1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2019 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
77 /* Undo the effects of #including reloc-macros.h. */
79 #undef START_RELOC_NUMBERS
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
90 #define RELOC_MACROS_GEN_FUNC
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
101 #include "elf/csky.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
105 #include "elf/epiphany.h"
106 #include "elf/fr30.h"
108 #include "elf/ft32.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/s12z.h"
124 #include "elf/mcore.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
137 #include "elf/nios2.h"
138 #include "elf/or1k.h"
141 #include "elf/ppc64.h"
143 #include "elf/riscv.h"
144 #include "elf/rl78.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
149 #include "elf/sparc.h"
151 #include "elf/tic6x.h"
152 #include "elf/tilegx.h"
153 #include "elf/tilepro.h"
154 #include "elf/v850.h"
156 #include "elf/visium.h"
157 #include "elf/wasm32.h"
158 #include "elf/x86-64.h"
159 #include "elf/xc16x.h"
160 #include "elf/xgate.h"
161 #include "elf/xstormy16.h"
162 #include "elf/xtensa.h"
165 #include "libiberty.h"
166 #include "safe-ctype.h"
167 #include "filenames.h"
170 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
173 typedef struct elf_section_list
175 Elf_Internal_Shdr * hdr;
176 struct elf_section_list * next;
179 /* Flag bits indicating particular types of dump. */
180 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
181 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
182 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
183 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
184 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
186 typedef unsigned char dump_type;
188 /* A linked list of the section names for which dumps were requested. */
189 struct dump_list_entry
193 struct dump_list_entry * next;
196 typedef struct filedata
198 const char * file_name;
200 bfd_size_type file_size;
201 Elf_Internal_Ehdr file_header;
202 Elf_Internal_Shdr * section_headers;
203 Elf_Internal_Phdr * program_headers;
205 unsigned long string_table_length;
206 /* A dynamic array of flags indicating for which sections a dump of
207 some kind has been requested. It is reset on a per-object file
208 basis and then initialised from the cmdline_dump_sects array,
209 the results of interpreting the -w switch, and the
210 dump_sects_byname list. */
211 dump_type * dump_sects;
212 unsigned int num_dump_sects;
215 char * program_name = "readelf";
217 static unsigned long archive_file_offset;
218 static unsigned long archive_file_size;
219 static unsigned long dynamic_addr;
220 static bfd_size_type dynamic_size;
221 static size_t dynamic_nent;
222 static char * dynamic_strings;
223 static unsigned long dynamic_strings_length;
224 static unsigned long num_dynamic_syms;
225 static Elf_Internal_Sym * dynamic_symbols;
226 static Elf_Internal_Syminfo * dynamic_syminfo;
227 static unsigned long dynamic_syminfo_offset;
228 static unsigned int dynamic_syminfo_nent;
229 static char program_interpreter[PATH_MAX];
230 static bfd_vma dynamic_info[DT_ENCODING];
231 static bfd_vma dynamic_info_DT_GNU_HASH;
232 static bfd_vma version_info[16];
233 static Elf_Internal_Dyn * dynamic_section;
234 static elf_section_list * symtab_shndx_list;
235 static bfd_boolean show_name = FALSE;
236 static bfd_boolean do_dynamic = FALSE;
237 static bfd_boolean do_syms = FALSE;
238 static bfd_boolean do_dyn_syms = FALSE;
239 static bfd_boolean do_reloc = FALSE;
240 static bfd_boolean do_sections = FALSE;
241 static bfd_boolean do_section_groups = FALSE;
242 static bfd_boolean do_section_details = FALSE;
243 static bfd_boolean do_segments = FALSE;
244 static bfd_boolean do_unwind = FALSE;
245 static bfd_boolean do_using_dynamic = FALSE;
246 static bfd_boolean do_header = FALSE;
247 static bfd_boolean do_dump = FALSE;
248 static bfd_boolean do_version = FALSE;
249 static bfd_boolean do_histogram = FALSE;
250 static bfd_boolean do_debugging = FALSE;
251 static bfd_boolean do_arch = FALSE;
252 static bfd_boolean do_notes = FALSE;
253 static bfd_boolean do_archive_index = FALSE;
254 static bfd_boolean is_32bit_elf = FALSE;
255 static bfd_boolean decompress_dumps = FALSE;
259 struct group_list * next;
260 unsigned int section_index;
265 struct group_list * root;
266 unsigned int group_index;
269 static size_t group_count;
270 static struct group * section_groups;
271 static struct group ** section_headers_groups;
273 /* A dynamic array of flags indicating for which sections a dump
274 has been requested via command line switches. */
275 static Filedata cmdline;
277 static struct dump_list_entry * dump_sects_byname;
279 /* How to print a vma value. */
280 typedef enum print_mode
292 /* Versioned symbol info. */
293 enum versioned_symbol_info
300 static const char * get_symbol_version_string
301 (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
302 Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
306 #define SECTION_NAME(X) \
307 ((X) == NULL ? _("<none>") \
308 : filedata->string_table == NULL ? _("<no-strings>") \
309 : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>") \
310 : filedata->string_table + (X)->sh_name))
312 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
314 #define GET_ELF_SYMBOLS(file, section, sym_count) \
315 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
316 : get_64bit_elf_symbols (file, section, sym_count))
318 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320 already been called and verified that the string exists. */
321 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
323 #define REMOVE_ARCH_BITS(ADDR) \
326 if (filedata->file_header.e_machine == EM_ARM) \
331 /* Print a BFD_VMA to an internal buffer, for use in error messages.
332 BFD_FMA_FMT can't be used in translated strings. */
335 bfd_vmatoa (char *fmtch, bfd_vma value)
337 /* bfd_vmatoa is used more then once in a printf call for output.
338 Cycle through an array of buffers. */
339 static int buf_pos = 0;
340 static struct bfd_vmatoa_buf
347 ret = buf[buf_pos++].place;
348 buf_pos %= ARRAY_SIZE (buf);
350 sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351 snprintf (ret, sizeof (buf[0].place), fmt, value);
355 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356 OFFSET + the offset of the current archive member, if we are examining an
357 archive. Put the retrieved data into VAR, if it is not NULL. Otherwise
358 allocate a buffer using malloc and fill that. In either case return the
359 pointer to the start of the retrieved data or NULL if something went wrong.
360 If something does go wrong and REASON is not NULL then emit an error
361 message using REASON as part of the context. */
364 get_data (void * var,
366 unsigned long offset,
372 bfd_size_type amt = size * nmemb;
374 if (size == 0 || nmemb == 0)
377 /* If the size_t type is smaller than the bfd_size_type, eg because
378 you are building a 32-bit tool on a 64-bit host, then make sure
379 that when the sizes are cast to (size_t) no information is lost. */
380 if (sizeof (size_t) < sizeof (bfd_size_type)
381 && ( (bfd_size_type) ((size_t) size) != size
382 || (bfd_size_type) ((size_t) nmemb) != nmemb))
385 error (_("Size truncation prevents reading %s"
386 " elements of size %s for %s\n"),
387 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
391 /* Check for size overflow. */
395 error (_("Size overflow prevents reading %s"
396 " elements of size %s for %s\n"),
397 bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
401 /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
402 attempting to allocate memory when the read is bound to fail. */
403 if (archive_file_offset > filedata->file_size
404 || offset > filedata->file_size - archive_file_offset
405 || amt > filedata->file_size - archive_file_offset - offset)
408 error (_("Reading %s bytes extends past end of file for %s\n"),
409 bfd_vmatoa ("u", amt), reason);
413 if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
416 error (_("Unable to seek to 0x%lx for %s\n"),
417 archive_file_offset + offset, reason);
424 /* Check for overflow. */
425 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
426 /* + 1 so that we can '\0' terminate invalid string table sections. */
427 mvar = malloc ((size_t) amt + 1);
432 error (_("Out of memory allocating %s bytes for %s\n"),
433 bfd_vmatoa ("u", amt), reason);
437 ((char *) mvar)[amt] = '\0';
440 if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
443 error (_("Unable to read in %s bytes of %s\n"),
444 bfd_vmatoa ("u", amt), reason);
453 /* Print a VMA value in the MODE specified.
454 Returns the number of characters displayed. */
457 print_vma (bfd_vma vma, print_mode mode)
469 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
476 return printf ("%5" BFD_VMA_FMT "d", vma);
482 return nc + printf ("%" BFD_VMA_FMT "x", vma);
485 return printf ("%" BFD_VMA_FMT "d", vma);
488 return printf ("%" BFD_VMA_FMT "u", vma);
491 /* FIXME: Report unrecognised mode ? */
496 /* Display a symbol on stdout. Handles the display of control characters and
497 multibye characters (assuming the host environment supports them).
499 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
501 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
502 padding as necessary.
504 Returns the number of emitted characters. */
507 print_symbol (signed int width, const char *symbol)
509 bfd_boolean extra_padding = FALSE;
510 signed int num_printed = 0;
511 #ifdef HAVE_MBSTATE_T
514 unsigned int width_remaining;
518 /* Keep the width positive. This helps the code below. */
520 extra_padding = TRUE;
526 /* Set the remaining width to a very large value.
527 This simplifies the code below. */
528 width_remaining = INT_MAX;
530 width_remaining = width;
532 #ifdef HAVE_MBSTATE_T
533 /* Initialise the multibyte conversion state. */
534 memset (& state, 0, sizeof (state));
537 while (width_remaining)
540 const char c = *symbol++;
545 /* Do not print control characters directly as they can affect terminal
546 settings. Such characters usually appear in the names generated
547 by the assembler for local labels. */
550 if (width_remaining < 2)
553 printf ("^%c", c + 0x40);
554 width_remaining -= 2;
557 else if (ISPRINT (c))
565 #ifdef HAVE_MBSTATE_T
568 /* Let printf do the hard work of displaying multibyte characters. */
569 printf ("%.1s", symbol - 1);
573 #ifdef HAVE_MBSTATE_T
574 /* Try to find out how many bytes made up the character that was
575 just printed. Advance the symbol pointer past the bytes that
577 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
581 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
586 if (extra_padding && num_printed < width)
588 /* Fill in the remaining spaces. */
589 printf ("%-*s", width - num_printed, " ");
596 /* Returns a pointer to a static buffer containing a printable version of
597 the given section's name. Like print_symbol, except that it does not try
598 to print multibyte characters, it just interprets them as hex values. */
601 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
603 #define MAX_PRINT_SEC_NAME_LEN 128
604 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
605 const char * name = SECTION_NAME (sec);
606 char * buf = sec_name_buf;
608 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
610 while ((c = * name ++) != 0)
621 else if (ISPRINT (c))
628 static char hex[17] = "0123456789ABCDEF";
633 * buf ++ = hex[(c & 0xf0) >> 4];
634 * buf ++ = hex[c & 0x0f];
648 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
650 if (ndx >= filedata->file_header.e_shnum)
651 return _("<corrupt>");
653 return printable_section_name (filedata, filedata->section_headers + ndx);
656 /* Return a pointer to section NAME, or NULL if no such section exists. */
658 static Elf_Internal_Shdr *
659 find_section (Filedata * filedata, const char * name)
663 if (filedata->section_headers == NULL)
666 for (i = 0; i < filedata->file_header.e_shnum; i++)
667 if (streq (SECTION_NAME (filedata->section_headers + i), name))
668 return filedata->section_headers + i;
673 /* Return a pointer to a section containing ADDR, or NULL if no such
676 static Elf_Internal_Shdr *
677 find_section_by_address (Filedata * filedata, bfd_vma addr)
681 if (filedata->section_headers == NULL)
684 for (i = 0; i < filedata->file_header.e_shnum; i++)
686 Elf_Internal_Shdr *sec = filedata->section_headers + i;
688 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
695 static Elf_Internal_Shdr *
696 find_section_by_type (Filedata * filedata, unsigned int type)
700 if (filedata->section_headers == NULL)
703 for (i = 0; i < filedata->file_header.e_shnum; i++)
705 Elf_Internal_Shdr *sec = filedata->section_headers + i;
707 if (sec->sh_type == type)
714 /* Return a pointer to section NAME, or NULL if no such section exists,
715 restricted to the list of sections given in SET. */
717 static Elf_Internal_Shdr *
718 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
722 if (filedata->section_headers == NULL)
727 while ((i = *set++) > 0)
729 /* See PR 21156 for a reproducer. */
730 if (i >= filedata->file_header.e_shnum)
731 continue; /* FIXME: Should we issue an error message ? */
733 if (streq (SECTION_NAME (filedata->section_headers + i), name))
734 return filedata->section_headers + i;
738 return find_section (filedata, name);
741 /* Read an unsigned LEB128 encoded value from DATA.
742 Set *LENGTH_RETURN to the number of bytes read. */
744 static inline unsigned long
745 read_uleb128 (unsigned char * data,
746 unsigned int * length_return,
747 const unsigned char * const end)
749 return read_leb128 (data, length_return, FALSE, end);
752 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
753 This OS has so many departures from the ELF standard that we test it at
756 static inline bfd_boolean
757 is_ia64_vms (Filedata * filedata)
759 return filedata->file_header.e_machine == EM_IA_64
760 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
763 /* Guess the relocation size commonly used by the specific machines. */
766 guess_is_rela (unsigned int e_machine)
770 /* Targets that use REL relocations. */
786 /* Targets that use RELA relocations. */
790 case EM_ADAPTEVA_EPIPHANY:
792 case EM_ALTERA_NIOS2:
795 case EM_ARC_COMPACT2:
816 case EM_LATTICEMICO32:
825 case EM_CYGNUS_MN10200:
827 case EM_CYGNUS_MN10300:
863 case EM_MICROBLAZE_OLD:
885 warn (_("Don't know about relocations on this machine architecture\n"));
890 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
891 Returns TRUE upon success, FALSE otherwise. If successful then a
892 pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
893 and the number of relocs loaded is placed in *NRELASP. It is the caller's
894 responsibility to free the allocated buffer. */
897 slurp_rela_relocs (Filedata * filedata,
898 unsigned long rel_offset,
899 unsigned long rel_size,
900 Elf_Internal_Rela ** relasp,
901 unsigned long * nrelasp)
903 Elf_Internal_Rela * relas;
909 Elf32_External_Rela * erelas;
911 erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
912 rel_size, _("32-bit relocation data"));
916 nrelas = rel_size / sizeof (Elf32_External_Rela);
918 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
919 sizeof (Elf_Internal_Rela));
924 error (_("out of memory parsing relocs\n"));
928 for (i = 0; i < nrelas; i++)
930 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
931 relas[i].r_info = BYTE_GET (erelas[i].r_info);
932 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
939 Elf64_External_Rela * erelas;
941 erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
942 rel_size, _("64-bit relocation data"));
946 nrelas = rel_size / sizeof (Elf64_External_Rela);
948 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
949 sizeof (Elf_Internal_Rela));
954 error (_("out of memory parsing relocs\n"));
958 for (i = 0; i < nrelas; i++)
960 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
961 relas[i].r_info = BYTE_GET (erelas[i].r_info);
962 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
964 /* The #ifdef BFD64 below is to prevent a compile time
965 warning. We know that if we do not have a 64 bit data
966 type that we will never execute this code anyway. */
968 if (filedata->file_header.e_machine == EM_MIPS
969 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
971 /* In little-endian objects, r_info isn't really a
972 64-bit little-endian value: it has a 32-bit
973 little-endian symbol index followed by four
974 individual byte fields. Reorder INFO
976 bfd_vma inf = relas[i].r_info;
977 inf = (((inf & 0xffffffff) << 32)
978 | ((inf >> 56) & 0xff)
979 | ((inf >> 40) & 0xff00)
980 | ((inf >> 24) & 0xff0000)
981 | ((inf >> 8) & 0xff000000));
982 relas[i].r_info = inf;
995 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
996 Returns TRUE upon success, FALSE otherwise. If successful then a
997 pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
998 and the number of relocs loaded is placed in *NRELSP. It is the caller's
999 responsibility to free the allocated buffer. */
1002 slurp_rel_relocs (Filedata * filedata,
1003 unsigned long rel_offset,
1004 unsigned long rel_size,
1005 Elf_Internal_Rela ** relsp,
1006 unsigned long * nrelsp)
1008 Elf_Internal_Rela * rels;
1014 Elf32_External_Rel * erels;
1016 erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1017 rel_size, _("32-bit relocation data"));
1021 nrels = rel_size / sizeof (Elf32_External_Rel);
1023 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1028 error (_("out of memory parsing relocs\n"));
1032 for (i = 0; i < nrels; i++)
1034 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1035 rels[i].r_info = BYTE_GET (erels[i].r_info);
1036 rels[i].r_addend = 0;
1043 Elf64_External_Rel * erels;
1045 erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1046 rel_size, _("64-bit relocation data"));
1050 nrels = rel_size / sizeof (Elf64_External_Rel);
1052 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1057 error (_("out of memory parsing relocs\n"));
1061 for (i = 0; i < nrels; i++)
1063 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1064 rels[i].r_info = BYTE_GET (erels[i].r_info);
1065 rels[i].r_addend = 0;
1067 /* The #ifdef BFD64 below is to prevent a compile time
1068 warning. We know that if we do not have a 64 bit data
1069 type that we will never execute this code anyway. */
1071 if (filedata->file_header.e_machine == EM_MIPS
1072 && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1074 /* In little-endian objects, r_info isn't really a
1075 64-bit little-endian value: it has a 32-bit
1076 little-endian symbol index followed by four
1077 individual byte fields. Reorder INFO
1079 bfd_vma inf = rels[i].r_info;
1080 inf = (((inf & 0xffffffff) << 32)
1081 | ((inf >> 56) & 0xff)
1082 | ((inf >> 40) & 0xff00)
1083 | ((inf >> 24) & 0xff0000)
1084 | ((inf >> 8) & 0xff000000));
1085 rels[i].r_info = inf;
1098 /* Returns the reloc type extracted from the reloc info field. */
1101 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1104 return ELF32_R_TYPE (reloc_info);
1106 switch (filedata->file_header.e_machine)
1109 /* Note: We assume that reloc_info has already been adjusted for us. */
1110 return ELF64_MIPS_R_TYPE (reloc_info);
1113 return ELF64_R_TYPE_ID (reloc_info);
1116 return ELF64_R_TYPE (reloc_info);
1120 /* Return the symbol index extracted from the reloc info field. */
1123 get_reloc_symindex (bfd_vma reloc_info)
1125 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1128 static inline bfd_boolean
1129 uses_msp430x_relocs (Filedata * filedata)
1132 filedata->file_header.e_machine == EM_MSP430 /* Paranoia. */
1133 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1134 && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1135 /* TI compiler uses ELFOSABI_NONE. */
1136 || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1139 /* Display the contents of the relocation data found at the specified
1143 dump_relocations (Filedata * filedata,
1144 unsigned long rel_offset,
1145 unsigned long rel_size,
1146 Elf_Internal_Sym * symtab,
1147 unsigned long nsyms,
1149 unsigned long strtablen,
1151 bfd_boolean is_dynsym)
1154 Elf_Internal_Rela * rels;
1155 bfd_boolean res = TRUE;
1157 if (is_rela == UNKNOWN)
1158 is_rela = guess_is_rela (filedata->file_header.e_machine);
1162 if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1167 if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1176 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1178 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1183 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1185 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1193 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1195 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1200 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1202 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1206 for (i = 0; i < rel_size; i++)
1211 bfd_vma symtab_index;
1214 offset = rels[i].r_offset;
1215 inf = rels[i].r_info;
1217 type = get_reloc_type (filedata, inf);
1218 symtab_index = get_reloc_symindex (inf);
1222 printf ("%8.8lx %8.8lx ",
1223 (unsigned long) offset & 0xffffffff,
1224 (unsigned long) inf & 0xffffffff);
1228 #if BFD_HOST_64BIT_LONG
1230 ? "%16.16lx %16.16lx "
1231 : "%12.12lx %12.12lx ",
1233 #elif BFD_HOST_64BIT_LONG_LONG
1236 ? "%16.16llx %16.16llx "
1237 : "%12.12llx %12.12llx ",
1241 ? "%16.16I64x %16.16I64x "
1242 : "%12.12I64x %12.12I64x ",
1247 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1248 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1249 _bfd_int64_high (offset),
1250 _bfd_int64_low (offset),
1251 _bfd_int64_high (inf),
1252 _bfd_int64_low (inf));
1256 switch (filedata->file_header.e_machine)
1263 rtype = elf_aarch64_reloc_type (type);
1267 case EM_CYGNUS_M32R:
1268 rtype = elf_m32r_reloc_type (type);
1273 rtype = elf_i386_reloc_type (type);
1278 rtype = elf_m68hc11_reloc_type (type);
1282 rtype = elf_s12z_reloc_type (type);
1286 rtype = elf_m68k_reloc_type (type);
1290 rtype = elf_i960_reloc_type (type);
1295 rtype = elf_avr_reloc_type (type);
1298 case EM_OLD_SPARCV9:
1299 case EM_SPARC32PLUS:
1302 rtype = elf_sparc_reloc_type (type);
1306 rtype = elf_spu_reloc_type (type);
1310 rtype = v800_reloc_type (type);
1313 case EM_CYGNUS_V850:
1314 rtype = v850_reloc_type (type);
1318 case EM_CYGNUS_D10V:
1319 rtype = elf_d10v_reloc_type (type);
1323 case EM_CYGNUS_D30V:
1324 rtype = elf_d30v_reloc_type (type);
1328 rtype = elf_dlx_reloc_type (type);
1332 rtype = elf_sh_reloc_type (type);
1336 case EM_CYGNUS_MN10300:
1337 rtype = elf_mn10300_reloc_type (type);
1341 case EM_CYGNUS_MN10200:
1342 rtype = elf_mn10200_reloc_type (type);
1346 case EM_CYGNUS_FR30:
1347 rtype = elf_fr30_reloc_type (type);
1351 rtype = elf_frv_reloc_type (type);
1355 rtype = elf_csky_reloc_type (type);
1359 rtype = elf_ft32_reloc_type (type);
1363 rtype = elf_mcore_reloc_type (type);
1367 rtype = elf_mmix_reloc_type (type);
1371 rtype = elf_moxie_reloc_type (type);
1375 if (uses_msp430x_relocs (filedata))
1377 rtype = elf_msp430x_reloc_type (type);
1382 rtype = elf_msp430_reloc_type (type);
1386 rtype = elf_nds32_reloc_type (type);
1390 rtype = elf_ppc_reloc_type (type);
1394 rtype = elf_ppc64_reloc_type (type);
1398 case EM_MIPS_RS3_LE:
1399 rtype = elf_mips_reloc_type (type);
1403 rtype = elf_riscv_reloc_type (type);
1407 rtype = elf_alpha_reloc_type (type);
1411 rtype = elf_arm_reloc_type (type);
1415 case EM_ARC_COMPACT:
1416 case EM_ARC_COMPACT2:
1417 rtype = elf_arc_reloc_type (type);
1421 rtype = elf_hppa_reloc_type (type);
1427 rtype = elf_h8_reloc_type (type);
1431 rtype = elf_or1k_reloc_type (type);
1436 rtype = elf_pj_reloc_type (type);
1439 rtype = elf_ia64_reloc_type (type);
1443 rtype = elf_cris_reloc_type (type);
1447 rtype = elf_i860_reloc_type (type);
1453 rtype = elf_x86_64_reloc_type (type);
1457 rtype = i370_reloc_type (type);
1462 rtype = elf_s390_reloc_type (type);
1466 rtype = elf_score_reloc_type (type);
1470 rtype = elf_xstormy16_reloc_type (type);
1474 rtype = elf_crx_reloc_type (type);
1478 rtype = elf_vax_reloc_type (type);
1482 rtype = elf_visium_reloc_type (type);
1485 case EM_ADAPTEVA_EPIPHANY:
1486 rtype = elf_epiphany_reloc_type (type);
1491 rtype = elf_ip2k_reloc_type (type);
1495 rtype = elf_iq2000_reloc_type (type);
1500 rtype = elf_xtensa_reloc_type (type);
1503 case EM_LATTICEMICO32:
1504 rtype = elf_lm32_reloc_type (type);
1509 rtype = elf_m32c_reloc_type (type);
1513 rtype = elf_mt_reloc_type (type);
1517 rtype = elf_bfin_reloc_type (type);
1521 rtype = elf_mep_reloc_type (type);
1525 rtype = elf_cr16_reloc_type (type);
1529 case EM_MICROBLAZE_OLD:
1530 rtype = elf_microblaze_reloc_type (type);
1534 rtype = elf_rl78_reloc_type (type);
1538 rtype = elf_rx_reloc_type (type);
1542 rtype = elf_metag_reloc_type (type);
1547 rtype = elf_xc16x_reloc_type (type);
1551 rtype = elf_tic6x_reloc_type (type);
1555 rtype = elf_tilegx_reloc_type (type);
1559 rtype = elf_tilepro_reloc_type (type);
1562 case EM_WEBASSEMBLY:
1563 rtype = elf_wasm32_reloc_type (type);
1567 rtype = elf_xgate_reloc_type (type);
1570 case EM_ALTERA_NIOS2:
1571 rtype = elf_nios2_reloc_type (type);
1575 rtype = elf_pru_reloc_type (type);
1579 if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1580 rtype = elf_nfp3200_reloc_type (type);
1582 rtype = elf_nfp_reloc_type (type);
1587 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1589 printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1591 if (filedata->file_header.e_machine == EM_ALPHA
1593 && streq (rtype, "R_ALPHA_LITUSE")
1596 switch (rels[i].r_addend)
1598 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1599 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1600 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1601 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1602 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1603 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1604 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1605 default: rtype = NULL;
1609 printf (" (%s)", rtype);
1613 printf (_("<unknown addend: %lx>"),
1614 (unsigned long) rels[i].r_addend);
1618 else if (symtab_index)
1620 if (symtab == NULL || symtab_index >= nsyms)
1622 error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1627 Elf_Internal_Sym * psym;
1628 const char * version_string;
1629 enum versioned_symbol_info sym_info;
1630 unsigned short vna_other;
1632 psym = symtab + symtab_index;
1635 = get_symbol_version_string (filedata, is_dynsym,
1644 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1648 unsigned int width = is_32bit_elf ? 8 : 14;
1650 /* Relocations against GNU_IFUNC symbols do not use the value
1651 of the symbol as the address to relocate against. Instead
1652 they invoke the function named by the symbol and use its
1653 result as the address for relocation.
1655 To indicate this to the user, do not display the value of
1656 the symbol in the "Symbols's Value" field. Instead show
1657 its name followed by () as a hint that the symbol is
1661 || psym->st_name == 0
1662 || psym->st_name >= strtablen)
1665 name = strtab + psym->st_name;
1667 len = print_symbol (width, name);
1669 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1671 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1675 print_vma (psym->st_value, LONG_HEX);
1677 printf (is_32bit_elf ? " " : " ");
1680 if (psym->st_name == 0)
1682 const char * sec_name = "<null>";
1685 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1687 if (psym->st_shndx < filedata->file_header.e_shnum)
1688 sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1689 else if (psym->st_shndx == SHN_ABS)
1691 else if (psym->st_shndx == SHN_COMMON)
1692 sec_name = "COMMON";
1693 else if ((filedata->file_header.e_machine == EM_MIPS
1694 && psym->st_shndx == SHN_MIPS_SCOMMON)
1695 || (filedata->file_header.e_machine == EM_TI_C6000
1696 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1697 sec_name = "SCOMMON";
1698 else if (filedata->file_header.e_machine == EM_MIPS
1699 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1700 sec_name = "SUNDEF";
1701 else if ((filedata->file_header.e_machine == EM_X86_64
1702 || filedata->file_header.e_machine == EM_L1OM
1703 || filedata->file_header.e_machine == EM_K1OM)
1704 && psym->st_shndx == SHN_X86_64_LCOMMON)
1705 sec_name = "LARGE_COMMON";
1706 else if (filedata->file_header.e_machine == EM_IA_64
1707 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1708 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1709 sec_name = "ANSI_COM";
1710 else if (is_ia64_vms (filedata)
1711 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1712 sec_name = "VMS_SYMVEC";
1715 sprintf (name_buf, "<section 0x%x>",
1716 (unsigned int) psym->st_shndx);
1717 sec_name = name_buf;
1720 print_symbol (22, sec_name);
1722 else if (strtab == NULL)
1723 printf (_("<string table index: %3ld>"), psym->st_name);
1724 else if (psym->st_name >= strtablen)
1726 error (_("<corrupt string table index: %3ld>"), psym->st_name);
1731 print_symbol (22, strtab + psym->st_name);
1733 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1739 bfd_vma off = rels[i].r_addend;
1741 if ((bfd_signed_vma) off < 0)
1742 printf (" - %" BFD_VMA_FMT "x", - off);
1744 printf (" + %" BFD_VMA_FMT "x", off);
1750 bfd_vma off = rels[i].r_addend;
1752 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1753 if ((bfd_signed_vma) off < 0)
1754 printf ("-%" BFD_VMA_FMT "x", - off);
1756 printf ("%" BFD_VMA_FMT "x", off);
1759 if (filedata->file_header.e_machine == EM_SPARCV9
1761 && streq (rtype, "R_SPARC_OLO10"))
1762 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1767 if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1769 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1770 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1771 const char * rtype2 = elf_mips_reloc_type (type2);
1772 const char * rtype3 = elf_mips_reloc_type (type3);
1774 printf (" Type2: ");
1777 printf (_("unrecognized: %-7lx"),
1778 (unsigned long) type2 & 0xffffffff);
1780 printf ("%-17.17s", rtype2);
1782 printf ("\n Type3: ");
1785 printf (_("unrecognized: %-7lx"),
1786 (unsigned long) type3 & 0xffffffff);
1788 printf ("%-17.17s", rtype3);
1801 get_aarch64_dynamic_type (unsigned long type)
1805 case DT_AARCH64_BTI_PLT: return "AARCH64_BTI_PLT";
1812 get_mips_dynamic_type (unsigned long type)
1816 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1817 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1818 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1819 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1820 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1821 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1822 case DT_MIPS_MSYM: return "MIPS_MSYM";
1823 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1824 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1825 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1826 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1827 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1828 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1829 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1830 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1831 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1832 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1833 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1834 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1835 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1836 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1837 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1838 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1839 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1840 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1841 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1842 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1843 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1844 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1845 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1846 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1847 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1848 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1849 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1850 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1851 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1852 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1853 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1854 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1855 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1856 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1857 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1858 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1859 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1860 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1861 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1868 get_sparc64_dynamic_type (unsigned long type)
1872 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1879 get_ppc_dynamic_type (unsigned long type)
1883 case DT_PPC_GOT: return "PPC_GOT";
1884 case DT_PPC_OPT: return "PPC_OPT";
1891 get_ppc64_dynamic_type (unsigned long type)
1895 case DT_PPC64_GLINK: return "PPC64_GLINK";
1896 case DT_PPC64_OPD: return "PPC64_OPD";
1897 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1898 case DT_PPC64_OPT: return "PPC64_OPT";
1905 get_parisc_dynamic_type (unsigned long type)
1909 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1910 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1911 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1912 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1913 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1914 case DT_HP_PREINIT: return "HP_PREINIT";
1915 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1916 case DT_HP_NEEDED: return "HP_NEEDED";
1917 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1918 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1919 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1920 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1921 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1922 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1923 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1924 case DT_HP_FILTERED: return "HP_FILTERED";
1925 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1926 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1927 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1928 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1929 case DT_PLT: return "PLT";
1930 case DT_PLT_SIZE: return "PLT_SIZE";
1931 case DT_DLT: return "DLT";
1932 case DT_DLT_SIZE: return "DLT_SIZE";
1939 get_ia64_dynamic_type (unsigned long type)
1943 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1944 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1945 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1946 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1947 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1948 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1949 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1950 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1951 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1952 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1953 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1954 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1955 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1956 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1957 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1958 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1959 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1960 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1961 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1962 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1963 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1964 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1965 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1966 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1967 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1968 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1969 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1970 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1971 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1972 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1973 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1980 get_solaris_section_type (unsigned long type)
1984 case 0x6fffffee: return "SUNW_ancillary";
1985 case 0x6fffffef: return "SUNW_capchain";
1986 case 0x6ffffff0: return "SUNW_capinfo";
1987 case 0x6ffffff1: return "SUNW_symsort";
1988 case 0x6ffffff2: return "SUNW_tlssort";
1989 case 0x6ffffff3: return "SUNW_LDYNSYM";
1990 case 0x6ffffff4: return "SUNW_dof";
1991 case 0x6ffffff5: return "SUNW_cap";
1992 case 0x6ffffff6: return "SUNW_SIGNATURE";
1993 case 0x6ffffff7: return "SUNW_ANNOTATE";
1994 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1995 case 0x6ffffff9: return "SUNW_DEBUG";
1996 case 0x6ffffffa: return "SUNW_move";
1997 case 0x6ffffffb: return "SUNW_COMDAT";
1998 case 0x6ffffffc: return "SUNW_syminfo";
1999 case 0x6ffffffd: return "SUNW_verdef";
2000 case 0x6ffffffe: return "SUNW_verneed";
2001 case 0x6fffffff: return "SUNW_versym";
2002 case 0x70000000: return "SPARC_GOTDATA";
2003 default: return NULL;
2008 get_alpha_dynamic_type (unsigned long type)
2012 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2013 default: return NULL;
2018 get_score_dynamic_type (unsigned long type)
2022 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2023 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
2024 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
2025 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
2026 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
2027 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
2028 default: return NULL;
2033 get_tic6x_dynamic_type (unsigned long type)
2037 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2038 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2039 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
2040 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
2041 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
2042 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
2043 default: return NULL;
2048 get_nios2_dynamic_type (unsigned long type)
2052 case DT_NIOS2_GP: return "NIOS2_GP";
2053 default: return NULL;
2058 get_solaris_dynamic_type (unsigned long type)
2062 case 0x6000000d: return "SUNW_AUXILIARY";
2063 case 0x6000000e: return "SUNW_RTLDINF";
2064 case 0x6000000f: return "SUNW_FILTER";
2065 case 0x60000010: return "SUNW_CAP";
2066 case 0x60000011: return "SUNW_SYMTAB";
2067 case 0x60000012: return "SUNW_SYMSZ";
2068 case 0x60000013: return "SUNW_SORTENT";
2069 case 0x60000014: return "SUNW_SYMSORT";
2070 case 0x60000015: return "SUNW_SYMSORTSZ";
2071 case 0x60000016: return "SUNW_TLSSORT";
2072 case 0x60000017: return "SUNW_TLSSORTSZ";
2073 case 0x60000018: return "SUNW_CAPINFO";
2074 case 0x60000019: return "SUNW_STRPAD";
2075 case 0x6000001a: return "SUNW_CAPCHAIN";
2076 case 0x6000001b: return "SUNW_LDMACH";
2077 case 0x6000001d: return "SUNW_CAPCHAINENT";
2078 case 0x6000001f: return "SUNW_CAPCHAINSZ";
2079 case 0x60000021: return "SUNW_PARENT";
2080 case 0x60000023: return "SUNW_ASLR";
2081 case 0x60000025: return "SUNW_RELAX";
2082 case 0x60000029: return "SUNW_NXHEAP";
2083 case 0x6000002b: return "SUNW_NXSTACK";
2085 case 0x70000001: return "SPARC_REGISTER";
2086 case 0x7ffffffd: return "AUXILIARY";
2087 case 0x7ffffffe: return "USED";
2088 case 0x7fffffff: return "FILTER";
2090 default: return NULL;
2095 get_dynamic_type (Filedata * filedata, unsigned long type)
2097 static char buff[64];
2101 case DT_NULL: return "NULL";
2102 case DT_NEEDED: return "NEEDED";
2103 case DT_PLTRELSZ: return "PLTRELSZ";
2104 case DT_PLTGOT: return "PLTGOT";
2105 case DT_HASH: return "HASH";
2106 case DT_STRTAB: return "STRTAB";
2107 case DT_SYMTAB: return "SYMTAB";
2108 case DT_RELA: return "RELA";
2109 case DT_RELASZ: return "RELASZ";
2110 case DT_RELAENT: return "RELAENT";
2111 case DT_STRSZ: return "STRSZ";
2112 case DT_SYMENT: return "SYMENT";
2113 case DT_INIT: return "INIT";
2114 case DT_FINI: return "FINI";
2115 case DT_SONAME: return "SONAME";
2116 case DT_RPATH: return "RPATH";
2117 case DT_SYMBOLIC: return "SYMBOLIC";
2118 case DT_REL: return "REL";
2119 case DT_RELSZ: return "RELSZ";
2120 case DT_RELENT: return "RELENT";
2121 case DT_PLTREL: return "PLTREL";
2122 case DT_DEBUG: return "DEBUG";
2123 case DT_TEXTREL: return "TEXTREL";
2124 case DT_JMPREL: return "JMPREL";
2125 case DT_BIND_NOW: return "BIND_NOW";
2126 case DT_INIT_ARRAY: return "INIT_ARRAY";
2127 case DT_FINI_ARRAY: return "FINI_ARRAY";
2128 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2129 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2130 case DT_RUNPATH: return "RUNPATH";
2131 case DT_FLAGS: return "FLAGS";
2133 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2134 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2135 case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2137 case DT_CHECKSUM: return "CHECKSUM";
2138 case DT_PLTPADSZ: return "PLTPADSZ";
2139 case DT_MOVEENT: return "MOVEENT";
2140 case DT_MOVESZ: return "MOVESZ";
2141 case DT_FEATURE: return "FEATURE";
2142 case DT_POSFLAG_1: return "POSFLAG_1";
2143 case DT_SYMINSZ: return "SYMINSZ";
2144 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2146 case DT_ADDRRNGLO: return "ADDRRNGLO";
2147 case DT_CONFIG: return "CONFIG";
2148 case DT_DEPAUDIT: return "DEPAUDIT";
2149 case DT_AUDIT: return "AUDIT";
2150 case DT_PLTPAD: return "PLTPAD";
2151 case DT_MOVETAB: return "MOVETAB";
2152 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2154 case DT_VERSYM: return "VERSYM";
2156 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2157 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2158 case DT_RELACOUNT: return "RELACOUNT";
2159 case DT_RELCOUNT: return "RELCOUNT";
2160 case DT_FLAGS_1: return "FLAGS_1";
2161 case DT_VERDEF: return "VERDEF";
2162 case DT_VERDEFNUM: return "VERDEFNUM";
2163 case DT_VERNEED: return "VERNEED";
2164 case DT_VERNEEDNUM: return "VERNEEDNUM";
2166 case DT_AUXILIARY: return "AUXILIARY";
2167 case DT_USED: return "USED";
2168 case DT_FILTER: return "FILTER";
2170 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2171 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2172 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2173 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2174 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2175 case DT_GNU_HASH: return "GNU_HASH";
2178 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2180 const char * result;
2182 switch (filedata->file_header.e_machine)
2185 result = get_aarch64_dynamic_type (type);
2188 case EM_MIPS_RS3_LE:
2189 result = get_mips_dynamic_type (type);
2192 result = get_sparc64_dynamic_type (type);
2195 result = get_ppc_dynamic_type (type);
2198 result = get_ppc64_dynamic_type (type);
2201 result = get_ia64_dynamic_type (type);
2204 result = get_alpha_dynamic_type (type);
2207 result = get_score_dynamic_type (type);
2210 result = get_tic6x_dynamic_type (type);
2212 case EM_ALTERA_NIOS2:
2213 result = get_nios2_dynamic_type (type);
2216 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2217 result = get_solaris_dynamic_type (type);
2226 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2228 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2229 || (filedata->file_header.e_machine == EM_PARISC
2230 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2232 const char * result;
2234 switch (filedata->file_header.e_machine)
2237 result = get_parisc_dynamic_type (type);
2240 result = get_ia64_dynamic_type (type);
2243 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2244 result = get_solaris_dynamic_type (type);
2253 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2257 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2264 get_file_type (unsigned e_type)
2266 static char buff[32];
2270 case ET_NONE: return _("NONE (None)");
2271 case ET_REL: return _("REL (Relocatable file)");
2272 case ET_EXEC: return _("EXEC (Executable file)");
2273 case ET_DYN: return _("DYN (Shared object file)");
2274 case ET_CORE: return _("CORE (Core file)");
2277 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2278 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2279 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2280 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2282 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2288 get_machine_name (unsigned e_machine)
2290 static char buff[64]; /* XXX */
2294 /* Please keep this switch table sorted by increasing EM_ value. */
2296 case EM_NONE: return _("None");
2297 case EM_M32: return "WE32100";
2298 case EM_SPARC: return "Sparc";
2299 case EM_386: return "Intel 80386";
2300 case EM_68K: return "MC68000";
2301 case EM_88K: return "MC88000";
2302 case EM_IAMCU: return "Intel MCU";
2303 case EM_860: return "Intel 80860";
2304 case EM_MIPS: return "MIPS R3000";
2305 case EM_S370: return "IBM System/370";
2307 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2308 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2309 case EM_PARISC: return "HPPA";
2310 case EM_VPP550: return "Fujitsu VPP500";
2311 case EM_SPARC32PLUS: return "Sparc v8+" ;
2312 case EM_960: return "Intel 80960";
2313 case EM_PPC: return "PowerPC";
2315 case EM_PPC64: return "PowerPC64";
2317 case EM_S390: return "IBM S/390";
2318 case EM_SPU: return "SPU";
2320 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2321 case EM_FR20: return "Fujitsu FR20";
2322 case EM_RH32: return "TRW RH32";
2323 case EM_MCORE: return "MCORE";
2325 case EM_ARM: return "ARM";
2326 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2327 case EM_SH: return "Renesas / SuperH SH";
2328 case EM_SPARCV9: return "Sparc v9";
2329 case EM_TRICORE: return "Siemens Tricore";
2330 case EM_ARC: return "ARC";
2331 case EM_H8_300: return "Renesas H8/300";
2332 case EM_H8_300H: return "Renesas H8/300H";
2333 case EM_H8S: return "Renesas H8S";
2334 case EM_H8_500: return "Renesas H8/500";
2336 case EM_IA_64: return "Intel IA-64";
2337 case EM_MIPS_X: return "Stanford MIPS-X";
2338 case EM_COLDFIRE: return "Motorola Coldfire";
2339 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2340 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2341 case EM_PCP: return "Siemens PCP";
2342 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2343 case EM_NDR1: return "Denso NDR1 microprocesspr";
2344 case EM_STARCORE: return "Motorola Star*Core processor";
2345 case EM_ME16: return "Toyota ME16 processor";
2347 case EM_ST100: return "STMicroelectronics ST100 processor";
2348 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2349 case EM_X86_64: return "Advanced Micro Devices X86-64";
2350 case EM_PDSP: return "Sony DSP processor";
2351 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2352 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2353 case EM_FX66: return "Siemens FX66 microcontroller";
2354 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2355 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2356 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2358 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2359 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2360 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2361 case EM_SVX: return "Silicon Graphics SVx";
2362 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2363 case EM_VAX: return "Digital VAX";
2364 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2365 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2366 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2367 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2369 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2370 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2371 case EM_PRISM: return "Vitesse Prism";
2373 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2374 case EM_CYGNUS_FR30:
2375 case EM_FR30: return "Fujitsu FR30";
2376 case EM_CYGNUS_D10V:
2377 case EM_D10V: return "d10v";
2378 case EM_CYGNUS_D30V:
2379 case EM_D30V: return "d30v";
2380 case EM_CYGNUS_V850:
2381 case EM_V850: return "Renesas V850";
2382 case EM_CYGNUS_M32R:
2383 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2384 case EM_CYGNUS_MN10300:
2385 case EM_MN10300: return "mn10300";
2387 case EM_CYGNUS_MN10200:
2388 case EM_MN10200: return "mn10200";
2389 case EM_PJ: return "picoJava";
2390 case EM_OR1K: return "OpenRISC 1000";
2391 case EM_ARC_COMPACT: return "ARCompact";
2393 case EM_XTENSA: return "Tensilica Xtensa Processor";
2394 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2395 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2396 case EM_NS32K: return "National Semiconductor 32000 series";
2397 case EM_TPC: return "Tenor Network TPC processor";
2398 case EM_SNP1K: return "Trebia SNP 1000 processor";
2400 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2402 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2403 case EM_MAX: return "MAX Processor";
2404 case EM_CR: return "National Semiconductor CompactRISC";
2405 case EM_F2MC16: return "Fujitsu F2MC16";
2406 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2407 case EM_BLACKFIN: return "Analog Devices Blackfin";
2408 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2409 case EM_SEP: return "Sharp embedded microprocessor";
2410 case EM_ARCA: return "Arca RISC microprocessor";
2412 case EM_UNICORE: return "Unicore";
2413 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2414 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2415 case EM_ALTERA_NIOS2: return "Altera Nios II";
2416 case EM_CRX: return "National Semiconductor CRX microprocessor";
2417 case EM_XGATE: return "Motorola XGATE embedded processor";
2419 case EM_XC16X: return "Infineon Technologies xc16x";
2420 case EM_M16C: return "Renesas M16C series microprocessors";
2421 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2422 case EM_CE: return "Freescale Communication Engine RISC core";
2424 case EM_M32C: return "Renesas M32c";
2426 case EM_TSK3000: return "Altium TSK3000 core";
2427 case EM_RS08: return "Freescale RS08 embedded processor";
2428 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2429 case EM_SCORE: return "SUNPLUS S+Core";
2430 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2431 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2432 case EM_LATTICEMICO32: return "Lattice Mico32";
2433 case EM_SE_C17: return "Seiko Epson C17 family";
2435 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2436 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2437 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2438 case EM_TI_PRU: return "TI PRU I/O processor";
2440 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2441 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2442 case EM_R32C: return "Renesas R32C series microprocessors";
2443 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2444 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2445 case EM_8051: return "Intel 8051 and variants";
2446 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2447 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2448 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2449 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2451 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2452 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2453 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2454 case EM_RX: return "Renesas RX";
2455 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2456 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2457 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2460 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2461 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2462 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2464 case EM_L1OM: return "Intel L1OM";
2465 case EM_K1OM: return "Intel K1OM";
2466 case EM_INTEL182: return "Intel (reserved)";
2467 case EM_AARCH64: return "AArch64";
2468 case EM_ARM184: return "ARM (reserved)";
2469 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor";
2470 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2471 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2472 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2474 case EM_CUDA: return "NVIDIA CUDA architecture";
2475 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2476 case EM_CLOUDSHIELD: return "CloudShield architecture family";
2477 case EM_COREA_1ST: return "KIPO-KAIST Core-A 1st generation processor family";
2478 case EM_COREA_2ND: return "KIPO-KAIST Core-A 2nd generation processor family";
2479 case EM_ARC_COMPACT2: return "ARCv2";
2480 case EM_OPEN8: return "Open8 8-bit RISC soft processor core";
2481 case EM_RL78: return "Renesas RL78";
2482 case EM_VIDEOCORE5: return "Broadcom VideoCore V processor";
2483 case EM_78K0R: return "Renesas 78K0R";
2485 case EM_56800EX: return "Freescale 56800EX Digital Signal Controller (DSC)";
2486 case EM_BA1: return "Beyond BA1 CPU architecture";
2487 case EM_BA2: return "Beyond BA2 CPU architecture";
2488 case EM_XCORE: return "XMOS xCORE processor family";
2489 case EM_MCHP_PIC: return "Microchip 8-bit PIC(r) family";
2491 case EM_KM32: return "KM211 KM32 32-bit processor";
2492 case EM_KMX32: return "KM211 KMX32 32-bit processor";
2493 case EM_KMX16: return "KM211 KMX16 16-bit processor";
2494 case EM_KMX8: return "KM211 KMX8 8-bit processor";
2495 case EM_KVARC: return "KM211 KVARC processor";
2496 case EM_CDP: return "Paneve CDP architecture family";
2497 case EM_COGE: return "Cognitive Smart Memory Processor";
2498 case EM_COOL: return "Bluechip Systems CoolEngine";
2499 case EM_NORC: return "Nanoradio Optimized RISC";
2500 case EM_CSR_KALIMBA: return "CSR Kalimba architecture family";
2502 case EM_Z80: return "Zilog Z80";
2503 case EM_VISIUM: return "CDS VISIUMcore processor";
2504 case EM_FT32: return "FTDI Chip FT32";
2505 case EM_MOXIE: return "Moxie";
2506 case EM_AMDGPU: return "AMD GPU";
2507 case EM_RISCV: return "RISC-V";
2508 case EM_LANAI: return "Lanai 32-bit processor";
2509 case EM_BPF: return "Linux BPF";
2510 case EM_NFP: return "Netronome Flow Processor";
2512 /* Large numbers... */
2513 case EM_MT: return "Morpho Techologies MT processor";
2514 case EM_ALPHA: return "Alpha";
2515 case EM_WEBASSEMBLY: return "Web Assembly";
2516 case EM_DLX: return "OpenDLX";
2517 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2518 case EM_IQ2000: return "Vitesse IQ2000";
2520 case EM_NIOS32: return "Altera Nios";
2521 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2522 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2523 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2524 case EM_S12Z: return "Freescale S12Z";
2525 case EM_CSKY: return "C-SKY";
2528 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2534 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2536 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2537 other compilers don't a specific architecture type in the e_flags, and
2538 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2539 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2542 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2543 but also sets a specific architecture type in the e_flags field.
2545 However, when decoding the flags we don't worry if we see an
2546 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2547 ARCEM architecture type. */
2549 switch (e_flags & EF_ARC_MACH_MSK)
2551 /* We only expect these to occur for EM_ARC_COMPACT2. */
2552 case EF_ARC_CPU_ARCV2EM:
2553 strcat (buf, ", ARC EM");
2555 case EF_ARC_CPU_ARCV2HS:
2556 strcat (buf, ", ARC HS");
2559 /* We only expect these to occur for EM_ARC_COMPACT. */
2560 case E_ARC_MACH_ARC600:
2561 strcat (buf, ", ARC600");
2563 case E_ARC_MACH_ARC601:
2564 strcat (buf, ", ARC601");
2566 case E_ARC_MACH_ARC700:
2567 strcat (buf, ", ARC700");
2570 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2571 new ELF with new architecture being read by an old version of
2572 readelf, or (c) An ELF built with non-GNU compiler that does not
2573 set the architecture in the e_flags. */
2575 if (e_machine == EM_ARC_COMPACT)
2576 strcat (buf, ", Unknown ARCompact");
2578 strcat (buf, ", Unknown ARC");
2582 switch (e_flags & EF_ARC_OSABI_MSK)
2584 case E_ARC_OSABI_ORIG:
2585 strcat (buf, ", (ABI:legacy)");
2587 case E_ARC_OSABI_V2:
2588 strcat (buf, ", (ABI:v2)");
2590 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2591 case E_ARC_OSABI_V3:
2592 strcat (buf, ", v3 no-legacy-syscalls ABI");
2594 case E_ARC_OSABI_V4:
2595 strcat (buf, ", v4 ABI");
2598 strcat (buf, ", unrecognised ARC OSABI flag");
2604 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2607 bfd_boolean unknown = FALSE;
2609 eabi = EF_ARM_EABI_VERSION (e_flags);
2610 e_flags &= ~ EF_ARM_EABIMASK;
2612 /* Handle "generic" ARM flags. */
2613 if (e_flags & EF_ARM_RELEXEC)
2615 strcat (buf, ", relocatable executable");
2616 e_flags &= ~ EF_ARM_RELEXEC;
2619 if (e_flags & EF_ARM_PIC)
2621 strcat (buf, ", position independent");
2622 e_flags &= ~ EF_ARM_PIC;
2625 /* Now handle EABI specific flags. */
2629 strcat (buf, ", <unrecognized EABI>");
2634 case EF_ARM_EABI_VER1:
2635 strcat (buf, ", Version1 EABI");
2640 /* Process flags one bit at a time. */
2641 flag = e_flags & - e_flags;
2646 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2647 strcat (buf, ", sorted symbol tables");
2657 case EF_ARM_EABI_VER2:
2658 strcat (buf, ", Version2 EABI");
2663 /* Process flags one bit at a time. */
2664 flag = e_flags & - e_flags;
2669 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2670 strcat (buf, ", sorted symbol tables");
2673 case EF_ARM_DYNSYMSUSESEGIDX:
2674 strcat (buf, ", dynamic symbols use segment index");
2677 case EF_ARM_MAPSYMSFIRST:
2678 strcat (buf, ", mapping symbols precede others");
2688 case EF_ARM_EABI_VER3:
2689 strcat (buf, ", Version3 EABI");
2692 case EF_ARM_EABI_VER4:
2693 strcat (buf, ", Version4 EABI");
2698 /* Process flags one bit at a time. */
2699 flag = e_flags & - e_flags;
2705 strcat (buf, ", BE8");
2709 strcat (buf, ", LE8");
2719 case EF_ARM_EABI_VER5:
2720 strcat (buf, ", Version5 EABI");
2725 /* Process flags one bit at a time. */
2726 flag = e_flags & - e_flags;
2732 strcat (buf, ", BE8");
2736 strcat (buf, ", LE8");
2739 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2740 strcat (buf, ", soft-float ABI");
2743 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2744 strcat (buf, ", hard-float ABI");
2754 case EF_ARM_EABI_UNKNOWN:
2755 strcat (buf, ", GNU EABI");
2760 /* Process flags one bit at a time. */
2761 flag = e_flags & - e_flags;
2766 case EF_ARM_INTERWORK:
2767 strcat (buf, ", interworking enabled");
2770 case EF_ARM_APCS_26:
2771 strcat (buf, ", uses APCS/26");
2774 case EF_ARM_APCS_FLOAT:
2775 strcat (buf, ", uses APCS/float");
2779 strcat (buf, ", position independent");
2783 strcat (buf, ", 8 bit structure alignment");
2786 case EF_ARM_NEW_ABI:
2787 strcat (buf, ", uses new ABI");
2790 case EF_ARM_OLD_ABI:
2791 strcat (buf, ", uses old ABI");
2794 case EF_ARM_SOFT_FLOAT:
2795 strcat (buf, ", software FP");
2798 case EF_ARM_VFP_FLOAT:
2799 strcat (buf, ", VFP");
2802 case EF_ARM_MAVERICK_FLOAT:
2803 strcat (buf, ", Maverick FP");
2814 strcat (buf,_(", <unknown>"));
2818 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2820 --size; /* Leave space for null terminator. */
2822 switch (e_flags & EF_AVR_MACH)
2824 case E_AVR_MACH_AVR1:
2825 strncat (buf, ", avr:1", size);
2827 case E_AVR_MACH_AVR2:
2828 strncat (buf, ", avr:2", size);
2830 case E_AVR_MACH_AVR25:
2831 strncat (buf, ", avr:25", size);
2833 case E_AVR_MACH_AVR3:
2834 strncat (buf, ", avr:3", size);
2836 case E_AVR_MACH_AVR31:
2837 strncat (buf, ", avr:31", size);
2839 case E_AVR_MACH_AVR35:
2840 strncat (buf, ", avr:35", size);
2842 case E_AVR_MACH_AVR4:
2843 strncat (buf, ", avr:4", size);
2845 case E_AVR_MACH_AVR5:
2846 strncat (buf, ", avr:5", size);
2848 case E_AVR_MACH_AVR51:
2849 strncat (buf, ", avr:51", size);
2851 case E_AVR_MACH_AVR6:
2852 strncat (buf, ", avr:6", size);
2854 case E_AVR_MACH_AVRTINY:
2855 strncat (buf, ", avr:100", size);
2857 case E_AVR_MACH_XMEGA1:
2858 strncat (buf, ", avr:101", size);
2860 case E_AVR_MACH_XMEGA2:
2861 strncat (buf, ", avr:102", size);
2863 case E_AVR_MACH_XMEGA3:
2864 strncat (buf, ", avr:103", size);
2866 case E_AVR_MACH_XMEGA4:
2867 strncat (buf, ", avr:104", size);
2869 case E_AVR_MACH_XMEGA5:
2870 strncat (buf, ", avr:105", size);
2872 case E_AVR_MACH_XMEGA6:
2873 strncat (buf, ", avr:106", size);
2875 case E_AVR_MACH_XMEGA7:
2876 strncat (buf, ", avr:107", size);
2879 strncat (buf, ", avr:<unknown>", size);
2883 size -= strlen (buf);
2884 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2885 strncat (buf, ", link-relax", size);
2889 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2895 bfd_boolean has_fpu = FALSE;
2898 static const char *ABI_STRINGS[] =
2900 "ABI v0", /* use r5 as return register; only used in N1213HC */
2901 "ABI v1", /* use r0 as return register */
2902 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2903 "ABI v2fp", /* for FPU */
2907 static const char *VER_STRINGS[] =
2909 "Andes ELF V1.3 or older",
2913 static const char *ARCH_STRINGS[] =
2922 abi = EF_NDS_ABI & e_flags;
2923 arch = EF_NDS_ARCH & e_flags;
2924 config = EF_NDS_INST & e_flags;
2925 version = EF_NDS32_ELF_VERSION & e_flags;
2927 memset (buf, 0, size);
2934 case E_NDS_ABI_V2FP:
2935 case E_NDS_ABI_AABI:
2936 case E_NDS_ABI_V2FP_PLUS:
2937 /* In case there are holes in the array. */
2938 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2942 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2948 case E_NDS32_ELF_VER_1_2:
2949 case E_NDS32_ELF_VER_1_3:
2950 case E_NDS32_ELF_VER_1_4:
2951 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2955 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2959 if (E_NDS_ABI_V0 == abi)
2961 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2962 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2963 if (arch == E_NDS_ARCH_STAR_V1_0)
2964 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2970 case E_NDS_ARCH_STAR_V1_0:
2971 case E_NDS_ARCH_STAR_V2_0:
2972 case E_NDS_ARCH_STAR_V3_0:
2973 case E_NDS_ARCH_STAR_V3_M:
2974 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2978 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2979 /* ARCH version determines how the e_flags are interpreted.
2980 If it is unknown, we cannot proceed. */
2984 /* Newer ABI; Now handle architecture specific flags. */
2985 if (arch == E_NDS_ARCH_STAR_V1_0)
2987 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2988 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2990 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2991 r += snprintf (buf + r, size -r, ", MAC");
2993 if (config & E_NDS32_HAS_DIV_INST)
2994 r += snprintf (buf + r, size -r, ", DIV");
2996 if (config & E_NDS32_HAS_16BIT_INST)
2997 r += snprintf (buf + r, size -r, ", 16b");
3001 if (config & E_NDS32_HAS_MFUSR_PC_INST)
3003 if (version <= E_NDS32_ELF_VER_1_3)
3004 r += snprintf (buf + r, size -r, ", [B8]");
3006 r += snprintf (buf + r, size -r, ", EX9");
3009 if (config & E_NDS32_HAS_MAC_DX_INST)
3010 r += snprintf (buf + r, size -r, ", MAC_DX");
3012 if (config & E_NDS32_HAS_DIV_DX_INST)
3013 r += snprintf (buf + r, size -r, ", DIV_DX");
3015 if (config & E_NDS32_HAS_16BIT_INST)
3017 if (version <= E_NDS32_ELF_VER_1_3)
3018 r += snprintf (buf + r, size -r, ", 16b");
3020 r += snprintf (buf + r, size -r, ", IFC");
3024 if (config & E_NDS32_HAS_EXT_INST)
3025 r += snprintf (buf + r, size -r, ", PERF1");
3027 if (config & E_NDS32_HAS_EXT2_INST)
3028 r += snprintf (buf + r, size -r, ", PERF2");
3030 if (config & E_NDS32_HAS_FPU_INST)
3033 r += snprintf (buf + r, size -r, ", FPU_SP");
3036 if (config & E_NDS32_HAS_FPU_DP_INST)
3039 r += snprintf (buf + r, size -r, ", FPU_DP");
3042 if (config & E_NDS32_HAS_FPU_MAC_INST)
3045 r += snprintf (buf + r, size -r, ", FPU_MAC");
3050 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3052 case E_NDS32_FPU_REG_8SP_4DP:
3053 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3055 case E_NDS32_FPU_REG_16SP_8DP:
3056 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3058 case E_NDS32_FPU_REG_32SP_16DP:
3059 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3061 case E_NDS32_FPU_REG_32SP_32DP:
3062 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3067 if (config & E_NDS32_HAS_AUDIO_INST)
3068 r += snprintf (buf + r, size -r, ", AUDIO");
3070 if (config & E_NDS32_HAS_STRING_INST)
3071 r += snprintf (buf + r, size -r, ", STR");
3073 if (config & E_NDS32_HAS_REDUCED_REGS)
3074 r += snprintf (buf + r, size -r, ", 16REG");
3076 if (config & E_NDS32_HAS_VIDEO_INST)
3078 if (version <= E_NDS32_ELF_VER_1_3)
3079 r += snprintf (buf + r, size -r, ", VIDEO");
3081 r += snprintf (buf + r, size -r, ", SATURATION");
3084 if (config & E_NDS32_HAS_ENCRIPT_INST)
3085 r += snprintf (buf + r, size -r, ", ENCRP");
3087 if (config & E_NDS32_HAS_L2C_INST)
3088 r += snprintf (buf + r, size -r, ", L2C");
3092 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3094 static char buf[1024];
3105 case EM_ARC_COMPACT2:
3106 case EM_ARC_COMPACT:
3107 decode_ARC_machine_flags (e_flags, e_machine, buf);
3111 decode_ARM_machine_flags (e_flags, buf);
3115 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3119 if (e_flags & EF_BFIN_PIC)
3120 strcat (buf, ", PIC");
3122 if (e_flags & EF_BFIN_FDPIC)
3123 strcat (buf, ", FDPIC");
3125 if (e_flags & EF_BFIN_CODE_IN_L1)
3126 strcat (buf, ", code in L1");
3128 if (e_flags & EF_BFIN_DATA_IN_L1)
3129 strcat (buf, ", data in L1");
3134 switch (e_flags & EF_FRV_CPU_MASK)
3136 case EF_FRV_CPU_GENERIC:
3140 strcat (buf, ", fr???");
3143 case EF_FRV_CPU_FR300:
3144 strcat (buf, ", fr300");
3147 case EF_FRV_CPU_FR400:
3148 strcat (buf, ", fr400");
3150 case EF_FRV_CPU_FR405:
3151 strcat (buf, ", fr405");
3154 case EF_FRV_CPU_FR450:
3155 strcat (buf, ", fr450");
3158 case EF_FRV_CPU_FR500:
3159 strcat (buf, ", fr500");
3161 case EF_FRV_CPU_FR550:
3162 strcat (buf, ", fr550");
3165 case EF_FRV_CPU_SIMPLE:
3166 strcat (buf, ", simple");
3168 case EF_FRV_CPU_TOMCAT:
3169 strcat (buf, ", tomcat");
3175 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3176 strcat (buf, ", m68000");
3177 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3178 strcat (buf, ", cpu32");
3179 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3180 strcat (buf, ", fido_a");
3183 char const * isa = _("unknown");
3184 char const * mac = _("unknown mac");
3185 char const * additional = NULL;
3187 switch (e_flags & EF_M68K_CF_ISA_MASK)
3189 case EF_M68K_CF_ISA_A_NODIV:
3191 additional = ", nodiv";
3193 case EF_M68K_CF_ISA_A:
3196 case EF_M68K_CF_ISA_A_PLUS:
3199 case EF_M68K_CF_ISA_B_NOUSP:
3201 additional = ", nousp";
3203 case EF_M68K_CF_ISA_B:
3206 case EF_M68K_CF_ISA_C:
3209 case EF_M68K_CF_ISA_C_NODIV:
3211 additional = ", nodiv";
3214 strcat (buf, ", cf, isa ");
3217 strcat (buf, additional);
3218 if (e_flags & EF_M68K_CF_FLOAT)
3219 strcat (buf, ", float");
3220 switch (e_flags & EF_M68K_CF_MAC_MASK)
3225 case EF_M68K_CF_MAC:
3228 case EF_M68K_CF_EMAC:
3231 case EF_M68K_CF_EMAC_B:
3244 switch (e_flags & EF_MEP_CPU_MASK)
3246 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3247 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3248 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3249 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3250 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3251 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3252 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3255 switch (e_flags & EF_MEP_COP_MASK)
3257 case EF_MEP_COP_NONE: break;
3258 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3259 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3260 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3261 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3262 default: strcat (buf, _("<unknown MeP copro type>")); break;
3265 if (e_flags & EF_MEP_LIBRARY)
3266 strcat (buf, ", Built for Library");
3268 if (e_flags & EF_MEP_INDEX_MASK)
3269 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3270 e_flags & EF_MEP_INDEX_MASK);
3272 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3273 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3274 e_flags & ~ EF_MEP_ALL_FLAGS);
3278 if (e_flags & EF_PPC_EMB)
3279 strcat (buf, ", emb");
3281 if (e_flags & EF_PPC_RELOCATABLE)
3282 strcat (buf, _(", relocatable"));
3284 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3285 strcat (buf, _(", relocatable-lib"));
3289 if (e_flags & EF_PPC64_ABI)
3291 char abi[] = ", abiv0";
3293 abi[6] += e_flags & EF_PPC64_ABI;
3299 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3300 strcat (buf, ", RH850 ABI");
3302 if (e_flags & EF_V800_850E3)
3303 strcat (buf, ", V3 architecture");
3305 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3306 strcat (buf, ", FPU not used");
3308 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3309 strcat (buf, ", regmode: COMMON");
3311 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3312 strcat (buf, ", r4 not used");
3314 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3315 strcat (buf, ", r30 not used");
3317 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3318 strcat (buf, ", r5 not used");
3320 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3321 strcat (buf, ", r2 not used");
3323 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3325 switch (e_flags & - e_flags)
3327 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3328 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3329 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3330 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3331 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3332 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3333 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3334 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3335 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3336 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3337 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3338 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3345 case EM_CYGNUS_V850:
3346 switch (e_flags & EF_V850_ARCH)
3348 case E_V850E3V5_ARCH:
3349 strcat (buf, ", v850e3v5");
3351 case E_V850E2V3_ARCH:
3352 strcat (buf, ", v850e2v3");
3355 strcat (buf, ", v850e2");
3358 strcat (buf, ", v850e1");
3361 strcat (buf, ", v850e");
3364 strcat (buf, ", v850");
3367 strcat (buf, _(", unknown v850 architecture variant"));
3373 case EM_CYGNUS_M32R:
3374 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3375 strcat (buf, ", m32r");
3379 case EM_MIPS_RS3_LE:
3380 if (e_flags & EF_MIPS_NOREORDER)
3381 strcat (buf, ", noreorder");
3383 if (e_flags & EF_MIPS_PIC)
3384 strcat (buf, ", pic");
3386 if (e_flags & EF_MIPS_CPIC)
3387 strcat (buf, ", cpic");
3389 if (e_flags & EF_MIPS_UCODE)
3390 strcat (buf, ", ugen_reserved");
3392 if (e_flags & EF_MIPS_ABI2)
3393 strcat (buf, ", abi2");
3395 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3396 strcat (buf, ", odk first");
3398 if (e_flags & EF_MIPS_32BITMODE)
3399 strcat (buf, ", 32bitmode");
3401 if (e_flags & EF_MIPS_NAN2008)
3402 strcat (buf, ", nan2008");
3404 if (e_flags & EF_MIPS_FP64)
3405 strcat (buf, ", fp64");
3407 switch ((e_flags & EF_MIPS_MACH))
3409 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3410 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3411 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3412 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3413 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3414 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3415 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3416 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3417 case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3418 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3419 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3420 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3421 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3422 case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3423 case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3424 case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3425 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3426 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3427 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3428 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3429 case E_MIPS_MACH_IAMR2: strcat (buf, ", interaptiv-mr2"); break;
3431 /* We simply ignore the field in this case to avoid confusion:
3432 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3435 default: strcat (buf, _(", unknown CPU")); break;
3438 switch ((e_flags & EF_MIPS_ABI))
3440 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3441 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3442 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3443 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3445 /* We simply ignore the field in this case to avoid confusion:
3446 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3447 This means it is likely to be an o32 file, but not for
3450 default: strcat (buf, _(", unknown ABI")); break;
3453 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3454 strcat (buf, ", mdmx");
3456 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3457 strcat (buf, ", mips16");
3459 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3460 strcat (buf, ", micromips");
3462 switch ((e_flags & EF_MIPS_ARCH))
3464 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3465 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3466 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3467 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3468 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3469 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3470 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3471 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3472 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3473 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3474 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3475 default: strcat (buf, _(", unknown ISA")); break;
3480 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3484 switch (EF_NFP_MACH (e_flags))
3486 case E_NFP_MACH_3200:
3487 strcat (buf, ", NFP-32xx");
3489 case E_NFP_MACH_6000:
3490 strcat (buf, ", NFP-6xxx");
3496 if (e_flags & EF_RISCV_RVC)
3497 strcat (buf, ", RVC");
3499 if (e_flags & EF_RISCV_RVE)
3500 strcat (buf, ", RVE");
3502 switch (e_flags & EF_RISCV_FLOAT_ABI)
3504 case EF_RISCV_FLOAT_ABI_SOFT:
3505 strcat (buf, ", soft-float ABI");
3508 case EF_RISCV_FLOAT_ABI_SINGLE:
3509 strcat (buf, ", single-float ABI");
3512 case EF_RISCV_FLOAT_ABI_DOUBLE:
3513 strcat (buf, ", double-float ABI");
3516 case EF_RISCV_FLOAT_ABI_QUAD:
3517 strcat (buf, ", quad-float ABI");
3523 switch ((e_flags & EF_SH_MACH_MASK))
3525 case EF_SH1: strcat (buf, ", sh1"); break;
3526 case EF_SH2: strcat (buf, ", sh2"); break;
3527 case EF_SH3: strcat (buf, ", sh3"); break;
3528 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3529 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3530 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3531 case EF_SH3E: strcat (buf, ", sh3e"); break;
3532 case EF_SH4: strcat (buf, ", sh4"); break;
3533 case EF_SH5: strcat (buf, ", sh5"); break;
3534 case EF_SH2E: strcat (buf, ", sh2e"); break;
3535 case EF_SH4A: strcat (buf, ", sh4a"); break;
3536 case EF_SH2A: strcat (buf, ", sh2a"); break;
3537 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3538 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3539 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3540 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3541 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3542 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3543 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3544 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3545 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3546 default: strcat (buf, _(", unknown ISA")); break;
3549 if (e_flags & EF_SH_PIC)
3550 strcat (buf, ", pic");
3552 if (e_flags & EF_SH_FDPIC)
3553 strcat (buf, ", fdpic");
3557 if (e_flags & EF_OR1K_NODELAY)
3558 strcat (buf, ", no delay");
3562 if (e_flags & EF_SPARC_32PLUS)
3563 strcat (buf, ", v8+");
3565 if (e_flags & EF_SPARC_SUN_US1)
3566 strcat (buf, ", ultrasparcI");
3568 if (e_flags & EF_SPARC_SUN_US3)
3569 strcat (buf, ", ultrasparcIII");
3571 if (e_flags & EF_SPARC_HAL_R1)
3572 strcat (buf, ", halr1");
3574 if (e_flags & EF_SPARC_LEDATA)
3575 strcat (buf, ", ledata");
3577 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3578 strcat (buf, ", tso");
3580 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3581 strcat (buf, ", pso");
3583 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3584 strcat (buf, ", rmo");
3588 switch (e_flags & EF_PARISC_ARCH)
3590 case EFA_PARISC_1_0:
3591 strcpy (buf, ", PA-RISC 1.0");
3593 case EFA_PARISC_1_1:
3594 strcpy (buf, ", PA-RISC 1.1");
3596 case EFA_PARISC_2_0:
3597 strcpy (buf, ", PA-RISC 2.0");
3602 if (e_flags & EF_PARISC_TRAPNIL)
3603 strcat (buf, ", trapnil");
3604 if (e_flags & EF_PARISC_EXT)
3605 strcat (buf, ", ext");
3606 if (e_flags & EF_PARISC_LSB)
3607 strcat (buf, ", lsb");
3608 if (e_flags & EF_PARISC_WIDE)
3609 strcat (buf, ", wide");
3610 if (e_flags & EF_PARISC_NO_KABP)
3611 strcat (buf, ", no kabp");
3612 if (e_flags & EF_PARISC_LAZYSWAP)
3613 strcat (buf, ", lazyswap");
3618 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3619 strcat (buf, ", new calling convention");
3621 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3622 strcat (buf, ", gnu calling convention");
3626 if ((e_flags & EF_IA_64_ABI64))
3627 strcat (buf, ", 64-bit");
3629 strcat (buf, ", 32-bit");
3630 if ((e_flags & EF_IA_64_REDUCEDFP))
3631 strcat (buf, ", reduced fp model");
3632 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3633 strcat (buf, ", no function descriptors, constant gp");
3634 else if ((e_flags & EF_IA_64_CONS_GP))
3635 strcat (buf, ", constant gp");
3636 if ((e_flags & EF_IA_64_ABSOLUTE))
3637 strcat (buf, ", absolute");
3638 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3640 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3641 strcat (buf, ", vms_linkages");
3642 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3644 case EF_IA_64_VMS_COMCOD_SUCCESS:
3646 case EF_IA_64_VMS_COMCOD_WARNING:
3647 strcat (buf, ", warning");
3649 case EF_IA_64_VMS_COMCOD_ERROR:
3650 strcat (buf, ", error");
3652 case EF_IA_64_VMS_COMCOD_ABORT:
3653 strcat (buf, ", abort");
3656 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3657 e_flags & EF_IA_64_VMS_COMCOD);
3658 strcat (buf, ", <unknown>");
3664 if ((e_flags & EF_VAX_NONPIC))
3665 strcat (buf, ", non-PIC");
3666 if ((e_flags & EF_VAX_DFLOAT))
3667 strcat (buf, ", D-Float");
3668 if ((e_flags & EF_VAX_GFLOAT))
3669 strcat (buf, ", G-Float");
3673 if (e_flags & EF_VISIUM_ARCH_MCM)
3674 strcat (buf, ", mcm");
3675 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3676 strcat (buf, ", mcm24");
3677 if (e_flags & EF_VISIUM_ARCH_GR6)
3678 strcat (buf, ", gr6");
3682 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3684 case E_FLAG_RL78_ANY_CPU: break;
3685 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3686 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3687 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3689 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3690 strcat (buf, ", 64-bit doubles");
3694 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3695 strcat (buf, ", 64-bit doubles");
3696 if (e_flags & E_FLAG_RX_DSP)
3697 strcat (buf, ", dsp");
3698 if (e_flags & E_FLAG_RX_PID)
3699 strcat (buf, ", pid");
3700 if (e_flags & E_FLAG_RX_ABI)
3701 strcat (buf, ", RX ABI");
3702 if (e_flags & E_FLAG_RX_SINSNS_SET)
3703 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3704 ? ", uses String instructions" : ", bans String instructions");
3705 if (e_flags & E_FLAG_RX_V2)
3706 strcat (buf, ", V2");
3707 if (e_flags & E_FLAG_RX_V3)
3708 strcat (buf, ", V3");
3712 if (e_flags & EF_S390_HIGH_GPRS)
3713 strcat (buf, ", highgprs");
3717 if ((e_flags & EF_C6000_REL))
3718 strcat (buf, ", relocatable module");
3722 strcat (buf, _(": architecture variant: "));
3723 switch (e_flags & EF_MSP430_MACH)
3725 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3726 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3727 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3728 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3729 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3730 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3731 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3732 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3733 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3734 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3735 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3736 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3737 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3738 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3739 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3741 strcat (buf, _(": unknown")); break;
3744 if (e_flags & ~ EF_MSP430_MACH)
3745 strcat (buf, _(": unknown extra flag bits also present"));
3753 get_osabi_name (Filedata * filedata, unsigned int osabi)
3755 static char buff[32];
3759 case ELFOSABI_NONE: return "UNIX - System V";
3760 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3761 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3762 case ELFOSABI_GNU: return "UNIX - GNU";
3763 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3764 case ELFOSABI_AIX: return "UNIX - AIX";
3765 case ELFOSABI_IRIX: return "UNIX - IRIX";
3766 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3767 case ELFOSABI_TRU64: return "UNIX - TRU64";
3768 case ELFOSABI_MODESTO: return "Novell - Modesto";
3769 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3770 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3771 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3772 case ELFOSABI_AROS: return "AROS";
3773 case ELFOSABI_FENIXOS: return "FenixOS";
3774 case ELFOSABI_CLOUDABI: return "Nuxi CloudABI";
3775 case ELFOSABI_OPENVOS: return "Stratus Technologies OpenVOS";
3778 switch (filedata->file_header.e_machine)
3783 case ELFOSABI_ARM: return "ARM";
3784 case ELFOSABI_ARM_FDPIC: return "ARM FDPIC";
3795 case ELFOSABI_STANDALONE: return _("Standalone App");
3804 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3805 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3814 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3820 get_aarch64_segment_type (unsigned long type)
3824 case PT_AARCH64_ARCHEXT: return "AARCH64_ARCHEXT";
3825 default: return NULL;
3830 get_arm_segment_type (unsigned long type)
3834 case PT_ARM_EXIDX: return "EXIDX";
3835 default: return NULL;
3840 get_s390_segment_type (unsigned long type)
3844 case PT_S390_PGSTE: return "S390_PGSTE";
3845 default: return NULL;
3850 get_mips_segment_type (unsigned long type)
3854 case PT_MIPS_REGINFO: return "REGINFO";
3855 case PT_MIPS_RTPROC: return "RTPROC";
3856 case PT_MIPS_OPTIONS: return "OPTIONS";
3857 case PT_MIPS_ABIFLAGS: return "ABIFLAGS";
3858 default: return NULL;
3863 get_parisc_segment_type (unsigned long type)
3867 case PT_HP_TLS: return "HP_TLS";
3868 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3869 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3870 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3871 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3872 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3873 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3874 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3875 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3876 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3877 case PT_HP_PARALLEL: return "HP_PARALLEL";
3878 case PT_HP_FASTBIND: return "HP_FASTBIND";
3879 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3880 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3881 case PT_HP_STACK: return "HP_STACK";
3882 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3883 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3884 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3885 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3886 default: return NULL;
3891 get_ia64_segment_type (unsigned long type)
3895 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3896 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3897 case PT_HP_TLS: return "HP_TLS";
3898 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3899 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3900 case PT_IA_64_HP_STACK: return "HP_STACK";
3901 default: return NULL;
3906 get_tic6x_segment_type (unsigned long type)
3910 case PT_C6000_PHATTR: return "C6000_PHATTR";
3911 default: return NULL;
3916 get_solaris_segment_type (unsigned long type)
3920 case 0x6464e550: return "PT_SUNW_UNWIND";
3921 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3922 case 0x6ffffff7: return "PT_LOSUNW";
3923 case 0x6ffffffa: return "PT_SUNWBSS";
3924 case 0x6ffffffb: return "PT_SUNWSTACK";
3925 case 0x6ffffffc: return "PT_SUNWDTRACE";
3926 case 0x6ffffffd: return "PT_SUNWCAP";
3927 case 0x6fffffff: return "PT_HISUNW";
3928 default: return NULL;
3933 get_segment_type (Filedata * filedata, unsigned long p_type)
3935 static char buff[32];
3939 case PT_NULL: return "NULL";
3940 case PT_LOAD: return "LOAD";
3941 case PT_DYNAMIC: return "DYNAMIC";
3942 case PT_INTERP: return "INTERP";
3943 case PT_NOTE: return "NOTE";
3944 case PT_SHLIB: return "SHLIB";
3945 case PT_PHDR: return "PHDR";
3946 case PT_TLS: return "TLS";
3947 case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3948 case PT_GNU_STACK: return "GNU_STACK";
3949 case PT_GNU_RELRO: return "GNU_RELRO";
3950 case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3953 if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3955 sprintf (buff, "GNU_MBIND+%#lx",
3956 p_type - PT_GNU_MBIND_LO);
3958 else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3960 const char * result;
3962 switch (filedata->file_header.e_machine)
3965 result = get_aarch64_segment_type (p_type);
3968 result = get_arm_segment_type (p_type);
3971 case EM_MIPS_RS3_LE:
3972 result = get_mips_segment_type (p_type);
3975 result = get_parisc_segment_type (p_type);
3978 result = get_ia64_segment_type (p_type);
3981 result = get_tic6x_segment_type (p_type);
3985 result = get_s390_segment_type (p_type);
3995 sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3997 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3999 const char * result;
4001 switch (filedata->file_header.e_machine)
4004 result = get_parisc_segment_type (p_type);
4007 result = get_ia64_segment_type (p_type);
4010 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4011 result = get_solaris_segment_type (p_type);
4020 sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4023 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4030 get_arc_section_type_name (unsigned int sh_type)
4034 case SHT_ARC_ATTRIBUTES: return "ARC_ATTRIBUTES";
4042 get_mips_section_type_name (unsigned int sh_type)
4046 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
4047 case SHT_MIPS_MSYM: return "MIPS_MSYM";
4048 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
4049 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
4050 case SHT_MIPS_UCODE: return "MIPS_UCODE";
4051 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
4052 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
4053 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
4054 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
4055 case SHT_MIPS_RELD: return "MIPS_RELD";
4056 case SHT_MIPS_IFACE: return "MIPS_IFACE";
4057 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
4058 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
4059 case SHT_MIPS_SHDR: return "MIPS_SHDR";
4060 case SHT_MIPS_FDESC: return "MIPS_FDESC";
4061 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
4062 case SHT_MIPS_DENSE: return "MIPS_DENSE";
4063 case SHT_MIPS_PDESC: return "MIPS_PDESC";
4064 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
4065 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
4066 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
4067 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
4068 case SHT_MIPS_LINE: return "MIPS_LINE";
4069 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
4070 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
4071 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
4072 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
4073 case SHT_MIPS_DWARF: return "MIPS_DWARF";
4074 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
4075 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
4076 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
4077 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
4078 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
4079 case SHT_MIPS_XLATE: return "MIPS_XLATE";
4080 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
4081 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
4082 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
4083 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
4084 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4085 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
4093 get_parisc_section_type_name (unsigned int sh_type)
4097 case SHT_PARISC_EXT: return "PARISC_EXT";
4098 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
4099 case SHT_PARISC_DOC: return "PARISC_DOC";
4100 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
4101 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
4102 case SHT_PARISC_STUBS: return "PARISC_STUBS";
4103 case SHT_PARISC_DLKM: return "PARISC_DLKM";
4104 default: return NULL;
4109 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4111 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
4112 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4113 return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4117 case SHT_IA_64_EXT: return "IA_64_EXT";
4118 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
4119 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
4120 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
4121 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4122 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
4123 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
4124 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
4125 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
4126 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
4134 get_x86_64_section_type_name (unsigned int sh_type)
4138 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
4139 default: return NULL;
4144 get_aarch64_section_type_name (unsigned int sh_type)
4148 case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4149 default: return NULL;
4154 get_arm_section_type_name (unsigned int sh_type)
4158 case SHT_ARM_EXIDX: return "ARM_EXIDX";
4159 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
4160 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
4161 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
4162 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
4163 default: return NULL;
4168 get_tic6x_section_type_name (unsigned int sh_type)
4172 case SHT_C6000_UNWIND: return "C6000_UNWIND";
4173 case SHT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
4174 case SHT_C6000_ATTRIBUTES: return "C6000_ATTRIBUTES";
4175 case SHT_TI_ICODE: return "TI_ICODE";
4176 case SHT_TI_XREF: return "TI_XREF";
4177 case SHT_TI_HANDLER: return "TI_HANDLER";
4178 case SHT_TI_INITINFO: return "TI_INITINFO";
4179 case SHT_TI_PHATTRS: return "TI_PHATTRS";
4180 default: return NULL;
4185 get_msp430x_section_type_name (unsigned int sh_type)
4189 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
4190 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
4191 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
4192 default: return NULL;
4197 get_nfp_section_type_name (unsigned int sh_type)
4201 case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
4202 case SHT_NFP_INITREG: return "NFP_INITREG";
4203 case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
4204 default: return NULL;
4209 get_v850_section_type_name (unsigned int sh_type)
4213 case SHT_V850_SCOMMON: return "V850 Small Common";
4214 case SHT_V850_TCOMMON: return "V850 Tiny Common";
4215 case SHT_V850_ZCOMMON: return "V850 Zero Common";
4216 case SHT_RENESAS_IOP: return "RENESAS IOP";
4217 case SHT_RENESAS_INFO: return "RENESAS INFO";
4218 default: return NULL;
4223 get_riscv_section_type_name (unsigned int sh_type)
4227 case SHT_RISCV_ATTRIBUTES: return "RISCV_ATTRIBUTES";
4228 default: return NULL;
4233 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4235 static char buff[32];
4236 const char * result;
4240 case SHT_NULL: return "NULL";
4241 case SHT_PROGBITS: return "PROGBITS";
4242 case SHT_SYMTAB: return "SYMTAB";
4243 case SHT_STRTAB: return "STRTAB";
4244 case SHT_RELA: return "RELA";
4245 case SHT_HASH: return "HASH";
4246 case SHT_DYNAMIC: return "DYNAMIC";
4247 case SHT_NOTE: return "NOTE";
4248 case SHT_NOBITS: return "NOBITS";
4249 case SHT_REL: return "REL";
4250 case SHT_SHLIB: return "SHLIB";
4251 case SHT_DYNSYM: return "DYNSYM";
4252 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4253 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4254 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4255 case SHT_GNU_HASH: return "GNU_HASH";
4256 case SHT_GROUP: return "GROUP";
4257 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICES";
4258 case SHT_GNU_verdef: return "VERDEF";
4259 case SHT_GNU_verneed: return "VERNEED";
4260 case SHT_GNU_versym: return "VERSYM";
4261 case 0x6ffffff0: return "VERSYM";
4262 case 0x6ffffffc: return "VERDEF";
4263 case 0x7ffffffd: return "AUXILIARY";
4264 case 0x7fffffff: return "FILTER";
4265 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4268 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4270 switch (filedata->file_header.e_machine)
4273 case EM_ARC_COMPACT:
4274 case EM_ARC_COMPACT2:
4275 result = get_arc_section_type_name (sh_type);
4278 case EM_MIPS_RS3_LE:
4279 result = get_mips_section_type_name (sh_type);
4282 result = get_parisc_section_type_name (sh_type);
4285 result = get_ia64_section_type_name (filedata, sh_type);
4290 result = get_x86_64_section_type_name (sh_type);
4293 result = get_aarch64_section_type_name (sh_type);
4296 result = get_arm_section_type_name (sh_type);
4299 result = get_tic6x_section_type_name (sh_type);
4302 result = get_msp430x_section_type_name (sh_type);
4305 result = get_nfp_section_type_name (sh_type);
4309 case EM_CYGNUS_V850:
4310 result = get_v850_section_type_name (sh_type);
4313 result = get_riscv_section_type_name (sh_type);
4323 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4325 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4327 switch (filedata->file_header.e_machine)
4330 result = get_ia64_section_type_name (filedata, sh_type);
4333 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4334 result = get_solaris_section_type (sh_type);
4339 case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4340 case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4341 case SHT_GNU_HASH: result = "GNU_HASH"; break;
4342 case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4354 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4356 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4358 switch (filedata->file_header.e_machine)
4362 case EM_CYGNUS_V850:
4363 result = get_v850_section_type_name (sh_type);
4373 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4376 /* This message is probably going to be displayed in a 15
4377 character wide field, so put the hex value first. */
4378 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4384 #define OPTION_DEBUG_DUMP 512
4385 #define OPTION_DYN_SYMS 513
4386 #define OPTION_DWARF_DEPTH 514
4387 #define OPTION_DWARF_START 515
4388 #define OPTION_DWARF_CHECK 516
4390 static struct option options[] =
4392 {"all", no_argument, 0, 'a'},
4393 {"file-header", no_argument, 0, 'h'},
4394 {"program-headers", no_argument, 0, 'l'},
4395 {"headers", no_argument, 0, 'e'},
4396 {"histogram", no_argument, 0, 'I'},
4397 {"segments", no_argument, 0, 'l'},
4398 {"sections", no_argument, 0, 'S'},
4399 {"section-headers", no_argument, 0, 'S'},
4400 {"section-groups", no_argument, 0, 'g'},
4401 {"section-details", no_argument, 0, 't'},
4402 {"full-section-name",no_argument, 0, 'N'},
4403 {"symbols", no_argument, 0, 's'},
4404 {"syms", no_argument, 0, 's'},
4405 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4406 {"relocs", no_argument, 0, 'r'},
4407 {"notes", no_argument, 0, 'n'},
4408 {"dynamic", no_argument, 0, 'd'},
4409 {"arch-specific", no_argument, 0, 'A'},
4410 {"version-info", no_argument, 0, 'V'},
4411 {"use-dynamic", no_argument, 0, 'D'},
4412 {"unwind", no_argument, 0, 'u'},
4413 {"archive-index", no_argument, 0, 'c'},
4414 {"hex-dump", required_argument, 0, 'x'},
4415 {"relocated-dump", required_argument, 0, 'R'},
4416 {"string-dump", required_argument, 0, 'p'},
4417 {"decompress", no_argument, 0, 'z'},
4418 #ifdef SUPPORT_DISASSEMBLY
4419 {"instruction-dump", required_argument, 0, 'i'},
4421 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4423 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4424 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4425 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4427 {"version", no_argument, 0, 'v'},
4428 {"wide", no_argument, 0, 'W'},
4429 {"help", no_argument, 0, 'H'},
4430 {0, no_argument, 0, 0}
4434 usage (FILE * stream)
4436 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4437 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4438 fprintf (stream, _(" Options are:\n\
4439 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4440 -h --file-header Display the ELF file header\n\
4441 -l --program-headers Display the program headers\n\
4442 --segments An alias for --program-headers\n\
4443 -S --section-headers Display the sections' header\n\
4444 --sections An alias for --section-headers\n\
4445 -g --section-groups Display the section groups\n\
4446 -t --section-details Display the section details\n\
4447 -e --headers Equivalent to: -h -l -S\n\
4448 -s --syms Display the symbol table\n\
4449 --symbols An alias for --syms\n\
4450 --dyn-syms Display the dynamic symbol table\n\
4451 -n --notes Display the core notes (if present)\n\
4452 -r --relocs Display the relocations (if present)\n\
4453 -u --unwind Display the unwind info (if present)\n\
4454 -d --dynamic Display the dynamic section (if present)\n\
4455 -V --version-info Display the version sections (if present)\n\
4456 -A --arch-specific Display architecture specific information (if any)\n\
4457 -c --archive-index Display the symbol/file index in an archive\n\
4458 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4459 -x --hex-dump=<number|name>\n\
4460 Dump the contents of section <number|name> as bytes\n\
4461 -p --string-dump=<number|name>\n\
4462 Dump the contents of section <number|name> as strings\n\
4463 -R --relocated-dump=<number|name>\n\
4464 Dump the contents of section <number|name> as relocated bytes\n\
4465 -z --decompress Decompress section before dumping it\n\
4466 -w[lLiaprmfFsoRtUuTgAckK] or\n\
4467 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4468 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4469 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4470 =addr,=cu_index,=links,=follow-links]\n\
4471 Display the contents of DWARF debug sections\n"));
4472 fprintf (stream, _("\
4473 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4474 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4476 #ifdef SUPPORT_DISASSEMBLY
4477 fprintf (stream, _("\
4478 -i --instruction-dump=<number|name>\n\
4479 Disassemble the contents of section <number|name>\n"));
4481 fprintf (stream, _("\
4482 -I --histogram Display histogram of bucket list lengths\n\
4483 -W --wide Allow output width to exceed 80 characters\n\
4484 @<file> Read options from <file>\n\
4485 -H --help Display this information\n\
4486 -v --version Display the version number of readelf\n"));
4488 if (REPORT_BUGS_TO[0] && stream == stdout)
4489 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4491 exit (stream == stdout ? 0 : 1);
4494 /* Record the fact that the user wants the contents of section number
4495 SECTION to be displayed using the method(s) encoded as flags bits
4496 in TYPE. Note, TYPE can be zero if we are creating the array for
4500 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4502 if (section >= filedata->num_dump_sects)
4504 dump_type * new_dump_sects;
4506 new_dump_sects = (dump_type *) calloc (section + 1,
4507 sizeof (* new_dump_sects));
4509 if (new_dump_sects == NULL)
4510 error (_("Out of memory allocating dump request table.\n"));
4513 if (filedata->dump_sects)
4515 /* Copy current flag settings. */
4516 memcpy (new_dump_sects, filedata->dump_sects,
4517 filedata->num_dump_sects * sizeof (* new_dump_sects));
4519 free (filedata->dump_sects);
4522 filedata->dump_sects = new_dump_sects;
4523 filedata->num_dump_sects = section + 1;
4527 if (filedata->dump_sects)
4528 filedata->dump_sects[section] |= type;
4531 /* Request a dump by section name. */
4534 request_dump_byname (const char * section, dump_type type)
4536 struct dump_list_entry * new_request;
4538 new_request = (struct dump_list_entry *)
4539 malloc (sizeof (struct dump_list_entry));
4541 error (_("Out of memory allocating dump request table.\n"));
4543 new_request->name = strdup (section);
4544 if (!new_request->name)
4545 error (_("Out of memory allocating dump request table.\n"));
4547 new_request->type = type;
4549 new_request->next = dump_sects_byname;
4550 dump_sects_byname = new_request;
4554 request_dump (Filedata * filedata, dump_type type)
4560 section = strtoul (optarg, & cp, 0);
4562 if (! *cp && section >= 0)
4563 request_dump_bynumber (filedata, section, type);
4565 request_dump_byname (optarg, type);
4569 parse_args (Filedata * filedata, int argc, char ** argv)
4576 while ((c = getopt_long
4577 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4595 do_section_groups = TRUE;
4598 do_histogram = TRUE;
4603 do_section_groups = TRUE;
4608 do_section_details = TRUE;
4619 do_using_dynamic = TRUE;
4643 do_histogram = TRUE;
4649 do_archive_index = TRUE;
4652 request_dump (filedata, HEX_DUMP);
4655 request_dump (filedata, STRING_DUMP);
4658 request_dump (filedata, RELOC_DUMP);
4661 decompress_dumps = TRUE;
4667 do_debugging = TRUE;
4668 dwarf_select_sections_all ();
4672 do_debugging = FALSE;
4673 dwarf_select_sections_by_letters (optarg);
4676 case OPTION_DEBUG_DUMP:
4679 do_debugging = TRUE;
4682 do_debugging = FALSE;
4683 dwarf_select_sections_by_names (optarg);
4686 case OPTION_DWARF_DEPTH:
4690 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4693 case OPTION_DWARF_START:
4697 dwarf_start_die = strtoul (optarg, & cp, 0);
4700 case OPTION_DWARF_CHECK:
4703 case OPTION_DYN_SYMS:
4706 #ifdef SUPPORT_DISASSEMBLY
4708 request_dump (filedata, DISASS_DUMP);
4712 print_version (program_name);
4721 /* xgettext:c-format */
4722 error (_("Invalid option '-%c'\n"), c);
4729 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4730 && !do_segments && !do_header && !do_dump && !do_version
4731 && !do_histogram && !do_debugging && !do_arch && !do_notes
4732 && !do_section_groups && !do_archive_index
4738 get_elf_class (unsigned int elf_class)
4740 static char buff[32];
4744 case ELFCLASSNONE: return _("none");
4745 case ELFCLASS32: return "ELF32";
4746 case ELFCLASS64: return "ELF64";
4748 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4754 get_data_encoding (unsigned int encoding)
4756 static char buff[32];
4760 case ELFDATANONE: return _("none");
4761 case ELFDATA2LSB: return _("2's complement, little endian");
4762 case ELFDATA2MSB: return _("2's complement, big endian");
4764 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4769 /* Decode the data held in 'filedata->file_header'. */
4772 process_file_header (Filedata * filedata)
4774 Elf_Internal_Ehdr * header = & filedata->file_header;
4776 if ( header->e_ident[EI_MAG0] != ELFMAG0
4777 || header->e_ident[EI_MAG1] != ELFMAG1
4778 || header->e_ident[EI_MAG2] != ELFMAG2
4779 || header->e_ident[EI_MAG3] != ELFMAG3)
4782 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4786 init_dwarf_regnames (header->e_machine);
4792 printf (_("ELF Header:\n"));
4793 printf (_(" Magic: "));
4794 for (i = 0; i < EI_NIDENT; i++)
4795 printf ("%2.2x ", header->e_ident[i]);
4797 printf (_(" Class: %s\n"),
4798 get_elf_class (header->e_ident[EI_CLASS]));
4799 printf (_(" Data: %s\n"),
4800 get_data_encoding (header->e_ident[EI_DATA]));
4801 printf (_(" Version: %d%s\n"),
4802 header->e_ident[EI_VERSION],
4803 (header->e_ident[EI_VERSION] == EV_CURRENT
4805 : (header->e_ident[EI_VERSION] != EV_NONE
4808 printf (_(" OS/ABI: %s\n"),
4809 get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4810 printf (_(" ABI Version: %d\n"),
4811 header->e_ident[EI_ABIVERSION]);
4812 printf (_(" Type: %s\n"),
4813 get_file_type (header->e_type));
4814 printf (_(" Machine: %s\n"),
4815 get_machine_name (header->e_machine));
4816 printf (_(" Version: 0x%lx\n"),
4819 printf (_(" Entry point address: "));
4820 print_vma (header->e_entry, PREFIX_HEX);
4821 printf (_("\n Start of program headers: "));
4822 print_vma (header->e_phoff, DEC);
4823 printf (_(" (bytes into file)\n Start of section headers: "));
4824 print_vma (header->e_shoff, DEC);
4825 printf (_(" (bytes into file)\n"));
4827 printf (_(" Flags: 0x%lx%s\n"),
4829 get_machine_flags (filedata, header->e_flags, header->e_machine));
4830 printf (_(" Size of this header: %u (bytes)\n"),
4832 printf (_(" Size of program headers: %u (bytes)\n"),
4833 header->e_phentsize);
4834 printf (_(" Number of program headers: %u"),
4836 if (filedata->section_headers != NULL
4837 && header->e_phnum == PN_XNUM
4838 && filedata->section_headers[0].sh_info != 0)
4840 header->e_phnum = filedata->section_headers[0].sh_info;
4841 printf (" (%u)", header->e_phnum);
4843 putc ('\n', stdout);
4844 printf (_(" Size of section headers: %u (bytes)\n"),
4845 header->e_shentsize);
4846 printf (_(" Number of section headers: %u"),
4848 if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4850 header->e_shnum = filedata->section_headers[0].sh_size;
4851 printf (" (%u)", header->e_shnum);
4853 putc ('\n', stdout);
4854 printf (_(" Section header string table index: %u"),
4855 header->e_shstrndx);
4856 if (filedata->section_headers != NULL
4857 && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4859 header->e_shstrndx = filedata->section_headers[0].sh_link;
4860 printf (" (%u)", header->e_shstrndx);
4862 if (header->e_shstrndx != SHN_UNDEF
4863 && header->e_shstrndx >= header->e_shnum)
4865 header->e_shstrndx = SHN_UNDEF;
4866 printf (_(" <corrupt: out of range>"));
4868 putc ('\n', stdout);
4871 if (filedata->section_headers != NULL)
4873 if (header->e_phnum == PN_XNUM
4874 && filedata->section_headers[0].sh_info != 0)
4875 header->e_phnum = filedata->section_headers[0].sh_info;
4876 if (header->e_shnum == SHN_UNDEF)
4877 header->e_shnum = filedata->section_headers[0].sh_size;
4878 if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4879 header->e_shstrndx = filedata->section_headers[0].sh_link;
4880 if (header->e_shstrndx >= header->e_shnum)
4881 header->e_shstrndx = SHN_UNDEF;
4882 free (filedata->section_headers);
4883 filedata->section_headers = NULL;
4889 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4890 Returns TRUE upon success, FALSE otherwise. Loads 32-bit headers. */
4893 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4895 Elf32_External_Phdr * phdrs;
4896 Elf32_External_Phdr * external;
4897 Elf_Internal_Phdr * internal;
4899 unsigned int size = filedata->file_header.e_phentsize;
4900 unsigned int num = filedata->file_header.e_phnum;
4902 /* PR binutils/17531: Cope with unexpected section header sizes. */
4903 if (size == 0 || num == 0)
4905 if (size < sizeof * phdrs)
4907 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4910 if (size > sizeof * phdrs)
4911 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4913 phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4914 size, num, _("program headers"));
4918 for (i = 0, internal = pheaders, external = phdrs;
4919 i < filedata->file_header.e_phnum;
4920 i++, internal++, external++)
4922 internal->p_type = BYTE_GET (external->p_type);
4923 internal->p_offset = BYTE_GET (external->p_offset);
4924 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4925 internal->p_paddr = BYTE_GET (external->p_paddr);
4926 internal->p_filesz = BYTE_GET (external->p_filesz);
4927 internal->p_memsz = BYTE_GET (external->p_memsz);
4928 internal->p_flags = BYTE_GET (external->p_flags);
4929 internal->p_align = BYTE_GET (external->p_align);
4936 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4937 Returns TRUE upon success, FALSE otherwise. Loads 64-bit headers. */
4940 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4942 Elf64_External_Phdr * phdrs;
4943 Elf64_External_Phdr * external;
4944 Elf_Internal_Phdr * internal;
4946 unsigned int size = filedata->file_header.e_phentsize;
4947 unsigned int num = filedata->file_header.e_phnum;
4949 /* PR binutils/17531: Cope with unexpected section header sizes. */
4950 if (size == 0 || num == 0)
4952 if (size < sizeof * phdrs)
4954 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4957 if (size > sizeof * phdrs)
4958 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4960 phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4961 size, num, _("program headers"));
4965 for (i = 0, internal = pheaders, external = phdrs;
4966 i < filedata->file_header.e_phnum;
4967 i++, internal++, external++)
4969 internal->p_type = BYTE_GET (external->p_type);
4970 internal->p_flags = BYTE_GET (external->p_flags);
4971 internal->p_offset = BYTE_GET (external->p_offset);
4972 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4973 internal->p_paddr = BYTE_GET (external->p_paddr);
4974 internal->p_filesz = BYTE_GET (external->p_filesz);
4975 internal->p_memsz = BYTE_GET (external->p_memsz);
4976 internal->p_align = BYTE_GET (external->p_align);
4983 /* Returns TRUE if the program headers were read into `program_headers'. */
4986 get_program_headers (Filedata * filedata)
4988 Elf_Internal_Phdr * phdrs;
4990 /* Check cache of prior read. */
4991 if (filedata->program_headers != NULL)
4994 /* Be kind to memory checkers by looking for
4995 e_phnum values which we know must be invalid. */
4996 if (filedata->file_header.e_phnum
4997 * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4998 >= filedata->file_size)
5000 error (_("Too many program headers - %#x - the file is not that big\n"),
5001 filedata->file_header.e_phnum);
5005 phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5006 sizeof (Elf_Internal_Phdr));
5009 error (_("Out of memory reading %u program headers\n"),
5010 filedata->file_header.e_phnum);
5015 ? get_32bit_program_headers (filedata, phdrs)
5016 : get_64bit_program_headers (filedata, phdrs))
5018 filedata->program_headers = phdrs;
5026 /* Returns TRUE if the program headers were loaded. */
5029 process_program_headers (Filedata * filedata)
5031 Elf_Internal_Phdr * segment;
5033 Elf_Internal_Phdr * previous_load = NULL;
5035 if (filedata->file_header.e_phnum == 0)
5037 /* PR binutils/12467. */
5038 if (filedata->file_header.e_phoff != 0)
5040 warn (_("possibly corrupt ELF header - it has a non-zero program"
5041 " header offset, but no program headers\n"));
5044 else if (do_segments)
5045 printf (_("\nThere are no program headers in this file.\n"));
5049 if (do_segments && !do_header)
5051 printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5052 printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5053 printf (ngettext ("There is %d program header, starting at offset %s\n",
5054 "There are %d program headers, starting at offset %s\n",
5055 filedata->file_header.e_phnum),
5056 filedata->file_header.e_phnum,
5057 bfd_vmatoa ("u", filedata->file_header.e_phoff));
5060 if (! get_program_headers (filedata))
5065 if (filedata->file_header.e_phnum > 1)
5066 printf (_("\nProgram Headers:\n"));
5068 printf (_("\nProgram Headers:\n"));
5072 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5075 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
5079 (_(" Type Offset VirtAddr PhysAddr\n"));
5081 (_(" FileSiz MemSiz Flags Align\n"));
5088 for (i = 0, segment = filedata->program_headers;
5089 i < filedata->file_header.e_phnum;
5094 printf (" %-14.14s ", get_segment_type (filedata, segment->p_type));
5098 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5099 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5100 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5101 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5102 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5104 (segment->p_flags & PF_R ? 'R' : ' '),
5105 (segment->p_flags & PF_W ? 'W' : ' '),
5106 (segment->p_flags & PF_X ? 'E' : ' '));
5107 printf ("%#lx", (unsigned long) segment->p_align);
5111 if ((unsigned long) segment->p_offset == segment->p_offset)
5112 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5115 print_vma (segment->p_offset, FULL_HEX);
5119 print_vma (segment->p_vaddr, FULL_HEX);
5121 print_vma (segment->p_paddr, FULL_HEX);
5124 if ((unsigned long) segment->p_filesz == segment->p_filesz)
5125 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5128 print_vma (segment->p_filesz, FULL_HEX);
5132 if ((unsigned long) segment->p_memsz == segment->p_memsz)
5133 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5136 print_vma (segment->p_memsz, FULL_HEX);
5140 (segment->p_flags & PF_R ? 'R' : ' '),
5141 (segment->p_flags & PF_W ? 'W' : ' '),
5142 (segment->p_flags & PF_X ? 'E' : ' '));
5144 if ((unsigned long) segment->p_align == segment->p_align)
5145 printf ("%#lx", (unsigned long) segment->p_align);
5148 print_vma (segment->p_align, PREFIX_HEX);
5153 print_vma (segment->p_offset, FULL_HEX);
5155 print_vma (segment->p_vaddr, FULL_HEX);
5157 print_vma (segment->p_paddr, FULL_HEX);
5159 print_vma (segment->p_filesz, FULL_HEX);
5161 print_vma (segment->p_memsz, FULL_HEX);
5163 (segment->p_flags & PF_R ? 'R' : ' '),
5164 (segment->p_flags & PF_W ? 'W' : ' '),
5165 (segment->p_flags & PF_X ? 'E' : ' '));
5166 print_vma (segment->p_align, PREFIX_HEX);
5169 putc ('\n', stdout);
5172 switch (segment->p_type)
5175 #if 0 /* Do not warn about out of order PT_LOAD segments. Although officially
5176 required by the ELF standard, several programs, including the Linux
5177 kernel, make use of non-ordered segments. */
5179 && previous_load->p_vaddr > segment->p_vaddr)
5180 error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5182 if (segment->p_memsz < segment->p_filesz)
5183 error (_("the segment's file size is larger than its memory size\n"));
5184 previous_load = segment;
5188 /* PR 20815 - Verify that the program header is loaded into memory. */
5189 if (i > 0 && previous_load != NULL)
5190 error (_("the PHDR segment must occur before any LOAD segment\n"));
5191 if (filedata->file_header.e_machine != EM_PARISC)
5195 for (j = 1; j < filedata->file_header.e_phnum; j++)
5196 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5197 && (filedata->program_headers[j].p_vaddr
5198 + filedata->program_headers[j].p_memsz)
5199 >= (segment->p_vaddr + segment->p_filesz))
5201 if (j == filedata->file_header.e_phnum)
5202 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5208 error (_("more than one dynamic segment\n"));
5210 /* By default, assume that the .dynamic section is the first
5211 section in the DYNAMIC segment. */
5212 dynamic_addr = segment->p_offset;
5213 dynamic_size = segment->p_filesz;
5215 /* Try to locate the .dynamic section. If there is
5216 a section header table, we can easily locate it. */
5217 if (filedata->section_headers != NULL)
5219 Elf_Internal_Shdr * sec;
5221 sec = find_section (filedata, ".dynamic");
5222 if (sec == NULL || sec->sh_size == 0)
5224 /* A corresponding .dynamic section is expected, but on
5225 IA-64/OpenVMS it is OK for it to be missing. */
5226 if (!is_ia64_vms (filedata))
5227 error (_("no .dynamic section in the dynamic segment\n"));
5231 if (sec->sh_type == SHT_NOBITS)
5237 dynamic_addr = sec->sh_offset;
5238 dynamic_size = sec->sh_size;
5240 if (dynamic_addr < segment->p_offset
5241 || dynamic_addr > segment->p_offset + segment->p_filesz)
5242 warn (_("the .dynamic section is not contained"
5243 " within the dynamic segment\n"));
5244 else if (dynamic_addr > segment->p_offset)
5245 warn (_("the .dynamic section is not the first section"
5246 " in the dynamic segment.\n"));
5249 /* PR binutils/17512: Avoid corrupt dynamic section info in the
5250 segment. Check this after matching against the section headers
5251 so we don't warn on debuginfo file (which have NOBITS .dynamic
5253 if (dynamic_addr > filedata->file_size
5254 || dynamic_size > filedata->file_size - dynamic_addr)
5256 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5257 dynamic_addr = dynamic_size = 0;
5262 if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5264 error (_("Unable to find program interpreter name\n"));
5268 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5270 if (ret >= (int) sizeof (fmt) || ret < 0)
5271 error (_("Internal error: failed to create format string to display program interpreter\n"));
5273 program_interpreter[0] = 0;
5274 if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5275 error (_("Unable to read program interpreter name\n"));
5278 printf (_(" [Requesting program interpreter: %s]\n"),
5279 program_interpreter);
5286 && filedata->section_headers != NULL
5287 && filedata->string_table != NULL)
5289 printf (_("\n Section to Segment mapping:\n"));
5290 printf (_(" Segment Sections...\n"));
5292 for (i = 0; i < filedata->file_header.e_phnum; i++)
5295 Elf_Internal_Shdr * section;
5297 segment = filedata->program_headers + i;
5298 section = filedata->section_headers + 1;
5300 printf (" %2.2d ", i);
5302 for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5304 if (!ELF_TBSS_SPECIAL (section, segment)
5305 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5306 printf ("%s ", printable_section_name (filedata, section));
5317 /* Find the file offset corresponding to VMA by using the program headers. */
5320 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5322 Elf_Internal_Phdr * seg;
5324 if (! get_program_headers (filedata))
5326 warn (_("Cannot interpret virtual addresses without program headers.\n"));
5330 for (seg = filedata->program_headers;
5331 seg < filedata->program_headers + filedata->file_header.e_phnum;
5334 if (seg->p_type != PT_LOAD)
5337 if (vma >= (seg->p_vaddr & -seg->p_align)
5338 && vma + size <= seg->p_vaddr + seg->p_filesz)
5339 return vma - seg->p_vaddr + seg->p_offset;
5342 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5343 (unsigned long) vma);
5348 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5349 If PROBE is true, this is just a probe and we do not generate any error
5350 messages if the load fails. */
5353 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5355 Elf32_External_Shdr * shdrs;
5356 Elf_Internal_Shdr * internal;
5358 unsigned int size = filedata->file_header.e_shentsize;
5359 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5361 /* PR binutils/17531: Cope with unexpected section header sizes. */
5362 if (size == 0 || num == 0)
5364 if (size < sizeof * shdrs)
5367 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5370 if (!probe && size > sizeof * shdrs)
5371 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5373 shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5375 probe ? NULL : _("section headers"));
5379 free (filedata->section_headers);
5380 filedata->section_headers = (Elf_Internal_Shdr *)
5381 cmalloc (num, sizeof (Elf_Internal_Shdr));
5382 if (filedata->section_headers == NULL)
5385 error (_("Out of memory reading %u section headers\n"), num);
5390 for (i = 0, internal = filedata->section_headers;
5394 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5395 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5396 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5397 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5398 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5399 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5400 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5401 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5402 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5403 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5404 if (!probe && internal->sh_link > num)
5405 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5406 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5407 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5414 /* Like get_32bit_section_headers, except that it fetches 64-bit headers. */
5417 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5419 Elf64_External_Shdr * shdrs;
5420 Elf_Internal_Shdr * internal;
5422 unsigned int size = filedata->file_header.e_shentsize;
5423 unsigned int num = probe ? 1 : filedata->file_header.e_shnum;
5425 /* PR binutils/17531: Cope with unexpected section header sizes. */
5426 if (size == 0 || num == 0)
5429 if (size < sizeof * shdrs)
5432 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5436 if (! probe && size > sizeof * shdrs)
5437 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5439 shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5440 filedata->file_header.e_shoff,
5442 probe ? NULL : _("section headers"));
5446 free (filedata->section_headers);
5447 filedata->section_headers = (Elf_Internal_Shdr *)
5448 cmalloc (num, sizeof (Elf_Internal_Shdr));
5449 if (filedata->section_headers == NULL)
5452 error (_("Out of memory reading %u section headers\n"), num);
5457 for (i = 0, internal = filedata->section_headers;
5461 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5462 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5463 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5464 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5465 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5466 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5467 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5468 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5469 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5470 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5471 if (!probe && internal->sh_link > num)
5472 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5473 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5474 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5481 static Elf_Internal_Sym *
5482 get_32bit_elf_symbols (Filedata * filedata,
5483 Elf_Internal_Shdr * section,
5484 unsigned long * num_syms_return)
5486 unsigned long number = 0;
5487 Elf32_External_Sym * esyms = NULL;
5488 Elf_External_Sym_Shndx * shndx = NULL;
5489 Elf_Internal_Sym * isyms = NULL;
5490 Elf_Internal_Sym * psym;
5492 elf_section_list * entry;
5494 if (section->sh_size == 0)
5496 if (num_syms_return != NULL)
5497 * num_syms_return = 0;
5501 /* Run some sanity checks first. */
5502 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5504 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5505 printable_section_name (filedata, section),
5506 (unsigned long) section->sh_entsize);
5510 if (section->sh_size > filedata->file_size)
5512 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5513 printable_section_name (filedata, section),
5514 (unsigned long) section->sh_size);
5518 number = section->sh_size / section->sh_entsize;
5520 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5522 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5523 (unsigned long) section->sh_size,
5524 printable_section_name (filedata, section),
5525 (unsigned long) section->sh_entsize);
5529 esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5530 section->sh_size, _("symbols"));
5535 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5537 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5542 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5546 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5547 entry->hdr->sh_offset,
5548 1, entry->hdr->sh_size,
5549 _("symbol table section indices"));
5553 /* PR17531: file: heap-buffer-overflow */
5554 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5556 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5557 printable_section_name (filedata, entry->hdr),
5558 (unsigned long) entry->hdr->sh_size,
5559 (unsigned long) section->sh_size);
5564 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5568 error (_("Out of memory reading %lu symbols\n"),
5569 (unsigned long) number);
5573 for (j = 0, psym = isyms; j < number; j++, psym++)
5575 psym->st_name = BYTE_GET (esyms[j].st_name);
5576 psym->st_value = BYTE_GET (esyms[j].st_value);
5577 psym->st_size = BYTE_GET (esyms[j].st_size);
5578 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5579 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5581 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5582 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5583 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5584 psym->st_info = BYTE_GET (esyms[j].st_info);
5585 psym->st_other = BYTE_GET (esyms[j].st_other);
5592 if (num_syms_return != NULL)
5593 * num_syms_return = isyms == NULL ? 0 : number;
5598 static Elf_Internal_Sym *
5599 get_64bit_elf_symbols (Filedata * filedata,
5600 Elf_Internal_Shdr * section,
5601 unsigned long * num_syms_return)
5603 unsigned long number = 0;
5604 Elf64_External_Sym * esyms = NULL;
5605 Elf_External_Sym_Shndx * shndx = NULL;
5606 Elf_Internal_Sym * isyms = NULL;
5607 Elf_Internal_Sym * psym;
5609 elf_section_list * entry;
5611 if (section->sh_size == 0)
5613 if (num_syms_return != NULL)
5614 * num_syms_return = 0;
5618 /* Run some sanity checks first. */
5619 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5621 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5622 printable_section_name (filedata, section),
5623 (unsigned long) section->sh_entsize);
5627 if (section->sh_size > filedata->file_size)
5629 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5630 printable_section_name (filedata, section),
5631 (unsigned long) section->sh_size);
5635 number = section->sh_size / section->sh_entsize;
5637 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5639 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5640 (unsigned long) section->sh_size,
5641 printable_section_name (filedata, section),
5642 (unsigned long) section->sh_entsize);
5646 esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5647 section->sh_size, _("symbols"));
5652 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5654 if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5659 error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5663 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5664 entry->hdr->sh_offset,
5665 1, entry->hdr->sh_size,
5666 _("symbol table section indices"));
5670 /* PR17531: file: heap-buffer-overflow */
5671 if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5673 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5674 printable_section_name (filedata, entry->hdr),
5675 (unsigned long) entry->hdr->sh_size,
5676 (unsigned long) section->sh_size);
5681 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5685 error (_("Out of memory reading %lu symbols\n"),
5686 (unsigned long) number);
5690 for (j = 0, psym = isyms; j < number; j++, psym++)
5692 psym->st_name = BYTE_GET (esyms[j].st_name);
5693 psym->st_info = BYTE_GET (esyms[j].st_info);
5694 psym->st_other = BYTE_GET (esyms[j].st_other);
5695 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5697 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5699 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5700 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5701 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5703 psym->st_value = BYTE_GET (esyms[j].st_value);
5704 psym->st_size = BYTE_GET (esyms[j].st_size);
5711 if (num_syms_return != NULL)
5712 * num_syms_return = isyms == NULL ? 0 : number;
5718 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5720 static char buff[1024];
5722 unsigned int field_size = is_32bit_elf ? 8 : 16;
5724 unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5725 bfd_vma os_flags = 0;
5726 bfd_vma proc_flags = 0;
5727 bfd_vma unknown_flags = 0;
5735 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5736 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5737 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5738 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5739 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5740 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5741 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5742 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5743 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5744 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5745 /* IA-64 specific. */
5746 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5747 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5748 /* IA-64 OpenVMS specific. */
5749 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5750 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5751 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5752 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5753 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5754 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5756 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5757 /* SPARC specific. */
5758 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5759 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5761 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5762 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5763 /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5765 /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5767 /* 25 */ { STRING_COMMA_LEN ("VLE") },
5770 if (do_section_details)
5772 sprintf (buff, "[%*.*lx]: ",
5773 field_size, field_size, (unsigned long) sh_flags);
5774 p += field_size + 4;
5781 flag = sh_flags & - sh_flags;
5784 if (do_section_details)
5788 case SHF_WRITE: sindex = 0; break;
5789 case SHF_ALLOC: sindex = 1; break;
5790 case SHF_EXECINSTR: sindex = 2; break;
5791 case SHF_MERGE: sindex = 3; break;
5792 case SHF_STRINGS: sindex = 4; break;
5793 case SHF_INFO_LINK: sindex = 5; break;
5794 case SHF_LINK_ORDER: sindex = 6; break;
5795 case SHF_OS_NONCONFORMING: sindex = 7; break;
5796 case SHF_GROUP: sindex = 8; break;
5797 case SHF_TLS: sindex = 9; break;
5798 case SHF_EXCLUDE: sindex = 18; break;
5799 case SHF_COMPRESSED: sindex = 20; break;
5800 case SHF_GNU_MBIND: sindex = 24; break;
5804 switch (filedata->file_header.e_machine)
5807 if (flag == SHF_IA_64_SHORT)
5809 else if (flag == SHF_IA_64_NORECOV)
5812 else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5815 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5816 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5817 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5818 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5819 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5820 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5831 case EM_OLD_SPARCV9:
5832 case EM_SPARC32PLUS:
5835 if (flag == SHF_ORDERED)
5842 case SHF_ENTRYSECT: sindex = 21; break;
5843 case SHF_ARM_PURECODE: sindex = 22; break;
5844 case SHF_COMDEF: sindex = 23; break;
5849 if (flag == SHF_PPC_VLE)
5860 if (p != buff + field_size + 4)
5862 if (size < (10 + 2))
5864 warn (_("Internal error: not enough buffer room for section flag info"));
5865 return _("<unknown>");
5872 size -= flags [sindex].len;
5873 p = stpcpy (p, flags [sindex].str);
5875 else if (flag & SHF_MASKOS)
5877 else if (flag & SHF_MASKPROC)
5880 unknown_flags |= flag;
5886 case SHF_WRITE: *p = 'W'; break;
5887 case SHF_ALLOC: *p = 'A'; break;
5888 case SHF_EXECINSTR: *p = 'X'; break;
5889 case SHF_MERGE: *p = 'M'; break;
5890 case SHF_STRINGS: *p = 'S'; break;
5891 case SHF_INFO_LINK: *p = 'I'; break;
5892 case SHF_LINK_ORDER: *p = 'L'; break;
5893 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5894 case SHF_GROUP: *p = 'G'; break;
5895 case SHF_TLS: *p = 'T'; break;
5896 case SHF_EXCLUDE: *p = 'E'; break;
5897 case SHF_COMPRESSED: *p = 'C'; break;
5898 case SHF_GNU_MBIND: *p = 'D'; break;
5901 if ((filedata->file_header.e_machine == EM_X86_64
5902 || filedata->file_header.e_machine == EM_L1OM
5903 || filedata->file_header.e_machine == EM_K1OM)
5904 && flag == SHF_X86_64_LARGE)
5906 else if (filedata->file_header.e_machine == EM_ARM
5907 && flag == SHF_ARM_PURECODE)
5909 else if (filedata->file_header.e_machine == EM_PPC
5910 && flag == SHF_PPC_VLE)
5912 else if (flag & SHF_MASKOS)
5915 sh_flags &= ~ SHF_MASKOS;
5917 else if (flag & SHF_MASKPROC)
5920 sh_flags &= ~ SHF_MASKPROC;
5930 if (do_section_details)
5934 size -= 5 + field_size;
5935 if (p != buff + field_size + 4)
5939 warn (_("Internal error: not enough buffer room for section flag info"));
5940 return _("<unknown>");
5946 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5947 (unsigned long) os_flags);
5948 p += 5 + field_size;
5952 size -= 7 + field_size;
5953 if (p != buff + field_size + 4)
5957 warn (_("Internal error: not enough buffer room for section flag info"));
5958 return _("<unknown>");
5964 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5965 (unsigned long) proc_flags);
5966 p += 7 + field_size;
5970 size -= 10 + field_size;
5971 if (p != buff + field_size + 4)
5975 warn (_("Internal error: not enough buffer room for section flag info"));
5976 return _("<unknown>");
5982 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5983 (unsigned long) unknown_flags);
5984 p += 10 + field_size;
5993 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5997 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5999 if (size < sizeof (* echdr))
6001 error (_("Compressed section is too small even for a compression header\n"));
6005 chdr->ch_type = BYTE_GET (echdr->ch_type);
6006 chdr->ch_size = BYTE_GET (echdr->ch_size);
6007 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6008 return sizeof (*echdr);
6012 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6014 if (size < sizeof (* echdr))
6016 error (_("Compressed section is too small even for a compression header\n"));
6020 chdr->ch_type = BYTE_GET (echdr->ch_type);
6021 chdr->ch_size = BYTE_GET (echdr->ch_size);
6022 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6023 return sizeof (*echdr);
6028 process_section_headers (Filedata * filedata)
6030 Elf_Internal_Shdr * section;
6033 filedata->section_headers = NULL;
6035 if (filedata->file_header.e_shnum == 0)
6037 /* PR binutils/12467. */
6038 if (filedata->file_header.e_shoff != 0)
6040 warn (_("possibly corrupt ELF file header - it has a non-zero"
6041 " section header offset, but no section headers\n"));
6044 else if (do_sections)
6045 printf (_("\nThere are no sections in this file.\n"));
6050 if (do_sections && !do_header)
6051 printf (ngettext ("There is %d section header, "
6052 "starting at offset 0x%lx:\n",
6053 "There are %d section headers, "
6054 "starting at offset 0x%lx:\n",
6055 filedata->file_header.e_shnum),
6056 filedata->file_header.e_shnum,
6057 (unsigned long) filedata->file_header.e_shoff);
6061 if (! get_32bit_section_headers (filedata, FALSE))
6066 if (! get_64bit_section_headers (filedata, FALSE))
6070 /* Read in the string table, so that we have names to display. */
6071 if (filedata->file_header.e_shstrndx != SHN_UNDEF
6072 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6074 section = filedata->section_headers + filedata->file_header.e_shstrndx;
6076 if (section->sh_size != 0)
6078 filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6079 1, section->sh_size,
6082 filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6086 /* Scan the sections for the dynamic symbol table
6087 and dynamic string table and debug sections. */
6088 dynamic_symbols = NULL;
6089 dynamic_strings = NULL;
6090 dynamic_syminfo = NULL;
6091 symtab_shndx_list = NULL;
6093 eh_addr_size = is_32bit_elf ? 4 : 8;
6094 switch (filedata->file_header.e_machine)
6097 case EM_MIPS_RS3_LE:
6098 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6099 FDE addresses. However, the ABI also has a semi-official ILP32
6100 variant for which the normal FDE address size rules apply.
6102 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6103 section, where XX is the size of longs in bits. Unfortunately,
6104 earlier compilers provided no way of distinguishing ILP32 objects
6105 from LP64 objects, so if there's any doubt, we should assume that
6106 the official LP64 form is being used. */
6107 if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6108 && find_section (filedata, ".gcc_compiled_long32") == NULL)
6114 switch (filedata->file_header.e_flags & EF_H8_MACH)
6116 case E_H8_MACH_H8300:
6117 case E_H8_MACH_H8300HN:
6118 case E_H8_MACH_H8300SN:
6119 case E_H8_MACH_H8300SXN:
6122 case E_H8_MACH_H8300H:
6123 case E_H8_MACH_H8300S:
6124 case E_H8_MACH_H8300SX:
6132 switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6134 case EF_M32C_CPU_M16C:
6141 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
6144 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
6145 if (section->sh_entsize != expected_entsize) \
6148 sprintf_vma (buf, section->sh_entsize); \
6149 /* Note: coded this way so that there is a single string for \
6151 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6152 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6153 (unsigned) expected_entsize); \
6154 section->sh_entsize = expected_entsize; \
6159 #define CHECK_ENTSIZE(section, i, type) \
6160 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
6161 sizeof (Elf64_External_##type))
6163 for (i = 0, section = filedata->section_headers;
6164 i < filedata->file_header.e_shnum;
6167 char * name = SECTION_NAME (section);
6169 if (section->sh_type == SHT_DYNSYM)
6171 if (dynamic_symbols != NULL)
6173 error (_("File contains multiple dynamic symbol tables\n"));
6177 CHECK_ENTSIZE (section, i, Sym);
6178 dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6180 else if (section->sh_type == SHT_STRTAB
6181 && streq (name, ".dynstr"))
6183 if (dynamic_strings != NULL)
6185 error (_("File contains multiple dynamic string tables\n"));
6189 dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6190 1, section->sh_size,
6191 _("dynamic strings"));
6192 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6194 else if (section->sh_type == SHT_SYMTAB_SHNDX)
6196 elf_section_list * entry = xmalloc (sizeof * entry);
6198 entry->hdr = section;
6199 entry->next = symtab_shndx_list;
6200 symtab_shndx_list = entry;
6202 else if (section->sh_type == SHT_SYMTAB)
6203 CHECK_ENTSIZE (section, i, Sym);
6204 else if (section->sh_type == SHT_GROUP)
6205 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6206 else if (section->sh_type == SHT_REL)
6207 CHECK_ENTSIZE (section, i, Rel);
6208 else if (section->sh_type == SHT_RELA)
6209 CHECK_ENTSIZE (section, i, Rela);
6210 else if ((do_debugging || do_debug_info || do_debug_abbrevs
6211 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6212 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6213 || do_debug_str || do_debug_loc || do_debug_ranges
6214 || do_debug_addr || do_debug_cu_index || do_debug_links)
6215 && (const_strneq (name, ".debug_")
6216 || const_strneq (name, ".zdebug_")))
6219 name += sizeof (".zdebug_") - 1;
6221 name += sizeof (".debug_") - 1;
6224 || (do_debug_info && const_strneq (name, "info"))
6225 || (do_debug_info && const_strneq (name, "types"))
6226 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
6227 || (do_debug_lines && strcmp (name, "line") == 0)
6228 || (do_debug_lines && const_strneq (name, "line."))
6229 || (do_debug_pubnames && const_strneq (name, "pubnames"))
6230 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6231 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6232 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6233 || (do_debug_aranges && const_strneq (name, "aranges"))
6234 || (do_debug_ranges && const_strneq (name, "ranges"))
6235 || (do_debug_ranges && const_strneq (name, "rnglists"))
6236 || (do_debug_frames && const_strneq (name, "frame"))
6237 || (do_debug_macinfo && const_strneq (name, "macinfo"))
6238 || (do_debug_macinfo && const_strneq (name, "macro"))
6239 || (do_debug_str && const_strneq (name, "str"))
6240 || (do_debug_loc && const_strneq (name, "loc"))
6241 || (do_debug_loc && const_strneq (name, "loclists"))
6242 || (do_debug_addr && const_strneq (name, "addr"))
6243 || (do_debug_cu_index && const_strneq (name, "cu_index"))
6244 || (do_debug_cu_index && const_strneq (name, "tu_index"))
6246 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6248 /* Linkonce section to be combined with .debug_info at link time. */
6249 else if ((do_debugging || do_debug_info)
6250 && const_strneq (name, ".gnu.linkonce.wi."))
6251 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6252 else if (do_debug_frames && streq (name, ".eh_frame"))
6253 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6254 else if (do_gdb_index && (streq (name, ".gdb_index")
6255 || streq (name, ".debug_names")))
6256 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6257 /* Trace sections for Itanium VMS. */
6258 else if ((do_debugging || do_trace_info || do_trace_abbrevs
6259 || do_trace_aranges)
6260 && const_strneq (name, ".trace_"))
6262 name += sizeof (".trace_") - 1;
6265 || (do_trace_info && streq (name, "info"))
6266 || (do_trace_abbrevs && streq (name, "abbrev"))
6267 || (do_trace_aranges && streq (name, "aranges"))
6269 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6271 else if ((do_debugging || do_debug_links)
6272 && (const_strneq (name, ".gnu_debuglink")
6273 || const_strneq (name, ".gnu_debugaltlink")))
6274 request_dump_bynumber (filedata, i, DEBUG_DUMP);
6280 if (filedata->file_header.e_shnum > 1)
6281 printf (_("\nSection Headers:\n"));
6283 printf (_("\nSection Header:\n"));
6287 if (do_section_details)
6289 printf (_(" [Nr] Name\n"));
6290 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
6294 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
6298 if (do_section_details)
6300 printf (_(" [Nr] Name\n"));
6301 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
6305 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
6309 if (do_section_details)
6311 printf (_(" [Nr] Name\n"));
6312 printf (_(" Type Address Offset Link\n"));
6313 printf (_(" Size EntSize Info Align\n"));
6317 printf (_(" [Nr] Name Type Address Offset\n"));
6318 printf (_(" Size EntSize Flags Link Info Align\n"));
6322 if (do_section_details)
6323 printf (_(" Flags\n"));
6325 for (i = 0, section = filedata->section_headers;
6326 i < filedata->file_header.e_shnum;
6329 /* Run some sanity checks on the section header. */
6331 /* Check the sh_link field. */
6332 switch (section->sh_type)
6336 if (section->sh_link == 0
6337 && (filedata->file_header.e_type == ET_EXEC
6338 || filedata->file_header.e_type == ET_DYN))
6339 /* A dynamic relocation section where all entries use a
6340 zero symbol index need not specify a symtab section. */
6343 case SHT_SYMTAB_SHNDX:
6347 case SHT_GNU_versym:
6348 if (section->sh_link == 0
6349 || section->sh_link >= filedata->file_header.e_shnum
6350 || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6351 && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6352 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6353 i, section->sh_link);
6359 case SHT_GNU_verneed:
6360 case SHT_GNU_verdef:
6361 case SHT_GNU_LIBLIST:
6362 if (section->sh_link == 0
6363 || section->sh_link >= filedata->file_header.e_shnum
6364 || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6365 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6366 i, section->sh_link);
6369 case SHT_INIT_ARRAY:
6370 case SHT_FINI_ARRAY:
6371 case SHT_PREINIT_ARRAY:
6372 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6373 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6374 i, section->sh_link);
6378 /* FIXME: Add support for target specific section types. */
6379 #if 0 /* Currently we do not check other section types as there are too
6380 many special cases. Stab sections for example have a type
6381 of SHT_PROGBITS but an sh_link field that links to the .stabstr
6383 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6384 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6385 i, section->sh_link);
6390 /* Check the sh_info field. */
6391 switch (section->sh_type)
6395 if (section->sh_info == 0
6396 && (filedata->file_header.e_type == ET_EXEC
6397 || filedata->file_header.e_type == ET_DYN))
6398 /* Dynamic relocations apply to segments, so they do not
6399 need to specify the section they relocate. */
6401 if (section->sh_info == 0
6402 || section->sh_info >= filedata->file_header.e_shnum
6403 || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6404 && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6405 && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6406 && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6407 && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6408 && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6409 /* FIXME: Are other section types valid ? */
6410 && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6411 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6412 i, section->sh_info);
6417 case SHT_SYMTAB_SHNDX:
6418 case SHT_INIT_ARRAY:
6419 case SHT_FINI_ARRAY:
6420 case SHT_PREINIT_ARRAY:
6421 if (section->sh_info != 0)
6422 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6423 i, section->sh_info);
6429 /* A symbol index - we assume that it is valid. */
6433 /* FIXME: Add support for target specific section types. */
6434 if (section->sh_type == SHT_NOBITS)
6435 /* NOBITS section headers with non-zero sh_info fields can be
6436 created when a binary is stripped of everything but its debug
6437 information. The stripped sections have their headers
6438 preserved but their types set to SHT_NOBITS. So do not check
6439 this type of section. */
6441 else if (section->sh_flags & SHF_INFO_LINK)
6443 if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6444 warn (_("[%2u]: Expected link to another section in info field"), i);
6446 else if (section->sh_type < SHT_LOOS
6447 && (section->sh_flags & SHF_GNU_MBIND) == 0
6448 && section->sh_info != 0)
6449 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6450 i, section->sh_info);
6454 /* Check the sh_size field. */
6455 if (section->sh_size > filedata->file_size
6456 && section->sh_type != SHT_NOBITS
6457 && section->sh_type != SHT_NULL
6458 && section->sh_type < SHT_LOOS)
6459 warn (_("Size of section %u is larger than the entire file!\n"), i);
6461 printf (" [%2u] ", i);
6462 if (do_section_details)
6463 printf ("%s\n ", printable_section_name (filedata, section));
6465 print_symbol (-17, SECTION_NAME (section));
6467 printf (do_wide ? " %-15s " : " %-15.15s ",
6468 get_section_type_name (filedata, section->sh_type));
6472 const char * link_too_big = NULL;
6474 print_vma (section->sh_addr, LONG_HEX);
6476 printf ( " %6.6lx %6.6lx %2.2lx",
6477 (unsigned long) section->sh_offset,
6478 (unsigned long) section->sh_size,
6479 (unsigned long) section->sh_entsize);
6481 if (do_section_details)
6482 fputs (" ", stdout);
6484 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6486 if (section->sh_link >= filedata->file_header.e_shnum)
6489 /* The sh_link value is out of range. Normally this indicates
6490 an error but it can have special values in Solaris binaries. */
6491 switch (filedata->file_header.e_machine)
6498 case EM_OLD_SPARCV9:
6499 case EM_SPARC32PLUS:
6502 if (section->sh_link == (SHN_BEFORE & 0xffff))
6503 link_too_big = "BEFORE";
6504 else if (section->sh_link == (SHN_AFTER & 0xffff))
6505 link_too_big = "AFTER";
6512 if (do_section_details)
6514 if (link_too_big != NULL && * link_too_big)
6515 printf ("<%s> ", link_too_big);
6517 printf ("%2u ", section->sh_link);
6518 printf ("%3u %2lu\n", section->sh_info,
6519 (unsigned long) section->sh_addralign);
6522 printf ("%2u %3u %2lu\n",
6525 (unsigned long) section->sh_addralign);
6527 if (link_too_big && ! * link_too_big)
6528 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6529 i, section->sh_link);
6533 print_vma (section->sh_addr, LONG_HEX);
6535 if ((long) section->sh_offset == section->sh_offset)
6536 printf (" %6.6lx", (unsigned long) section->sh_offset);
6540 print_vma (section->sh_offset, LONG_HEX);
6543 if ((unsigned long) section->sh_size == section->sh_size)
6544 printf (" %6.6lx", (unsigned long) section->sh_size);
6548 print_vma (section->sh_size, LONG_HEX);
6551 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6552 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6556 print_vma (section->sh_entsize, LONG_HEX);
6559 if (do_section_details)
6560 fputs (" ", stdout);
6562 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6564 printf ("%2u %3u ", section->sh_link, section->sh_info);
6566 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6567 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6570 print_vma (section->sh_addralign, DEC);
6574 else if (do_section_details)
6577 print_vma (section->sh_addr, LONG_HEX);
6578 if ((long) section->sh_offset == section->sh_offset)
6579 printf (" %16.16lx", (unsigned long) section->sh_offset);
6583 print_vma (section->sh_offset, LONG_HEX);
6585 printf (" %u\n ", section->sh_link);
6586 print_vma (section->sh_size, LONG_HEX);
6588 print_vma (section->sh_entsize, LONG_HEX);
6590 printf (" %-16u %lu\n",
6592 (unsigned long) section->sh_addralign);
6597 print_vma (section->sh_addr, LONG_HEX);
6598 if ((long) section->sh_offset == section->sh_offset)
6599 printf (" %8.8lx", (unsigned long) section->sh_offset);
6603 print_vma (section->sh_offset, LONG_HEX);
6606 print_vma (section->sh_size, LONG_HEX);
6608 print_vma (section->sh_entsize, LONG_HEX);
6610 printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6612 printf (" %2u %3u %lu\n",
6615 (unsigned long) section->sh_addralign);
6618 if (do_section_details)
6620 printf (" %s\n", get_elf_section_flags (filedata, section->sh_flags));
6621 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6623 /* Minimum section size is 12 bytes for 32-bit compression
6624 header + 12 bytes for compressed data header. */
6625 unsigned char buf[24];
6627 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6628 if (get_data (&buf, filedata, section->sh_offset, 1,
6629 sizeof (buf), _("compression header")))
6631 Elf_Internal_Chdr chdr;
6633 (void) get_compression_header (&chdr, buf, sizeof (buf));
6635 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6638 printf (_(" [<unknown>: 0x%x], "),
6640 print_vma (chdr.ch_size, LONG_HEX);
6641 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6647 if (!do_section_details)
6649 /* The ordering of the letters shown here matches the ordering of the
6650 corresponding SHF_xxx values, and hence the order in which these
6651 letters will be displayed to the user. */
6652 printf (_("Key to Flags:\n\
6653 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6654 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6655 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6656 if (filedata->file_header.e_machine == EM_X86_64
6657 || filedata->file_header.e_machine == EM_L1OM
6658 || filedata->file_header.e_machine == EM_K1OM)
6659 printf (_("l (large), "));
6660 else if (filedata->file_header.e_machine == EM_ARM)
6661 printf (_("y (purecode), "));
6662 else if (filedata->file_header.e_machine == EM_PPC)
6663 printf (_("v (VLE), "));
6664 printf ("p (processor specific)\n");
6671 get_group_flags (unsigned int flags)
6673 static char buff[128];
6677 else if (flags == GRP_COMDAT)
6680 snprintf (buff, 14, _("[0x%x: "), flags);
6682 flags &= ~ GRP_COMDAT;
6683 if (flags & GRP_MASKOS)
6685 strcat (buff, "<OS specific>");
6686 flags &= ~ GRP_MASKOS;
6689 if (flags & GRP_MASKPROC)
6691 strcat (buff, "<PROC specific>");
6692 flags &= ~ GRP_MASKPROC;
6696 strcat (buff, "<unknown>");
6703 process_section_groups (Filedata * filedata)
6705 Elf_Internal_Shdr * section;
6707 struct group * group;
6708 Elf_Internal_Shdr * symtab_sec;
6709 Elf_Internal_Shdr * strtab_sec;
6710 Elf_Internal_Sym * symtab;
6711 unsigned long num_syms;
6715 /* Don't process section groups unless needed. */
6716 if (!do_unwind && !do_section_groups)
6719 if (filedata->file_header.e_shnum == 0)
6721 if (do_section_groups)
6722 printf (_("\nThere are no sections to group in this file.\n"));
6727 if (filedata->section_headers == NULL)
6729 error (_("Section headers are not available!\n"));
6730 /* PR 13622: This can happen with a corrupt ELF header. */
6734 section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6735 sizeof (struct group *));
6737 if (section_headers_groups == NULL)
6739 error (_("Out of memory reading %u section group headers\n"),
6740 filedata->file_header.e_shnum);
6744 /* Scan the sections for the group section. */
6746 for (i = 0, section = filedata->section_headers;
6747 i < filedata->file_header.e_shnum;
6749 if (section->sh_type == SHT_GROUP)
6752 if (group_count == 0)
6754 if (do_section_groups)
6755 printf (_("\nThere are no section groups in this file.\n"));
6760 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6762 if (section_groups == NULL)
6764 error (_("Out of memory reading %lu groups\n"),
6765 (unsigned long) group_count);
6775 for (i = 0, section = filedata->section_headers, group = section_groups;
6776 i < filedata->file_header.e_shnum;
6779 if (section->sh_type == SHT_GROUP)
6781 const char * name = printable_section_name (filedata, section);
6782 const char * group_name;
6783 unsigned char * start;
6784 unsigned char * indices;
6785 unsigned int entry, j, size;
6786 Elf_Internal_Shdr * sec;
6787 Elf_Internal_Sym * sym;
6789 /* Get the symbol table. */
6790 if (section->sh_link >= filedata->file_header.e_shnum
6791 || ((sec = filedata->section_headers + section->sh_link)->sh_type
6794 error (_("Bad sh_link in group section `%s'\n"), name);
6798 if (symtab_sec != sec)
6803 symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6808 error (_("Corrupt header in group section `%s'\n"), name);
6812 if (section->sh_info >= num_syms)
6814 error (_("Bad sh_info in group section `%s'\n"), name);
6818 sym = symtab + section->sh_info;
6820 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6822 if (sym->st_shndx == 0
6823 || sym->st_shndx >= filedata->file_header.e_shnum)
6825 error (_("Bad sh_info in group section `%s'\n"), name);
6829 group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6838 /* Get the string table. */
6839 if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6848 != (sec = filedata->section_headers + symtab_sec->sh_link))
6854 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6855 1, strtab_sec->sh_size,
6857 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6859 group_name = sym->st_name < strtab_size
6860 ? strtab + sym->st_name : _("<corrupt>");
6863 /* PR 17531: file: loop. */
6864 if (section->sh_entsize > section->sh_size)
6866 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6867 printable_section_name (filedata, section),
6868 (unsigned long) section->sh_entsize,
6869 (unsigned long) section->sh_size);
6873 start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6874 1, section->sh_size,
6880 size = (section->sh_size / section->sh_entsize) - 1;
6881 entry = byte_get (indices, 4);
6884 if (do_section_groups)
6886 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6887 get_group_flags (entry), i, name, group_name, size);
6889 printf (_(" [Index] Name\n"));
6892 group->group_index = i;
6894 for (j = 0; j < size; j++)
6896 struct group_list * g;
6898 entry = byte_get (indices, 4);
6901 if (entry >= filedata->file_header.e_shnum)
6903 static unsigned num_group_errors = 0;
6905 if (num_group_errors ++ < 10)
6907 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6908 entry, i, filedata->file_header.e_shnum - 1);
6909 if (num_group_errors == 10)
6910 warn (_("Further error messages about overlarge group section indices suppressed\n"));
6915 if (section_headers_groups [entry] != NULL)
6919 static unsigned num_errs = 0;
6921 if (num_errs ++ < 10)
6923 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6925 section_headers_groups [entry]->group_index);
6927 warn (_("Further error messages about already contained group sections suppressed\n"));
6933 /* Intel C/C++ compiler may put section 0 in a
6934 section group. We just warn it the first time
6935 and ignore it afterwards. */
6936 static bfd_boolean warned = FALSE;
6939 error (_("section 0 in group section [%5u]\n"),
6940 section_headers_groups [entry]->group_index);
6946 section_headers_groups [entry] = group;
6948 if (do_section_groups)
6950 sec = filedata->section_headers + entry;
6951 printf (" [%5u] %s\n", entry, printable_section_name (filedata, sec));
6954 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6955 g->section_index = entry;
6956 g->next = group->root;
6974 /* Data used to display dynamic fixups. */
6976 struct ia64_vms_dynfixup
6978 bfd_vma needed_ident; /* Library ident number. */
6979 bfd_vma needed; /* Index in the dstrtab of the library name. */
6980 bfd_vma fixup_needed; /* Index of the library. */
6981 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6982 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6985 /* Data used to display dynamic relocations. */
6987 struct ia64_vms_dynimgrela
6989 bfd_vma img_rela_cnt; /* Number of relocations. */
6990 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6993 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6997 dump_ia64_vms_dynamic_fixups (Filedata * filedata,
6998 struct ia64_vms_dynfixup * fixup,
6999 const char * strtab,
7000 unsigned int strtab_sz)
7002 Elf64_External_VMS_IMAGE_FIXUP * imfs;
7004 const char * lib_name;
7006 imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7007 1, fixup->fixup_rela_cnt * sizeof (*imfs),
7008 _("dynamic section image fixups"));
7012 if (fixup->needed < strtab_sz)
7013 lib_name = strtab + fixup->needed;
7016 warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7017 (unsigned long) fixup->needed);
7020 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7021 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7023 (_("Seg Offset Type SymVec DataType\n"));
7025 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7030 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7031 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7032 type = BYTE_GET (imfs [i].type);
7033 rtype = elf_ia64_reloc_type (type);
7035 printf (" 0x%08x ", type);
7037 printf (" %-32s ", rtype);
7038 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7039 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7046 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
7049 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7051 Elf64_External_VMS_IMAGE_RELA *imrs;
7054 imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7055 1, imgrela->img_rela_cnt * sizeof (*imrs),
7056 _("dynamic section image relocations"));
7060 printf (_("\nImage relocs\n"));
7062 (_("Seg Offset Type Addend Seg Sym Off\n"));
7064 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7069 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7070 printf ("%08" BFD_VMA_FMT "x ",
7071 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7072 type = BYTE_GET (imrs [i].type);
7073 rtype = elf_ia64_reloc_type (type);
7075 printf ("0x%08x ", type);
7077 printf ("%-31s ", rtype);
7078 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7079 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7080 printf ("%08" BFD_VMA_FMT "x\n",
7081 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7088 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
7091 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7093 struct ia64_vms_dynfixup fixup;
7094 struct ia64_vms_dynimgrela imgrela;
7095 Elf_Internal_Dyn *entry;
7096 bfd_vma strtab_off = 0;
7097 bfd_vma strtab_sz = 0;
7098 char *strtab = NULL;
7099 bfd_boolean res = TRUE;
7101 memset (&fixup, 0, sizeof (fixup));
7102 memset (&imgrela, 0, sizeof (imgrela));
7104 /* Note: the order of the entries is specified by the OpenVMS specs. */
7105 for (entry = dynamic_section;
7106 entry < dynamic_section + dynamic_nent;
7109 switch (entry->d_tag)
7111 case DT_IA_64_VMS_STRTAB_OFFSET:
7112 strtab_off = entry->d_un.d_val;
7115 strtab_sz = entry->d_un.d_val;
7117 strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7118 1, strtab_sz, _("dynamic string section"));
7121 case DT_IA_64_VMS_NEEDED_IDENT:
7122 fixup.needed_ident = entry->d_un.d_val;
7125 fixup.needed = entry->d_un.d_val;
7127 case DT_IA_64_VMS_FIXUP_NEEDED:
7128 fixup.fixup_needed = entry->d_un.d_val;
7130 case DT_IA_64_VMS_FIXUP_RELA_CNT:
7131 fixup.fixup_rela_cnt = entry->d_un.d_val;
7133 case DT_IA_64_VMS_FIXUP_RELA_OFF:
7134 fixup.fixup_rela_off = entry->d_un.d_val;
7135 if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7138 case DT_IA_64_VMS_IMG_RELA_CNT:
7139 imgrela.img_rela_cnt = entry->d_un.d_val;
7141 case DT_IA_64_VMS_IMG_RELA_OFF:
7142 imgrela.img_rela_off = entry->d_un.d_val;
7143 if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7165 dynamic_relocations [] =
7167 { "REL", DT_REL, DT_RELSZ, FALSE },
7168 { "RELA", DT_RELA, DT_RELASZ, TRUE },
7169 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7172 /* Process the reloc section. */
7175 process_relocs (Filedata * filedata)
7177 unsigned long rel_size;
7178 unsigned long rel_offset;
7183 if (do_using_dynamic)
7187 bfd_boolean has_dynamic_reloc;
7190 has_dynamic_reloc = FALSE;
7192 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7194 is_rela = dynamic_relocations [i].rela;
7195 name = dynamic_relocations [i].name;
7196 rel_size = dynamic_info [dynamic_relocations [i].size];
7197 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7200 has_dynamic_reloc = TRUE;
7202 if (is_rela == UNKNOWN)
7204 if (dynamic_relocations [i].reloc == DT_JMPREL)
7205 switch (dynamic_info[DT_PLTREL])
7219 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7220 name, rel_offset, rel_size);
7222 dump_relocations (filedata,
7223 offset_from_vma (filedata, rel_offset, rel_size),
7225 dynamic_symbols, num_dynamic_syms,
7226 dynamic_strings, dynamic_strings_length,
7227 is_rela, TRUE /* is_dynamic */);
7231 if (is_ia64_vms (filedata))
7232 if (process_ia64_vms_dynamic_relocs (filedata))
7233 has_dynamic_reloc = TRUE;
7235 if (! has_dynamic_reloc)
7236 printf (_("\nThere are no dynamic relocations in this file.\n"));
7240 Elf_Internal_Shdr * section;
7242 bfd_boolean found = FALSE;
7244 for (i = 0, section = filedata->section_headers;
7245 i < filedata->file_header.e_shnum;
7248 if ( section->sh_type != SHT_RELA
7249 && section->sh_type != SHT_REL)
7252 rel_offset = section->sh_offset;
7253 rel_size = section->sh_size;
7257 Elf_Internal_Shdr * strsec;
7259 unsigned long num_rela;
7261 printf (_("\nRelocation section "));
7263 if (filedata->string_table == NULL)
7264 printf ("%d", section->sh_name);
7266 printf ("'%s'", printable_section_name (filedata, section));
7268 num_rela = rel_size / section->sh_entsize;
7269 printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7270 " at offset 0x%lx contains %lu entries:\n",
7272 rel_offset, num_rela);
7274 is_rela = section->sh_type == SHT_RELA;
7276 if (section->sh_link != 0
7277 && section->sh_link < filedata->file_header.e_shnum)
7279 Elf_Internal_Shdr * symsec;
7280 Elf_Internal_Sym * symtab;
7281 unsigned long nsyms;
7282 unsigned long strtablen = 0;
7283 char * strtab = NULL;
7285 symsec = filedata->section_headers + section->sh_link;
7286 if (symsec->sh_type != SHT_SYMTAB
7287 && symsec->sh_type != SHT_DYNSYM)
7290 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7295 if (symsec->sh_link != 0
7296 && symsec->sh_link < filedata->file_header.e_shnum)
7298 strsec = filedata->section_headers + symsec->sh_link;
7300 strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7303 strtablen = strtab == NULL ? 0 : strsec->sh_size;
7306 dump_relocations (filedata, rel_offset, rel_size,
7307 symtab, nsyms, strtab, strtablen,
7309 symsec->sh_type == SHT_DYNSYM);
7315 dump_relocations (filedata, rel_offset, rel_size,
7316 NULL, 0, NULL, 0, is_rela,
7317 FALSE /* is_dynamic */);
7325 /* Users sometimes forget the -D option, so try to be helpful. */
7326 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7328 if (dynamic_info [dynamic_relocations [i].size])
7330 printf (_("\nThere are no static relocations in this file."));
7331 printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7336 if (i == ARRAY_SIZE (dynamic_relocations))
7337 printf (_("\nThere are no relocations in this file.\n"));
7344 /* An absolute address consists of a section and an offset. If the
7345 section is NULL, the offset itself is the address, otherwise, the
7346 address equals to LOAD_ADDRESS(section) + offset. */
7350 unsigned short section;
7354 #define ABSADDR(a) \
7356 ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7359 /* Find the nearest symbol at or below ADDR. Returns the symbol
7360 name, if found, and the offset from the symbol to ADDR. */
7363 find_symbol_for_address (Filedata * filedata,
7364 Elf_Internal_Sym * symtab,
7365 unsigned long nsyms,
7366 const char * strtab,
7367 unsigned long strtab_size,
7368 struct absaddr addr,
7369 const char ** symname,
7372 bfd_vma dist = 0x100000;
7373 Elf_Internal_Sym * sym;
7374 Elf_Internal_Sym * beg;
7375 Elf_Internal_Sym * end;
7376 Elf_Internal_Sym * best = NULL;
7378 REMOVE_ARCH_BITS (addr.offset);
7380 end = symtab + nsyms;
7386 sym = beg + (end - beg) / 2;
7388 value = sym->st_value;
7389 REMOVE_ARCH_BITS (value);
7391 if (sym->st_name != 0
7392 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7393 && addr.offset >= value
7394 && addr.offset - value < dist)
7397 dist = addr.offset - value;
7402 if (addr.offset < value)
7410 *symname = (best->st_name >= strtab_size
7411 ? _("<corrupt>") : strtab + best->st_name);
7417 *offset = addr.offset;
7420 static /* signed */ int
7421 symcmp (const void *p, const void *q)
7423 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7424 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7426 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7429 /* Process the unwind section. */
7431 #include "unwind-ia64.h"
7433 struct ia64_unw_table_entry
7435 struct absaddr start;
7437 struct absaddr info;
7440 struct ia64_unw_aux_info
7442 struct ia64_unw_table_entry * table; /* Unwind table. */
7443 unsigned long table_len; /* Length of unwind table. */
7444 unsigned char * info; /* Unwind info. */
7445 unsigned long info_size; /* Size of unwind info. */
7446 bfd_vma info_addr; /* Starting address of unwind info. */
7447 bfd_vma seg_base; /* Starting address of segment. */
7448 Elf_Internal_Sym * symtab; /* The symbol table. */
7449 unsigned long nsyms; /* Number of symbols. */
7450 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7451 unsigned long nfuns; /* Number of entries in funtab. */
7452 char * strtab; /* The string table. */
7453 unsigned long strtab_size; /* Size of string table. */
7457 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7459 struct ia64_unw_table_entry * tp;
7460 unsigned long j, nfuns;
7462 bfd_boolean res = TRUE;
7464 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7465 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7466 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7467 aux->funtab[nfuns++] = aux->symtab[j];
7469 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7471 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7475 const unsigned char * dp;
7476 const unsigned char * head;
7477 const unsigned char * end;
7478 const char * procname;
7480 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7481 aux->strtab_size, tp->start, &procname, &offset);
7483 fputs ("\n<", stdout);
7487 fputs (procname, stdout);
7490 printf ("+%lx", (unsigned long) offset);
7493 fputs (">: [", stdout);
7494 print_vma (tp->start.offset, PREFIX_HEX);
7495 fputc ('-', stdout);
7496 print_vma (tp->end.offset, PREFIX_HEX);
7497 printf ("], info at +0x%lx\n",
7498 (unsigned long) (tp->info.offset - aux->seg_base));
7500 /* PR 17531: file: 86232b32. */
7501 if (aux->info == NULL)
7504 /* PR 17531: file: 0997b4d1. */
7505 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7507 warn (_("Invalid offset %lx in table entry %ld\n"),
7508 (long) tp->info.offset, (long) (tp - aux->table));
7513 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7514 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7516 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7517 (unsigned) UNW_VER (stamp),
7518 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7519 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7520 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7521 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7523 if (UNW_VER (stamp) != 1)
7525 printf (_("\tUnknown version.\n"));
7530 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7531 /* PR 17531: file: 16ceda89. */
7532 if (end > aux->info + aux->info_size)
7533 end = aux->info + aux->info_size;
7534 for (dp = head + 8; dp < end;)
7535 dp = unw_decode (dp, in_body, & in_body, end);
7544 slurp_ia64_unwind_table (Filedata * filedata,
7545 struct ia64_unw_aux_info * aux,
7546 Elf_Internal_Shdr * sec)
7548 unsigned long size, nrelas, i;
7549 Elf_Internal_Phdr * seg;
7550 struct ia64_unw_table_entry * tep;
7551 Elf_Internal_Shdr * relsec;
7552 Elf_Internal_Rela * rela;
7553 Elf_Internal_Rela * rp;
7554 unsigned char * table;
7556 Elf_Internal_Sym * sym;
7557 const char * relname;
7561 /* First, find the starting address of the segment that includes
7564 if (filedata->file_header.e_phnum)
7566 if (! get_program_headers (filedata))
7569 for (seg = filedata->program_headers;
7570 seg < filedata->program_headers + filedata->file_header.e_phnum;
7573 if (seg->p_type != PT_LOAD)
7576 if (sec->sh_addr >= seg->p_vaddr
7577 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7579 aux->seg_base = seg->p_vaddr;
7585 /* Second, build the unwind table from the contents of the unwind section: */
7586 size = sec->sh_size;
7587 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7592 aux->table_len = size / (3 * eh_addr_size);
7593 aux->table = (struct ia64_unw_table_entry *)
7594 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7597 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7599 tep->start.section = SHN_UNDEF;
7600 tep->end.section = SHN_UNDEF;
7601 tep->info.section = SHN_UNDEF;
7602 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7603 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7604 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7605 tep->start.offset += aux->seg_base;
7606 tep->end.offset += aux->seg_base;
7607 tep->info.offset += aux->seg_base;
7611 /* Third, apply any relocations to the unwind table: */
7612 for (relsec = filedata->section_headers;
7613 relsec < filedata->section_headers + filedata->file_header.e_shnum;
7616 if (relsec->sh_type != SHT_RELA
7617 || relsec->sh_info >= filedata->file_header.e_shnum
7618 || filedata->section_headers + relsec->sh_info != sec)
7621 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7630 for (rp = rela; rp < rela + nrelas; ++rp)
7632 unsigned int sym_ndx;
7633 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7634 relname = elf_ia64_reloc_type (r_type);
7636 /* PR 17531: file: 9fa67536. */
7637 if (relname == NULL)
7639 warn (_("Skipping unknown relocation type: %u\n"), r_type);
7643 if (! const_strneq (relname, "R_IA64_SEGREL"))
7645 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7649 i = rp->r_offset / (3 * eh_addr_size);
7651 /* PR 17531: file: 5bc8d9bf. */
7652 if (i >= aux->table_len)
7654 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7658 sym_ndx = get_reloc_symindex (rp->r_info);
7659 if (sym_ndx >= aux->nsyms)
7661 warn (_("Skipping reloc with invalid symbol index: %u\n"),
7665 sym = aux->symtab + sym_ndx;
7667 switch (rp->r_offset / eh_addr_size % 3)
7670 aux->table[i].start.section = sym->st_shndx;
7671 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7674 aux->table[i].end.section = sym->st_shndx;
7675 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7678 aux->table[i].info.section = sym->st_shndx;
7679 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7693 ia64_process_unwind (Filedata * filedata)
7695 Elf_Internal_Shdr * sec;
7696 Elf_Internal_Shdr * unwsec = NULL;
7697 Elf_Internal_Shdr * strsec;
7698 unsigned long i, unwcount = 0, unwstart = 0;
7699 struct ia64_unw_aux_info aux;
7700 bfd_boolean res = TRUE;
7702 memset (& aux, 0, sizeof (aux));
7704 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7706 if (sec->sh_type == SHT_SYMTAB
7707 && sec->sh_link < filedata->file_header.e_shnum)
7709 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7711 strsec = filedata->section_headers + sec->sh_link;
7712 if (aux.strtab != NULL)
7714 error (_("Multiple auxillary string tables encountered\n"));
7718 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7721 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7723 else if (sec->sh_type == SHT_IA_64_UNWIND)
7728 printf (_("\nThere are no unwind sections in this file.\n"));
7730 while (unwcount-- > 0)
7735 for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7736 i < filedata->file_header.e_shnum; ++i, ++sec)
7737 if (sec->sh_type == SHT_IA_64_UNWIND)
7742 /* We have already counted the number of SHT_IA64_UNWIND
7743 sections so the loop above should never fail. */
7744 assert (unwsec != NULL);
7747 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7749 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7751 /* We need to find which section group it is in. */
7752 struct group_list * g;
7754 if (section_headers_groups == NULL
7755 || section_headers_groups [i] == NULL)
7756 i = filedata->file_header.e_shnum;
7759 g = section_headers_groups [i]->root;
7761 for (; g != NULL; g = g->next)
7763 sec = filedata->section_headers + g->section_index;
7765 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7770 i = filedata->file_header.e_shnum;
7773 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7775 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7776 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7777 suffix = SECTION_NAME (unwsec) + len;
7778 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7780 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7781 && streq (SECTION_NAME (sec) + len2, suffix))
7786 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7787 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7788 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7789 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7791 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7792 suffix = SECTION_NAME (unwsec) + len;
7793 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7795 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7796 && streq (SECTION_NAME (sec) + len2, suffix))
7800 if (i == filedata->file_header.e_shnum)
7802 printf (_("\nCould not find unwind info section for "));
7804 if (filedata->string_table == NULL)
7805 printf ("%d", unwsec->sh_name);
7807 printf ("'%s'", printable_section_name (filedata, unwsec));
7811 aux.info_addr = sec->sh_addr;
7812 aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7815 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7817 printf (_("\nUnwind section "));
7819 if (filedata->string_table == NULL)
7820 printf ("%d", unwsec->sh_name);
7822 printf ("'%s'", printable_section_name (filedata, unwsec));
7824 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7825 (unsigned long) unwsec->sh_offset,
7826 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7828 if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7829 && aux.table_len > 0)
7830 dump_ia64_unwind (filedata, & aux);
7833 free ((char *) aux.table);
7835 free ((char *) aux.info);
7844 free ((char *) aux.strtab);
7849 struct hppa_unw_table_entry
7851 struct absaddr start;
7853 unsigned int Cannot_unwind:1; /* 0 */
7854 unsigned int Millicode:1; /* 1 */
7855 unsigned int Millicode_save_sr0:1; /* 2 */
7856 unsigned int Region_description:2; /* 3..4 */
7857 unsigned int reserved1:1; /* 5 */
7858 unsigned int Entry_SR:1; /* 6 */
7859 unsigned int Entry_FR:4; /* Number saved 7..10 */
7860 unsigned int Entry_GR:5; /* Number saved 11..15 */
7861 unsigned int Args_stored:1; /* 16 */
7862 unsigned int Variable_Frame:1; /* 17 */
7863 unsigned int Separate_Package_Body:1; /* 18 */
7864 unsigned int Frame_Extension_Millicode:1; /* 19 */
7865 unsigned int Stack_Overflow_Check:1; /* 20 */
7866 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
7867 unsigned int Ada_Region:1; /* 22 */
7868 unsigned int cxx_info:1; /* 23 */
7869 unsigned int cxx_try_catch:1; /* 24 */
7870 unsigned int sched_entry_seq:1; /* 25 */
7871 unsigned int reserved2:1; /* 26 */
7872 unsigned int Save_SP:1; /* 27 */
7873 unsigned int Save_RP:1; /* 28 */
7874 unsigned int Save_MRP_in_frame:1; /* 29 */
7875 unsigned int extn_ptr_defined:1; /* 30 */
7876 unsigned int Cleanup_defined:1; /* 31 */
7878 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7879 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7880 unsigned int Large_frame:1; /* 2 */
7881 unsigned int Pseudo_SP_Set:1; /* 3 */
7882 unsigned int reserved4:1; /* 4 */
7883 unsigned int Total_frame_size:27; /* 5..31 */
7886 struct hppa_unw_aux_info
7888 struct hppa_unw_table_entry * table; /* Unwind table. */
7889 unsigned long table_len; /* Length of unwind table. */
7890 bfd_vma seg_base; /* Starting address of segment. */
7891 Elf_Internal_Sym * symtab; /* The symbol table. */
7892 unsigned long nsyms; /* Number of symbols. */
7893 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7894 unsigned long nfuns; /* Number of entries in funtab. */
7895 char * strtab; /* The string table. */
7896 unsigned long strtab_size; /* Size of string table. */
7900 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7902 struct hppa_unw_table_entry * tp;
7903 unsigned long j, nfuns;
7904 bfd_boolean res = TRUE;
7906 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7907 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7908 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7909 aux->funtab[nfuns++] = aux->symtab[j];
7911 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7913 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7916 const char * procname;
7918 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7919 aux->strtab_size, tp->start, &procname,
7922 fputs ("\n<", stdout);
7926 fputs (procname, stdout);
7929 printf ("+%lx", (unsigned long) offset);
7932 fputs (">: [", stdout);
7933 print_vma (tp->start.offset, PREFIX_HEX);
7934 fputc ('-', stdout);
7935 print_vma (tp->end.offset, PREFIX_HEX);
7938 #define PF(_m) if (tp->_m) printf (#_m " ");
7939 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7942 PF(Millicode_save_sr0);
7943 /* PV(Region_description); */
7949 PF(Separate_Package_Body);
7950 PF(Frame_Extension_Millicode);
7951 PF(Stack_Overflow_Check);
7952 PF(Two_Instruction_SP_Increment);
7956 PF(sched_entry_seq);
7959 PF(Save_MRP_in_frame);
7960 PF(extn_ptr_defined);
7961 PF(Cleanup_defined);
7962 PF(MPE_XL_interrupt_marker);
7963 PF(HP_UX_interrupt_marker);
7966 PV(Total_frame_size);
7979 slurp_hppa_unwind_table (Filedata * filedata,
7980 struct hppa_unw_aux_info * aux,
7981 Elf_Internal_Shdr * sec)
7983 unsigned long size, unw_ent_size, nentries, nrelas, i;
7984 Elf_Internal_Phdr * seg;
7985 struct hppa_unw_table_entry * tep;
7986 Elf_Internal_Shdr * relsec;
7987 Elf_Internal_Rela * rela;
7988 Elf_Internal_Rela * rp;
7989 unsigned char * table;
7991 Elf_Internal_Sym * sym;
7992 const char * relname;
7994 /* First, find the starting address of the segment that includes
7996 if (filedata->file_header.e_phnum)
7998 if (! get_program_headers (filedata))
8001 for (seg = filedata->program_headers;
8002 seg < filedata->program_headers + filedata->file_header.e_phnum;
8005 if (seg->p_type != PT_LOAD)
8008 if (sec->sh_addr >= seg->p_vaddr
8009 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8011 aux->seg_base = seg->p_vaddr;
8017 /* Second, build the unwind table from the contents of the unwind
8019 size = sec->sh_size;
8020 table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8026 nentries = size / unw_ent_size;
8027 size = unw_ent_size * nentries;
8029 tep = aux->table = (struct hppa_unw_table_entry *)
8030 xcmalloc (nentries, sizeof (aux->table[0]));
8032 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8034 unsigned int tmp1, tmp2;
8036 tep->start.section = SHN_UNDEF;
8037 tep->end.section = SHN_UNDEF;
8039 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8040 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8041 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8042 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8044 tep->start.offset += aux->seg_base;
8045 tep->end.offset += aux->seg_base;
8047 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8048 tep->Millicode = (tmp1 >> 30) & 0x1;
8049 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8050 tep->Region_description = (tmp1 >> 27) & 0x3;
8051 tep->reserved1 = (tmp1 >> 26) & 0x1;
8052 tep->Entry_SR = (tmp1 >> 25) & 0x1;
8053 tep->Entry_FR = (tmp1 >> 21) & 0xf;
8054 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8055 tep->Args_stored = (tmp1 >> 15) & 0x1;
8056 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8057 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8058 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8059 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8060 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8061 tep->Ada_Region = (tmp1 >> 9) & 0x1;
8062 tep->cxx_info = (tmp1 >> 8) & 0x1;
8063 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8064 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8065 tep->reserved2 = (tmp1 >> 5) & 0x1;
8066 tep->Save_SP = (tmp1 >> 4) & 0x1;
8067 tep->Save_RP = (tmp1 >> 3) & 0x1;
8068 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8069 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8070 tep->Cleanup_defined = tmp1 & 0x1;
8072 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8073 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8074 tep->Large_frame = (tmp2 >> 29) & 0x1;
8075 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8076 tep->reserved4 = (tmp2 >> 27) & 0x1;
8077 tep->Total_frame_size = tmp2 & 0x7ffffff;
8081 /* Third, apply any relocations to the unwind table. */
8082 for (relsec = filedata->section_headers;
8083 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8086 if (relsec->sh_type != SHT_RELA
8087 || relsec->sh_info >= filedata->file_header.e_shnum
8088 || filedata->section_headers + relsec->sh_info != sec)
8091 if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8095 for (rp = rela; rp < rela + nrelas; ++rp)
8097 unsigned int sym_ndx;
8098 unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8099 relname = elf_hppa_reloc_type (r_type);
8101 if (relname == NULL)
8103 warn (_("Skipping unknown relocation type: %u\n"), r_type);
8107 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
8108 if (! const_strneq (relname, "R_PARISC_SEGREL"))
8110 warn (_("Skipping unexpected relocation type: %s\n"), relname);
8114 i = rp->r_offset / unw_ent_size;
8115 if (i >= aux->table_len)
8117 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8121 sym_ndx = get_reloc_symindex (rp->r_info);
8122 if (sym_ndx >= aux->nsyms)
8124 warn (_("Skipping reloc with invalid symbol index: %u\n"),
8128 sym = aux->symtab + sym_ndx;
8130 switch ((rp->r_offset % unw_ent_size) / 4)
8133 aux->table[i].start.section = sym->st_shndx;
8134 aux->table[i].start.offset = sym->st_value + rp->r_addend;
8137 aux->table[i].end.section = sym->st_shndx;
8138 aux->table[i].end.offset = sym->st_value + rp->r_addend;
8148 aux->table_len = nentries;
8154 hppa_process_unwind (Filedata * filedata)
8156 struct hppa_unw_aux_info aux;
8157 Elf_Internal_Shdr * unwsec = NULL;
8158 Elf_Internal_Shdr * strsec;
8159 Elf_Internal_Shdr * sec;
8161 bfd_boolean res = TRUE;
8163 if (filedata->string_table == NULL)
8166 memset (& aux, 0, sizeof (aux));
8168 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8170 if (sec->sh_type == SHT_SYMTAB
8171 && sec->sh_link < filedata->file_header.e_shnum)
8173 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8175 strsec = filedata->section_headers + sec->sh_link;
8176 if (aux.strtab != NULL)
8178 error (_("Multiple auxillary string tables encountered\n"));
8182 aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8185 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8187 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8192 printf (_("\nThere are no unwind sections in this file.\n"));
8194 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8196 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8198 unsigned long num_unwind = sec->sh_size / 16;
8200 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8201 "contains %lu entry:\n",
8202 "\nUnwind section '%s' at offset 0x%lx "
8203 "contains %lu entries:\n",
8205 printable_section_name (filedata, sec),
8206 (unsigned long) sec->sh_offset,
8209 if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8212 if (res && aux.table_len > 0)
8214 if (! dump_hppa_unwind (filedata, &aux))
8219 free ((char *) aux.table);
8227 free ((char *) aux.strtab);
8234 unsigned char * data; /* The unwind data. */
8235 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
8236 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
8237 unsigned long nrelas; /* The number of relocations. */
8238 unsigned int rel_type; /* REL or RELA ? */
8239 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
8242 struct arm_unw_aux_info
8244 Filedata * filedata; /* The file containing the unwind sections. */
8245 Elf_Internal_Sym * symtab; /* The file's symbol table. */
8246 unsigned long nsyms; /* Number of symbols. */
8247 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
8248 unsigned long nfuns; /* Number of these symbols. */
8249 char * strtab; /* The file's string table. */
8250 unsigned long strtab_size; /* Size of string table. */
8254 arm_print_vma_and_name (Filedata * filedata,
8255 struct arm_unw_aux_info * aux,
8257 struct absaddr addr)
8259 const char *procname;
8262 if (addr.section == SHN_UNDEF)
8265 find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8266 aux->strtab_size, addr, &procname,
8269 print_vma (fn, PREFIX_HEX);
8273 fputs (" <", stdout);
8274 fputs (procname, stdout);
8277 printf ("+0x%lx", (unsigned long) sym_offset);
8278 fputc ('>', stdout);
8285 arm_free_section (struct arm_section *arm_sec)
8287 if (arm_sec->data != NULL)
8288 free (arm_sec->data);
8290 if (arm_sec->rela != NULL)
8291 free (arm_sec->rela);
8294 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8295 cached section and install SEC instead.
8296 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8297 and return its valued in * WORDP, relocating if necessary.
8298 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8299 relocation's offset in ADDR.
8300 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8301 into the string table of the symbol associated with the reloc. If no
8302 reloc was applied store -1 there.
8303 5) Return TRUE upon success, FALSE otherwise. */
8306 get_unwind_section_word (Filedata * filedata,
8307 struct arm_unw_aux_info * aux,
8308 struct arm_section * arm_sec,
8309 Elf_Internal_Shdr * sec,
8310 bfd_vma word_offset,
8311 unsigned int * wordp,
8312 struct absaddr * addr,
8315 Elf_Internal_Rela *rp;
8316 Elf_Internal_Sym *sym;
8317 const char * relname;
8319 bfd_boolean wrapped;
8321 if (sec == NULL || arm_sec == NULL)
8324 addr->section = SHN_UNDEF;
8327 if (sym_name != NULL)
8328 *sym_name = (bfd_vma) -1;
8330 /* If necessary, update the section cache. */
8331 if (sec != arm_sec->sec)
8333 Elf_Internal_Shdr *relsec;
8335 arm_free_section (arm_sec);
8338 arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8339 sec->sh_size, _("unwind data"));
8340 arm_sec->rela = NULL;
8341 arm_sec->nrelas = 0;
8343 for (relsec = filedata->section_headers;
8344 relsec < filedata->section_headers + filedata->file_header.e_shnum;
8347 if (relsec->sh_info >= filedata->file_header.e_shnum
8348 || filedata->section_headers + relsec->sh_info != sec
8349 /* PR 15745: Check the section type as well. */
8350 || (relsec->sh_type != SHT_REL
8351 && relsec->sh_type != SHT_RELA))
8354 arm_sec->rel_type = relsec->sh_type;
8355 if (relsec->sh_type == SHT_REL)
8357 if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8359 & arm_sec->rela, & arm_sec->nrelas))
8362 else /* relsec->sh_type == SHT_RELA */
8364 if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8366 & arm_sec->rela, & arm_sec->nrelas))
8372 arm_sec->next_rela = arm_sec->rela;
8375 /* If there is no unwind data we can do nothing. */
8376 if (arm_sec->data == NULL)
8379 /* If the offset is invalid then fail. */
8380 if (/* PR 21343 *//* PR 18879 */
8382 || word_offset > (sec->sh_size - 4)
8383 || ((bfd_signed_vma) word_offset) < 0)
8386 /* Get the word at the required offset. */
8387 word = byte_get (arm_sec->data + word_offset, 4);
8389 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
8390 if (arm_sec->rela == NULL)
8396 /* Look through the relocs to find the one that applies to the provided offset. */
8398 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8400 bfd_vma prelval, offset;
8402 if (rp->r_offset > word_offset && !wrapped)
8407 if (rp->r_offset > word_offset)
8410 if (rp->r_offset & 3)
8412 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8413 (unsigned long) rp->r_offset);
8417 if (rp->r_offset < word_offset)
8420 /* PR 17531: file: 027-161405-0.004 */
8421 if (aux->symtab == NULL)
8424 if (arm_sec->rel_type == SHT_REL)
8426 offset = word & 0x7fffffff;
8427 if (offset & 0x40000000)
8428 offset |= ~ (bfd_vma) 0x7fffffff;
8430 else if (arm_sec->rel_type == SHT_RELA)
8431 offset = rp->r_addend;
8434 error (_("Unknown section relocation type %d encountered\n"),
8439 /* PR 17531 file: 027-1241568-0.004. */
8440 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8442 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8443 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8447 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8448 offset += sym->st_value;
8449 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8451 /* Check that we are processing the expected reloc type. */
8452 if (filedata->file_header.e_machine == EM_ARM)
8454 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8455 if (relname == NULL)
8457 warn (_("Skipping unknown ARM relocation type: %d\n"),
8458 (int) ELF32_R_TYPE (rp->r_info));
8462 if (streq (relname, "R_ARM_NONE"))
8465 if (! streq (relname, "R_ARM_PREL31"))
8467 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8471 else if (filedata->file_header.e_machine == EM_TI_C6000)
8473 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8474 if (relname == NULL)
8476 warn (_("Skipping unknown C6000 relocation type: %d\n"),
8477 (int) ELF32_R_TYPE (rp->r_info));
8481 if (streq (relname, "R_C6000_NONE"))
8484 if (! streq (relname, "R_C6000_PREL31"))
8486 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8494 /* This function currently only supports ARM and TI unwinders. */
8495 warn (_("Only TI and ARM unwinders are currently supported\n"));
8499 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8500 addr->section = sym->st_shndx;
8501 addr->offset = offset;
8504 * sym_name = sym->st_name;
8509 arm_sec->next_rela = rp;
8514 static const char *tic6x_unwind_regnames[16] =
8516 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8517 "A14", "A13", "A12", "A11", "A10",
8518 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8522 decode_tic6x_unwind_regmask (unsigned int mask)
8526 for (i = 12; mask; mask >>= 1, i--)
8530 fputs (tic6x_unwind_regnames[i], stdout);
8532 fputs (", ", stdout);
8538 if (remaining == 0 && more_words) \
8541 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, \
8542 data_offset, & word, & addr, NULL)) \
8548 #define GET_OP(OP) \
8553 (OP) = word >> 24; \
8558 printf (_("[Truncated opcode]\n")); \
8561 printf ("0x%02x ", OP)
8564 decode_arm_unwind_bytecode (Filedata * filedata,
8565 struct arm_unw_aux_info * aux,
8567 unsigned int remaining,
8568 unsigned int more_words,
8569 bfd_vma data_offset,
8570 Elf_Internal_Shdr * data_sec,
8571 struct arm_section * data_arm_sec)
8573 struct absaddr addr;
8574 bfd_boolean res = TRUE;
8576 /* Decode the unwinding instructions. */
8579 unsigned int op, op2;
8588 printf (" 0x%02x ", op);
8590 if ((op & 0xc0) == 0x00)
8592 int offset = ((op & 0x3f) << 2) + 4;
8594 printf (" vsp = vsp + %d", offset);
8596 else if ((op & 0xc0) == 0x40)
8598 int offset = ((op & 0x3f) << 2) + 4;
8600 printf (" vsp = vsp - %d", offset);
8602 else if ((op & 0xf0) == 0x80)
8605 if (op == 0x80 && op2 == 0)
8606 printf (_("Refuse to unwind"));
8609 unsigned int mask = ((op & 0x0f) << 8) | op2;
8610 bfd_boolean first = TRUE;
8614 for (i = 0; i < 12; i++)
8615 if (mask & (1 << i))
8621 printf ("r%d", 4 + i);
8626 else if ((op & 0xf0) == 0x90)
8628 if (op == 0x9d || op == 0x9f)
8629 printf (_(" [Reserved]"));
8631 printf (" vsp = r%d", op & 0x0f);
8633 else if ((op & 0xf0) == 0xa0)
8635 int end = 4 + (op & 0x07);
8636 bfd_boolean first = TRUE;
8640 for (i = 4; i <= end; i++)
8656 else if (op == 0xb0)
8657 printf (_(" finish"));
8658 else if (op == 0xb1)
8661 if (op2 == 0 || (op2 & 0xf0) != 0)
8662 printf (_("[Spare]"));
8665 unsigned int mask = op2 & 0x0f;
8666 bfd_boolean first = TRUE;
8670 for (i = 0; i < 12; i++)
8671 if (mask & (1 << i))
8682 else if (op == 0xb2)
8684 unsigned char buf[9];
8685 unsigned int i, len;
8686 unsigned long offset;
8688 for (i = 0; i < sizeof (buf); i++)
8691 if ((buf[i] & 0x80) == 0)
8694 if (i == sizeof (buf))
8696 error (_("corrupt change to vsp"));
8701 offset = read_uleb128 (buf, &len, buf + i + 1);
8702 assert (len == i + 1);
8703 offset = offset * 4 + 0x204;
8704 printf ("vsp = vsp + %ld", offset);
8707 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8709 unsigned int first, last;
8716 printf ("pop {D%d", first);
8718 printf ("-D%d", first + last);
8721 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8723 unsigned int count = op & 0x07;
8727 printf ("-D%d", 8 + count);
8730 else if (op >= 0xc0 && op <= 0xc5)
8732 unsigned int count = op & 0x07;
8734 printf (" pop {wR10");
8736 printf ("-wR%d", 10 + count);
8739 else if (op == 0xc6)
8741 unsigned int first, last;
8746 printf ("pop {wR%d", first);
8748 printf ("-wR%d", first + last);
8751 else if (op == 0xc7)
8754 if (op2 == 0 || (op2 & 0xf0) != 0)
8755 printf (_("[Spare]"));
8758 unsigned int mask = op2 & 0x0f;
8759 bfd_boolean first = TRUE;
8763 for (i = 0; i < 4; i++)
8764 if (mask & (1 << i))
8770 printf ("wCGR%d", i);
8777 printf (_(" [unsupported opcode]"));
8788 decode_tic6x_unwind_bytecode (Filedata * filedata,
8789 struct arm_unw_aux_info * aux,
8791 unsigned int remaining,
8792 unsigned int more_words,
8793 bfd_vma data_offset,
8794 Elf_Internal_Shdr * data_sec,
8795 struct arm_section * data_arm_sec)
8797 struct absaddr addr;
8799 /* Decode the unwinding instructions. */
8802 unsigned int op, op2;
8811 printf (" 0x%02x ", op);
8813 if ((op & 0xc0) == 0x00)
8815 int offset = ((op & 0x3f) << 3) + 8;
8816 printf (" sp = sp + %d", offset);
8818 else if ((op & 0xc0) == 0x80)
8821 if (op == 0x80 && op2 == 0)
8822 printf (_("Refuse to unwind"));
8825 unsigned int mask = ((op & 0x1f) << 8) | op2;
8827 printf ("pop compact {");
8831 decode_tic6x_unwind_regmask (mask);
8835 else if ((op & 0xf0) == 0xc0)
8843 unsigned int offset;
8847 /* Scan entire instruction first so that GET_OP output is not
8848 interleaved with disassembly. */
8850 for (i = 0; nregs < (op & 0xf); i++)
8856 regpos[nregs].offset = i * 2;
8857 regpos[nregs].reg = reg;
8864 regpos[nregs].offset = i * 2 + 1;
8865 regpos[nregs].reg = reg;
8870 printf (_("pop frame {"));
8873 printf (_("*corrupt* - no registers specified"));
8878 for (i = i * 2; i > 0; i--)
8880 if (regpos[reg].offset == i - 1)
8882 name = tic6x_unwind_regnames[regpos[reg].reg];
8889 fputs (name, stdout);
8897 else if (op == 0xd0)
8898 printf (" MOV FP, SP");
8899 else if (op == 0xd1)
8900 printf (" __c6xabi_pop_rts");
8901 else if (op == 0xd2)
8903 unsigned char buf[9];
8904 unsigned int i, len;
8905 unsigned long offset;
8907 for (i = 0; i < sizeof (buf); i++)
8910 if ((buf[i] & 0x80) == 0)
8913 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8914 if (i == sizeof (buf))
8916 warn (_("Corrupt stack pointer adjustment detected\n"));
8920 offset = read_uleb128 (buf, &len, buf + i + 1);
8921 assert (len == i + 1);
8922 offset = offset * 8 + 0x408;
8923 printf (_("sp = sp + %ld"), offset);
8925 else if ((op & 0xf0) == 0xe0)
8927 if ((op & 0x0f) == 7)
8930 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8934 printf (_(" [unsupported opcode]"));
8943 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8947 offset = word & 0x7fffffff;
8948 if (offset & 0x40000000)
8949 offset |= ~ (bfd_vma) 0x7fffffff;
8951 if (filedata->file_header.e_machine == EM_TI_C6000)
8954 return offset + where;
8958 decode_arm_unwind (Filedata * filedata,
8959 struct arm_unw_aux_info * aux,
8961 unsigned int remaining,
8962 bfd_vma data_offset,
8963 Elf_Internal_Shdr * data_sec,
8964 struct arm_section * data_arm_sec)
8967 unsigned int more_words = 0;
8968 struct absaddr addr;
8969 bfd_vma sym_name = (bfd_vma) -1;
8970 bfd_boolean res = TRUE;
8974 /* Fetch the first word.
8975 Note - when decoding an object file the address extracted
8976 here will always be 0. So we also pass in the sym_name
8977 parameter so that we can find the symbol associated with
8978 the personality routine. */
8979 if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8980 & word, & addr, & sym_name))
8986 if ((word & 0x80000000) == 0)
8988 /* Expand prel31 for personality routine. */
8990 const char *procname;
8992 fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8993 printf (_(" Personality routine: "));
8995 && addr.section == SHN_UNDEF && addr.offset == 0
8996 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8998 procname = aux->strtab + sym_name;
8999 print_vma (fn, PREFIX_HEX);
9002 fputs (" <", stdout);
9003 fputs (procname, stdout);
9004 fputc ('>', stdout);
9008 procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9009 fputc ('\n', stdout);
9011 /* The GCC personality routines use the standard compact
9012 encoding, starting with one byte giving the number of
9014 if (procname != NULL
9015 && (const_strneq (procname, "__gcc_personality_v0")
9016 || const_strneq (procname, "__gxx_personality_v0")
9017 || const_strneq (procname, "__gcj_personality_v0")
9018 || const_strneq (procname, "__gnu_objc_personality_v0")))
9025 printf (_(" [Truncated data]\n"));
9028 more_words = word >> 24;
9038 /* ARM EHABI Section 6.3:
9040 An exception-handling table entry for the compact model looks like:
9044 1 0 index Data for personalityRoutine[index] */
9046 if (filedata->file_header.e_machine == EM_ARM
9047 && (word & 0x70000000))
9049 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9053 per_index = (word >> 24) & 0x7f;
9054 printf (_(" Compact model index: %d\n"), per_index);
9061 else if (per_index < 3)
9063 more_words = (word >> 16) & 0xff;
9069 switch (filedata->file_header.e_machine)
9074 if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9075 data_offset, data_sec, data_arm_sec))
9080 warn (_("Unknown ARM compact model index encountered\n"));
9081 printf (_(" [reserved]\n"));
9089 if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9090 data_offset, data_sec, data_arm_sec))
9093 else if (per_index < 5)
9095 if (((word >> 17) & 0x7f) == 0x7f)
9096 printf (_(" Restore stack from frame pointer\n"));
9098 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
9099 printf (_(" Registers restored: "));
9101 printf (" (compact) ");
9102 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9104 printf (_(" Return register: %s\n"),
9105 tic6x_unwind_regnames[word & 0xf]);
9108 printf (_(" [reserved (%d)]\n"), per_index);
9112 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9113 filedata->file_header.e_machine);
9117 /* Decode the descriptors. Not implemented. */
9123 dump_arm_unwind (Filedata * filedata,
9124 struct arm_unw_aux_info * aux,
9125 Elf_Internal_Shdr * exidx_sec)
9127 struct arm_section exidx_arm_sec, extab_arm_sec;
9128 unsigned int i, exidx_len;
9129 unsigned long j, nfuns;
9130 bfd_boolean res = TRUE;
9132 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9133 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9134 exidx_len = exidx_sec->sh_size / 8;
9136 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9137 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9138 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9139 aux->funtab[nfuns++] = aux->symtab[j];
9141 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9143 for (i = 0; i < exidx_len; i++)
9145 unsigned int exidx_fn, exidx_entry;
9146 struct absaddr fn_addr, entry_addr;
9149 fputc ('\n', stdout);
9151 if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9152 8 * i, & exidx_fn, & fn_addr, NULL)
9153 || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9154 8 * i + 4, & exidx_entry, & entry_addr, NULL))
9157 arm_free_section (& exidx_arm_sec);
9158 arm_free_section (& extab_arm_sec);
9162 /* ARM EHABI, Section 5:
9163 An index table entry consists of 2 words.
9164 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
9165 if (exidx_fn & 0x80000000)
9167 warn (_("corrupt index table entry: %x\n"), exidx_fn);
9171 fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9173 arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9174 fputs (": ", stdout);
9176 if (exidx_entry == 1)
9178 print_vma (exidx_entry, PREFIX_HEX);
9179 fputs (" [cantunwind]\n", stdout);
9181 else if (exidx_entry & 0x80000000)
9183 print_vma (exidx_entry, PREFIX_HEX);
9184 fputc ('\n', stdout);
9185 decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9189 bfd_vma table, table_offset = 0;
9190 Elf_Internal_Shdr *table_sec;
9192 fputs ("@", stdout);
9193 table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9194 print_vma (table, PREFIX_HEX);
9197 /* Locate the matching .ARM.extab. */
9198 if (entry_addr.section != SHN_UNDEF
9199 && entry_addr.section < filedata->file_header.e_shnum)
9201 table_sec = filedata->section_headers + entry_addr.section;
9202 table_offset = entry_addr.offset;
9204 if (table_offset > table_sec->sh_size
9205 || ((bfd_signed_vma) table_offset) < 0)
9207 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9208 (unsigned long) table_offset,
9209 printable_section_name (filedata, table_sec));
9216 table_sec = find_section_by_address (filedata, table);
9217 if (table_sec != NULL)
9218 table_offset = table - table_sec->sh_addr;
9221 if (table_sec == NULL)
9223 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9224 (unsigned long) table);
9229 if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9238 arm_free_section (&exidx_arm_sec);
9239 arm_free_section (&extab_arm_sec);
9244 /* Used for both ARM and C6X unwinding tables. */
9247 arm_process_unwind (Filedata * filedata)
9249 struct arm_unw_aux_info aux;
9250 Elf_Internal_Shdr *unwsec = NULL;
9251 Elf_Internal_Shdr *strsec;
9252 Elf_Internal_Shdr *sec;
9254 unsigned int sec_type;
9255 bfd_boolean res = TRUE;
9257 switch (filedata->file_header.e_machine)
9260 sec_type = SHT_ARM_EXIDX;
9264 sec_type = SHT_C6000_UNWIND;
9268 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9269 filedata->file_header.e_machine);
9273 if (filedata->string_table == NULL)
9276 memset (& aux, 0, sizeof (aux));
9277 aux.filedata = filedata;
9279 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9281 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9283 aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9285 strsec = filedata->section_headers + sec->sh_link;
9287 /* PR binutils/17531 file: 011-12666-0.004. */
9288 if (aux.strtab != NULL)
9290 error (_("Multiple string tables found in file.\n"));
9294 aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9295 1, strsec->sh_size, _("string table"));
9296 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9298 else if (sec->sh_type == sec_type)
9303 printf (_("\nThere are no unwind sections in this file.\n"));
9305 for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9307 if (sec->sh_type == sec_type)
9309 unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9310 printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9311 "contains %lu entry:\n",
9312 "\nUnwind section '%s' at offset 0x%lx "
9313 "contains %lu entries:\n",
9315 printable_section_name (filedata, sec),
9316 (unsigned long) sec->sh_offset,
9319 if (! dump_arm_unwind (filedata, &aux, sec))
9327 free ((char *) aux.strtab);
9333 process_unwind (Filedata * filedata)
9335 struct unwind_handler
9337 unsigned int machtype;
9338 bfd_boolean (* handler)(Filedata *);
9341 { EM_ARM, arm_process_unwind },
9342 { EM_IA_64, ia64_process_unwind },
9343 { EM_PARISC, hppa_process_unwind },
9344 { EM_TI_C6000, arm_process_unwind },
9352 for (i = 0; handlers[i].handler != NULL; i++)
9353 if (filedata->file_header.e_machine == handlers[i].machtype)
9354 return handlers[i].handler (filedata);
9356 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9357 get_machine_name (filedata->file_header.e_machine));
9362 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9364 switch (entry->d_tag)
9366 case DT_AARCH64_BTI_PLT:
9369 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9376 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9378 switch (entry->d_tag)
9381 if (entry->d_un.d_val == 0)
9385 static const char * opts[] =
9387 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9388 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9389 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9390 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9394 bfd_boolean first = TRUE;
9396 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9397 if (entry->d_un.d_val & (1 << cnt))
9399 printf ("%s%s", first ? "" : " ", opts[cnt]);
9405 case DT_MIPS_IVERSION:
9406 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9407 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9411 sprintf_vma (buf, entry->d_un.d_ptr);
9412 /* Note: coded this way so that there is a single string for translation. */
9413 printf (_("<corrupt: %s>"), buf);
9417 case DT_MIPS_TIME_STAMP:
9421 time_t atime = entry->d_un.d_val;
9423 tmp = gmtime (&atime);
9424 /* PR 17531: file: 6accc532. */
9426 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9428 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9429 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9430 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9431 printf (_("Time Stamp: %s"), timebuf);
9435 case DT_MIPS_RLD_VERSION:
9436 case DT_MIPS_LOCAL_GOTNO:
9437 case DT_MIPS_CONFLICTNO:
9438 case DT_MIPS_LIBLISTNO:
9439 case DT_MIPS_SYMTABNO:
9440 case DT_MIPS_UNREFEXTNO:
9441 case DT_MIPS_HIPAGENO:
9442 case DT_MIPS_DELTA_CLASS_NO:
9443 case DT_MIPS_DELTA_INSTANCE_NO:
9444 case DT_MIPS_DELTA_RELOC_NO:
9445 case DT_MIPS_DELTA_SYM_NO:
9446 case DT_MIPS_DELTA_CLASSSYM_NO:
9447 case DT_MIPS_COMPACT_SIZE:
9448 print_vma (entry->d_un.d_val, DEC);
9452 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9458 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9460 switch (entry->d_tag)
9462 case DT_HP_DLD_FLAGS:
9471 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9472 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9473 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9474 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9475 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9476 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9477 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9478 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9479 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9480 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9481 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9482 { DT_HP_GST, "HP_GST" },
9483 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9484 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9485 { DT_HP_NODELETE, "HP_NODELETE" },
9486 { DT_HP_GROUP, "HP_GROUP" },
9487 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9489 bfd_boolean first = TRUE;
9491 bfd_vma val = entry->d_un.d_val;
9493 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9494 if (val & flags[cnt].bit)
9498 fputs (flags[cnt].str, stdout);
9500 val ^= flags[cnt].bit;
9503 if (val != 0 || first)
9507 print_vma (val, HEX);
9513 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9521 /* VMS vs Unix time offset and factor. */
9523 #define VMS_EPOCH_OFFSET 35067168000000000LL
9524 #define VMS_GRANULARITY_FACTOR 10000000
9526 /* Display a VMS time in a human readable format. */
9529 print_vms_time (bfd_int64_t vmstime)
9534 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9535 tm = gmtime (&unxtime);
9536 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9537 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9538 tm->tm_hour, tm->tm_min, tm->tm_sec);
9543 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9545 switch (entry->d_tag)
9547 case DT_IA_64_PLT_RESERVE:
9548 /* First 3 slots reserved. */
9549 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9551 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9554 case DT_IA_64_VMS_LINKTIME:
9556 print_vms_time (entry->d_un.d_val);
9560 case DT_IA_64_VMS_LNKFLAGS:
9561 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9562 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9563 printf (" CALL_DEBUG");
9564 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9565 printf (" NOP0BUFS");
9566 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9567 printf (" P0IMAGE");
9568 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9569 printf (" MKTHREADS");
9570 if (entry->d_un.d_val & VMS_LF_UPCALLS)
9571 printf (" UPCALLS");
9572 if (entry->d_un.d_val & VMS_LF_IMGSTA)
9574 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9575 printf (" INITIALIZE");
9576 if (entry->d_un.d_val & VMS_LF_MAIN)
9578 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9579 printf (" EXE_INIT");
9580 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9581 printf (" TBK_IN_IMG");
9582 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9583 printf (" DBG_IN_IMG");
9584 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9585 printf (" TBK_IN_DSF");
9586 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9587 printf (" DBG_IN_DSF");
9588 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9589 printf (" SIGNATURES");
9590 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9591 printf (" REL_SEG_OFF");
9595 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9602 get_32bit_dynamic_section (Filedata * filedata)
9604 Elf32_External_Dyn * edyn;
9605 Elf32_External_Dyn * ext;
9606 Elf_Internal_Dyn * entry;
9608 edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9609 dynamic_size, _("dynamic section"));
9613 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9614 might not have the luxury of section headers. Look for the DT_NULL
9615 terminator to determine the number of entries. */
9616 for (ext = edyn, dynamic_nent = 0;
9617 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9621 if (BYTE_GET (ext->d_tag) == DT_NULL)
9625 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9627 if (dynamic_section == NULL)
9629 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9630 (unsigned long) dynamic_nent);
9635 for (ext = edyn, entry = dynamic_section;
9636 entry < dynamic_section + dynamic_nent;
9639 entry->d_tag = BYTE_GET (ext->d_tag);
9640 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9649 get_64bit_dynamic_section (Filedata * filedata)
9651 Elf64_External_Dyn * edyn;
9652 Elf64_External_Dyn * ext;
9653 Elf_Internal_Dyn * entry;
9655 /* Read in the data. */
9656 edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9657 dynamic_size, _("dynamic section"));
9661 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9662 might not have the luxury of section headers. Look for the DT_NULL
9663 terminator to determine the number of entries. */
9664 for (ext = edyn, dynamic_nent = 0;
9665 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9666 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9670 if (BYTE_GET (ext->d_tag) == DT_NULL)
9674 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9676 if (dynamic_section == NULL)
9678 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9679 (unsigned long) dynamic_nent);
9684 /* Convert from external to internal formats. */
9685 for (ext = edyn, entry = dynamic_section;
9686 entry < dynamic_section + dynamic_nent;
9689 entry->d_tag = BYTE_GET (ext->d_tag);
9690 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9699 print_dynamic_flags (bfd_vma flags)
9701 bfd_boolean first = TRUE;
9707 flag = flags & - flags;
9717 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9718 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9719 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9720 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9721 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9722 default: fputs (_("unknown"), stdout); break;
9728 /* Parse and display the contents of the dynamic section. */
9731 process_dynamic_section (Filedata * filedata)
9733 Elf_Internal_Dyn * entry;
9735 if (dynamic_size == 0)
9738 printf (_("\nThere is no dynamic section in this file.\n"));
9745 if (! get_32bit_dynamic_section (filedata))
9750 if (! get_64bit_dynamic_section (filedata))
9754 /* Find the appropriate symbol table. */
9755 if (dynamic_symbols == NULL)
9757 for (entry = dynamic_section;
9758 entry < dynamic_section + dynamic_nent;
9761 Elf_Internal_Shdr section;
9763 if (entry->d_tag != DT_SYMTAB)
9766 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9768 /* Since we do not know how big the symbol table is,
9769 we default to reading in the entire file (!) and
9770 processing that. This is overkill, I know, but it
9772 section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9773 if ((bfd_size_type) section.sh_offset > filedata->file_size)
9775 /* See PR 21379 for a reproducer. */
9776 error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9780 if (archive_file_offset != 0)
9781 section.sh_size = archive_file_size - section.sh_offset;
9783 section.sh_size = filedata->file_size - section.sh_offset;
9786 section.sh_entsize = sizeof (Elf32_External_Sym);
9788 section.sh_entsize = sizeof (Elf64_External_Sym);
9789 section.sh_name = filedata->string_table_length;
9791 if (dynamic_symbols != NULL)
9793 error (_("Multiple dynamic symbol table sections found\n"));
9794 free (dynamic_symbols);
9796 dynamic_symbols = GET_ELF_SYMBOLS (filedata, §ion, & num_dynamic_syms);
9797 if (num_dynamic_syms < 1)
9799 error (_("Unable to determine the number of symbols to load\n"));
9805 /* Similarly find a string table. */
9806 if (dynamic_strings == NULL)
9808 for (entry = dynamic_section;
9809 entry < dynamic_section + dynamic_nent;
9812 unsigned long offset;
9815 if (entry->d_tag != DT_STRTAB)
9818 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9820 /* Since we do not know how big the string table is,
9821 we default to reading in the entire file (!) and
9822 processing that. This is overkill, I know, but it
9825 offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9827 if (archive_file_offset != 0)
9828 str_tab_len = archive_file_size - offset;
9830 str_tab_len = filedata->file_size - offset;
9832 if (str_tab_len < 1)
9835 (_("Unable to determine the length of the dynamic string table\n"));
9839 if (dynamic_strings != NULL)
9841 error (_("Multiple dynamic string tables found\n"));
9842 free (dynamic_strings);
9845 dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9847 _("dynamic string table"));
9848 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9852 /* And find the syminfo section if available. */
9853 if (dynamic_syminfo == NULL)
9855 unsigned long syminsz = 0;
9857 for (entry = dynamic_section;
9858 entry < dynamic_section + dynamic_nent;
9861 if (entry->d_tag == DT_SYMINENT)
9863 /* Note: these braces are necessary to avoid a syntax
9864 error from the SunOS4 C compiler. */
9865 /* PR binutils/17531: A corrupt file can trigger this test.
9866 So do not use an assert, instead generate an error message. */
9867 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9868 error (_("Bad value (%d) for SYMINENT entry\n"),
9869 (int) entry->d_un.d_val);
9871 else if (entry->d_tag == DT_SYMINSZ)
9872 syminsz = entry->d_un.d_val;
9873 else if (entry->d_tag == DT_SYMINFO)
9874 dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9878 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9880 Elf_External_Syminfo * extsyminfo;
9881 Elf_External_Syminfo * extsym;
9882 Elf_Internal_Syminfo * syminfo;
9884 /* There is a syminfo section. Read the data. */
9885 extsyminfo = (Elf_External_Syminfo *)
9886 get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9887 _("symbol information"));
9891 if (dynamic_syminfo != NULL)
9893 error (_("Multiple dynamic symbol information sections found\n"));
9894 free (dynamic_syminfo);
9896 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9897 if (dynamic_syminfo == NULL)
9899 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9900 (unsigned long) syminsz);
9904 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9905 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9906 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9907 ++syminfo, ++extsym)
9909 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9910 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9917 if (do_dynamic && dynamic_addr)
9918 printf (ngettext ("\nDynamic section at offset 0x%lx "
9919 "contains %lu entry:\n",
9920 "\nDynamic section at offset 0x%lx "
9921 "contains %lu entries:\n",
9923 dynamic_addr, (unsigned long) dynamic_nent);
9925 printf (_(" Tag Type Name/Value\n"));
9927 for (entry = dynamic_section;
9928 entry < dynamic_section + dynamic_nent;
9936 print_vma (entry->d_tag, FULL_HEX);
9937 dtype = get_dynamic_type (filedata, entry->d_tag);
9938 printf (" (%s)%*s", dtype,
9939 ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9942 switch (entry->d_tag)
9946 print_dynamic_flags (entry->d_un.d_val);
9956 switch (entry->d_tag)
9959 printf (_("Auxiliary library"));
9963 printf (_("Filter library"));
9967 printf (_("Configuration file"));
9971 printf (_("Dependency audit library"));
9975 printf (_("Audit library"));
9979 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9980 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9984 print_vma (entry->d_un.d_val, PREFIX_HEX);
9993 printf (_("Flags:"));
9995 if (entry->d_un.d_val == 0)
9996 printf (_(" None\n"));
9999 unsigned long int val = entry->d_un.d_val;
10001 if (val & DTF_1_PARINIT)
10003 printf (" PARINIT");
10004 val ^= DTF_1_PARINIT;
10006 if (val & DTF_1_CONFEXP)
10008 printf (" CONFEXP");
10009 val ^= DTF_1_CONFEXP;
10012 printf (" %lx", val);
10021 printf (_("Flags:"));
10023 if (entry->d_un.d_val == 0)
10024 printf (_(" None\n"));
10027 unsigned long int val = entry->d_un.d_val;
10029 if (val & DF_P1_LAZYLOAD)
10031 printf (" LAZYLOAD");
10032 val ^= DF_P1_LAZYLOAD;
10034 if (val & DF_P1_GROUPPERM)
10036 printf (" GROUPPERM");
10037 val ^= DF_P1_GROUPPERM;
10040 printf (" %lx", val);
10049 printf (_("Flags:"));
10050 if (entry->d_un.d_val == 0)
10051 printf (_(" None\n"));
10054 unsigned long int val = entry->d_un.d_val;
10056 if (val & DF_1_NOW)
10061 if (val & DF_1_GLOBAL)
10063 printf (" GLOBAL");
10064 val ^= DF_1_GLOBAL;
10066 if (val & DF_1_GROUP)
10071 if (val & DF_1_NODELETE)
10073 printf (" NODELETE");
10074 val ^= DF_1_NODELETE;
10076 if (val & DF_1_LOADFLTR)
10078 printf (" LOADFLTR");
10079 val ^= DF_1_LOADFLTR;
10081 if (val & DF_1_INITFIRST)
10083 printf (" INITFIRST");
10084 val ^= DF_1_INITFIRST;
10086 if (val & DF_1_NOOPEN)
10088 printf (" NOOPEN");
10089 val ^= DF_1_NOOPEN;
10091 if (val & DF_1_ORIGIN)
10093 printf (" ORIGIN");
10094 val ^= DF_1_ORIGIN;
10096 if (val & DF_1_DIRECT)
10098 printf (" DIRECT");
10099 val ^= DF_1_DIRECT;
10101 if (val & DF_1_TRANS)
10106 if (val & DF_1_INTERPOSE)
10108 printf (" INTERPOSE");
10109 val ^= DF_1_INTERPOSE;
10111 if (val & DF_1_NODEFLIB)
10113 printf (" NODEFLIB");
10114 val ^= DF_1_NODEFLIB;
10116 if (val & DF_1_NODUMP)
10118 printf (" NODUMP");
10119 val ^= DF_1_NODUMP;
10121 if (val & DF_1_CONFALT)
10123 printf (" CONFALT");
10124 val ^= DF_1_CONFALT;
10126 if (val & DF_1_ENDFILTEE)
10128 printf (" ENDFILTEE");
10129 val ^= DF_1_ENDFILTEE;
10131 if (val & DF_1_DISPRELDNE)
10133 printf (" DISPRELDNE");
10134 val ^= DF_1_DISPRELDNE;
10136 if (val & DF_1_DISPRELPND)
10138 printf (" DISPRELPND");
10139 val ^= DF_1_DISPRELPND;
10141 if (val & DF_1_NODIRECT)
10143 printf (" NODIRECT");
10144 val ^= DF_1_NODIRECT;
10146 if (val & DF_1_IGNMULDEF)
10148 printf (" IGNMULDEF");
10149 val ^= DF_1_IGNMULDEF;
10151 if (val & DF_1_NOKSYMS)
10153 printf (" NOKSYMS");
10154 val ^= DF_1_NOKSYMS;
10156 if (val & DF_1_NOHDR)
10161 if (val & DF_1_EDITED)
10163 printf (" EDITED");
10164 val ^= DF_1_EDITED;
10166 if (val & DF_1_NORELOC)
10168 printf (" NORELOC");
10169 val ^= DF_1_NORELOC;
10171 if (val & DF_1_SYMINTPOSE)
10173 printf (" SYMINTPOSE");
10174 val ^= DF_1_SYMINTPOSE;
10176 if (val & DF_1_GLOBAUDIT)
10178 printf (" GLOBAUDIT");
10179 val ^= DF_1_GLOBAUDIT;
10181 if (val & DF_1_SINGLETON)
10183 printf (" SINGLETON");
10184 val ^= DF_1_SINGLETON;
10186 if (val & DF_1_STUB)
10191 if (val & DF_1_PIE)
10196 if (val & DF_1_KMOD)
10201 if (val & DF_1_WEAKFILTER)
10203 printf (" WEAKFILTER");
10204 val ^= DF_1_WEAKFILTER;
10206 if (val & DF_1_NOCOMMON)
10208 printf (" NOCOMMON");
10209 val ^= DF_1_NOCOMMON;
10212 printf (" %lx", val);
10219 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10221 puts (get_dynamic_type (filedata, entry->d_un.d_val));
10241 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10247 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10248 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10254 switch (entry->d_tag)
10257 printf (_("Shared library: [%s]"), name);
10259 if (streq (name, program_interpreter))
10260 printf (_(" program interpreter"));
10264 printf (_("Library soname: [%s]"), name);
10268 printf (_("Library rpath: [%s]"), name);
10272 printf (_("Library runpath: [%s]"), name);
10276 print_vma (entry->d_un.d_val, PREFIX_HEX);
10281 print_vma (entry->d_un.d_val, PREFIX_HEX);
10294 dynamic_info[entry->d_tag] = entry->d_un.d_val;
10295 /* Fall through. */
10299 case DT_INIT_ARRAYSZ:
10300 case DT_FINI_ARRAYSZ:
10301 case DT_GNU_CONFLICTSZ:
10302 case DT_GNU_LIBLISTSZ:
10305 print_vma (entry->d_un.d_val, UNSIGNED);
10306 printf (_(" (bytes)\n"));
10311 case DT_VERNEEDNUM:
10316 print_vma (entry->d_un.d_val, UNSIGNED);
10325 case DT_INIT_ARRAY:
10326 case DT_FINI_ARRAY:
10329 if (entry->d_tag == DT_USED
10330 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10332 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10336 printf (_("Not needed object: [%s]\n"), name);
10341 print_vma (entry->d_un.d_val, PREFIX_HEX);
10347 /* The value of this entry is ignored. */
10352 case DT_GNU_PRELINKED:
10356 time_t atime = entry->d_un.d_val;
10358 tmp = gmtime (&atime);
10359 /* PR 17533 file: 041-1244816-0.004. */
10361 printf (_("<corrupt time val: %lx"),
10362 (unsigned long) atime);
10364 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10365 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10366 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10372 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10375 print_vma (entry->d_un.d_val, PREFIX_HEX);
10381 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10382 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10387 switch (filedata->file_header.e_machine)
10390 dynamic_section_aarch64_val (entry);
10393 case EM_MIPS_RS3_LE:
10394 dynamic_section_mips_val (entry);
10397 dynamic_section_parisc_val (entry);
10400 dynamic_section_ia64_val (entry);
10403 print_vma (entry->d_un.d_val, PREFIX_HEX);
10415 get_ver_flags (unsigned int flags)
10417 static char buff[128];
10424 if (flags & VER_FLG_BASE)
10425 strcat (buff, "BASE");
10427 if (flags & VER_FLG_WEAK)
10429 if (flags & VER_FLG_BASE)
10430 strcat (buff, " | ");
10432 strcat (buff, "WEAK");
10435 if (flags & VER_FLG_INFO)
10437 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10438 strcat (buff, " | ");
10440 strcat (buff, "INFO");
10443 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10445 if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10446 strcat (buff, " | ");
10448 strcat (buff, _("<unknown>"));
10454 /* Display the contents of the version sections. */
10457 process_version_sections (Filedata * filedata)
10459 Elf_Internal_Shdr * section;
10461 bfd_boolean found = FALSE;
10466 for (i = 0, section = filedata->section_headers;
10467 i < filedata->file_header.e_shnum;
10470 switch (section->sh_type)
10472 case SHT_GNU_verdef:
10474 Elf_External_Verdef * edefs;
10481 printf (ngettext ("\nVersion definition section '%s' "
10482 "contains %u entry:\n",
10483 "\nVersion definition section '%s' "
10484 "contains %u entries:\n",
10486 printable_section_name (filedata, section),
10489 printf (_(" Addr: 0x"));
10490 printf_vma (section->sh_addr);
10491 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10492 (unsigned long) section->sh_offset, section->sh_link,
10493 printable_section_name_from_index (filedata, section->sh_link));
10495 edefs = (Elf_External_Verdef *)
10496 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10497 _("version definition section"));
10500 endbuf = (char *) edefs + section->sh_size;
10502 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10505 Elf_External_Verdef * edef;
10506 Elf_Internal_Verdef ent;
10507 Elf_External_Verdaux * eaux;
10508 Elf_Internal_Verdaux aux;
10509 unsigned long isum;
10512 vstart = ((char *) edefs) + idx;
10513 if (vstart + sizeof (*edef) > endbuf)
10516 edef = (Elf_External_Verdef *) vstart;
10518 ent.vd_version = BYTE_GET (edef->vd_version);
10519 ent.vd_flags = BYTE_GET (edef->vd_flags);
10520 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
10521 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
10522 ent.vd_hash = BYTE_GET (edef->vd_hash);
10523 ent.vd_aux = BYTE_GET (edef->vd_aux);
10524 ent.vd_next = BYTE_GET (edef->vd_next);
10526 printf (_(" %#06lx: Rev: %d Flags: %s"),
10527 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10529 printf (_(" Index: %d Cnt: %d "),
10530 ent.vd_ndx, ent.vd_cnt);
10532 /* Check for overflow. */
10533 if (ent.vd_aux > (size_t) (endbuf - vstart))
10536 vstart += ent.vd_aux;
10538 if (vstart + sizeof (*eaux) > endbuf)
10540 eaux = (Elf_External_Verdaux *) vstart;
10542 aux.vda_name = BYTE_GET (eaux->vda_name);
10543 aux.vda_next = BYTE_GET (eaux->vda_next);
10545 if (VALID_DYNAMIC_NAME (aux.vda_name))
10546 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10548 printf (_("Name index: %ld\n"), aux.vda_name);
10550 isum = idx + ent.vd_aux;
10552 for (j = 1; j < ent.vd_cnt; j++)
10554 if (aux.vda_next < sizeof (*eaux)
10555 && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10557 warn (_("Invalid vda_next field of %lx\n"),
10562 /* Check for overflow. */
10563 if (aux.vda_next > (size_t) (endbuf - vstart))
10566 isum += aux.vda_next;
10567 vstart += aux.vda_next;
10569 if (vstart + sizeof (*eaux) > endbuf)
10571 eaux = (Elf_External_Verdaux *) vstart;
10573 aux.vda_name = BYTE_GET (eaux->vda_name);
10574 aux.vda_next = BYTE_GET (eaux->vda_next);
10576 if (VALID_DYNAMIC_NAME (aux.vda_name))
10577 printf (_(" %#06lx: Parent %d: %s\n"),
10578 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10580 printf (_(" %#06lx: Parent %d, name index: %ld\n"),
10581 isum, j, aux.vda_name);
10584 if (j < ent.vd_cnt)
10585 printf (_(" Version def aux past end of section\n"));
10588 file: id:000001,src:000172+005151,op:splice,rep:2. */
10589 if (ent.vd_next < sizeof (*edef)
10590 && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10592 warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10593 cnt = section->sh_info;
10596 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10599 idx += ent.vd_next;
10602 if (cnt < section->sh_info)
10603 printf (_(" Version definition past end of section\n"));
10609 case SHT_GNU_verneed:
10611 Elf_External_Verneed * eneed;
10618 printf (ngettext ("\nVersion needs section '%s' "
10619 "contains %u entry:\n",
10620 "\nVersion needs section '%s' "
10621 "contains %u entries:\n",
10623 printable_section_name (filedata, section), section->sh_info);
10625 printf (_(" Addr: 0x"));
10626 printf_vma (section->sh_addr);
10627 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10628 (unsigned long) section->sh_offset, section->sh_link,
10629 printable_section_name_from_index (filedata, section->sh_link));
10631 eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10632 section->sh_offset, 1,
10634 _("Version Needs section"));
10637 endbuf = (char *) eneed + section->sh_size;
10639 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10641 Elf_External_Verneed * entry;
10642 Elf_Internal_Verneed ent;
10643 unsigned long isum;
10647 vstart = ((char *) eneed) + idx;
10648 if (vstart + sizeof (*entry) > endbuf)
10651 entry = (Elf_External_Verneed *) vstart;
10653 ent.vn_version = BYTE_GET (entry->vn_version);
10654 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10655 ent.vn_file = BYTE_GET (entry->vn_file);
10656 ent.vn_aux = BYTE_GET (entry->vn_aux);
10657 ent.vn_next = BYTE_GET (entry->vn_next);
10659 printf (_(" %#06lx: Version: %d"), idx, ent.vn_version);
10661 if (VALID_DYNAMIC_NAME (ent.vn_file))
10662 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10664 printf (_(" File: %lx"), ent.vn_file);
10666 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10668 /* Check for overflow. */
10669 if (ent.vn_aux > (size_t) (endbuf - vstart))
10671 vstart += ent.vn_aux;
10673 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10675 Elf_External_Vernaux * eaux;
10676 Elf_Internal_Vernaux aux;
10678 if (vstart + sizeof (*eaux) > endbuf)
10680 eaux = (Elf_External_Vernaux *) vstart;
10682 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10683 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10684 aux.vna_other = BYTE_GET (eaux->vna_other);
10685 aux.vna_name = BYTE_GET (eaux->vna_name);
10686 aux.vna_next = BYTE_GET (eaux->vna_next);
10688 if (VALID_DYNAMIC_NAME (aux.vna_name))
10689 printf (_(" %#06lx: Name: %s"),
10690 isum, GET_DYNAMIC_NAME (aux.vna_name));
10692 printf (_(" %#06lx: Name index: %lx"),
10693 isum, aux.vna_name);
10695 printf (_(" Flags: %s Version: %d\n"),
10696 get_ver_flags (aux.vna_flags), aux.vna_other);
10698 if (aux.vna_next < sizeof (*eaux)
10699 && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10701 warn (_("Invalid vna_next field of %lx\n"),
10706 /* Check for overflow. */
10707 if (aux.vna_next > (size_t) (endbuf - vstart))
10709 isum += aux.vna_next;
10710 vstart += aux.vna_next;
10713 if (j < ent.vn_cnt)
10714 warn (_("Missing Version Needs auxillary information\n"));
10716 if (ent.vn_next < sizeof (*entry)
10717 && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10719 warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10720 cnt = section->sh_info;
10723 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10725 idx += ent.vn_next;
10728 if (cnt < section->sh_info)
10729 warn (_("Missing Version Needs information\n"));
10735 case SHT_GNU_versym:
10737 Elf_Internal_Shdr * link_section;
10740 unsigned char * edata;
10741 unsigned short * data;
10743 Elf_Internal_Sym * symbols;
10744 Elf_Internal_Shdr * string_sec;
10745 unsigned long num_syms;
10748 if (section->sh_link >= filedata->file_header.e_shnum)
10751 link_section = filedata->section_headers + section->sh_link;
10752 total = section->sh_size / sizeof (Elf_External_Versym);
10754 if (link_section->sh_link >= filedata->file_header.e_shnum)
10759 symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10760 if (symbols == NULL)
10763 string_sec = filedata->section_headers + link_section->sh_link;
10765 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10766 string_sec->sh_size,
10767 _("version string table"));
10774 printf (ngettext ("\nVersion symbols section '%s' "
10775 "contains %lu entry:\n",
10776 "\nVersion symbols section '%s' "
10777 "contains %lu entries:\n",
10779 printable_section_name (filedata, section), (unsigned long) total);
10781 printf (_(" Addr: "));
10782 printf_vma (section->sh_addr);
10783 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10784 (unsigned long) section->sh_offset, section->sh_link,
10785 printable_section_name (filedata, link_section));
10787 off = offset_from_vma (filedata,
10788 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10789 total * sizeof (short));
10790 edata = (unsigned char *) get_data (NULL, filedata, off, total,
10792 _("version symbol data"));
10800 data = (short unsigned int *) cmalloc (total, sizeof (short));
10802 for (cnt = total; cnt --;)
10803 data[cnt] = byte_get (edata + cnt * sizeof (short),
10808 for (cnt = 0; cnt < total; cnt += 4)
10812 char *invalid = _("*invalid*");
10814 printf (" %03x:", cnt);
10816 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10817 switch (data[cnt + j])
10820 fputs (_(" 0 (*local*) "), stdout);
10824 fputs (_(" 1 (*global*) "), stdout);
10828 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10829 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10831 /* If this index value is greater than the size of the symbols
10832 array, break to avoid an out-of-bounds read. */
10833 if ((unsigned long)(cnt + j) >= num_syms)
10835 warn (_("invalid index into symbol array\n"));
10840 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10842 Elf_Internal_Verneed ivn;
10843 unsigned long offset;
10845 offset = offset_from_vma
10846 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10847 sizeof (Elf_External_Verneed));
10851 Elf_Internal_Vernaux ivna;
10852 Elf_External_Verneed evn;
10853 Elf_External_Vernaux evna;
10854 unsigned long a_off;
10856 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10857 _("version need")) == NULL)
10860 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10861 ivn.vn_next = BYTE_GET (evn.vn_next);
10863 a_off = offset + ivn.vn_aux;
10867 if (get_data (&evna, filedata, a_off, sizeof (evna),
10868 1, _("version need aux (2)")) == NULL)
10871 ivna.vna_other = 0;
10875 ivna.vna_next = BYTE_GET (evna.vna_next);
10876 ivna.vna_other = BYTE_GET (evna.vna_other);
10879 a_off += ivna.vna_next;
10881 while (ivna.vna_other != data[cnt + j]
10882 && ivna.vna_next != 0);
10884 if (ivna.vna_other == data[cnt + j])
10886 ivna.vna_name = BYTE_GET (evna.vna_name);
10888 if (ivna.vna_name >= string_sec->sh_size)
10891 name = strtab + ivna.vna_name;
10895 offset += ivn.vn_next;
10897 while (ivn.vn_next);
10900 if (data[cnt + j] != 0x8001
10901 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10903 Elf_Internal_Verdef ivd;
10904 Elf_External_Verdef evd;
10905 unsigned long offset;
10907 offset = offset_from_vma
10908 (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10913 if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10914 _("version def")) == NULL)
10917 /* PR 17531: file: 046-1082287-0.004. */
10918 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10923 ivd.vd_next = BYTE_GET (evd.vd_next);
10924 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10927 offset += ivd.vd_next;
10929 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10930 && ivd.vd_next != 0);
10932 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10934 Elf_External_Verdaux evda;
10935 Elf_Internal_Verdaux ivda;
10937 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10939 if (get_data (&evda, filedata,
10940 offset - ivd.vd_next + ivd.vd_aux,
10942 _("version def aux")) == NULL)
10945 ivda.vda_name = BYTE_GET (evda.vda_name);
10947 if (ivda.vda_name >= string_sec->sh_size)
10949 else if (name != NULL && name != invalid)
10950 name = _("*both*");
10952 name = strtab + ivda.vda_name;
10956 nn += printf ("(%s%-*s",
10958 12 - (int) strlen (name),
10962 printf ("%*c", 18 - nn, ' ');
10980 printf (_("\nNo version information found in this file.\n"));
10985 static const char *
10986 get_symbol_binding (Filedata * filedata, unsigned int binding)
10988 static char buff[32];
10992 case STB_LOCAL: return "LOCAL";
10993 case STB_GLOBAL: return "GLOBAL";
10994 case STB_WEAK: return "WEAK";
10996 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10997 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10999 else if (binding >= STB_LOOS && binding <= STB_HIOS)
11001 if (binding == STB_GNU_UNIQUE
11002 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11003 /* GNU is still using the default value 0. */
11004 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11006 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11009 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11014 static const char *
11015 get_symbol_type (Filedata * filedata, unsigned int type)
11017 static char buff[32];
11021 case STT_NOTYPE: return "NOTYPE";
11022 case STT_OBJECT: return "OBJECT";
11023 case STT_FUNC: return "FUNC";
11024 case STT_SECTION: return "SECTION";
11025 case STT_FILE: return "FILE";
11026 case STT_COMMON: return "COMMON";
11027 case STT_TLS: return "TLS";
11028 case STT_RELC: return "RELC";
11029 case STT_SRELC: return "SRELC";
11031 if (type >= STT_LOPROC && type <= STT_HIPROC)
11033 if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11034 return "THUMB_FUNC";
11036 if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11039 if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11040 return "PARISC_MILLI";
11042 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11044 else if (type >= STT_LOOS && type <= STT_HIOS)
11046 if (filedata->file_header.e_machine == EM_PARISC)
11048 if (type == STT_HP_OPAQUE)
11049 return "HP_OPAQUE";
11050 if (type == STT_HP_STUB)
11054 if (type == STT_GNU_IFUNC
11055 && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11056 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11057 /* GNU is still using the default value 0. */
11058 || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11061 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11064 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11069 static const char *
11070 get_symbol_visibility (unsigned int visibility)
11072 switch (visibility)
11074 case STV_DEFAULT: return "DEFAULT";
11075 case STV_INTERNAL: return "INTERNAL";
11076 case STV_HIDDEN: return "HIDDEN";
11077 case STV_PROTECTED: return "PROTECTED";
11079 error (_("Unrecognized visibility value: %u"), visibility);
11080 return _("<unknown>");
11084 static const char *
11085 get_solaris_symbol_visibility (unsigned int visibility)
11087 switch (visibility)
11089 case 4: return "EXPORTED";
11090 case 5: return "SINGLETON";
11091 case 6: return "ELIMINATE";
11092 default: return get_symbol_visibility (visibility);
11096 static const char *
11097 get_mips_symbol_other (unsigned int other)
11101 case STO_OPTIONAL: return "OPTIONAL";
11102 case STO_MIPS_PLT: return "MIPS PLT";
11103 case STO_MIPS_PIC: return "MIPS PIC";
11104 case STO_MICROMIPS: return "MICROMIPS";
11105 case STO_MICROMIPS | STO_MIPS_PIC: return "MICROMIPS, MIPS PIC";
11106 case STO_MIPS16: return "MIPS16";
11107 default: return NULL;
11111 static const char *
11112 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11114 if (is_ia64_vms (filedata))
11116 static char res[32];
11120 /* Function types is for images and .STB files only. */
11121 switch (filedata->file_header.e_type)
11125 switch (VMS_ST_FUNC_TYPE (other))
11127 case VMS_SFT_CODE_ADDR:
11128 strcat (res, " CA");
11130 case VMS_SFT_SYMV_IDX:
11131 strcat (res, " VEC");
11134 strcat (res, " FD");
11136 case VMS_SFT_RESERVE:
11137 strcat (res, " RSV");
11140 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11141 VMS_ST_FUNC_TYPE (other));
11142 strcat (res, " <unknown>");
11149 switch (VMS_ST_LINKAGE (other))
11151 case VMS_STL_IGNORE:
11152 strcat (res, " IGN");
11154 case VMS_STL_RESERVE:
11155 strcat (res, " RSV");
11158 strcat (res, " STD");
11161 strcat (res, " LNK");
11164 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11165 VMS_ST_LINKAGE (other));
11166 strcat (res, " <unknown>");
11178 static const char *
11179 get_ppc64_symbol_other (unsigned int other)
11181 if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11184 other >>= STO_PPC64_LOCAL_BIT;
11187 static char buf[32];
11189 other = ppc64_decode_local_entry (other);
11190 snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11196 static const char *
11197 get_symbol_other (Filedata * filedata, unsigned int other)
11199 const char * result = NULL;
11200 static char buff [32];
11205 switch (filedata->file_header.e_machine)
11208 result = get_mips_symbol_other (other);
11211 result = get_ia64_symbol_other (filedata, other);
11214 result = get_ppc64_symbol_other (other);
11224 snprintf (buff, sizeof buff, _("<other>: %x"), other);
11228 static const char *
11229 get_symbol_index_type (Filedata * filedata, unsigned int type)
11231 static char buff[32];
11235 case SHN_UNDEF: return "UND";
11236 case SHN_ABS: return "ABS";
11237 case SHN_COMMON: return "COM";
11239 if (type == SHN_IA_64_ANSI_COMMON
11240 && filedata->file_header.e_machine == EM_IA_64
11241 && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11243 else if ((filedata->file_header.e_machine == EM_X86_64
11244 || filedata->file_header.e_machine == EM_L1OM
11245 || filedata->file_header.e_machine == EM_K1OM)
11246 && type == SHN_X86_64_LCOMMON)
11247 return "LARGE_COM";
11248 else if ((type == SHN_MIPS_SCOMMON
11249 && filedata->file_header.e_machine == EM_MIPS)
11250 || (type == SHN_TIC6X_SCOMMON
11251 && filedata->file_header.e_machine == EM_TI_C6000))
11253 else if (type == SHN_MIPS_SUNDEFINED
11254 && filedata->file_header.e_machine == EM_MIPS)
11256 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11257 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11258 else if (type >= SHN_LOOS && type <= SHN_HIOS)
11259 sprintf (buff, "OS [0x%04x]", type & 0xffff);
11260 else if (type >= SHN_LORESERVE)
11261 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11262 else if (type >= filedata->file_header.e_shnum)
11263 sprintf (buff, _("bad section index[%3d]"), type);
11265 sprintf (buff, "%3d", type);
11273 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11275 unsigned char * e_data;
11278 /* If the size_t type is smaller than the bfd_size_type, eg because
11279 you are building a 32-bit tool on a 64-bit host, then make sure
11280 that when (number) is cast to (size_t) no information is lost. */
11281 if (sizeof (size_t) < sizeof (bfd_size_type)
11282 && (bfd_size_type) ((size_t) number) != number)
11284 error (_("Size truncation prevents reading %s elements of size %u\n"),
11285 bfd_vmatoa ("u", number), ent_size);
11289 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11290 attempting to allocate memory when the read is bound to fail. */
11291 if (ent_size * number > filedata->file_size)
11293 error (_("Invalid number of dynamic entries: %s\n"),
11294 bfd_vmatoa ("u", number));
11298 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11299 if (e_data == NULL)
11301 error (_("Out of memory reading %s dynamic entries\n"),
11302 bfd_vmatoa ("u", number));
11306 if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11308 error (_("Unable to read in %s bytes of dynamic data\n"),
11309 bfd_vmatoa ("u", number * ent_size));
11314 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11315 if (i_data == NULL)
11317 error (_("Out of memory allocating space for %s dynamic entries\n"),
11318 bfd_vmatoa ("u", number));
11324 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11332 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11334 Elf_Internal_Sym * psym;
11337 n = print_vma (si, DEC_5);
11339 fputs (&" "[n], stdout);
11340 printf (" %3lu: ", hn);
11342 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11344 printf (_("<No info available for dynamic symbol number %lu>\n"),
11345 (unsigned long) si);
11349 psym = dynamic_symbols + si;
11350 print_vma (psym->st_value, LONG_HEX);
11352 print_vma (psym->st_size, DEC_5);
11354 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11355 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11357 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11358 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11361 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11363 printf (" %-7s", get_symbol_visibility (vis));
11364 /* Check to see if any other bits in the st_other field are set.
11365 Note - displaying this information disrupts the layout of the
11366 table being generated, but for the moment this case is very
11368 if (psym->st_other ^ vis)
11369 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11372 printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11373 if (VALID_DYNAMIC_NAME (psym->st_name))
11374 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11376 printf (_(" <corrupt: %14ld>"), psym->st_name);
11380 static const char *
11381 get_symbol_version_string (Filedata * filedata,
11382 bfd_boolean is_dynsym,
11383 const char * strtab,
11384 unsigned long int strtab_size,
11386 Elf_Internal_Sym * psym,
11387 enum versioned_symbol_info * sym_info,
11388 unsigned short * vna_other)
11390 unsigned char data[2];
11391 unsigned short vers_data;
11392 unsigned long offset;
11393 unsigned short max_vd_ndx;
11396 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11399 offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11400 sizeof data + si * sizeof (vers_data));
11402 if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11403 sizeof (data), 1, _("version data")) == NULL)
11406 vers_data = byte_get (data, 2);
11408 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11413 /* Usually we'd only see verdef for defined symbols, and verneed for
11414 undefined symbols. However, symbols defined by the linker in
11415 .dynbss for variables copied from a shared library in order to
11416 avoid text relocations are defined yet have verneed. We could
11417 use a heuristic to detect the special case, for example, check
11418 for verneed first on symbols defined in SHT_NOBITS sections, but
11419 it is simpler and more reliable to just look for both verdef and
11420 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
11422 if (psym->st_shndx != SHN_UNDEF
11423 && vers_data != 0x8001
11424 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11426 Elf_Internal_Verdef ivd;
11427 Elf_Internal_Verdaux ivda;
11428 Elf_External_Verdaux evda;
11431 off = offset_from_vma (filedata,
11432 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11433 sizeof (Elf_External_Verdef));
11437 Elf_External_Verdef evd;
11439 if (get_data (&evd, filedata, off, sizeof (evd), 1,
11440 _("version def")) == NULL)
11449 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11450 ivd.vd_aux = BYTE_GET (evd.vd_aux);
11451 ivd.vd_next = BYTE_GET (evd.vd_next);
11452 ivd.vd_flags = BYTE_GET (evd.vd_flags);
11455 if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11456 max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11458 off += ivd.vd_next;
11460 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11462 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11464 if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11467 off -= ivd.vd_next;
11470 if (get_data (&evda, filedata, off, sizeof (evda), 1,
11471 _("version def aux")) != NULL)
11473 ivda.vda_name = BYTE_GET (evda.vda_name);
11475 if (psym->st_name != ivda.vda_name)
11477 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11478 ? symbol_hidden : symbol_public);
11479 return (ivda.vda_name < strtab_size
11480 ? strtab + ivda.vda_name : _("<corrupt>"));
11486 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11488 Elf_External_Verneed evn;
11489 Elf_Internal_Verneed ivn;
11490 Elf_Internal_Vernaux ivna;
11492 offset = offset_from_vma (filedata,
11493 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11497 unsigned long vna_off;
11499 if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11500 _("version need")) == NULL)
11503 ivna.vna_other = 0;
11508 ivn.vn_aux = BYTE_GET (evn.vn_aux);
11509 ivn.vn_next = BYTE_GET (evn.vn_next);
11511 vna_off = offset + ivn.vn_aux;
11515 Elf_External_Vernaux evna;
11517 if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11518 _("version need aux (3)")) == NULL)
11521 ivna.vna_other = 0;
11526 ivna.vna_other = BYTE_GET (evna.vna_other);
11527 ivna.vna_next = BYTE_GET (evna.vna_next);
11528 ivna.vna_name = BYTE_GET (evna.vna_name);
11531 vna_off += ivna.vna_next;
11533 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11535 if (ivna.vna_other == vers_data)
11538 offset += ivn.vn_next;
11540 while (ivn.vn_next != 0);
11542 if (ivna.vna_other == vers_data)
11544 *sym_info = symbol_undefined;
11545 *vna_other = ivna.vna_other;
11546 return (ivna.vna_name < strtab_size
11547 ? strtab + ivna.vna_name : _("<corrupt>"));
11549 else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11550 && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11551 return _("<corrupt>");
11556 /* Dump the symbol table. */
11558 process_symbol_table (Filedata * filedata)
11560 Elf_Internal_Shdr * section;
11561 bfd_size_type nbuckets = 0;
11562 bfd_size_type nchains = 0;
11563 bfd_vma * buckets = NULL;
11564 bfd_vma * chains = NULL;
11565 bfd_vma ngnubuckets = 0;
11566 bfd_vma * gnubuckets = NULL;
11567 bfd_vma * gnuchains = NULL;
11568 bfd_vma gnusymidx = 0;
11569 bfd_size_type ngnuchains = 0;
11571 if (!do_syms && !do_dyn_syms && !do_histogram)
11574 if (dynamic_info[DT_HASH]
11576 || (do_using_dynamic
11578 && dynamic_strings != NULL)))
11580 unsigned char nb[8];
11581 unsigned char nc[8];
11582 unsigned int hash_ent_size = 4;
11584 if ((filedata->file_header.e_machine == EM_ALPHA
11585 || filedata->file_header.e_machine == EM_S390
11586 || filedata->file_header.e_machine == EM_S390_OLD)
11587 && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11590 if (fseek (filedata->handle,
11591 (archive_file_offset
11592 + offset_from_vma (filedata, dynamic_info[DT_HASH],
11593 sizeof nb + sizeof nc)),
11596 error (_("Unable to seek to start of dynamic information\n"));
11600 if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11602 error (_("Failed to read in number of buckets\n"));
11606 if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11608 error (_("Failed to read in number of chains\n"));
11612 nbuckets = byte_get (nb, hash_ent_size);
11613 nchains = byte_get (nc, hash_ent_size);
11615 buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11616 chains = get_dynamic_data (filedata, nchains, hash_ent_size);
11619 if (buckets == NULL || chains == NULL)
11621 if (do_using_dynamic)
11632 if (dynamic_info_DT_GNU_HASH
11634 || (do_using_dynamic
11636 && dynamic_strings != NULL)))
11638 unsigned char nb[16];
11639 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11640 bfd_vma buckets_vma;
11642 if (fseek (filedata->handle,
11643 (archive_file_offset
11644 + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11648 error (_("Unable to seek to start of dynamic information\n"));
11652 if (fread (nb, 16, 1, filedata->handle) != 1)
11654 error (_("Failed to read in number of buckets\n"));
11658 ngnubuckets = byte_get (nb, 4);
11659 gnusymidx = byte_get (nb + 4, 4);
11660 bitmaskwords = byte_get (nb + 8, 4);
11661 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11663 buckets_vma += bitmaskwords * 4;
11665 buckets_vma += bitmaskwords * 8;
11667 if (fseek (filedata->handle,
11668 (archive_file_offset
11669 + offset_from_vma (filedata, buckets_vma, 4)),
11672 error (_("Unable to seek to start of dynamic information\n"));
11676 gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11678 if (gnubuckets == NULL)
11681 for (i = 0; i < ngnubuckets; i++)
11682 if (gnubuckets[i] != 0)
11684 if (gnubuckets[i] < gnusymidx)
11687 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11688 maxchain = gnubuckets[i];
11691 if (maxchain == 0xffffffff)
11694 maxchain -= gnusymidx;
11696 if (fseek (filedata->handle,
11697 (archive_file_offset
11698 + offset_from_vma (filedata, buckets_vma
11699 + 4 * (ngnubuckets + maxchain), 4)),
11702 error (_("Unable to seek to start of dynamic information\n"));
11708 if (fread (nb, 4, 1, filedata->handle) != 1)
11710 error (_("Failed to determine last chain length\n"));
11714 if (maxchain + 1 == 0)
11719 while ((byte_get (nb, 4) & 1) == 0);
11721 if (fseek (filedata->handle,
11722 (archive_file_offset
11723 + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11726 error (_("Unable to seek to start of dynamic information\n"));
11730 gnuchains = get_dynamic_data (filedata, maxchain, 4);
11731 ngnuchains = maxchain;
11734 if (gnuchains == NULL)
11739 if (do_using_dynamic)
11744 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11746 && do_using_dynamic
11747 && dynamic_strings != NULL
11748 && dynamic_symbols != NULL)
11752 if (dynamic_info[DT_HASH])
11757 printf (_("\nSymbol table for image:\n"));
11759 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11761 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11763 visited = xcmalloc (nchains, 1);
11764 memset (visited, 0, nchains);
11765 for (hn = 0; hn < nbuckets; hn++)
11767 for (si = buckets[hn]; si > 0; si = chains[si])
11769 print_dynamic_symbol (filedata, si, hn);
11770 if (si >= nchains || visited[si])
11772 error (_("histogram chain is corrupt\n"));
11781 if (dynamic_info_DT_GNU_HASH)
11783 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11785 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11787 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11789 for (hn = 0; hn < ngnubuckets; ++hn)
11790 if (gnubuckets[hn] != 0)
11792 bfd_vma si = gnubuckets[hn];
11793 bfd_vma off = si - gnusymidx;
11797 print_dynamic_symbol (filedata, si, hn);
11800 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11804 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11805 && filedata->section_headers != NULL)
11809 for (i = 0, section = filedata->section_headers;
11810 i < filedata->file_header.e_shnum;
11814 char * strtab = NULL;
11815 unsigned long int strtab_size = 0;
11816 Elf_Internal_Sym * symtab;
11817 Elf_Internal_Sym * psym;
11818 unsigned long num_syms;
11820 if ((section->sh_type != SHT_SYMTAB
11821 && section->sh_type != SHT_DYNSYM)
11823 && section->sh_type == SHT_SYMTAB))
11826 if (section->sh_entsize == 0)
11828 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11829 printable_section_name (filedata, section));
11833 num_syms = section->sh_size / section->sh_entsize;
11834 printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11835 "\nSymbol table '%s' contains %lu entries:\n",
11837 printable_section_name (filedata, section),
11841 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11843 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11845 symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11846 if (symtab == NULL)
11849 if (section->sh_link == filedata->file_header.e_shstrndx)
11851 strtab = filedata->string_table;
11852 strtab_size = filedata->string_table_length;
11854 else if (section->sh_link < filedata->file_header.e_shnum)
11856 Elf_Internal_Shdr * string_sec;
11858 string_sec = filedata->section_headers + section->sh_link;
11860 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11861 1, string_sec->sh_size,
11862 _("string table"));
11863 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11866 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11868 const char *version_string;
11869 enum versioned_symbol_info sym_info;
11870 unsigned short vna_other;
11872 printf ("%6d: ", si);
11873 print_vma (psym->st_value, LONG_HEX);
11875 print_vma (psym->st_size, DEC_5);
11876 printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11877 printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11878 if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11879 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11882 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11884 printf (" %-7s", get_symbol_visibility (vis));
11885 /* Check to see if any other bits in the st_other field are set.
11886 Note - displaying this information disrupts the layout of the
11887 table being generated, but for the moment this case is very rare. */
11888 if (psym->st_other ^ vis)
11889 printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11891 printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11892 print_symbol (25, psym->st_name < strtab_size
11893 ? strtab + psym->st_name : _("<corrupt>"));
11896 = get_symbol_version_string (filedata,
11897 section->sh_type == SHT_DYNSYM,
11898 strtab, strtab_size, si,
11899 psym, &sym_info, &vna_other);
11900 if (version_string)
11902 if (sym_info == symbol_undefined)
11903 printf ("@%s (%d)", version_string, vna_other);
11905 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11911 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11912 && si >= section->sh_info
11913 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11914 && filedata->file_header.e_machine != EM_MIPS
11915 /* Solaris binaries have been found to violate this requirement as
11916 well. Not sure if this is a bug or an ABI requirement. */
11917 && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11918 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11919 si, printable_section_name (filedata, section), section->sh_info);
11923 if (strtab != filedata->string_table)
11929 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11931 if (do_histogram && buckets != NULL)
11933 unsigned long * lengths;
11934 unsigned long * counts;
11937 unsigned long maxlength = 0;
11938 unsigned long nzero_counts = 0;
11939 unsigned long nsyms = 0;
11942 printf (ngettext ("\nHistogram for bucket list length "
11943 "(total of %lu bucket):\n",
11944 "\nHistogram for bucket list length "
11945 "(total of %lu buckets):\n",
11946 (unsigned long) nbuckets),
11947 (unsigned long) nbuckets);
11949 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11950 if (lengths == NULL)
11952 error (_("Out of memory allocating space for histogram buckets\n"));
11955 visited = xcmalloc (nchains, 1);
11956 memset (visited, 0, nchains);
11958 printf (_(" Length Number %% of total Coverage\n"));
11959 for (hn = 0; hn < nbuckets; ++hn)
11961 for (si = buckets[hn]; si > 0; si = chains[si])
11964 if (maxlength < ++lengths[hn])
11966 if (si >= nchains || visited[si])
11968 error (_("histogram chain is corrupt\n"));
11976 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11977 if (counts == NULL)
11980 error (_("Out of memory allocating space for histogram counts\n"));
11984 for (hn = 0; hn < nbuckets; ++hn)
11985 ++counts[lengths[hn]];
11990 printf (" 0 %-10lu (%5.1f%%)\n",
11991 counts[0], (counts[0] * 100.0) / nbuckets);
11992 for (i = 1; i <= maxlength; ++i)
11994 nzero_counts += counts[i] * i;
11995 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11996 i, counts[i], (counts[i] * 100.0) / nbuckets,
11997 (nzero_counts * 100.0) / nsyms);
12005 if (buckets != NULL)
12011 if (do_histogram && gnubuckets != NULL)
12013 unsigned long * lengths;
12014 unsigned long * counts;
12016 unsigned long maxlength = 0;
12017 unsigned long nzero_counts = 0;
12018 unsigned long nsyms = 0;
12020 printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12021 "(total of %lu bucket):\n",
12022 "\nHistogram for `.gnu.hash' bucket list length "
12023 "(total of %lu buckets):\n",
12024 (unsigned long) ngnubuckets),
12025 (unsigned long) ngnubuckets);
12027 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12028 if (lengths == NULL)
12030 error (_("Out of memory allocating space for gnu histogram buckets\n"));
12034 printf (_(" Length Number %% of total Coverage\n"));
12036 for (hn = 0; hn < ngnubuckets; ++hn)
12037 if (gnubuckets[hn] != 0)
12039 bfd_vma off, length = 1;
12041 for (off = gnubuckets[hn] - gnusymidx;
12042 /* PR 17531 file: 010-77222-0.004. */
12043 off < ngnuchains && (gnuchains[off] & 1) == 0;
12046 lengths[hn] = length;
12047 if (length > maxlength)
12048 maxlength = length;
12052 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12053 if (counts == NULL)
12056 error (_("Out of memory allocating space for gnu histogram counts\n"));
12060 for (hn = 0; hn < ngnubuckets; ++hn)
12061 ++counts[lengths[hn]];
12063 if (ngnubuckets > 0)
12066 printf (" 0 %-10lu (%5.1f%%)\n",
12067 counts[0], (counts[0] * 100.0) / ngnubuckets);
12068 for (j = 1; j <= maxlength; ++j)
12070 nzero_counts += counts[j] * j;
12071 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
12072 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12073 (nzero_counts * 100.0) / nsyms);
12087 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12091 if (dynamic_syminfo == NULL
12093 /* No syminfo, this is ok. */
12096 /* There better should be a dynamic symbol section. */
12097 if (dynamic_symbols == NULL || dynamic_strings == NULL)
12101 printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12102 "contains %d entry:\n",
12103 "\nDynamic info segment at offset 0x%lx "
12104 "contains %d entries:\n",
12105 dynamic_syminfo_nent),
12106 dynamic_syminfo_offset, dynamic_syminfo_nent);
12108 printf (_(" Num: Name BoundTo Flags\n"));
12109 for (i = 0; i < dynamic_syminfo_nent; ++i)
12111 unsigned short int flags = dynamic_syminfo[i].si_flags;
12113 printf ("%4d: ", i);
12114 if (i >= num_dynamic_syms)
12115 printf (_("<corrupt index>"));
12116 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12117 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12119 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12122 switch (dynamic_syminfo[i].si_boundto)
12124 case SYMINFO_BT_SELF:
12125 fputs ("SELF ", stdout);
12127 case SYMINFO_BT_PARENT:
12128 fputs ("PARENT ", stdout);
12131 if (dynamic_syminfo[i].si_boundto > 0
12132 && dynamic_syminfo[i].si_boundto < dynamic_nent
12133 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12135 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12139 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12143 if (flags & SYMINFO_FLG_DIRECT)
12144 printf (" DIRECT");
12145 if (flags & SYMINFO_FLG_PASSTHRU)
12146 printf (" PASSTHRU");
12147 if (flags & SYMINFO_FLG_COPY)
12149 if (flags & SYMINFO_FLG_LAZYLOAD)
12150 printf (" LAZYLOAD");
12158 #define IN_RANGE(START,END,ADDR,OFF) \
12159 (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12161 /* Check to see if the given reloc needs to be handled in a target specific
12162 manner. If so then process the reloc and return TRUE otherwise return
12165 If called with reloc == NULL, then this is a signal that reloc processing
12166 for the current section has finished, and any saved state should be
12170 target_specific_reloc_handling (Filedata * filedata,
12171 Elf_Internal_Rela * reloc,
12172 unsigned char * start,
12173 unsigned char * end,
12174 Elf_Internal_Sym * symtab,
12175 unsigned long num_syms)
12177 unsigned int reloc_type = 0;
12178 unsigned long sym_index = 0;
12182 reloc_type = get_reloc_type (filedata, reloc->r_info);
12183 sym_index = get_reloc_symindex (reloc->r_info);
12186 switch (filedata->file_header.e_machine)
12189 case EM_MSP430_OLD:
12191 static Elf_Internal_Sym * saved_sym = NULL;
12199 switch (reloc_type)
12201 case 10: /* R_MSP430_SYM_DIFF */
12202 if (uses_msp430x_relocs (filedata))
12204 /* Fall through. */
12205 case 21: /* R_MSP430X_SYM_DIFF */
12207 if (sym_index >= num_syms)
12208 error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12211 saved_sym = symtab + sym_index;
12214 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12215 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12216 goto handle_sym_diff;
12218 case 5: /* R_MSP430_16_BYTE */
12219 case 9: /* R_MSP430_8 */
12220 if (uses_msp430x_relocs (filedata))
12222 goto handle_sym_diff;
12224 case 2: /* R_MSP430_ABS16 */
12225 case 15: /* R_MSP430X_ABS16 */
12226 if (! uses_msp430x_relocs (filedata))
12228 goto handle_sym_diff;
12231 if (saved_sym != NULL)
12233 int reloc_size = reloc_type == 1 ? 4 : 2;
12236 if (sym_index >= num_syms)
12237 error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12241 value = reloc->r_addend + (symtab[sym_index].st_value
12242 - saved_sym->st_value);
12244 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12245 byte_put (start + reloc->r_offset, value, reloc_size);
12248 error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12249 (long) reloc->r_offset);
12258 if (saved_sym != NULL)
12259 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12266 case EM_CYGNUS_MN10300:
12268 static Elf_Internal_Sym * saved_sym = NULL;
12276 switch (reloc_type)
12278 case 34: /* R_MN10300_ALIGN */
12280 case 33: /* R_MN10300_SYM_DIFF */
12281 if (sym_index >= num_syms)
12282 error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12285 saved_sym = symtab + sym_index;
12288 case 1: /* R_MN10300_32 */
12289 case 2: /* R_MN10300_16 */
12290 if (saved_sym != NULL)
12292 int reloc_size = reloc_type == 1 ? 4 : 2;
12295 if (sym_index >= num_syms)
12296 error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12300 value = reloc->r_addend + (symtab[sym_index].st_value
12301 - saved_sym->st_value);
12303 if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12304 byte_put (start + reloc->r_offset, value, reloc_size);
12306 error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12307 (long) reloc->r_offset);
12315 if (saved_sym != NULL)
12316 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12324 static bfd_vma saved_sym1 = 0;
12325 static bfd_vma saved_sym2 = 0;
12326 static bfd_vma value;
12330 saved_sym1 = saved_sym2 = 0;
12334 switch (reloc_type)
12336 case 0x80: /* R_RL78_SYM. */
12337 saved_sym1 = saved_sym2;
12338 if (sym_index >= num_syms)
12339 error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12343 saved_sym2 = symtab[sym_index].st_value;
12344 saved_sym2 += reloc->r_addend;
12348 case 0x83: /* R_RL78_OPsub. */
12349 value = saved_sym1 - saved_sym2;
12350 saved_sym2 = saved_sym1 = 0;
12354 case 0x41: /* R_RL78_ABS32. */
12355 if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12356 byte_put (start + reloc->r_offset, value, 4);
12358 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12359 (long) reloc->r_offset);
12363 case 0x43: /* R_RL78_ABS16. */
12364 if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12365 byte_put (start + reloc->r_offset, value, 2);
12367 error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12368 (long) reloc->r_offset);
12382 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12383 DWARF debug sections. This is a target specific test. Note - we do not
12384 go through the whole including-target-headers-multiple-times route, (as
12385 we have already done with <elf/h8.h>) because this would become very
12386 messy and even then this function would have to contain target specific
12387 information (the names of the relocs instead of their numeric values).
12388 FIXME: This is not the correct way to solve this problem. The proper way
12389 is to have target specific reloc sizing and typing functions created by
12390 the reloc-macros.h header, in the same way that it already creates the
12391 reloc naming functions. */
12394 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12396 /* Please keep this table alpha-sorted for ease of visual lookup. */
12397 switch (filedata->file_header.e_machine)
12401 return reloc_type == 1; /* R_386_32. */
12403 return reloc_type == 1; /* R_68K_32. */
12405 return reloc_type == 1; /* R_860_32. */
12407 return reloc_type == 2; /* R_960_32. */
12409 return (reloc_type == 258
12410 || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12411 case EM_ADAPTEVA_EPIPHANY:
12412 return reloc_type == 3;
12414 return reloc_type == 1; /* R_ALPHA_REFLONG. */
12416 return reloc_type == 1; /* R_ARC_32. */
12417 case EM_ARC_COMPACT:
12418 case EM_ARC_COMPACT2:
12419 return reloc_type == 4; /* R_ARC_32. */
12421 return reloc_type == 2; /* R_ARM_ABS32 */
12424 return reloc_type == 1;
12426 return reloc_type == 0x12; /* R_byte4_data. */
12428 return reloc_type == 3; /* R_CRIS_32. */
12430 return reloc_type == 3; /* R_CR16_NUM32. */
12432 return reloc_type == 15; /* R_CRX_NUM32. */
12434 return reloc_type == 1; /* R_CKCORE_ADDR32. */
12435 case EM_CYGNUS_FRV:
12436 return reloc_type == 1;
12437 case EM_CYGNUS_D10V:
12439 return reloc_type == 6; /* R_D10V_32. */
12440 case EM_CYGNUS_D30V:
12442 return reloc_type == 12; /* R_D30V_32_NORMAL. */
12444 return reloc_type == 3; /* R_DLX_RELOC_32. */
12445 case EM_CYGNUS_FR30:
12447 return reloc_type == 3; /* R_FR30_32. */
12449 return reloc_type == 1; /* R_FT32_32. */
12453 return reloc_type == 1; /* R_H8_DIR32. */
12455 return (reloc_type == 0x64 /* R_IA64_SECREL32MSB. */
12456 || reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
12457 || reloc_type == 0x24 /* R_IA64_DIR32MSB. */
12458 || reloc_type == 0x25 /* R_IA64_DIR32LSB. */);
12461 return reloc_type == 2; /* R_IP2K_32. */
12463 return reloc_type == 2; /* R_IQ2000_32. */
12464 case EM_LATTICEMICO32:
12465 return reloc_type == 3; /* R_LM32_32. */
12468 return reloc_type == 3; /* R_M32C_32. */
12470 return reloc_type == 34; /* R_M32R_32_RELA. */
12473 return reloc_type == 6; /* R_M68HC11_32. */
12475 return reloc_type == 7 || /* R_S12Z_EXT32 */
12476 reloc_type == 6; /* R_S12Z_CW32. */
12478 return reloc_type == 1; /* R_MCORE_ADDR32. */
12479 case EM_CYGNUS_MEP:
12480 return reloc_type == 4; /* R_MEP_32. */
12482 return reloc_type == 2; /* R_METAG_ADDR32. */
12483 case EM_MICROBLAZE:
12484 return reloc_type == 1; /* R_MICROBLAZE_32. */
12486 return reloc_type == 2; /* R_MIPS_32. */
12488 return reloc_type == 4; /* R_MMIX_32. */
12489 case EM_CYGNUS_MN10200:
12491 return reloc_type == 1; /* R_MN10200_32. */
12492 case EM_CYGNUS_MN10300:
12494 return reloc_type == 1; /* R_MN10300_32. */
12496 return reloc_type == 1; /* R_MOXIE_32. */
12497 case EM_MSP430_OLD:
12499 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
12501 return reloc_type == 2; /* R_MT_32. */
12503 return reloc_type == 20; /* R_NDS32_RELA. */
12504 case EM_ALTERA_NIOS2:
12505 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
12507 return reloc_type == 1; /* R_NIOS_32. */
12509 return reloc_type == 1; /* R_OR1K_32. */
12511 return (reloc_type == 1 /* R_PARISC_DIR32. */
12512 || reloc_type == 2 /* R_PARISC_DIR21L. */
12513 || reloc_type == 41); /* R_PARISC_SECREL32. */
12516 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
12518 return reloc_type == 1; /* R_PPC64_ADDR32. */
12520 return reloc_type == 1; /* R_PPC_ADDR32. */
12522 return reloc_type == 11; /* R_PRU_BFD_RELOC_32. */
12524 return reloc_type == 1; /* R_RISCV_32. */
12526 return reloc_type == 1; /* R_RL78_DIR32. */
12528 return reloc_type == 1; /* R_RX_DIR32. */
12530 return reloc_type == 1; /* R_I370_ADDR31. */
12533 return reloc_type == 4; /* R_S390_32. */
12535 return reloc_type == 8; /* R_SCORE_ABS32. */
12537 return reloc_type == 1; /* R_SH_DIR32. */
12538 case EM_SPARC32PLUS:
12541 return reloc_type == 3 /* R_SPARC_32. */
12542 || reloc_type == 23; /* R_SPARC_UA32. */
12544 return reloc_type == 6; /* R_SPU_ADDR32 */
12546 return reloc_type == 1; /* R_C6000_ABS32. */
12548 return reloc_type == 2; /* R_TILEGX_32. */
12550 return reloc_type == 1; /* R_TILEPRO_32. */
12551 case EM_CYGNUS_V850:
12553 return reloc_type == 6; /* R_V850_ABS32. */
12555 return reloc_type == 0x33; /* R_V810_WORD. */
12557 return reloc_type == 1; /* R_VAX_32. */
12559 return reloc_type == 3; /* R_VISIUM_32. */
12560 case EM_WEBASSEMBLY:
12561 return reloc_type == 1; /* R_WASM32_32. */
12565 return reloc_type == 10; /* R_X86_64_32. */
12568 return reloc_type == 3; /* R_XC16C_ABS_32. */
12570 return reloc_type == 4; /* R_XGATE_32. */
12572 return reloc_type == 1; /* R_XSTROMY16_32. */
12573 case EM_XTENSA_OLD:
12575 return reloc_type == 1; /* R_XTENSA_32. */
12578 static unsigned int prev_warn = 0;
12580 /* Avoid repeating the same warning multiple times. */
12581 if (prev_warn != filedata->file_header.e_machine)
12582 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12583 filedata->file_header.e_machine);
12584 prev_warn = filedata->file_header.e_machine;
12590 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12591 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
12594 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12596 switch (filedata->file_header.e_machine)
12597 /* Please keep this table alpha-sorted for ease of visual lookup. */
12601 return reloc_type == 2; /* R_386_PC32. */
12603 return reloc_type == 4; /* R_68K_PC32. */
12605 return reloc_type == 261; /* R_AARCH64_PREL32 */
12606 case EM_ADAPTEVA_EPIPHANY:
12607 return reloc_type == 6;
12609 return reloc_type == 10; /* R_ALPHA_SREL32. */
12610 case EM_ARC_COMPACT:
12611 case EM_ARC_COMPACT2:
12612 return reloc_type == 49; /* R_ARC_32_PCREL. */
12614 return reloc_type == 3; /* R_ARM_REL32 */
12617 return reloc_type == 36; /* R_AVR_32_PCREL. */
12618 case EM_MICROBLAZE:
12619 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
12621 return reloc_type == 9; /* R_OR1K_32_PCREL. */
12623 return reloc_type == 9; /* R_PARISC_PCREL32. */
12625 return reloc_type == 26; /* R_PPC_REL32. */
12627 return reloc_type == 26; /* R_PPC64_REL32. */
12629 return reloc_type == 57; /* R_RISCV_32_PCREL. */
12632 return reloc_type == 5; /* R_390_PC32. */
12634 return reloc_type == 2; /* R_SH_REL32. */
12635 case EM_SPARC32PLUS:
12638 return reloc_type == 6; /* R_SPARC_DISP32. */
12640 return reloc_type == 13; /* R_SPU_REL32. */
12642 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
12644 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
12646 return reloc_type == 6; /* R_VISIUM_32_PCREL */
12650 return reloc_type == 2; /* R_X86_64_PC32. */
12651 case EM_XTENSA_OLD:
12653 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
12655 /* Do not abort or issue an error message here. Not all targets use
12656 pc-relative 32-bit relocs in their DWARF debug information and we
12657 have already tested for target coverage in is_32bit_abs_reloc. A
12658 more helpful warning message will be generated by apply_relocations
12659 anyway, so just return. */
12664 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12665 a 64-bit absolute RELA relocation used in DWARF debug sections. */
12668 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12670 switch (filedata->file_header.e_machine)
12673 return reloc_type == 257; /* R_AARCH64_ABS64. */
12675 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
12677 return (reloc_type == 0x26 /* R_IA64_DIR64MSB. */
12678 || reloc_type == 0x27 /* R_IA64_DIR64LSB. */);
12680 return reloc_type == 80; /* R_PARISC_DIR64. */
12682 return reloc_type == 38; /* R_PPC64_ADDR64. */
12684 return reloc_type == 2; /* R_RISCV_64. */
12685 case EM_SPARC32PLUS:
12688 return reloc_type == 32 /* R_SPARC_64. */
12689 || reloc_type == 54; /* R_SPARC_UA64. */
12693 return reloc_type == 1; /* R_X86_64_64. */
12696 return reloc_type == 22; /* R_S390_64. */
12698 return reloc_type == 1; /* R_TILEGX_64. */
12700 return reloc_type == 18; /* R_MIPS_64. */
12706 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12707 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
12710 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12712 switch (filedata->file_header.e_machine)
12715 return reloc_type == 260; /* R_AARCH64_PREL64. */
12717 return reloc_type == 11; /* R_ALPHA_SREL64. */
12719 return (reloc_type == 0x4e /* R_IA64_PCREL64MSB. */
12720 || reloc_type == 0x4f /* R_IA64_PCREL64LSB. */);
12722 return reloc_type == 72; /* R_PARISC_PCREL64. */
12724 return reloc_type == 44; /* R_PPC64_REL64. */
12725 case EM_SPARC32PLUS:
12728 return reloc_type == 46; /* R_SPARC_DISP64. */
12732 return reloc_type == 24; /* R_X86_64_PC64. */
12735 return reloc_type == 23; /* R_S390_PC64. */
12737 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
12743 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12744 a 24-bit absolute RELA relocation used in DWARF debug sections. */
12747 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12749 switch (filedata->file_header.e_machine)
12751 case EM_CYGNUS_MN10200:
12753 return reloc_type == 4; /* R_MN10200_24. */
12755 return reloc_type == 5; /* R_FT32_20. */
12761 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12762 a 16-bit absolute RELA relocation used in DWARF debug sections. */
12765 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12767 /* Please keep this table alpha-sorted for ease of visual lookup. */
12768 switch (filedata->file_header.e_machine)
12771 case EM_ARC_COMPACT:
12772 case EM_ARC_COMPACT2:
12773 return reloc_type == 2; /* R_ARC_16. */
12774 case EM_ADAPTEVA_EPIPHANY:
12775 return reloc_type == 5;
12778 return reloc_type == 4; /* R_AVR_16. */
12779 case EM_CYGNUS_D10V:
12781 return reloc_type == 3; /* R_D10V_16. */
12783 return reloc_type == 2; /* R_FT32_16. */
12787 return reloc_type == R_H8_DIR16;
12790 return reloc_type == 1; /* R_IP2K_16. */
12793 return reloc_type == 1; /* R_M32C_16 */
12794 case EM_CYGNUS_MN10200:
12796 return reloc_type == 2; /* R_MN10200_16. */
12797 case EM_CYGNUS_MN10300:
12799 return reloc_type == 2; /* R_MN10300_16. */
12801 if (uses_msp430x_relocs (filedata))
12802 return reloc_type == 2; /* R_MSP430_ABS16. */
12803 /* Fall through. */
12804 case EM_MSP430_OLD:
12805 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12807 return reloc_type == 19; /* R_NDS32_RELA. */
12808 case EM_ALTERA_NIOS2:
12809 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12811 return reloc_type == 9; /* R_NIOS_16. */
12813 return reloc_type == 2; /* R_OR1K_16. */
12815 return reloc_type == 55; /* R_RISCV_SET16. */
12817 return reloc_type == 8; /* R_PRU_BFD_RELOC_16. */
12819 return reloc_type == 2; /* R_C6000_ABS16. */
12821 return reloc_type == 2; /* R_VISIUM_16. */
12824 return reloc_type == 2; /* R_XC16C_ABS_16. */
12826 return reloc_type == 3; /* R_XGATE_16. */
12832 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12833 a 8-bit absolute RELA relocation used in DWARF debug sections. */
12836 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12838 switch (filedata->file_header.e_machine)
12841 return reloc_type == 54; /* R_RISCV_SET8. */
12847 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12848 a 6-bit absolute RELA relocation used in DWARF debug sections. */
12851 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12853 switch (filedata->file_header.e_machine)
12856 return reloc_type == 53; /* R_RISCV_SET6. */
12862 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12863 a 32-bit inplace add RELA relocation used in DWARF debug sections. */
12866 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12868 /* Please keep this table alpha-sorted for ease of visual lookup. */
12869 switch (filedata->file_header.e_machine)
12872 return reloc_type == 35; /* R_RISCV_ADD32. */
12878 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12879 a 32-bit inplace sub RELA relocation used in DWARF debug sections. */
12882 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12884 /* Please keep this table alpha-sorted for ease of visual lookup. */
12885 switch (filedata->file_header.e_machine)
12888 return reloc_type == 39; /* R_RISCV_SUB32. */
12894 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12895 a 64-bit inplace add RELA relocation used in DWARF debug sections. */
12898 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12900 /* Please keep this table alpha-sorted for ease of visual lookup. */
12901 switch (filedata->file_header.e_machine)
12904 return reloc_type == 36; /* R_RISCV_ADD64. */
12910 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12911 a 64-bit inplace sub RELA relocation used in DWARF debug sections. */
12914 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12916 /* Please keep this table alpha-sorted for ease of visual lookup. */
12917 switch (filedata->file_header.e_machine)
12920 return reloc_type == 40; /* R_RISCV_SUB64. */
12926 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12927 a 16-bit inplace add RELA relocation used in DWARF debug sections. */
12930 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12932 /* Please keep this table alpha-sorted for ease of visual lookup. */
12933 switch (filedata->file_header.e_machine)
12936 return reloc_type == 34; /* R_RISCV_ADD16. */
12942 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12943 a 16-bit inplace sub RELA relocation used in DWARF debug sections. */
12946 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12948 /* Please keep this table alpha-sorted for ease of visual lookup. */
12949 switch (filedata->file_header.e_machine)
12952 return reloc_type == 38; /* R_RISCV_SUB16. */
12958 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12959 a 8-bit inplace add RELA relocation used in DWARF debug sections. */
12962 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12964 /* Please keep this table alpha-sorted for ease of visual lookup. */
12965 switch (filedata->file_header.e_machine)
12968 return reloc_type == 33; /* R_RISCV_ADD8. */
12974 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12975 a 8-bit inplace sub RELA relocation used in DWARF debug sections. */
12978 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12980 /* Please keep this table alpha-sorted for ease of visual lookup. */
12981 switch (filedata->file_header.e_machine)
12984 return reloc_type == 37; /* R_RISCV_SUB8. */
12990 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12991 a 6-bit inplace sub RELA relocation used in DWARF debug sections. */
12994 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12996 switch (filedata->file_header.e_machine)
12999 return reloc_type == 52; /* R_RISCV_SUB6. */
13005 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13006 relocation entries (possibly formerly used for SHT_GROUP sections). */
13009 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13011 switch (filedata->file_header.e_machine)
13013 case EM_386: /* R_386_NONE. */
13014 case EM_68K: /* R_68K_NONE. */
13015 case EM_ADAPTEVA_EPIPHANY:
13016 case EM_ALPHA: /* R_ALPHA_NONE. */
13017 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
13018 case EM_ARC: /* R_ARC_NONE. */
13019 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
13020 case EM_ARC_COMPACT: /* R_ARC_NONE. */
13021 case EM_ARM: /* R_ARM_NONE. */
13022 case EM_C166: /* R_XC16X_NONE. */
13023 case EM_CRIS: /* R_CRIS_NONE. */
13024 case EM_FT32: /* R_FT32_NONE. */
13025 case EM_IA_64: /* R_IA64_NONE. */
13026 case EM_K1OM: /* R_X86_64_NONE. */
13027 case EM_L1OM: /* R_X86_64_NONE. */
13028 case EM_M32R: /* R_M32R_NONE. */
13029 case EM_MIPS: /* R_MIPS_NONE. */
13030 case EM_MN10300: /* R_MN10300_NONE. */
13031 case EM_MOXIE: /* R_MOXIE_NONE. */
13032 case EM_NIOS32: /* R_NIOS_NONE. */
13033 case EM_OR1K: /* R_OR1K_NONE. */
13034 case EM_PARISC: /* R_PARISC_NONE. */
13035 case EM_PPC64: /* R_PPC64_NONE. */
13036 case EM_PPC: /* R_PPC_NONE. */
13037 case EM_RISCV: /* R_RISCV_NONE. */
13038 case EM_S390: /* R_390_NONE. */
13040 case EM_SH: /* R_SH_NONE. */
13041 case EM_SPARC32PLUS:
13042 case EM_SPARC: /* R_SPARC_NONE. */
13044 case EM_TILEGX: /* R_TILEGX_NONE. */
13045 case EM_TILEPRO: /* R_TILEPRO_NONE. */
13046 case EM_TI_C6000:/* R_C6000_NONE. */
13047 case EM_X86_64: /* R_X86_64_NONE. */
13049 case EM_WEBASSEMBLY: /* R_WASM32_NONE. */
13050 return reloc_type == 0;
13053 return reloc_type == 0 || reloc_type == 256;
13056 return (reloc_type == 0 /* R_AVR_NONE. */
13057 || reloc_type == 30 /* R_AVR_DIFF8. */
13058 || reloc_type == 31 /* R_AVR_DIFF16. */
13059 || reloc_type == 32 /* R_AVR_DIFF32. */);
13061 return reloc_type == 3; /* R_METAG_NONE. */
13063 return (reloc_type == 0 /* R_XTENSA_NONE. */
13064 || reloc_type == 204 /* R_NDS32_DIFF8. */
13065 || reloc_type == 205 /* R_NDS32_DIFF16. */
13066 || reloc_type == 206 /* R_NDS32_DIFF32. */
13067 || reloc_type == 207 /* R_NDS32_ULEB128. */);
13069 return (reloc_type == 0 /* R_PRU_NONE. */
13070 || reloc_type == 65 /* R_PRU_DIFF8. */
13071 || reloc_type == 66 /* R_PRU_DIFF16. */
13072 || reloc_type == 67 /* R_PRU_DIFF32. */);
13073 case EM_XTENSA_OLD:
13075 return (reloc_type == 0 /* R_XTENSA_NONE. */
13076 || reloc_type == 17 /* R_XTENSA_DIFF8. */
13077 || reloc_type == 18 /* R_XTENSA_DIFF16. */
13078 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
13083 /* Returns TRUE if there is a relocation against
13084 section NAME at OFFSET bytes. */
13087 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13089 Elf_Internal_Rela * relocs;
13090 Elf_Internal_Rela * rp;
13092 if (dsec == NULL || dsec->reloc_info == NULL)
13095 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13097 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13098 if (rp->r_offset == offset)
13104 /* Apply relocations to a section.
13105 Returns TRUE upon success, FALSE otherwise.
13106 If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13107 It is then the caller's responsibility to free them. NUM_RELOCS_RETURN
13108 will be set to the number of relocs loaded.
13110 Note: So far support has been added only for those relocations
13111 which can be found in debug sections. FIXME: Add support for
13112 more relocations ? */
13115 apply_relocations (Filedata * filedata,
13116 const Elf_Internal_Shdr * section,
13117 unsigned char * start,
13118 bfd_size_type size,
13119 void ** relocs_return,
13120 unsigned long * num_relocs_return)
13122 Elf_Internal_Shdr * relsec;
13123 unsigned char * end = start + size;
13125 if (relocs_return != NULL)
13127 * (Elf_Internal_Rela **) relocs_return = NULL;
13128 * num_relocs_return = 0;
13131 if (filedata->file_header.e_type != ET_REL)
13132 /* No relocs to apply. */
13135 /* Find the reloc section associated with the section. */
13136 for (relsec = filedata->section_headers;
13137 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13140 bfd_boolean is_rela;
13141 unsigned long num_relocs;
13142 Elf_Internal_Rela * relocs;
13143 Elf_Internal_Rela * rp;
13144 Elf_Internal_Shdr * symsec;
13145 Elf_Internal_Sym * symtab;
13146 unsigned long num_syms;
13147 Elf_Internal_Sym * sym;
13149 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13150 || relsec->sh_info >= filedata->file_header.e_shnum
13151 || filedata->section_headers + relsec->sh_info != section
13152 || relsec->sh_size == 0
13153 || relsec->sh_link >= filedata->file_header.e_shnum)
13156 is_rela = relsec->sh_type == SHT_RELA;
13160 if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13161 relsec->sh_size, & relocs, & num_relocs))
13166 if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13167 relsec->sh_size, & relocs, & num_relocs))
13171 /* SH uses RELA but uses in place value instead of the addend field. */
13172 if (filedata->file_header.e_machine == EM_SH)
13175 symsec = filedata->section_headers + relsec->sh_link;
13176 if (symsec->sh_type != SHT_SYMTAB
13177 && symsec->sh_type != SHT_DYNSYM)
13179 symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13181 for (rp = relocs; rp < relocs + num_relocs; ++rp)
13184 unsigned int reloc_type;
13185 unsigned int reloc_size;
13186 bfd_boolean reloc_inplace = FALSE;
13187 bfd_boolean reloc_subtract = FALSE;
13188 unsigned char * rloc;
13189 unsigned long sym_index;
13191 reloc_type = get_reloc_type (filedata, rp->r_info);
13193 if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13195 else if (is_none_reloc (filedata, reloc_type))
13197 else if (is_32bit_abs_reloc (filedata, reloc_type)
13198 || is_32bit_pcrel_reloc (filedata, reloc_type))
13200 else if (is_64bit_abs_reloc (filedata, reloc_type)
13201 || is_64bit_pcrel_reloc (filedata, reloc_type))
13203 else if (is_24bit_abs_reloc (filedata, reloc_type))
13205 else if (is_16bit_abs_reloc (filedata, reloc_type))
13207 else if (is_8bit_abs_reloc (filedata, reloc_type)
13208 || is_6bit_abs_reloc (filedata, reloc_type))
13210 else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13212 || is_32bit_inplace_add_reloc (filedata, reloc_type))
13215 reloc_inplace = TRUE;
13217 else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13219 || is_64bit_inplace_add_reloc (filedata, reloc_type))
13222 reloc_inplace = TRUE;
13224 else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13226 || is_16bit_inplace_add_reloc (filedata, reloc_type))
13229 reloc_inplace = TRUE;
13231 else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13233 || is_8bit_inplace_add_reloc (filedata, reloc_type))
13236 reloc_inplace = TRUE;
13238 else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13242 reloc_inplace = TRUE;
13246 static unsigned int prev_reloc = 0;
13248 if (reloc_type != prev_reloc)
13249 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13250 reloc_type, printable_section_name (filedata, section));
13251 prev_reloc = reloc_type;
13255 rloc = start + rp->r_offset;
13256 if ((rloc + reloc_size) > end || (rloc < start))
13258 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13259 (unsigned long) rp->r_offset,
13260 printable_section_name (filedata, section));
13264 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13265 if (sym_index >= num_syms)
13267 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13268 sym_index, printable_section_name (filedata, section));
13271 sym = symtab + sym_index;
13273 /* If the reloc has a symbol associated with it,
13274 make sure that it is of an appropriate type.
13276 Relocations against symbols without type can happen.
13277 Gcc -feliminate-dwarf2-dups may generate symbols
13278 without type for debug info.
13280 Icc generates relocations against function symbols
13281 instead of local labels.
13283 Relocations against object symbols can happen, eg when
13284 referencing a global array. For an example of this see
13285 the _clz.o binary in libgcc.a. */
13287 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13288 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13290 warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13291 get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13292 printable_section_name (filedata, relsec),
13293 (long int)(rp - relocs));
13299 addend += rp->r_addend;
13300 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13301 partial_inplace. */
13303 || (filedata->file_header.e_machine == EM_XTENSA
13304 && reloc_type == 1)
13305 || ((filedata->file_header.e_machine == EM_PJ
13306 || filedata->file_header.e_machine == EM_PJ_OLD)
13307 && reloc_type == 1)
13308 || ((filedata->file_header.e_machine == EM_D30V
13309 || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13310 && reloc_type == 12)
13313 if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13314 addend += byte_get (rloc, reloc_size) & 0x3f;
13316 addend += byte_get (rloc, reloc_size);
13319 if (is_32bit_pcrel_reloc (filedata, reloc_type)
13320 || is_64bit_pcrel_reloc (filedata, reloc_type))
13322 /* On HPPA, all pc-relative relocations are biased by 8. */
13323 if (filedata->file_header.e_machine == EM_PARISC)
13325 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13328 else if (is_6bit_abs_reloc (filedata, reloc_type)
13329 || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13331 if (reloc_subtract)
13332 addend -= sym->st_value;
13334 addend += sym->st_value;
13335 addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13336 byte_put (rloc, addend, reloc_size);
13338 else if (reloc_subtract)
13339 byte_put (rloc, addend - sym->st_value, reloc_size);
13341 byte_put (rloc, addend + sym->st_value, reloc_size);
13345 /* Let the target specific reloc processing code know that
13346 we have finished with these relocs. */
13347 target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13351 * (Elf_Internal_Rela **) relocs_return = relocs;
13352 * num_relocs_return = num_relocs;
13363 #ifdef SUPPORT_DISASSEMBLY
13365 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13367 printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13369 /* FIXME: XXX -- to be done --- XXX */
13375 /* Reads in the contents of SECTION from FILE, returning a pointer
13376 to a malloc'ed buffer or NULL if something went wrong. */
13379 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13381 bfd_size_type num_bytes = section->sh_size;
13383 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13385 printf (_("Section '%s' has no data to dump.\n"),
13386 printable_section_name (filedata, section));
13390 return (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13391 _("section contents"));
13394 /* Uncompresses a section that was compressed using zlib, in place. */
13397 uncompress_section_contents (unsigned char ** buffer,
13398 dwarf_size_type uncompressed_size,
13399 dwarf_size_type * size)
13401 dwarf_size_type compressed_size = *size;
13402 unsigned char * compressed_buffer = *buffer;
13403 unsigned char * uncompressed_buffer;
13407 /* It is possible the section consists of several compressed
13408 buffers concatenated together, so we uncompress in a loop. */
13409 /* PR 18313: The state field in the z_stream structure is supposed
13410 to be invisible to the user (ie us), but some compilers will
13411 still complain about it being used without initialisation. So
13412 we first zero the entire z_stream structure and then set the fields
13414 memset (& strm, 0, sizeof strm);
13415 strm.avail_in = compressed_size;
13416 strm.next_in = (Bytef *) compressed_buffer;
13417 strm.avail_out = uncompressed_size;
13418 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13420 rc = inflateInit (& strm);
13421 while (strm.avail_in > 0)
13425 strm.next_out = ((Bytef *) uncompressed_buffer
13426 + (uncompressed_size - strm.avail_out));
13427 rc = inflate (&strm, Z_FINISH);
13428 if (rc != Z_STREAM_END)
13430 rc = inflateReset (& strm);
13432 rc = inflateEnd (& strm);
13434 || strm.avail_out != 0)
13437 *buffer = uncompressed_buffer;
13438 *size = uncompressed_size;
13442 free (uncompressed_buffer);
13443 /* Indicate decompression failure. */
13449 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13451 Elf_Internal_Shdr * relsec;
13452 bfd_size_type num_bytes;
13453 unsigned char * data;
13454 unsigned char * end;
13455 unsigned char * real_start;
13456 unsigned char * start;
13457 bfd_boolean some_strings_shown;
13459 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13461 /* PR 21820: Do not fail if the section was empty. */
13462 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13464 num_bytes = section->sh_size;
13466 printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13468 if (decompress_dumps)
13470 dwarf_size_type new_size = num_bytes;
13471 dwarf_size_type uncompressed_size = 0;
13473 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13475 Elf_Internal_Chdr chdr;
13476 unsigned int compression_header_size
13477 = get_compression_header (& chdr, (unsigned char *) start,
13480 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13482 warn (_("section '%s' has unsupported compress type: %d\n"),
13483 printable_section_name (filedata, section), chdr.ch_type);
13486 uncompressed_size = chdr.ch_size;
13487 start += compression_header_size;
13488 new_size -= compression_header_size;
13490 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13492 /* Read the zlib header. In this case, it should be "ZLIB"
13493 followed by the uncompressed section size, 8 bytes in
13494 big-endian order. */
13495 uncompressed_size = start[4]; uncompressed_size <<= 8;
13496 uncompressed_size += start[5]; uncompressed_size <<= 8;
13497 uncompressed_size += start[6]; uncompressed_size <<= 8;
13498 uncompressed_size += start[7]; uncompressed_size <<= 8;
13499 uncompressed_size += start[8]; uncompressed_size <<= 8;
13500 uncompressed_size += start[9]; uncompressed_size <<= 8;
13501 uncompressed_size += start[10]; uncompressed_size <<= 8;
13502 uncompressed_size += start[11];
13507 if (uncompressed_size)
13509 if (uncompress_section_contents (& start,
13510 uncompressed_size, & new_size))
13511 num_bytes = new_size;
13514 error (_("Unable to decompress section %s\n"),
13515 printable_section_name (filedata, section));
13520 start = real_start;
13523 /* If the section being dumped has relocations against it the user might
13524 be expecting these relocations to have been applied. Check for this
13525 case and issue a warning message in order to avoid confusion.
13526 FIXME: Maybe we ought to have an option that dumps a section with
13527 relocs applied ? */
13528 for (relsec = filedata->section_headers;
13529 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13532 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13533 || relsec->sh_info >= filedata->file_header.e_shnum
13534 || filedata->section_headers + relsec->sh_info != section
13535 || relsec->sh_size == 0
13536 || relsec->sh_link >= filedata->file_header.e_shnum)
13539 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13544 end = start + num_bytes;
13545 some_strings_shown = FALSE;
13549 while (!ISPRINT (* data))
13550 if (++ data >= end)
13555 size_t maxlen = end - data;
13558 /* PR 11128: Use two separate invocations in order to work
13559 around bugs in the Solaris 8 implementation of printf. */
13560 printf (" [%6tx] ", data - start);
13562 printf (" [%6Ix] ", (size_t) (data - start));
13566 print_symbol ((int) maxlen, (const char *) data);
13568 data += strnlen ((const char *) data, maxlen);
13572 printf (_("<corrupt>\n"));
13575 some_strings_shown = TRUE;
13579 if (! some_strings_shown)
13580 printf (_(" No strings found in this section."));
13589 dump_section_as_bytes (Elf_Internal_Shdr * section,
13590 Filedata * filedata,
13591 bfd_boolean relocate)
13593 Elf_Internal_Shdr * relsec;
13594 bfd_size_type bytes;
13595 bfd_size_type section_size;
13597 unsigned char * data;
13598 unsigned char * real_start;
13599 unsigned char * start;
13601 real_start = start = (unsigned char *) get_section_contents (section, filedata);
13603 /* PR 21820: Do not fail if the section was empty. */
13604 return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13606 section_size = section->sh_size;
13608 printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13610 if (decompress_dumps)
13612 dwarf_size_type new_size = section_size;
13613 dwarf_size_type uncompressed_size = 0;
13615 if ((section->sh_flags & SHF_COMPRESSED) != 0)
13617 Elf_Internal_Chdr chdr;
13618 unsigned int compression_header_size
13619 = get_compression_header (& chdr, start, section_size);
13621 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13623 warn (_("section '%s' has unsupported compress type: %d\n"),
13624 printable_section_name (filedata, section), chdr.ch_type);
13627 uncompressed_size = chdr.ch_size;
13628 start += compression_header_size;
13629 new_size -= compression_header_size;
13631 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13633 /* Read the zlib header. In this case, it should be "ZLIB"
13634 followed by the uncompressed section size, 8 bytes in
13635 big-endian order. */
13636 uncompressed_size = start[4]; uncompressed_size <<= 8;
13637 uncompressed_size += start[5]; uncompressed_size <<= 8;
13638 uncompressed_size += start[6]; uncompressed_size <<= 8;
13639 uncompressed_size += start[7]; uncompressed_size <<= 8;
13640 uncompressed_size += start[8]; uncompressed_size <<= 8;
13641 uncompressed_size += start[9]; uncompressed_size <<= 8;
13642 uncompressed_size += start[10]; uncompressed_size <<= 8;
13643 uncompressed_size += start[11];
13648 if (uncompressed_size)
13650 if (uncompress_section_contents (& start, uncompressed_size,
13653 section_size = new_size;
13657 error (_("Unable to decompress section %s\n"),
13658 printable_section_name (filedata, section));
13659 /* FIXME: Print the section anyway ? */
13664 start = real_start;
13669 if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13674 /* If the section being dumped has relocations against it the user might
13675 be expecting these relocations to have been applied. Check for this
13676 case and issue a warning message in order to avoid confusion.
13677 FIXME: Maybe we ought to have an option that dumps a section with
13678 relocs applied ? */
13679 for (relsec = filedata->section_headers;
13680 relsec < filedata->section_headers + filedata->file_header.e_shnum;
13683 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13684 || relsec->sh_info >= filedata->file_header.e_shnum
13685 || filedata->section_headers + relsec->sh_info != section
13686 || relsec->sh_size == 0
13687 || relsec->sh_link >= filedata->file_header.e_shnum)
13690 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13695 addr = section->sh_addr;
13696 bytes = section_size;
13705 lbytes = (bytes > 16 ? 16 : bytes);
13707 printf (" 0x%8.8lx ", (unsigned long) addr);
13709 for (j = 0; j < 16; j++)
13712 printf ("%2.2x", data[j]);
13720 for (j = 0; j < lbytes; j++)
13723 if (k >= ' ' && k < 0x7f)
13743 load_specific_debug_section (enum dwarf_section_display_enum debug,
13744 const Elf_Internal_Shdr * sec,
13747 struct dwarf_section * section = &debug_displays [debug].section;
13749 Filedata * filedata = (Filedata *) data;
13751 if (section->start != NULL)
13753 /* If it is already loaded, do nothing. */
13754 if (streq (section->filename, filedata->file_name))
13756 free (section->start);
13759 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13760 section->address = sec->sh_addr;
13761 section->user_data = NULL;
13762 section->filename = filedata->file_name;
13763 section->start = (unsigned char *) get_data (NULL, filedata,
13765 sec->sh_size, buf);
13766 if (section->start == NULL)
13770 unsigned char *start = section->start;
13771 dwarf_size_type size = sec->sh_size;
13772 dwarf_size_type uncompressed_size = 0;
13774 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13776 Elf_Internal_Chdr chdr;
13777 unsigned int compression_header_size;
13779 if (size < (is_32bit_elf
13780 ? sizeof (Elf32_External_Chdr)
13781 : sizeof (Elf64_External_Chdr)))
13783 warn (_("compressed section %s is too small to contain a compression header"),
13788 compression_header_size = get_compression_header (&chdr, start, size);
13790 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13792 warn (_("section '%s' has unsupported compress type: %d\n"),
13793 section->name, chdr.ch_type);
13796 uncompressed_size = chdr.ch_size;
13797 start += compression_header_size;
13798 size -= compression_header_size;
13800 else if (size > 12 && streq ((char *) start, "ZLIB"))
13802 /* Read the zlib header. In this case, it should be "ZLIB"
13803 followed by the uncompressed section size, 8 bytes in
13804 big-endian order. */
13805 uncompressed_size = start[4]; uncompressed_size <<= 8;
13806 uncompressed_size += start[5]; uncompressed_size <<= 8;
13807 uncompressed_size += start[6]; uncompressed_size <<= 8;
13808 uncompressed_size += start[7]; uncompressed_size <<= 8;
13809 uncompressed_size += start[8]; uncompressed_size <<= 8;
13810 uncompressed_size += start[9]; uncompressed_size <<= 8;
13811 uncompressed_size += start[10]; uncompressed_size <<= 8;
13812 uncompressed_size += start[11];
13817 if (uncompressed_size)
13819 if (uncompress_section_contents (&start, uncompressed_size,
13822 /* Free the compressed buffer, update the section buffer
13823 and the section size if uncompress is successful. */
13824 free (section->start);
13825 section->start = start;
13829 error (_("Unable to decompress section %s\n"),
13830 printable_section_name (filedata, sec));
13835 section->size = size;
13838 if (section->start == NULL)
13841 if (debug_displays [debug].relocate)
13843 if (! apply_relocations (filedata, sec, section->start, section->size,
13844 & section->reloc_info, & section->num_relocs))
13849 section->reloc_info = NULL;
13850 section->num_relocs = 0;
13856 /* If this is not NULL, load_debug_section will only look for sections
13857 within the list of sections given here. */
13858 static unsigned int * section_subset = NULL;
13861 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13863 struct dwarf_section * section = &debug_displays [debug].section;
13864 Elf_Internal_Shdr * sec;
13865 Filedata * filedata = (Filedata *) data;
13867 /* Without section headers we cannot find any sections. */
13868 if (filedata->section_headers == NULL)
13871 if (filedata->string_table == NULL
13872 && filedata->file_header.e_shstrndx != SHN_UNDEF
13873 && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13875 Elf_Internal_Shdr * strs;
13877 /* Read in the string table, so that we have section names to scan. */
13878 strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13880 if (strs != NULL && strs->sh_size != 0)
13882 filedata->string_table
13883 = (char *) get_data (NULL, filedata, strs->sh_offset,
13884 1, strs->sh_size, _("string table"));
13886 filedata->string_table_length
13887 = filedata->string_table != NULL ? strs->sh_size : 0;
13891 /* Locate the debug section. */
13892 sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13894 section->name = section->uncompressed_name;
13897 sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13899 section->name = section->compressed_name;
13904 /* If we're loading from a subset of sections, and we've loaded
13905 a section matching this name before, it's likely that it's a
13907 if (section_subset != NULL)
13908 free_debug_section (debug);
13910 return load_specific_debug_section (debug, sec, data);
13914 free_debug_section (enum dwarf_section_display_enum debug)
13916 struct dwarf_section * section = &debug_displays [debug].section;
13918 if (section->start == NULL)
13921 free ((char *) section->start);
13922 section->start = NULL;
13923 section->address = 0;
13928 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13930 char * name = SECTION_NAME (section);
13931 const char * print_name = printable_section_name (filedata, section);
13932 bfd_size_type length;
13933 bfd_boolean result = TRUE;
13936 length = section->sh_size;
13939 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13942 if (section->sh_type == SHT_NOBITS)
13944 /* There is no point in dumping the contents of a debugging section
13945 which has the NOBITS type - the bits in the file will be random.
13946 This can happen when a file containing a .eh_frame section is
13947 stripped with the --only-keep-debug command line option. */
13948 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13953 if (const_strneq (name, ".gnu.linkonce.wi."))
13954 name = ".debug_info";
13956 /* See if we know how to display the contents of this section. */
13957 for (i = 0; i < max; i++)
13959 enum dwarf_section_display_enum id = (enum dwarf_section_display_enum) i;
13960 struct dwarf_section_display * display = debug_displays + i;
13961 struct dwarf_section * sec = & display->section;
13963 if (streq (sec->uncompressed_name, name)
13964 || (id == line && const_strneq (name, ".debug_line."))
13965 || streq (sec->compressed_name, name))
13967 bfd_boolean secondary = (section != find_section (filedata, name));
13970 free_debug_section (id);
13972 if (i == line && const_strneq (name, ".debug_line."))
13974 else if (streq (sec->uncompressed_name, name))
13975 sec->name = sec->uncompressed_name;
13977 sec->name = sec->compressed_name;
13979 if (load_specific_debug_section (id, section, filedata))
13981 /* If this debug section is part of a CU/TU set in a .dwp file,
13982 restrict load_debug_section to the sections in that set. */
13983 section_subset = find_cu_tu_set (filedata, shndx);
13985 result &= display->display (sec, filedata);
13987 section_subset = NULL;
13989 if (secondary || (id != info && id != abbrev))
13990 free_debug_section (id);
13998 printf (_("Unrecognized debug section: %s\n"), print_name);
14005 /* Set DUMP_SECTS for all sections where dumps were requested
14006 based on section name. */
14009 initialise_dumps_byname (Filedata * filedata)
14011 struct dump_list_entry * cur;
14013 for (cur = dump_sects_byname; cur; cur = cur->next)
14016 bfd_boolean any = FALSE;
14018 for (i = 0; i < filedata->file_header.e_shnum; i++)
14019 if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14021 request_dump_bynumber (filedata, i, cur->type);
14026 warn (_("Section '%s' was not dumped because it does not exist!\n"),
14032 process_section_contents (Filedata * filedata)
14034 Elf_Internal_Shdr * section;
14036 bfd_boolean res = TRUE;
14041 initialise_dumps_byname (filedata);
14043 for (i = 0, section = filedata->section_headers;
14044 i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14047 dump_type dump = filedata->dump_sects[i];
14049 #ifdef SUPPORT_DISASSEMBLY
14050 if (dump & DISASS_DUMP)
14052 if (! disassemble_section (section, filedata))
14056 if (dump & HEX_DUMP)
14058 if (! dump_section_as_bytes (section, filedata, FALSE))
14062 if (dump & RELOC_DUMP)
14064 if (! dump_section_as_bytes (section, filedata, TRUE))
14068 if (dump & STRING_DUMP)
14070 if (! dump_section_as_strings (section, filedata))
14074 if (dump & DEBUG_DUMP)
14076 if (! display_debug_section (i, section, filedata))
14081 /* Check to see if the user requested a
14082 dump of a section that does not exist. */
14083 while (i < filedata->num_dump_sects)
14085 if (filedata->dump_sects[i])
14087 warn (_("Section %d was not dumped because it does not exist!\n"), i);
14097 process_mips_fpe_exception (int mask)
14101 bfd_boolean first = TRUE;
14103 if (mask & OEX_FPU_INEX)
14104 fputs ("INEX", stdout), first = FALSE;
14105 if (mask & OEX_FPU_UFLO)
14106 printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14107 if (mask & OEX_FPU_OFLO)
14108 printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14109 if (mask & OEX_FPU_DIV0)
14110 printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14111 if (mask & OEX_FPU_INVAL)
14112 printf ("%sINVAL", first ? "" : "|");
14115 fputs ("0", stdout);
14118 /* Display's the value of TAG at location P. If TAG is
14119 greater than 0 it is assumed to be an unknown tag, and
14120 a message is printed to this effect. Otherwise it is
14121 assumed that a message has already been printed.
14123 If the bottom bit of TAG is set it assumed to have a
14124 string value, otherwise it is assumed to have an integer
14127 Returns an updated P pointing to the first unread byte
14128 beyond the end of TAG's value.
14130 Reads at or beyond END will not be made. */
14132 static unsigned char *
14133 display_tag_value (signed int tag,
14135 const unsigned char * const end)
14140 printf (" Tag_unknown_%d: ", tag);
14144 warn (_("<corrupt tag>\n"));
14148 /* PR 17531 file: 027-19978-0.004. */
14149 size_t maxlen = (end - p) - 1;
14154 print_symbol ((int) maxlen, (const char *) p);
14155 p += strnlen ((char *) p, maxlen) + 1;
14159 printf (_("<corrupt string tag>"));
14160 p = (unsigned char *) end;
14168 val = read_uleb128 (p, &len, end);
14170 printf ("%ld (0x%lx)\n", val, val);
14177 /* ARC ABI attributes section. */
14179 static unsigned char *
14180 display_arc_attribute (unsigned char * p,
14181 const unsigned char * const end)
14187 tag = read_uleb128 (p, &len, end);
14192 case Tag_ARC_PCS_config:
14193 val = read_uleb128 (p, &len, end);
14195 printf (" Tag_ARC_PCS_config: ");
14199 printf (_("Absent/Non standard\n"));
14202 printf (_("Bare metal/mwdt\n"));
14205 printf (_("Bare metal/newlib\n"));
14208 printf (_("Linux/uclibc\n"));
14211 printf (_("Linux/glibc\n"));
14214 printf (_("Unknown\n"));
14219 case Tag_ARC_CPU_base:
14220 val = read_uleb128 (p, &len, end);
14222 printf (" Tag_ARC_CPU_base: ");
14227 printf (_("Absent\n"));
14229 case TAG_CPU_ARC6xx:
14230 printf ("ARC6xx\n");
14232 case TAG_CPU_ARC7xx:
14233 printf ("ARC7xx\n");
14235 case TAG_CPU_ARCEM:
14236 printf ("ARCEM\n");
14238 case TAG_CPU_ARCHS:
14239 printf ("ARCHS\n");
14244 case Tag_ARC_CPU_variation:
14245 val = read_uleb128 (p, &len, end);
14247 printf (" Tag_ARC_CPU_variation: ");
14251 if (val > 0 && val < 16)
14252 printf ("Core%d\n", val);
14254 printf ("Unknown\n");
14258 printf (_("Absent\n"));
14263 case Tag_ARC_CPU_name:
14264 printf (" Tag_ARC_CPU_name: ");
14265 p = display_tag_value (-1, p, end);
14268 case Tag_ARC_ABI_rf16:
14269 val = read_uleb128 (p, &len, end);
14271 printf (" Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14274 case Tag_ARC_ABI_osver:
14275 val = read_uleb128 (p, &len, end);
14277 printf (" Tag_ARC_ABI_osver: v%d\n", val);
14280 case Tag_ARC_ABI_pic:
14281 case Tag_ARC_ABI_sda:
14282 val = read_uleb128 (p, &len, end);
14284 printf (tag == Tag_ARC_ABI_sda ? " Tag_ARC_ABI_sda: "
14285 : " Tag_ARC_ABI_pic: ");
14289 printf (_("Absent\n"));
14298 printf (_("Unknown\n"));
14303 case Tag_ARC_ABI_tls:
14304 val = read_uleb128 (p, &len, end);
14306 printf (" Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14309 case Tag_ARC_ABI_enumsize:
14310 val = read_uleb128 (p, &len, end);
14312 printf (" Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14316 case Tag_ARC_ABI_exceptions:
14317 val = read_uleb128 (p, &len, end);
14319 printf (" Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14323 case Tag_ARC_ABI_double_size:
14324 val = read_uleb128 (p, &len, end);
14326 printf (" Tag_ARC_ABI_double_size: %d\n", val);
14329 case Tag_ARC_ISA_config:
14330 printf (" Tag_ARC_ISA_config: ");
14331 p = display_tag_value (-1, p, end);
14334 case Tag_ARC_ISA_apex:
14335 printf (" Tag_ARC_ISA_apex: ");
14336 p = display_tag_value (-1, p, end);
14339 case Tag_ARC_ISA_mpy_option:
14340 val = read_uleb128 (p, &len, end);
14342 printf (" Tag_ARC_ISA_mpy_option: %d\n", val);
14345 case Tag_ARC_ATR_version:
14346 val = read_uleb128 (p, &len, end);
14348 printf (" Tag_ARC_ATR_version: %d\n", val);
14352 return display_tag_value (tag & 1, p, end);
14358 /* ARM EABI attributes section. */
14363 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
14365 const char ** table;
14366 } arm_attr_public_tag;
14368 static const char * arm_attr_tag_CPU_arch[] =
14369 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14370 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14372 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14373 static const char * arm_attr_tag_THUMB_ISA_use[] =
14374 {"No", "Thumb-1", "Thumb-2", "Yes"};
14375 static const char * arm_attr_tag_FP_arch[] =
14376 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14377 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14378 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14379 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14380 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14381 "NEON for ARMv8.1"};
14382 static const char * arm_attr_tag_PCS_config[] =
14383 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14384 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14385 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14386 {"V6", "SB", "TLS", "Unused"};
14387 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14388 {"Absolute", "PC-relative", "SB-relative", "None"};
14389 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14390 {"Absolute", "PC-relative", "None"};
14391 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14392 {"None", "direct", "GOT-indirect"};
14393 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14394 {"None", "??? 1", "2", "??? 3", "4"};
14395 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14396 static const char * arm_attr_tag_ABI_FP_denormal[] =
14397 {"Unused", "Needed", "Sign only"};
14398 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14399 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14400 static const char * arm_attr_tag_ABI_FP_number_model[] =
14401 {"Unused", "Finite", "RTABI", "IEEE 754"};
14402 static const char * arm_attr_tag_ABI_enum_size[] =
14403 {"Unused", "small", "int", "forced to int"};
14404 static const char * arm_attr_tag_ABI_HardFP_use[] =
14405 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14406 static const char * arm_attr_tag_ABI_VFP_args[] =
14407 {"AAPCS", "VFP registers", "custom", "compatible"};
14408 static const char * arm_attr_tag_ABI_WMMX_args[] =
14409 {"AAPCS", "WMMX registers", "custom"};
14410 static const char * arm_attr_tag_ABI_optimization_goals[] =
14411 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14412 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14413 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14414 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14415 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14416 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14417 static const char * arm_attr_tag_FP_HP_extension[] =
14418 {"Not Allowed", "Allowed"};
14419 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14420 {"None", "IEEE 754", "Alternative Format"};
14421 static const char * arm_attr_tag_DSP_extension[] =
14422 {"Follow architecture", "Allowed"};
14423 static const char * arm_attr_tag_MPextension_use[] =
14424 {"Not Allowed", "Allowed"};
14425 static const char * arm_attr_tag_DIV_use[] =
14426 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14427 "Allowed in v7-A with integer division extension"};
14428 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14429 static const char * arm_attr_tag_Virtualization_use[] =
14430 {"Not Allowed", "TrustZone", "Virtualization Extensions",
14431 "TrustZone and Virtualization Extensions"};
14432 static const char * arm_attr_tag_MPextension_use_legacy[] =
14433 {"Not Allowed", "Allowed"};
14435 #define LOOKUP(id, name) \
14436 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14437 static arm_attr_public_tag arm_attr_public_tags[] =
14439 {4, "CPU_raw_name", 1, NULL},
14440 {5, "CPU_name", 1, NULL},
14441 LOOKUP(6, CPU_arch),
14442 {7, "CPU_arch_profile", 0, NULL},
14443 LOOKUP(8, ARM_ISA_use),
14444 LOOKUP(9, THUMB_ISA_use),
14445 LOOKUP(10, FP_arch),
14446 LOOKUP(11, WMMX_arch),
14447 LOOKUP(12, Advanced_SIMD_arch),
14448 LOOKUP(13, PCS_config),
14449 LOOKUP(14, ABI_PCS_R9_use),
14450 LOOKUP(15, ABI_PCS_RW_data),
14451 LOOKUP(16, ABI_PCS_RO_data),
14452 LOOKUP(17, ABI_PCS_GOT_use),
14453 LOOKUP(18, ABI_PCS_wchar_t),
14454 LOOKUP(19, ABI_FP_rounding),
14455 LOOKUP(20, ABI_FP_denormal),
14456 LOOKUP(21, ABI_FP_exceptions),
14457 LOOKUP(22, ABI_FP_user_exceptions),
14458 LOOKUP(23, ABI_FP_number_model),
14459 {24, "ABI_align_needed", 0, NULL},
14460 {25, "ABI_align_preserved", 0, NULL},
14461 LOOKUP(26, ABI_enum_size),
14462 LOOKUP(27, ABI_HardFP_use),
14463 LOOKUP(28, ABI_VFP_args),
14464 LOOKUP(29, ABI_WMMX_args),
14465 LOOKUP(30, ABI_optimization_goals),
14466 LOOKUP(31, ABI_FP_optimization_goals),
14467 {32, "compatibility", 0, NULL},
14468 LOOKUP(34, CPU_unaligned_access),
14469 LOOKUP(36, FP_HP_extension),
14470 LOOKUP(38, ABI_FP_16bit_format),
14471 LOOKUP(42, MPextension_use),
14472 LOOKUP(44, DIV_use),
14473 LOOKUP(46, DSP_extension),
14474 {64, "nodefaults", 0, NULL},
14475 {65, "also_compatible_with", 0, NULL},
14476 LOOKUP(66, T2EE_use),
14477 {67, "conformance", 1, NULL},
14478 LOOKUP(68, Virtualization_use),
14479 LOOKUP(70, MPextension_use_legacy)
14483 static unsigned char *
14484 display_arm_attribute (unsigned char * p,
14485 const unsigned char * const end)
14490 arm_attr_public_tag * attr;
14494 tag = read_uleb128 (p, &len, end);
14497 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14499 if (arm_attr_public_tags[i].tag == tag)
14501 attr = &arm_attr_public_tags[i];
14508 printf (" Tag_%s: ", attr->name);
14509 switch (attr->type)
14514 case 7: /* Tag_CPU_arch_profile. */
14515 val = read_uleb128 (p, &len, end);
14519 case 0: printf (_("None\n")); break;
14520 case 'A': printf (_("Application\n")); break;
14521 case 'R': printf (_("Realtime\n")); break;
14522 case 'M': printf (_("Microcontroller\n")); break;
14523 case 'S': printf (_("Application or Realtime\n")); break;
14524 default: printf ("??? (%d)\n", val); break;
14528 case 24: /* Tag_align_needed. */
14529 val = read_uleb128 (p, &len, end);
14533 case 0: printf (_("None\n")); break;
14534 case 1: printf (_("8-byte\n")); break;
14535 case 2: printf (_("4-byte\n")); break;
14536 case 3: printf ("??? 3\n"); break;
14539 printf (_("8-byte and up to %d-byte extended\n"),
14542 printf ("??? (%d)\n", val);
14547 case 25: /* Tag_align_preserved. */
14548 val = read_uleb128 (p, &len, end);
14552 case 0: printf (_("None\n")); break;
14553 case 1: printf (_("8-byte, except leaf SP\n")); break;
14554 case 2: printf (_("8-byte\n")); break;
14555 case 3: printf ("??? 3\n"); break;
14558 printf (_("8-byte and up to %d-byte extended\n"),
14561 printf ("??? (%d)\n", val);
14566 case 32: /* Tag_compatibility. */
14568 val = read_uleb128 (p, &len, end);
14570 printf (_("flag = %d, vendor = "), val);
14573 size_t maxlen = (end - p) - 1;
14575 print_symbol ((int) maxlen, (const char *) p);
14576 p += strnlen ((char *) p, maxlen) + 1;
14580 printf (_("<corrupt>"));
14581 p = (unsigned char *) end;
14587 case 64: /* Tag_nodefaults. */
14588 /* PR 17531: file: 001-505008-0.01. */
14591 printf (_("True\n"));
14594 case 65: /* Tag_also_compatible_with. */
14595 val = read_uleb128 (p, &len, end);
14597 if (val == 6 /* Tag_CPU_arch. */)
14599 val = read_uleb128 (p, &len, end);
14601 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14602 printf ("??? (%d)\n", val);
14604 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14608 while (p < end && *(p++) != '\0' /* NUL terminator. */)
14613 printf (_("<unknown: %d>\n"), tag);
14619 return display_tag_value (-1, p, end);
14621 return display_tag_value (0, p, end);
14624 assert (attr->type & 0x80);
14625 val = read_uleb128 (p, &len, end);
14627 type = attr->type & 0x7f;
14629 printf ("??? (%d)\n", val);
14631 printf ("%s\n", attr->table[val]);
14636 return display_tag_value (tag, p, end);
14639 static unsigned char *
14640 display_gnu_attribute (unsigned char * p,
14641 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14642 const unsigned char * const end)
14648 tag = read_uleb128 (p, &len, end);
14651 /* Tag_compatibility is the only generic GNU attribute defined at
14655 val = read_uleb128 (p, &len, end);
14658 printf (_("flag = %d, vendor = "), val);
14661 printf (_("<corrupt>\n"));
14662 warn (_("corrupt vendor attribute\n"));
14668 size_t maxlen = (end - p) - 1;
14670 print_symbol ((int) maxlen, (const char *) p);
14671 p += strnlen ((char *) p, maxlen) + 1;
14675 printf (_("<corrupt>"));
14676 p = (unsigned char *) end;
14683 if ((tag & 2) == 0 && display_proc_gnu_attribute)
14684 return display_proc_gnu_attribute (p, tag, end);
14686 return display_tag_value (tag, p, end);
14689 static unsigned char *
14690 display_power_gnu_attribute (unsigned char * p,
14692 const unsigned char * const end)
14697 if (tag == Tag_GNU_Power_ABI_FP)
14699 val = read_uleb128 (p, &len, end);
14701 printf (" Tag_GNU_Power_ABI_FP: ");
14704 printf (_("<corrupt>\n"));
14709 printf ("(%#x), ", val);
14714 printf (_("unspecified hard/soft float, "));
14717 printf (_("hard float, "));
14720 printf (_("soft float, "));
14723 printf (_("single-precision hard float, "));
14730 printf (_("unspecified long double\n"));
14733 printf (_("128-bit IBM long double\n"));
14736 printf (_("64-bit long double\n"));
14739 printf (_("128-bit IEEE long double\n"));
14745 if (tag == Tag_GNU_Power_ABI_Vector)
14747 val = read_uleb128 (p, &len, end);
14749 printf (" Tag_GNU_Power_ABI_Vector: ");
14752 printf (_("<corrupt>\n"));
14757 printf ("(%#x), ", val);
14762 printf (_("unspecified\n"));
14765 printf (_("generic\n"));
14768 printf ("AltiVec\n");
14777 if (tag == Tag_GNU_Power_ABI_Struct_Return)
14779 val = read_uleb128 (p, &len, end);
14781 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
14784 printf (_("<corrupt>\n"));
14789 printf ("(%#x), ", val);
14794 printf (_("unspecified\n"));
14797 printf ("r3/r4\n");
14800 printf (_("memory\n"));
14809 return display_tag_value (tag & 1, p, end);
14812 static unsigned char *
14813 display_s390_gnu_attribute (unsigned char * p,
14815 const unsigned char * const end)
14820 if (tag == Tag_GNU_S390_ABI_Vector)
14822 val = read_uleb128 (p, &len, end);
14824 printf (" Tag_GNU_S390_ABI_Vector: ");
14829 printf (_("any\n"));
14832 printf (_("software\n"));
14835 printf (_("hardware\n"));
14838 printf ("??? (%d)\n", val);
14844 return display_tag_value (tag & 1, p, end);
14848 display_sparc_hwcaps (unsigned int mask)
14852 bfd_boolean first = TRUE;
14854 if (mask & ELF_SPARC_HWCAP_MUL32)
14855 fputs ("mul32", stdout), first = FALSE;
14856 if (mask & ELF_SPARC_HWCAP_DIV32)
14857 printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14858 if (mask & ELF_SPARC_HWCAP_FSMULD)
14859 printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14860 if (mask & ELF_SPARC_HWCAP_V8PLUS)
14861 printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14862 if (mask & ELF_SPARC_HWCAP_POPC)
14863 printf ("%spopc", first ? "" : "|"), first = FALSE;
14864 if (mask & ELF_SPARC_HWCAP_VIS)
14865 printf ("%svis", first ? "" : "|"), first = FALSE;
14866 if (mask & ELF_SPARC_HWCAP_VIS2)
14867 printf ("%svis2", first ? "" : "|"), first = FALSE;
14868 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14869 printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14870 if (mask & ELF_SPARC_HWCAP_FMAF)
14871 printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14872 if (mask & ELF_SPARC_HWCAP_VIS3)
14873 printf ("%svis3", first ? "" : "|"), first = FALSE;
14874 if (mask & ELF_SPARC_HWCAP_HPC)
14875 printf ("%shpc", first ? "" : "|"), first = FALSE;
14876 if (mask & ELF_SPARC_HWCAP_RANDOM)
14877 printf ("%srandom", first ? "" : "|"), first = FALSE;
14878 if (mask & ELF_SPARC_HWCAP_TRANS)
14879 printf ("%strans", first ? "" : "|"), first = FALSE;
14880 if (mask & ELF_SPARC_HWCAP_FJFMAU)
14881 printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14882 if (mask & ELF_SPARC_HWCAP_IMA)
14883 printf ("%sima", first ? "" : "|"), first = FALSE;
14884 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14885 printf ("%scspare", first ? "" : "|"), first = FALSE;
14888 fputc ('0', stdout);
14889 fputc ('\n', stdout);
14893 display_sparc_hwcaps2 (unsigned int mask)
14897 bfd_boolean first = TRUE;
14899 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14900 fputs ("fjathplus", stdout), first = FALSE;
14901 if (mask & ELF_SPARC_HWCAP2_VIS3B)
14902 printf ("%svis3b", first ? "" : "|"), first = FALSE;
14903 if (mask & ELF_SPARC_HWCAP2_ADP)
14904 printf ("%sadp", first ? "" : "|"), first = FALSE;
14905 if (mask & ELF_SPARC_HWCAP2_SPARC5)
14906 printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14907 if (mask & ELF_SPARC_HWCAP2_MWAIT)
14908 printf ("%smwait", first ? "" : "|"), first = FALSE;
14909 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14910 printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14911 if (mask & ELF_SPARC_HWCAP2_XMONT)
14912 printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14913 if (mask & ELF_SPARC_HWCAP2_NSEC)
14914 printf ("%snsec", first ? "" : "|"), first = FALSE;
14915 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14916 printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14917 if (mask & ELF_SPARC_HWCAP2_FJDES)
14918 printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14919 if (mask & ELF_SPARC_HWCAP2_FJAES)
14920 printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14923 fputc ('0', stdout);
14924 fputc ('\n', stdout);
14927 static unsigned char *
14928 display_sparc_gnu_attribute (unsigned char * p,
14930 const unsigned char * const end)
14935 if (tag == Tag_GNU_Sparc_HWCAPS)
14937 val = read_uleb128 (p, &len, end);
14939 printf (" Tag_GNU_Sparc_HWCAPS: ");
14940 display_sparc_hwcaps (val);
14943 if (tag == Tag_GNU_Sparc_HWCAPS2)
14945 val = read_uleb128 (p, &len, end);
14947 printf (" Tag_GNU_Sparc_HWCAPS2: ");
14948 display_sparc_hwcaps2 (val);
14952 return display_tag_value (tag, p, end);
14956 print_mips_fp_abi_value (unsigned int val)
14960 case Val_GNU_MIPS_ABI_FP_ANY:
14961 printf (_("Hard or soft float\n"));
14963 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14964 printf (_("Hard float (double precision)\n"));
14966 case Val_GNU_MIPS_ABI_FP_SINGLE:
14967 printf (_("Hard float (single precision)\n"));
14969 case Val_GNU_MIPS_ABI_FP_SOFT:
14970 printf (_("Soft float\n"));
14972 case Val_GNU_MIPS_ABI_FP_OLD_64:
14973 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14975 case Val_GNU_MIPS_ABI_FP_XX:
14976 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14978 case Val_GNU_MIPS_ABI_FP_64:
14979 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14981 case Val_GNU_MIPS_ABI_FP_64A:
14982 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14984 case Val_GNU_MIPS_ABI_FP_NAN2008:
14985 printf (_("NaN 2008 compatibility\n"));
14988 printf ("??? (%d)\n", val);
14993 static unsigned char *
14994 display_mips_gnu_attribute (unsigned char * p,
14996 const unsigned char * const end)
14998 if (tag == Tag_GNU_MIPS_ABI_FP)
15003 val = read_uleb128 (p, &len, end);
15005 printf (" Tag_GNU_MIPS_ABI_FP: ");
15007 print_mips_fp_abi_value (val);
15012 if (tag == Tag_GNU_MIPS_ABI_MSA)
15017 val = read_uleb128 (p, &len, end);
15019 printf (" Tag_GNU_MIPS_ABI_MSA: ");
15023 case Val_GNU_MIPS_ABI_MSA_ANY:
15024 printf (_("Any MSA or not\n"));
15026 case Val_GNU_MIPS_ABI_MSA_128:
15027 printf (_("128-bit MSA\n"));
15030 printf ("??? (%d)\n", val);
15036 return display_tag_value (tag & 1, p, end);
15039 static unsigned char *
15040 display_tic6x_attribute (unsigned char * p,
15041 const unsigned char * const end)
15047 tag = read_uleb128 (p, &len, end);
15053 val = read_uleb128 (p, &len, end);
15055 printf (" Tag_ISA: ");
15059 case C6XABI_Tag_ISA_none:
15060 printf (_("None\n"));
15062 case C6XABI_Tag_ISA_C62X:
15065 case C6XABI_Tag_ISA_C67X:
15068 case C6XABI_Tag_ISA_C67XP:
15069 printf ("C67x+\n");
15071 case C6XABI_Tag_ISA_C64X:
15074 case C6XABI_Tag_ISA_C64XP:
15075 printf ("C64x+\n");
15077 case C6XABI_Tag_ISA_C674X:
15078 printf ("C674x\n");
15081 printf ("??? (%d)\n", val);
15086 case Tag_ABI_wchar_t:
15087 val = read_uleb128 (p, &len, end);
15089 printf (" Tag_ABI_wchar_t: ");
15093 printf (_("Not used\n"));
15096 printf (_("2 bytes\n"));
15099 printf (_("4 bytes\n"));
15102 printf ("??? (%d)\n", val);
15107 case Tag_ABI_stack_align_needed:
15108 val = read_uleb128 (p, &len, end);
15110 printf (" Tag_ABI_stack_align_needed: ");
15114 printf (_("8-byte\n"));
15117 printf (_("16-byte\n"));
15120 printf ("??? (%d)\n", val);
15125 case Tag_ABI_stack_align_preserved:
15126 val = read_uleb128 (p, &len, end);
15128 printf (" Tag_ABI_stack_align_preserved: ");
15132 printf (_("8-byte\n"));
15135 printf (_("16-byte\n"));
15138 printf ("??? (%d)\n", val);
15144 val = read_uleb128 (p, &len, end);
15146 printf (" Tag_ABI_DSBT: ");
15150 printf (_("DSBT addressing not used\n"));
15153 printf (_("DSBT addressing used\n"));
15156 printf ("??? (%d)\n", val);
15162 val = read_uleb128 (p, &len, end);
15164 printf (" Tag_ABI_PID: ");
15168 printf (_("Data addressing position-dependent\n"));
15171 printf (_("Data addressing position-independent, GOT near DP\n"));
15174 printf (_("Data addressing position-independent, GOT far from DP\n"));
15177 printf ("??? (%d)\n", val);
15183 val = read_uleb128 (p, &len, end);
15185 printf (" Tag_ABI_PIC: ");
15189 printf (_("Code addressing position-dependent\n"));
15192 printf (_("Code addressing position-independent\n"));
15195 printf ("??? (%d)\n", val);
15200 case Tag_ABI_array_object_alignment:
15201 val = read_uleb128 (p, &len, end);
15203 printf (" Tag_ABI_array_object_alignment: ");
15207 printf (_("8-byte\n"));
15210 printf (_("4-byte\n"));
15213 printf (_("16-byte\n"));
15216 printf ("??? (%d)\n", val);
15221 case Tag_ABI_array_object_align_expected:
15222 val = read_uleb128 (p, &len, end);
15224 printf (" Tag_ABI_array_object_align_expected: ");
15228 printf (_("8-byte\n"));
15231 printf (_("4-byte\n"));
15234 printf (_("16-byte\n"));
15237 printf ("??? (%d)\n", val);
15242 case Tag_ABI_compatibility:
15244 val = read_uleb128 (p, &len, end);
15246 printf (" Tag_ABI_compatibility: ");
15247 printf (_("flag = %d, vendor = "), val);
15250 size_t maxlen = (end - p) - 1;
15252 print_symbol ((int) maxlen, (const char *) p);
15253 p += strnlen ((char *) p, maxlen) + 1;
15257 printf (_("<corrupt>"));
15258 p = (unsigned char *) end;
15264 case Tag_ABI_conformance:
15266 printf (" Tag_ABI_conformance: \"");
15269 size_t maxlen = (end - p) - 1;
15271 print_symbol ((int) maxlen, (const char *) p);
15272 p += strnlen ((char *) p, maxlen) + 1;
15276 printf (_("<corrupt>"));
15277 p = (unsigned char *) end;
15284 return display_tag_value (tag, p, end);
15288 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15290 unsigned long addr = 0;
15291 size_t bytes = end - p;
15298 int lbytes = (bytes > 16 ? 16 : bytes);
15300 printf (" 0x%8.8lx ", addr);
15302 for (j = 0; j < 16; j++)
15305 printf ("%2.2x", p[j]);
15313 for (j = 0; j < lbytes; j++)
15316 if (k >= ' ' && k < 0x7f)
15332 static unsigned char *
15333 display_msp430x_attribute (unsigned char * p,
15334 const unsigned char * const end)
15340 tag = read_uleb128 (p, & len, end);
15345 case OFBA_MSPABI_Tag_ISA:
15346 val = read_uleb128 (p, &len, end);
15348 printf (" Tag_ISA: ");
15351 case 0: printf (_("None\n")); break;
15352 case 1: printf (_("MSP430\n")); break;
15353 case 2: printf (_("MSP430X\n")); break;
15354 default: printf ("??? (%d)\n", val); break;
15358 case OFBA_MSPABI_Tag_Code_Model:
15359 val = read_uleb128 (p, &len, end);
15361 printf (" Tag_Code_Model: ");
15364 case 0: printf (_("None\n")); break;
15365 case 1: printf (_("Small\n")); break;
15366 case 2: printf (_("Large\n")); break;
15367 default: printf ("??? (%d)\n", val); break;
15371 case OFBA_MSPABI_Tag_Data_Model:
15372 val = read_uleb128 (p, &len, end);
15374 printf (" Tag_Data_Model: ");
15377 case 0: printf (_("None\n")); break;
15378 case 1: printf (_("Small\n")); break;
15379 case 2: printf (_("Large\n")); break;
15380 case 3: printf (_("Restricted Large\n")); break;
15381 default: printf ("??? (%d)\n", val); break;
15386 printf (_(" <unknown tag %d>: "), tag);
15393 size_t maxlen = (end - p) - 1;
15395 print_symbol ((int) maxlen, (const char *) p);
15396 p += strnlen ((char *) p, maxlen) + 1;
15400 printf (_("<corrupt>"));
15401 p = (unsigned char *) end;
15407 val = read_uleb128 (p, &len, end);
15409 printf ("%d (0x%x)\n", val, val);
15418 struct riscv_attr_tag_t {
15423 static struct riscv_attr_tag_t riscv_attr_tag[] =
15425 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15428 T(priv_spec_minor),
15429 T(priv_spec_revision),
15430 T(unaligned_access),
15435 static unsigned char *
15436 display_riscv_attribute (unsigned char *p,
15437 const unsigned char * const end)
15442 struct riscv_attr_tag_t *attr = NULL;
15445 tag = read_uleb128 (p, &len, end);
15448 /* Find the name of attribute. */
15449 for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15451 if (riscv_attr_tag[i].tag == tag)
15453 attr = &riscv_attr_tag[i];
15459 printf (" %s: ", attr->name);
15461 return display_tag_value (tag, p, end);
15465 case Tag_RISCV_priv_spec:
15466 case Tag_RISCV_priv_spec_minor:
15467 case Tag_RISCV_priv_spec_revision:
15468 val = read_uleb128 (p, &len, end);
15470 printf (_("%d\n"), val);
15472 case Tag_RISCV_unaligned_access:
15473 val = read_uleb128 (p, &len, end);
15478 printf (_("No unaligned access\n"));
15481 printf (_("Unaligned access\n"));
15485 case Tag_RISCV_stack_align:
15486 val = read_uleb128 (p, &len, end);
15488 printf (_("%d-bytes\n"), val);
15490 case Tag_RISCV_arch:
15491 p = display_tag_value (-1, p, end);
15494 return display_tag_value (tag, p, end);
15501 process_attributes (Filedata * filedata,
15502 const char * public_name,
15503 unsigned int proc_type,
15504 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15505 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15507 Elf_Internal_Shdr * sect;
15509 bfd_boolean res = TRUE;
15511 /* Find the section header so that we get the size. */
15512 for (i = 0, sect = filedata->section_headers;
15513 i < filedata->file_header.e_shnum;
15516 unsigned char * contents;
15519 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15522 contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15523 sect->sh_size, _("attributes"));
15524 if (contents == NULL)
15531 /* The first character is the version of the attributes.
15532 Currently only version 1, (aka 'A') is recognised here. */
15535 printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15540 bfd_vma section_len;
15542 section_len = sect->sh_size - 1;
15545 while (section_len > 0)
15548 unsigned int namelen;
15549 bfd_boolean public_section;
15550 bfd_boolean gnu_section;
15552 if (section_len <= 4)
15554 error (_("Tag section ends prematurely\n"));
15558 attr_len = byte_get (p, 4);
15561 if (attr_len > section_len)
15563 error (_("Bad attribute length (%u > %u)\n"),
15564 (unsigned) attr_len, (unsigned) section_len);
15565 attr_len = section_len;
15568 /* PR 17531: file: 001-101425-0.004 */
15569 else if (attr_len < 5)
15571 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15576 section_len -= attr_len;
15579 namelen = strnlen ((char *) p, attr_len) + 1;
15580 if (namelen == 0 || namelen >= attr_len)
15582 error (_("Corrupt attribute section name\n"));
15587 printf (_("Attribute Section: "));
15588 print_symbol (INT_MAX, (const char *) p);
15591 if (public_name && streq ((char *) p, public_name))
15592 public_section = TRUE;
15594 public_section = FALSE;
15596 if (streq ((char *) p, "gnu"))
15597 gnu_section = TRUE;
15599 gnu_section = FALSE;
15602 attr_len -= namelen;
15604 while (attr_len > 0 && p < contents + sect->sh_size)
15609 unsigned char * end;
15611 /* PR binutils/17531: Safe handling of corrupt files. */
15614 error (_("Unused bytes at end of section\n"));
15621 size = byte_get (p, 4);
15622 if (size > attr_len)
15624 error (_("Bad subsection length (%u > %u)\n"),
15625 (unsigned) size, (unsigned) attr_len);
15629 /* PR binutils/17531: Safe handling of corrupt files. */
15632 error (_("Bad subsection length (%u < 6)\n"),
15640 end = p + size - 1;
15641 assert (end <= contents + sect->sh_size);
15647 printf (_("File Attributes\n"));
15650 printf (_("Section Attributes:"));
15653 printf (_("Symbol Attributes:"));
15654 /* Fall through. */
15660 val = read_uleb128 (p, &j, end);
15664 printf (" %d", val);
15669 printf (_("Unknown tag: %d\n"), tag);
15670 public_section = FALSE;
15674 if (public_section && display_pub_attribute != NULL)
15677 p = display_pub_attribute (p, end);
15680 else if (gnu_section && display_proc_gnu_attribute != NULL)
15683 p = display_gnu_attribute (p,
15684 display_proc_gnu_attribute,
15690 printf (_(" Unknown attribute:\n"));
15691 display_raw_attribute (p, end);
15706 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15707 Print the Address, Access and Initial fields of an entry at VMA ADDR
15708 and return the VMA of the next entry, or -1 if there was a problem.
15709 Does not read from DATA_END or beyond. */
15712 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15713 unsigned char * data_end)
15716 print_vma (addr, LONG_HEX);
15718 if (addr < pltgot + 0xfff0)
15719 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15721 printf ("%10s", "");
15724 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15728 unsigned char * from = data + addr - pltgot;
15730 if (from + (is_32bit_elf ? 4 : 8) > data_end)
15732 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15733 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15734 return (bfd_vma) -1;
15738 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15739 print_vma (entry, LONG_HEX);
15742 return addr + (is_32bit_elf ? 4 : 8);
15745 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15746 PLTGOT. Print the Address and Initial fields of an entry at VMA
15747 ADDR and return the VMA of the next entry. */
15750 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15753 print_vma (addr, LONG_HEX);
15756 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15761 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15762 print_vma (entry, LONG_HEX);
15764 return addr + (is_32bit_elf ? 4 : 8);
15768 print_mips_ases (unsigned int mask)
15770 if (mask & AFL_ASE_DSP)
15771 fputs ("\n\tDSP ASE", stdout);
15772 if (mask & AFL_ASE_DSPR2)
15773 fputs ("\n\tDSP R2 ASE", stdout);
15774 if (mask & AFL_ASE_DSPR3)
15775 fputs ("\n\tDSP R3 ASE", stdout);
15776 if (mask & AFL_ASE_EVA)
15777 fputs ("\n\tEnhanced VA Scheme", stdout);
15778 if (mask & AFL_ASE_MCU)
15779 fputs ("\n\tMCU (MicroController) ASE", stdout);
15780 if (mask & AFL_ASE_MDMX)
15781 fputs ("\n\tMDMX ASE", stdout);
15782 if (mask & AFL_ASE_MIPS3D)
15783 fputs ("\n\tMIPS-3D ASE", stdout);
15784 if (mask & AFL_ASE_MT)
15785 fputs ("\n\tMT ASE", stdout);
15786 if (mask & AFL_ASE_SMARTMIPS)
15787 fputs ("\n\tSmartMIPS ASE", stdout);
15788 if (mask & AFL_ASE_VIRT)
15789 fputs ("\n\tVZ ASE", stdout);
15790 if (mask & AFL_ASE_MSA)
15791 fputs ("\n\tMSA ASE", stdout);
15792 if (mask & AFL_ASE_MIPS16)
15793 fputs ("\n\tMIPS16 ASE", stdout);
15794 if (mask & AFL_ASE_MICROMIPS)
15795 fputs ("\n\tMICROMIPS ASE", stdout);
15796 if (mask & AFL_ASE_XPA)
15797 fputs ("\n\tXPA ASE", stdout);
15798 if (mask & AFL_ASE_MIPS16E2)
15799 fputs ("\n\tMIPS16e2 ASE", stdout);
15800 if (mask & AFL_ASE_CRC)
15801 fputs ("\n\tCRC ASE", stdout);
15802 if (mask & AFL_ASE_GINV)
15803 fputs ("\n\tGINV ASE", stdout);
15804 if (mask & AFL_ASE_LOONGSON_MMI)
15805 fputs ("\n\tLoongson MMI ASE", stdout);
15806 if (mask & AFL_ASE_LOONGSON_CAM)
15807 fputs ("\n\tLoongson CAM ASE", stdout);
15808 if (mask & AFL_ASE_LOONGSON_EXT)
15809 fputs ("\n\tLoongson EXT ASE", stdout);
15810 if (mask & AFL_ASE_LOONGSON_EXT2)
15811 fputs ("\n\tLoongson EXT2 ASE", stdout);
15813 fprintf (stdout, "\n\t%s", _("None"));
15814 else if ((mask & ~AFL_ASE_MASK) != 0)
15815 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15819 print_mips_isa_ext (unsigned int isa_ext)
15824 fputs (_("None"), stdout);
15827 fputs ("RMI XLR", stdout);
15829 case AFL_EXT_OCTEON3:
15830 fputs ("Cavium Networks Octeon3", stdout);
15832 case AFL_EXT_OCTEON2:
15833 fputs ("Cavium Networks Octeon2", stdout);
15835 case AFL_EXT_OCTEONP:
15836 fputs ("Cavium Networks OcteonP", stdout);
15838 case AFL_EXT_OCTEON:
15839 fputs ("Cavium Networks Octeon", stdout);
15842 fputs ("Toshiba R5900", stdout);
15845 fputs ("MIPS R4650", stdout);
15848 fputs ("LSI R4010", stdout);
15851 fputs ("NEC VR4100", stdout);
15854 fputs ("Toshiba R3900", stdout);
15856 case AFL_EXT_10000:
15857 fputs ("MIPS R10000", stdout);
15860 fputs ("Broadcom SB-1", stdout);
15863 fputs ("NEC VR4111/VR4181", stdout);
15866 fputs ("NEC VR4120", stdout);
15869 fputs ("NEC VR5400", stdout);
15872 fputs ("NEC VR5500", stdout);
15874 case AFL_EXT_LOONGSON_2E:
15875 fputs ("ST Microelectronics Loongson 2E", stdout);
15877 case AFL_EXT_LOONGSON_2F:
15878 fputs ("ST Microelectronics Loongson 2F", stdout);
15880 case AFL_EXT_INTERAPTIV_MR2:
15881 fputs ("Imagination interAptiv MR2", stdout);
15884 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15889 get_mips_reg_size (int reg_size)
15891 return (reg_size == AFL_REG_NONE) ? 0
15892 : (reg_size == AFL_REG_32) ? 32
15893 : (reg_size == AFL_REG_64) ? 64
15894 : (reg_size == AFL_REG_128) ? 128
15899 process_mips_specific (Filedata * filedata)
15901 Elf_Internal_Dyn * entry;
15902 Elf_Internal_Shdr *sect = NULL;
15903 size_t liblist_offset = 0;
15904 size_t liblistno = 0;
15905 size_t conflictsno = 0;
15906 size_t options_offset = 0;
15907 size_t conflicts_offset = 0;
15908 size_t pltrelsz = 0;
15910 bfd_vma pltgot = 0;
15911 bfd_vma mips_pltgot = 0;
15912 bfd_vma jmprel = 0;
15913 bfd_vma local_gotno = 0;
15914 bfd_vma gotsym = 0;
15915 bfd_vma symtabno = 0;
15916 bfd_boolean res = TRUE;
15918 if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15919 display_mips_gnu_attribute))
15922 sect = find_section (filedata, ".MIPS.abiflags");
15926 Elf_External_ABIFlags_v0 *abiflags_ext;
15927 Elf_Internal_ABIFlags_v0 abiflags_in;
15929 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15931 error (_("Corrupt MIPS ABI Flags section.\n"));
15936 abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15937 sect->sh_size, _("MIPS ABI Flags section"));
15940 abiflags_in.version = BYTE_GET (abiflags_ext->version);
15941 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15942 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15943 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15944 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15945 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15946 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15947 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15948 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15949 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15950 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15952 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15953 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15954 if (abiflags_in.isa_rev > 1)
15955 printf ("r%d", abiflags_in.isa_rev);
15956 printf ("\nGPR size: %d",
15957 get_mips_reg_size (abiflags_in.gpr_size));
15958 printf ("\nCPR1 size: %d",
15959 get_mips_reg_size (abiflags_in.cpr1_size));
15960 printf ("\nCPR2 size: %d",
15961 get_mips_reg_size (abiflags_in.cpr2_size));
15962 fputs ("\nFP ABI: ", stdout);
15963 print_mips_fp_abi_value (abiflags_in.fp_abi);
15964 fputs ("ISA Extension: ", stdout);
15965 print_mips_isa_ext (abiflags_in.isa_ext);
15966 fputs ("\nASEs:", stdout);
15967 print_mips_ases (abiflags_in.ases);
15968 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15969 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15970 fputc ('\n', stdout);
15971 free (abiflags_ext);
15976 /* We have a lot of special sections. Thanks SGI! */
15977 if (dynamic_section == NULL)
15979 /* No dynamic information available. See if there is static GOT. */
15980 sect = find_section (filedata, ".got");
15983 unsigned char *data_end;
15984 unsigned char *data;
15988 pltgot = sect->sh_addr;
15991 addr_size = (is_32bit_elf ? 4 : 8);
15992 end = pltgot + sect->sh_size;
15994 data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15996 _("Global Offset Table data"));
15997 /* PR 12855: Null data is handled gracefully throughout. */
15998 data_end = data + (end - pltgot);
16000 printf (_("\nStatic GOT:\n"));
16001 printf (_(" Canonical gp value: "));
16002 print_vma (ent + 0x7ff0, LONG_HEX);
16005 /* In a dynamic binary GOT[0] is reserved for the dynamic
16006 loader to store the lazy resolver pointer, however in
16007 a static binary it may well have been omitted and GOT
16008 reduced to a table of addresses.
16009 PR 21344: Check for the entry being fully available
16010 before fetching it. */
16012 && data + ent - pltgot + addr_size <= data_end
16013 && byte_get (data + ent - pltgot, addr_size) == 0)
16015 printf (_(" Reserved entries:\n"));
16016 printf (_(" %*s %10s %*s\n"),
16017 addr_size * 2, _("Address"), _("Access"),
16018 addr_size * 2, _("Value"));
16019 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16021 if (ent == (bfd_vma) -1)
16022 goto sgot_print_fail;
16024 /* Check for the MSB of GOT[1] being set, identifying a
16025 GNU object. This entry will be used by some runtime
16026 loaders, to store the module pointer. Otherwise this
16027 is an ordinary local entry.
16028 PR 21344: Check for the entry being fully available
16029 before fetching it. */
16031 && data + ent - pltgot + addr_size <= data_end
16032 && (byte_get (data + ent - pltgot, addr_size)
16033 >> (addr_size * 8 - 1)) != 0)
16035 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16037 if (ent == (bfd_vma) -1)
16038 goto sgot_print_fail;
16043 if (data != NULL && ent < end)
16045 printf (_(" Local entries:\n"));
16046 printf (" %*s %10s %*s\n",
16047 addr_size * 2, _("Address"), _("Access"),
16048 addr_size * 2, _("Value"));
16051 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16053 if (ent == (bfd_vma) -1)
16054 goto sgot_print_fail;
16066 for (entry = dynamic_section;
16067 /* PR 17531 file: 012-50589-0.004. */
16068 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16070 switch (entry->d_tag)
16072 case DT_MIPS_LIBLIST:
16074 = offset_from_vma (filedata, entry->d_un.d_val,
16075 liblistno * sizeof (Elf32_External_Lib));
16077 case DT_MIPS_LIBLISTNO:
16078 liblistno = entry->d_un.d_val;
16080 case DT_MIPS_OPTIONS:
16081 options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16083 case DT_MIPS_CONFLICT:
16085 = offset_from_vma (filedata, entry->d_un.d_val,
16086 conflictsno * sizeof (Elf32_External_Conflict));
16088 case DT_MIPS_CONFLICTNO:
16089 conflictsno = entry->d_un.d_val;
16092 pltgot = entry->d_un.d_ptr;
16094 case DT_MIPS_LOCAL_GOTNO:
16095 local_gotno = entry->d_un.d_val;
16097 case DT_MIPS_GOTSYM:
16098 gotsym = entry->d_un.d_val;
16100 case DT_MIPS_SYMTABNO:
16101 symtabno = entry->d_un.d_val;
16103 case DT_MIPS_PLTGOT:
16104 mips_pltgot = entry->d_un.d_ptr;
16107 pltrel = entry->d_un.d_val;
16110 pltrelsz = entry->d_un.d_val;
16113 jmprel = entry->d_un.d_ptr;
16119 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16121 Elf32_External_Lib * elib;
16124 elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16126 sizeof (Elf32_External_Lib),
16127 _("liblist section data"));
16130 printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16131 "\nSection '.liblist' contains %lu entries:\n",
16132 (unsigned long) liblistno),
16133 (unsigned long) liblistno);
16134 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
16137 for (cnt = 0; cnt < liblistno; ++cnt)
16144 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16145 atime = BYTE_GET (elib[cnt].l_time_stamp);
16146 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16147 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16148 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16150 tmp = gmtime (&atime);
16151 snprintf (timebuf, sizeof (timebuf),
16152 "%04u-%02u-%02uT%02u:%02u:%02u",
16153 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16154 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16156 printf ("%3lu: ", (unsigned long) cnt);
16157 if (VALID_DYNAMIC_NAME (liblist.l_name))
16158 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16160 printf (_("<corrupt: %9ld>"), liblist.l_name);
16161 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16162 liblist.l_version);
16164 if (liblist.l_flags == 0)
16168 static const struct
16175 { " EXACT_MATCH", LL_EXACT_MATCH },
16176 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16177 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16178 { " EXPORTS", LL_EXPORTS },
16179 { " DELAY_LOAD", LL_DELAY_LOAD },
16180 { " DELTA", LL_DELTA }
16182 int flags = liblist.l_flags;
16185 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16186 if ((flags & l_flags_vals[fcnt].bit) != 0)
16188 fputs (l_flags_vals[fcnt].name, stdout);
16189 flags ^= l_flags_vals[fcnt].bit;
16192 printf (" %#x", (unsigned int) flags);
16204 if (options_offset != 0)
16206 Elf_External_Options * eopt;
16207 Elf_Internal_Options * iopt;
16208 Elf_Internal_Options * option;
16211 sect = filedata->section_headers;
16213 /* Find the section header so that we get the size. */
16214 sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16215 /* PR 17533 file: 012-277276-0.004. */
16218 error (_("No MIPS_OPTIONS header found\n"));
16222 if (sect->sh_size < sizeof (* eopt))
16224 error (_("The MIPS options section is too small.\n"));
16228 eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16229 sect->sh_size, _("options"));
16232 iopt = (Elf_Internal_Options *)
16233 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16236 error (_("Out of memory allocating space for MIPS options\n"));
16243 while (offset <= sect->sh_size - sizeof (* eopt))
16245 Elf_External_Options * eoption;
16247 eoption = (Elf_External_Options *) ((char *) eopt + offset);
16249 option->kind = BYTE_GET (eoption->kind);
16250 option->size = BYTE_GET (eoption->size);
16251 option->section = BYTE_GET (eoption->section);
16252 option->info = BYTE_GET (eoption->info);
16254 /* PR 17531: file: ffa0fa3b. */
16255 if (option->size < sizeof (* eopt)
16256 || offset + option->size > sect->sh_size)
16258 error (_("Invalid size (%u) for MIPS option\n"), option->size);
16261 offset += option->size;
16267 printf (ngettext ("\nSection '%s' contains %d entry:\n",
16268 "\nSection '%s' contains %d entries:\n",
16270 printable_section_name (filedata, sect), cnt);
16279 switch (option->kind)
16282 /* This shouldn't happen. */
16283 printf (" NULL %d %lx", option->section, option->info);
16286 printf (" REGINFO ");
16287 if (filedata->file_header.e_machine == EM_MIPS)
16290 Elf32_External_RegInfo * ereg;
16291 Elf32_RegInfo reginfo;
16293 ereg = (Elf32_External_RegInfo *) (option + 1);
16294 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16295 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16296 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16297 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16298 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16299 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16301 printf ("GPR %08lx GP 0x%lx\n",
16302 reginfo.ri_gprmask,
16303 (unsigned long) reginfo.ri_gp_value);
16304 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16305 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16306 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16311 Elf64_External_RegInfo * ereg;
16312 Elf64_Internal_RegInfo reginfo;
16314 ereg = (Elf64_External_RegInfo *) (option + 1);
16315 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16316 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16317 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16318 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16319 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16320 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16322 printf ("GPR %08lx GP 0x",
16323 reginfo.ri_gprmask);
16324 printf_vma (reginfo.ri_gp_value);
16327 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
16328 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16329 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16333 case ODK_EXCEPTIONS:
16334 fputs (" EXCEPTIONS fpe_min(", stdout);
16335 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16336 fputs (") fpe_max(", stdout);
16337 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16338 fputs (")", stdout);
16340 if (option->info & OEX_PAGE0)
16341 fputs (" PAGE0", stdout);
16342 if (option->info & OEX_SMM)
16343 fputs (" SMM", stdout);
16344 if (option->info & OEX_FPDBUG)
16345 fputs (" FPDBUG", stdout);
16346 if (option->info & OEX_DISMISS)
16347 fputs (" DISMISS", stdout);
16350 fputs (" PAD ", stdout);
16351 if (option->info & OPAD_PREFIX)
16352 fputs (" PREFIX", stdout);
16353 if (option->info & OPAD_POSTFIX)
16354 fputs (" POSTFIX", stdout);
16355 if (option->info & OPAD_SYMBOL)
16356 fputs (" SYMBOL", stdout);
16359 fputs (" HWPATCH ", stdout);
16360 if (option->info & OHW_R4KEOP)
16361 fputs (" R4KEOP", stdout);
16362 if (option->info & OHW_R8KPFETCH)
16363 fputs (" R8KPFETCH", stdout);
16364 if (option->info & OHW_R5KEOP)
16365 fputs (" R5KEOP", stdout);
16366 if (option->info & OHW_R5KCVTL)
16367 fputs (" R5KCVTL", stdout);
16370 fputs (" FILL ", stdout);
16371 /* XXX Print content of info word? */
16374 fputs (" TAGS ", stdout);
16375 /* XXX Print content of info word? */
16378 fputs (" HWAND ", stdout);
16379 if (option->info & OHWA0_R4KEOP_CHECKED)
16380 fputs (" R4KEOP_CHECKED", stdout);
16381 if (option->info & OHWA0_R4KEOP_CLEAN)
16382 fputs (" R4KEOP_CLEAN", stdout);
16385 fputs (" HWOR ", stdout);
16386 if (option->info & OHWA0_R4KEOP_CHECKED)
16387 fputs (" R4KEOP_CHECKED", stdout);
16388 if (option->info & OHWA0_R4KEOP_CLEAN)
16389 fputs (" R4KEOP_CLEAN", stdout);
16392 printf (" GP_GROUP %#06lx self-contained %#06lx",
16393 option->info & OGP_GROUP,
16394 (option->info & OGP_SELF) >> 16);
16397 printf (" IDENT %#06lx self-contained %#06lx",
16398 option->info & OGP_GROUP,
16399 (option->info & OGP_SELF) >> 16);
16402 /* This shouldn't happen. */
16403 printf (" %3d ??? %d %lx",
16404 option->kind, option->section, option->info);
16408 len = sizeof (* eopt);
16409 while (len < option->size)
16411 unsigned char datum = * ((unsigned char *) eopt + offset + len);
16413 if (ISPRINT (datum))
16414 printf ("%c", datum);
16416 printf ("\\%03o", datum);
16419 fputs ("\n", stdout);
16421 offset += option->size;
16431 if (conflicts_offset != 0 && conflictsno != 0)
16433 Elf32_Conflict * iconf;
16436 if (dynamic_symbols == NULL)
16438 error (_("conflict list found without a dynamic symbol table\n"));
16442 /* PR 21345 - print a slightly more helpful error message
16443 if we are sure that the cmalloc will fail. */
16444 if (conflictsno * sizeof (* iconf) > filedata->file_size)
16446 error (_("Overlarge number of conflicts detected: %lx\n"),
16447 (long) conflictsno);
16451 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16454 error (_("Out of memory allocating space for dynamic conflicts\n"));
16460 Elf32_External_Conflict * econf32;
16462 econf32 = (Elf32_External_Conflict *)
16463 get_data (NULL, filedata, conflicts_offset, conflictsno,
16464 sizeof (* econf32), _("conflict"));
16468 for (cnt = 0; cnt < conflictsno; ++cnt)
16469 iconf[cnt] = BYTE_GET (econf32[cnt]);
16475 Elf64_External_Conflict * econf64;
16477 econf64 = (Elf64_External_Conflict *)
16478 get_data (NULL, filedata, conflicts_offset, conflictsno,
16479 sizeof (* econf64), _("conflict"));
16483 for (cnt = 0; cnt < conflictsno; ++cnt)
16484 iconf[cnt] = BYTE_GET (econf64[cnt]);
16489 printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16490 "\nSection '.conflict' contains %lu entries:\n",
16491 (unsigned long) conflictsno),
16492 (unsigned long) conflictsno);
16493 puts (_(" Num: Index Value Name"));
16495 for (cnt = 0; cnt < conflictsno; ++cnt)
16497 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
16499 if (iconf[cnt] >= num_dynamic_syms)
16500 printf (_("<corrupt symbol index>"));
16503 Elf_Internal_Sym * psym;
16505 psym = & dynamic_symbols[iconf[cnt]];
16506 print_vma (psym->st_value, FULL_HEX);
16508 if (VALID_DYNAMIC_NAME (psym->st_name))
16509 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16511 printf (_("<corrupt: %14ld>"), psym->st_name);
16519 if (pltgot != 0 && local_gotno != 0)
16521 bfd_vma ent, local_end, global_end;
16523 unsigned char * data;
16524 unsigned char * data_end;
16528 addr_size = (is_32bit_elf ? 4 : 8);
16529 local_end = pltgot + local_gotno * addr_size;
16531 /* PR binutils/17533 file: 012-111227-0.004 */
16532 if (symtabno < gotsym)
16534 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16535 (unsigned long) gotsym, (unsigned long) symtabno);
16539 global_end = local_end + (symtabno - gotsym) * addr_size;
16540 /* PR 17531: file: 54c91a34. */
16541 if (global_end < local_end)
16543 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16547 offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16548 data = (unsigned char *) get_data (NULL, filedata, offset,
16549 global_end - pltgot, 1,
16550 _("Global Offset Table data"));
16551 /* PR 12855: Null data is handled gracefully throughout. */
16552 data_end = data + (global_end - pltgot);
16554 printf (_("\nPrimary GOT:\n"));
16555 printf (_(" Canonical gp value: "));
16556 print_vma (pltgot + 0x7ff0, LONG_HEX);
16559 printf (_(" Reserved entries:\n"));
16560 printf (_(" %*s %10s %*s Purpose\n"),
16561 addr_size * 2, _("Address"), _("Access"),
16562 addr_size * 2, _("Initial"));
16563 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16564 printf (_(" Lazy resolver\n"));
16565 if (ent == (bfd_vma) -1)
16566 goto got_print_fail;
16568 /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16569 This entry will be used by some runtime loaders, to store the
16570 module pointer. Otherwise this is an ordinary local entry.
16571 PR 21344: Check for the entry being fully available before
16574 && data + ent - pltgot + addr_size <= data_end
16575 && (byte_get (data + ent - pltgot, addr_size)
16576 >> (addr_size * 8 - 1)) != 0)
16578 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16579 printf (_(" Module pointer (GNU extension)\n"));
16580 if (ent == (bfd_vma) -1)
16581 goto got_print_fail;
16585 if (data != NULL && ent < local_end)
16587 printf (_(" Local entries:\n"));
16588 printf (" %*s %10s %*s\n",
16589 addr_size * 2, _("Address"), _("Access"),
16590 addr_size * 2, _("Initial"));
16591 while (ent < local_end)
16593 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16595 if (ent == (bfd_vma) -1)
16596 goto got_print_fail;
16601 if (data != NULL && gotsym < symtabno)
16605 printf (_(" Global entries:\n"));
16606 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
16607 addr_size * 2, _("Address"),
16609 addr_size * 2, _("Initial"),
16610 addr_size * 2, _("Sym.Val."),
16612 /* Note for translators: "Ndx" = abbreviated form of "Index". */
16613 _("Ndx"), _("Name"));
16615 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16617 for (i = gotsym; i < symtabno; i++)
16619 ent = print_mips_got_entry (data, pltgot, ent, data_end);
16622 if (dynamic_symbols == NULL)
16623 printf (_("<no dynamic symbols>"));
16624 else if (i < num_dynamic_syms)
16626 Elf_Internal_Sym * psym = dynamic_symbols + i;
16628 print_vma (psym->st_value, LONG_HEX);
16629 printf (" %-7s %3s ",
16630 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16631 get_symbol_index_type (filedata, psym->st_shndx));
16633 if (VALID_DYNAMIC_NAME (psym->st_name))
16634 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16636 printf (_("<corrupt: %14ld>"), psym->st_name);
16639 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16640 (unsigned long) i);
16643 if (ent == (bfd_vma) -1)
16654 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16657 size_t offset, rel_offset;
16658 unsigned long count, i;
16659 unsigned char * data;
16660 int addr_size, sym_width;
16661 Elf_Internal_Rela * rels;
16663 rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16664 if (pltrel == DT_RELA)
16666 if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16671 if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16676 addr_size = (is_32bit_elf ? 4 : 8);
16677 end = mips_pltgot + (2 + count) * addr_size;
16679 offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16680 data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16681 1, _("Procedure Linkage Table data"));
16685 printf ("\nPLT GOT:\n\n");
16686 printf (_(" Reserved entries:\n"));
16687 printf (_(" %*s %*s Purpose\n"),
16688 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16689 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16690 printf (_(" PLT lazy resolver\n"));
16691 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16692 printf (_(" Module pointer\n"));
16695 printf (_(" Entries:\n"));
16696 printf (" %*s %*s %*s %-7s %3s %s\n",
16697 addr_size * 2, _("Address"),
16698 addr_size * 2, _("Initial"),
16699 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16700 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16701 for (i = 0; i < count; i++)
16703 unsigned long idx = get_reloc_symindex (rels[i].r_info);
16705 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16708 if (idx >= num_dynamic_syms)
16709 printf (_("<corrupt symbol index: %lu>"), idx);
16712 Elf_Internal_Sym * psym = dynamic_symbols + idx;
16714 print_vma (psym->st_value, LONG_HEX);
16715 printf (" %-7s %3s ",
16716 get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16717 get_symbol_index_type (filedata, psym->st_shndx));
16718 if (VALID_DYNAMIC_NAME (psym->st_name))
16719 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16721 printf (_("<corrupt: %14ld>"), psym->st_name);
16736 process_nds32_specific (Filedata * filedata)
16738 Elf_Internal_Shdr *sect = NULL;
16740 sect = find_section (filedata, ".nds32_e_flags");
16743 unsigned int *flag;
16745 printf ("\nNDS32 elf flags section:\n");
16746 flag = get_data (NULL, filedata, sect->sh_offset, 1,
16747 sect->sh_size, _("NDS32 elf flags section"));
16752 switch ((*flag) & 0x3)
16755 printf ("(VEC_SIZE):\tNo entry.\n");
16758 printf ("(VEC_SIZE):\t4 bytes\n");
16761 printf ("(VEC_SIZE):\t16 bytes\n");
16764 printf ("(VEC_SIZE):\treserved\n");
16773 process_gnu_liblist (Filedata * filedata)
16775 Elf_Internal_Shdr * section;
16776 Elf_Internal_Shdr * string_sec;
16777 Elf32_External_Lib * elib;
16779 size_t strtab_size;
16781 unsigned long num_liblist;
16783 bfd_boolean res = TRUE;
16788 for (i = 0, section = filedata->section_headers;
16789 i < filedata->file_header.e_shnum;
16792 switch (section->sh_type)
16794 case SHT_GNU_LIBLIST:
16795 if (section->sh_link >= filedata->file_header.e_shnum)
16798 elib = (Elf32_External_Lib *)
16799 get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16800 _("liblist section data"));
16808 string_sec = filedata->section_headers + section->sh_link;
16809 strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16810 string_sec->sh_size,
16811 _("liblist string table"));
16813 || section->sh_entsize != sizeof (Elf32_External_Lib))
16820 strtab_size = string_sec->sh_size;
16822 num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16823 printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16824 "\nLibrary list section '%s' contains %lu entries:\n",
16826 printable_section_name (filedata, section),
16829 puts (_(" Library Time Stamp Checksum Version Flags"));
16831 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16839 liblist.l_name = BYTE_GET (elib[cnt].l_name);
16840 atime = BYTE_GET (elib[cnt].l_time_stamp);
16841 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16842 liblist.l_version = BYTE_GET (elib[cnt].l_version);
16843 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16845 tmp = gmtime (&atime);
16846 snprintf (timebuf, sizeof (timebuf),
16847 "%04u-%02u-%02uT%02u:%02u:%02u",
16848 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16849 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16851 printf ("%3lu: ", (unsigned long) cnt);
16853 printf ("%-20s", liblist.l_name < strtab_size
16854 ? strtab + liblist.l_name : _("<corrupt>"));
16856 printf ("%-20.20s", liblist.l_name < strtab_size
16857 ? strtab + liblist.l_name : _("<corrupt>"));
16858 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16859 liblist.l_version, liblist.l_flags);
16870 static const char *
16871 get_note_type (Filedata * filedata, unsigned e_type)
16873 static char buff[64];
16875 if (filedata->file_header.e_type == ET_CORE)
16879 return _("NT_AUXV (auxiliary vector)");
16881 return _("NT_PRSTATUS (prstatus structure)");
16883 return _("NT_FPREGSET (floating point registers)");
16885 return _("NT_PRPSINFO (prpsinfo structure)");
16886 case NT_TASKSTRUCT:
16887 return _("NT_TASKSTRUCT (task structure)");
16889 return _("NT_PRXFPREG (user_xfpregs structure)");
16891 return _("NT_PPC_VMX (ppc Altivec registers)");
16893 return _("NT_PPC_VSX (ppc VSX registers)");
16895 return _("NT_PPC_TAR (ppc TAR register)");
16897 return _("NT_PPC_PPR (ppc PPR register)");
16899 return _("NT_PPC_DSCR (ppc DSCR register)");
16901 return _("NT_PPC_EBB (ppc EBB registers)");
16903 return _("NT_PPC_PMU (ppc PMU registers)");
16904 case NT_PPC_TM_CGPR:
16905 return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16906 case NT_PPC_TM_CFPR:
16907 return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16908 case NT_PPC_TM_CVMX:
16909 return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16910 case NT_PPC_TM_CVSX:
16911 return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16912 case NT_PPC_TM_SPR:
16913 return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16914 case NT_PPC_TM_CTAR:
16915 return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16916 case NT_PPC_TM_CPPR:
16917 return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16918 case NT_PPC_TM_CDSCR:
16919 return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16921 return _("NT_386_TLS (x86 TLS information)");
16922 case NT_386_IOPERM:
16923 return _("NT_386_IOPERM (x86 I/O permissions)");
16924 case NT_X86_XSTATE:
16925 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16926 case NT_S390_HIGH_GPRS:
16927 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16928 case NT_S390_TIMER:
16929 return _("NT_S390_TIMER (s390 timer register)");
16930 case NT_S390_TODCMP:
16931 return _("NT_S390_TODCMP (s390 TOD comparator register)");
16932 case NT_S390_TODPREG:
16933 return _("NT_S390_TODPREG (s390 TOD programmable register)");
16935 return _("NT_S390_CTRS (s390 control registers)");
16936 case NT_S390_PREFIX:
16937 return _("NT_S390_PREFIX (s390 prefix register)");
16938 case NT_S390_LAST_BREAK:
16939 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16940 case NT_S390_SYSTEM_CALL:
16941 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16943 return _("NT_S390_TDB (s390 transaction diagnostic block)");
16944 case NT_S390_VXRS_LOW:
16945 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16946 case NT_S390_VXRS_HIGH:
16947 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16948 case NT_S390_GS_CB:
16949 return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16950 case NT_S390_GS_BC:
16951 return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16953 return _("NT_ARM_VFP (arm VFP registers)");
16955 return _("NT_ARM_TLS (AArch TLS registers)");
16956 case NT_ARM_HW_BREAK:
16957 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16958 case NT_ARM_HW_WATCH:
16959 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16961 return _("NT_PSTATUS (pstatus structure)");
16963 return _("NT_FPREGS (floating point registers)");
16965 return _("NT_PSINFO (psinfo structure)");
16967 return _("NT_LWPSTATUS (lwpstatus_t structure)");
16969 return _("NT_LWPSINFO (lwpsinfo_t structure)");
16970 case NT_WIN32PSTATUS:
16971 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16973 return _("NT_SIGINFO (siginfo_t data)");
16975 return _("NT_FILE (mapped files)");
16983 return _("NT_VERSION (version)");
16985 return _("NT_ARCH (architecture)");
16986 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16988 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16994 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16999 print_core_note (Elf_Internal_Note *pnote)
17001 unsigned int addr_size = is_32bit_elf ? 4 : 8;
17002 bfd_vma count, page_size;
17003 unsigned char *descdata, *filenames, *descend;
17005 if (pnote->type != NT_FILE)
17015 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
17016 /* Still "successful". */
17021 if (pnote->descsz < 2 * addr_size)
17023 error (_(" Malformed note - too short for header\n"));
17027 descdata = (unsigned char *) pnote->descdata;
17028 descend = descdata + pnote->descsz;
17030 if (descdata[pnote->descsz - 1] != '\0')
17032 error (_(" Malformed note - does not end with \\0\n"));
17036 count = byte_get (descdata, addr_size);
17037 descdata += addr_size;
17039 page_size = byte_get (descdata, addr_size);
17040 descdata += addr_size;
17042 if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17043 || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17045 error (_(" Malformed note - too short for supplied file count\n"));
17049 printf (_(" Page size: "));
17050 print_vma (page_size, DEC);
17053 printf (_(" %*s%*s%*s\n"),
17054 (int) (2 + 2 * addr_size), _("Start"),
17055 (int) (4 + 2 * addr_size), _("End"),
17056 (int) (4 + 2 * addr_size), _("Page Offset"));
17057 filenames = descdata + count * 3 * addr_size;
17058 while (count-- > 0)
17060 bfd_vma start, end, file_ofs;
17062 if (filenames == descend)
17064 error (_(" Malformed note - filenames end too early\n"));
17068 start = byte_get (descdata, addr_size);
17069 descdata += addr_size;
17070 end = byte_get (descdata, addr_size);
17071 descdata += addr_size;
17072 file_ofs = byte_get (descdata, addr_size);
17073 descdata += addr_size;
17076 print_vma (start, FULL_HEX);
17078 print_vma (end, FULL_HEX);
17080 print_vma (file_ofs, FULL_HEX);
17081 printf ("\n %s\n", filenames);
17083 filenames += 1 + strlen ((char *) filenames);
17089 static const char *
17090 get_gnu_elf_note_type (unsigned e_type)
17092 /* NB/ Keep this switch statement in sync with print_gnu_note (). */
17095 case NT_GNU_ABI_TAG:
17096 return _("NT_GNU_ABI_TAG (ABI version tag)");
17098 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17099 case NT_GNU_BUILD_ID:
17100 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17101 case NT_GNU_GOLD_VERSION:
17102 return _("NT_GNU_GOLD_VERSION (gold version)");
17103 case NT_GNU_PROPERTY_TYPE_0:
17104 return _("NT_GNU_PROPERTY_TYPE_0");
17105 case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17106 return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17107 case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17108 return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17111 static char buff[64];
17113 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17120 decode_x86_compat_isa (unsigned int bitmask)
17124 unsigned int bit = bitmask & (- bitmask);
17129 case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17132 case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17135 case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17138 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17141 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17144 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17147 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17150 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17153 case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17156 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17159 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17162 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17163 printf ("AVX512F");
17165 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17166 printf ("AVX512CD");
17168 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17169 printf ("AVX512ER");
17171 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17172 printf ("AVX512PF");
17174 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17175 printf ("AVX512VL");
17177 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17178 printf ("AVX512DQ");
17180 case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17181 printf ("AVX512BW");
17184 printf (_("<unknown: %x>"), bit);
17193 decode_x86_isa (unsigned int bitmask)
17197 printf (_("<None>"));
17203 unsigned int bit = bitmask & (- bitmask);
17208 case GNU_PROPERTY_X86_ISA_1_CMOV:
17211 case GNU_PROPERTY_X86_ISA_1_SSE:
17214 case GNU_PROPERTY_X86_ISA_1_SSE2:
17217 case GNU_PROPERTY_X86_ISA_1_SSE3:
17220 case GNU_PROPERTY_X86_ISA_1_SSSE3:
17223 case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17226 case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17229 case GNU_PROPERTY_X86_ISA_1_AVX:
17232 case GNU_PROPERTY_X86_ISA_1_AVX2:
17235 case GNU_PROPERTY_X86_ISA_1_FMA:
17238 case GNU_PROPERTY_X86_ISA_1_AVX512F:
17239 printf ("AVX512F");
17241 case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17242 printf ("AVX512CD");
17244 case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17245 printf ("AVX512ER");
17247 case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17248 printf ("AVX512PF");
17250 case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17251 printf ("AVX512VL");
17253 case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17254 printf ("AVX512DQ");
17256 case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17257 printf ("AVX512BW");
17259 case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17260 printf ("AVX512_4FMAPS");
17262 case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17263 printf ("AVX512_4VNNIW");
17265 case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17266 printf ("AVX512_BITALG");
17268 case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17269 printf ("AVX512_IFMA");
17271 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17272 printf ("AVX512_VBMI");
17274 case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17275 printf ("AVX512_VBMI2");
17277 case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17278 printf ("AVX512_VNNI");
17281 printf (_("<unknown: %x>"), bit);
17290 decode_x86_feature_1 (unsigned int bitmask)
17294 printf (_("<None>"));
17300 unsigned int bit = bitmask & (- bitmask);
17305 case GNU_PROPERTY_X86_FEATURE_1_IBT:
17308 case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17312 printf (_("<unknown: %x>"), bit);
17321 decode_x86_feature_2 (unsigned int bitmask)
17325 printf (_("<None>"));
17331 unsigned int bit = bitmask & (- bitmask);
17336 case GNU_PROPERTY_X86_FEATURE_2_X86:
17339 case GNU_PROPERTY_X86_FEATURE_2_X87:
17342 case GNU_PROPERTY_X86_FEATURE_2_MMX:
17345 case GNU_PROPERTY_X86_FEATURE_2_XMM:
17348 case GNU_PROPERTY_X86_FEATURE_2_YMM:
17351 case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17354 case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17357 case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17360 case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17361 printf ("XSAVEOPT");
17363 case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17367 printf (_("<unknown: %x>"), bit);
17376 decode_aarch64_feature_1_and (unsigned int bitmask)
17380 unsigned int bit = bitmask & (- bitmask);
17385 case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17389 case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17394 printf (_("<unknown: %x>"), bit);
17403 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17405 unsigned char * ptr = (unsigned char *) pnote->descdata;
17406 unsigned char * ptr_end = ptr + pnote->descsz;
17407 unsigned int size = is_32bit_elf ? 4 : 8;
17409 printf (_(" Properties: "));
17411 if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17413 printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17417 while (ptr < ptr_end)
17421 unsigned int datasz;
17423 if ((size_t) (ptr_end - ptr) < 8)
17425 printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17429 type = byte_get (ptr, 4);
17430 datasz = byte_get (ptr + 4, 4);
17434 if (datasz > (size_t) (ptr_end - ptr))
17436 printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17441 if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17443 if (filedata->file_header.e_machine == EM_X86_64
17444 || filedata->file_header.e_machine == EM_IAMCU
17445 || filedata->file_header.e_machine == EM_386)
17447 unsigned int bitmask;
17450 bitmask = byte_get (ptr, 4);
17456 case GNU_PROPERTY_X86_ISA_1_USED:
17458 printf (_("x86 ISA used: <corrupt length: %#x> "),
17462 printf ("x86 ISA used: ");
17463 decode_x86_isa (bitmask);
17467 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17469 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17473 printf ("x86 ISA needed: ");
17474 decode_x86_isa (bitmask);
17478 case GNU_PROPERTY_X86_FEATURE_1_AND:
17480 printf (_("x86 feature: <corrupt length: %#x> "),
17484 printf ("x86 feature: ");
17485 decode_x86_feature_1 (bitmask);
17489 case GNU_PROPERTY_X86_FEATURE_2_USED:
17491 printf (_("x86 feature used: <corrupt length: %#x> "),
17495 printf ("x86 feature used: ");
17496 decode_x86_feature_2 (bitmask);
17500 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17502 printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17505 printf ("x86 feature needed: ");
17506 decode_x86_feature_2 (bitmask);
17510 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17512 printf (_("x86 ISA used: <corrupt length: %#x> "),
17516 printf ("x86 ISA used: ");
17517 decode_x86_compat_isa (bitmask);
17521 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17523 printf (_("x86 ISA needed: <corrupt length: %#x> "),
17527 printf ("x86 ISA needed: ");
17528 decode_x86_compat_isa (bitmask);
17536 else if (filedata->file_header.e_machine == EM_AARCH64)
17538 if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17540 printf ("AArch64 feature: ");
17542 printf (_("<corrupt length: %#x> "), datasz);
17544 decode_aarch64_feature_1_and (byte_get (ptr, 4));
17553 case GNU_PROPERTY_STACK_SIZE:
17554 printf (_("stack size: "));
17555 if (datasz != size)
17556 printf (_("<corrupt length: %#x> "), datasz);
17558 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17561 case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17562 printf ("no copy on protected ");
17564 printf (_("<corrupt length: %#x> "), datasz);
17572 if (type < GNU_PROPERTY_LOPROC)
17573 printf (_("<unknown type %#x data: "), type);
17574 else if (type < GNU_PROPERTY_LOUSER)
17575 printf (_("<procesor-specific type %#x data: "), type);
17577 printf (_("<application-specific type %#x data: "), type);
17578 for (j = 0; j < datasz; ++j)
17579 printf ("%02x ", ptr[j] & 0xff);
17583 ptr += ((datasz + (size - 1)) & ~ (size - 1));
17584 if (ptr == ptr_end)
17597 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17599 /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type (). */
17600 switch (pnote->type)
17602 case NT_GNU_BUILD_ID:
17606 printf (_(" Build ID: "));
17607 for (i = 0; i < pnote->descsz; ++i)
17608 printf ("%02x", pnote->descdata[i] & 0xff);
17613 case NT_GNU_ABI_TAG:
17615 unsigned long os, major, minor, subminor;
17616 const char *osname;
17618 /* PR 17531: file: 030-599401-0.004. */
17619 if (pnote->descsz < 16)
17621 printf (_(" <corrupt GNU_ABI_TAG>\n"));
17625 os = byte_get ((unsigned char *) pnote->descdata, 4);
17626 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17627 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17628 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17632 case GNU_ABI_TAG_LINUX:
17635 case GNU_ABI_TAG_HURD:
17638 case GNU_ABI_TAG_SOLARIS:
17639 osname = "Solaris";
17641 case GNU_ABI_TAG_FREEBSD:
17642 osname = "FreeBSD";
17644 case GNU_ABI_TAG_NETBSD:
17647 case GNU_ABI_TAG_SYLLABLE:
17648 osname = "Syllable";
17650 case GNU_ABI_TAG_NACL:
17654 osname = "Unknown";
17658 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17659 major, minor, subminor);
17663 case NT_GNU_GOLD_VERSION:
17667 printf (_(" Version: "));
17668 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17669 printf ("%c", pnote->descdata[i]);
17676 unsigned long num_entries, mask;
17678 /* Hardware capabilities information. Word 0 is the number of entries.
17679 Word 1 is a bitmask of enabled entries. The rest of the descriptor
17680 is a series of entries, where each entry is a single byte followed
17681 by a nul terminated string. The byte gives the bit number to test
17682 if enabled in the bitmask. */
17683 printf (_(" Hardware Capabilities: "));
17684 if (pnote->descsz < 8)
17686 error (_("<corrupt GNU_HWCAP>\n"));
17689 num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17690 mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17691 printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17692 /* FIXME: Add code to display the entries... */
17696 case NT_GNU_PROPERTY_TYPE_0:
17697 print_gnu_property_note (filedata, pnote);
17701 /* Handle unrecognised types. An error message should have already been
17702 created by get_gnu_elf_note_type(), so all that we need to do is to
17703 display the data. */
17707 printf (_(" Description data: "));
17708 for (i = 0; i < pnote->descsz; ++i)
17709 printf ("%02x ", pnote->descdata[i] & 0xff);
17718 static const char *
17719 get_v850_elf_note_type (enum v850_notes n_type)
17721 static char buff[64];
17725 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
17726 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
17727 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
17728 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
17729 case V850_NOTE_CACHE_INFO: return _("Use of cache");
17730 case V850_NOTE_MMU_INFO: return _("Use of MMU");
17732 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17738 print_v850_note (Elf_Internal_Note * pnote)
17742 if (pnote->descsz != 4)
17745 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17749 printf (_("not set\n"));
17753 switch (pnote->type)
17755 case V850_NOTE_ALIGNMENT:
17758 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17759 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17763 case V850_NOTE_DATA_SIZE:
17766 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17767 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17771 case V850_NOTE_FPU_INFO:
17774 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17775 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17779 case V850_NOTE_MMU_INFO:
17780 case V850_NOTE_CACHE_INFO:
17781 case V850_NOTE_SIMD_INFO:
17782 if (val == EF_RH850_SIMD)
17784 printf (_("yes\n"));
17790 /* An 'unknown note type' message will already have been displayed. */
17794 printf (_("unknown value: %x\n"), val);
17799 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17801 unsigned int version;
17803 switch (pnote->type)
17805 case NT_NETBSD_IDENT:
17806 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17807 if ((version / 10000) % 100)
17808 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17809 version, version / 100000000, (version / 1000000) % 100,
17810 (version / 10000) % 100 > 26 ? "Z" : "",
17811 'A' + (version / 10000) % 26);
17813 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17814 version, version / 100000000, (version / 1000000) % 100,
17815 (version / 100) % 100);
17818 case NT_NETBSD_MARCH:
17819 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17824 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17830 static const char *
17831 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17835 case NT_FREEBSD_THRMISC:
17836 return _("NT_THRMISC (thrmisc structure)");
17837 case NT_FREEBSD_PROCSTAT_PROC:
17838 return _("NT_PROCSTAT_PROC (proc data)");
17839 case NT_FREEBSD_PROCSTAT_FILES:
17840 return _("NT_PROCSTAT_FILES (files data)");
17841 case NT_FREEBSD_PROCSTAT_VMMAP:
17842 return _("NT_PROCSTAT_VMMAP (vmmap data)");
17843 case NT_FREEBSD_PROCSTAT_GROUPS:
17844 return _("NT_PROCSTAT_GROUPS (groups data)");
17845 case NT_FREEBSD_PROCSTAT_UMASK:
17846 return _("NT_PROCSTAT_UMASK (umask data)");
17847 case NT_FREEBSD_PROCSTAT_RLIMIT:
17848 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17849 case NT_FREEBSD_PROCSTAT_OSREL:
17850 return _("NT_PROCSTAT_OSREL (osreldate data)");
17851 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17852 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17853 case NT_FREEBSD_PROCSTAT_AUXV:
17854 return _("NT_PROCSTAT_AUXV (auxv data)");
17855 case NT_FREEBSD_PTLWPINFO:
17856 return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17858 return get_note_type (filedata, e_type);
17861 static const char *
17862 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17864 static char buff[64];
17866 if (e_type == NT_NETBSDCORE_PROCINFO)
17867 return _("NetBSD procinfo structure");
17869 /* As of Jan 2002 there are no other machine-independent notes
17870 defined for NetBSD core files. If the note type is less
17871 than the start of the machine-dependent note types, we don't
17874 if (e_type < NT_NETBSDCORE_FIRSTMACH)
17876 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17880 switch (filedata->file_header.e_machine)
17882 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17883 and PT_GETFPREGS == mach+2. */
17888 case EM_SPARC32PLUS:
17892 case NT_NETBSDCORE_FIRSTMACH + 0:
17893 return _("PT_GETREGS (reg structure)");
17894 case NT_NETBSDCORE_FIRSTMACH + 2:
17895 return _("PT_GETFPREGS (fpreg structure)");
17901 /* On all other arch's, PT_GETREGS == mach+1 and
17902 PT_GETFPREGS == mach+3. */
17906 case NT_NETBSDCORE_FIRSTMACH + 1:
17907 return _("PT_GETREGS (reg structure)");
17908 case NT_NETBSDCORE_FIRSTMACH + 3:
17909 return _("PT_GETFPREGS (fpreg structure)");
17915 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17916 e_type - NT_NETBSDCORE_FIRSTMACH);
17920 static const char *
17921 get_stapsdt_note_type (unsigned e_type)
17923 static char buff[64];
17928 return _("NT_STAPSDT (SystemTap probe descriptors)");
17934 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17939 print_stapsdt_note (Elf_Internal_Note *pnote)
17941 size_t len, maxlen;
17942 unsigned long addr_size = is_32bit_elf ? 4 : 8;
17943 char *data = pnote->descdata;
17944 char *data_end = pnote->descdata + pnote->descsz;
17945 bfd_vma pc, base_addr, semaphore;
17946 char *provider, *probe, *arg_fmt;
17948 if (pnote->descsz < (addr_size * 3))
17949 goto stapdt_note_too_small;
17951 pc = byte_get ((unsigned char *) data, addr_size);
17954 base_addr = byte_get ((unsigned char *) data, addr_size);
17957 semaphore = byte_get ((unsigned char *) data, addr_size);
17960 if (data >= data_end)
17961 goto stapdt_note_too_small;
17962 maxlen = data_end - data;
17963 len = strnlen (data, maxlen);
17970 goto stapdt_note_too_small;
17972 if (data >= data_end)
17973 goto stapdt_note_too_small;
17974 maxlen = data_end - data;
17975 len = strnlen (data, maxlen);
17982 goto stapdt_note_too_small;
17984 if (data >= data_end)
17985 goto stapdt_note_too_small;
17986 maxlen = data_end - data;
17987 len = strnlen (data, maxlen);
17994 goto stapdt_note_too_small;
17996 printf (_(" Provider: %s\n"), provider);
17997 printf (_(" Name: %s\n"), probe);
17998 printf (_(" Location: "));
17999 print_vma (pc, FULL_HEX);
18000 printf (_(", Base: "));
18001 print_vma (base_addr, FULL_HEX);
18002 printf (_(", Semaphore: "));
18003 print_vma (semaphore, FULL_HEX);
18005 printf (_(" Arguments: %s\n"), arg_fmt);
18007 return data == data_end;
18009 stapdt_note_too_small:
18010 printf (_(" <corrupt - note is too small>\n"));
18011 error (_("corrupt stapdt note - the data size is too small\n"));
18015 static const char *
18016 get_ia64_vms_note_type (unsigned e_type)
18018 static char buff[64];
18023 return _("NT_VMS_MHD (module header)");
18025 return _("NT_VMS_LNM (language name)");
18027 return _("NT_VMS_SRC (source files)");
18029 return "NT_VMS_TITLE";
18031 return _("NT_VMS_EIDC (consistency check)");
18032 case NT_VMS_FPMODE:
18033 return _("NT_VMS_FPMODE (FP mode)");
18034 case NT_VMS_LINKTIME:
18035 return "NT_VMS_LINKTIME";
18036 case NT_VMS_IMGNAM:
18037 return _("NT_VMS_IMGNAM (image name)");
18039 return _("NT_VMS_IMGID (image id)");
18040 case NT_VMS_LINKID:
18041 return _("NT_VMS_LINKID (link id)");
18042 case NT_VMS_IMGBID:
18043 return _("NT_VMS_IMGBID (build id)");
18044 case NT_VMS_GSTNAM:
18045 return _("NT_VMS_GSTNAM (sym table name)");
18046 case NT_VMS_ORIG_DYN:
18047 return "NT_VMS_ORIG_DYN";
18048 case NT_VMS_PATCHTIME:
18049 return "NT_VMS_PATCHTIME";
18051 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18057 print_ia64_vms_note (Elf_Internal_Note * pnote)
18059 int maxlen = pnote->descsz;
18061 if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18062 goto desc_size_fail;
18064 switch (pnote->type)
18068 goto desc_size_fail;
18070 int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18072 printf (_(" Creation date : %.17s\n"), pnote->descdata);
18073 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
18074 if (l + 34 < maxlen)
18076 printf (_(" Module name : %s\n"), pnote->descdata + 34);
18077 if (l + 35 < maxlen)
18078 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
18080 printf (_(" Module version : <missing>\n"));
18084 printf (_(" Module name : <missing>\n"));
18085 printf (_(" Module version : <missing>\n"));
18090 printf (_(" Language: %.*s\n"), maxlen, pnote->descdata);
18094 case NT_VMS_FPMODE:
18095 printf (_(" Floating Point mode: "));
18097 goto desc_size_fail;
18098 /* FIXME: Generate an error if descsz > 8 ? */
18100 printf ("0x%016" BFD_VMA_FMT "x\n",
18101 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18104 case NT_VMS_LINKTIME:
18105 printf (_(" Link time: "));
18107 goto desc_size_fail;
18108 /* FIXME: Generate an error if descsz > 8 ? */
18111 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18115 case NT_VMS_PATCHTIME:
18116 printf (_(" Patch time: "));
18118 goto desc_size_fail;
18119 /* FIXME: Generate an error if descsz > 8 ? */
18122 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18126 case NT_VMS_ORIG_DYN:
18128 goto desc_size_fail;
18130 printf (_(" Major id: %u, minor id: %u\n"),
18131 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18132 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18133 printf (_(" Last modified : "));
18135 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18136 printf (_("\n Link flags : "));
18137 printf ("0x%016" BFD_VMA_FMT "x\n",
18138 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18139 printf (_(" Header flags: 0x%08x\n"),
18140 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18141 printf (_(" Image id : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18145 case NT_VMS_IMGNAM:
18146 printf (_(" Image name: %.*s\n"), maxlen, pnote->descdata);
18149 case NT_VMS_GSTNAM:
18150 printf (_(" Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18154 printf (_(" Image id: %.*s\n"), maxlen, pnote->descdata);
18157 case NT_VMS_LINKID:
18158 printf (_(" Linker id: %.*s\n"), maxlen, pnote->descdata);
18168 printf (_(" <corrupt - data size is too small>\n"));
18169 error (_("corrupt IA64 note: data size is too small\n"));
18173 /* Find the symbol associated with a build attribute that is attached
18174 to address OFFSET. If PNAME is non-NULL then store the name of
18175 the symbol (if found) in the provided pointer, Returns NULL if a
18176 symbol could not be found. */
18178 static Elf_Internal_Sym *
18179 get_symbol_for_build_attribute (Filedata * filedata,
18180 unsigned long offset,
18181 bfd_boolean is_open_attr,
18182 const char ** pname)
18184 static Filedata * saved_filedata = NULL;
18185 static char * strtab;
18186 static unsigned long strtablen;
18187 static Elf_Internal_Sym * symtab;
18188 static unsigned long nsyms;
18189 Elf_Internal_Sym * saved_sym = NULL;
18190 Elf_Internal_Sym * sym;
18192 if (filedata->section_headers != NULL
18193 && (saved_filedata == NULL || filedata != saved_filedata))
18195 Elf_Internal_Shdr * symsec;
18197 /* Load the symbol and string sections. */
18198 for (symsec = filedata->section_headers;
18199 symsec < filedata->section_headers + filedata->file_header.e_shnum;
18202 if (symsec->sh_type == SHT_SYMTAB)
18204 symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18206 if (symsec->sh_link < filedata->file_header.e_shnum)
18208 Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18210 strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18211 1, strtab_sec->sh_size,
18212 _("string table"));
18213 strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18217 saved_filedata = filedata;
18220 if (symtab == NULL || strtab == NULL)
18223 /* Find a symbol whose value matches offset. */
18224 for (sym = symtab; sym < symtab + nsyms; sym ++)
18225 if (sym->st_value == offset)
18227 if (sym->st_name >= strtablen)
18228 /* Huh ? This should not happen. */
18231 if (strtab[sym->st_name] == 0)
18234 /* The AArch64 and ARM architectures define mapping symbols
18235 (eg $d, $x, $t) which we want to ignore. */
18236 if (strtab[sym->st_name] == '$'
18237 && strtab[sym->st_name + 1] != 0
18238 && strtab[sym->st_name + 2] == 0)
18243 /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18244 and FILE or OBJECT symbols over NOTYPE symbols. We skip
18245 FUNC symbols entirely. */
18246 switch (ELF_ST_TYPE (sym->st_info))
18253 /* If the symbol has a size associated
18254 with it then we can stop searching. */
18255 sym = symtab + nsyms;
18260 /* Ignore function symbols. */
18267 switch (ELF_ST_BIND (sym->st_info))
18270 if (saved_sym == NULL
18271 || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18276 if (saved_sym == NULL)
18286 if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18294 if (saved_sym && pname)
18295 * pname = strtab + saved_sym->st_name;
18300 /* Returns true iff addr1 and addr2 are in the same section. */
18303 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18305 Elf_Internal_Shdr * a1;
18306 Elf_Internal_Shdr * a2;
18308 a1 = find_section_by_address (filedata, addr1);
18309 a2 = find_section_by_address (filedata, addr2);
18311 return a1 == a2 && a1 != NULL;
18315 print_gnu_build_attribute_description (Elf_Internal_Note * pnote,
18316 Filedata * filedata)
18318 static unsigned long global_offset = 0;
18319 static unsigned long global_end = 0;
18320 static unsigned long func_offset = 0;
18321 static unsigned long func_end = 0;
18323 Elf_Internal_Sym * sym;
18325 unsigned long start;
18327 bfd_boolean is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18329 switch (pnote->descsz)
18332 /* A zero-length description means that the range of
18333 the previous note of the same type should be used. */
18336 if (global_end > global_offset)
18337 printf (_(" Applies to region from %#lx to %#lx\n"),
18338 global_offset, global_end);
18340 printf (_(" Applies to region from %#lx\n"), global_offset);
18344 if (func_end > func_offset)
18345 printf (_(" Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18347 printf (_(" Applies to region from %#lx\n"), func_offset);
18352 start = byte_get ((unsigned char *) pnote->descdata, 4);
18359 /* FIXME: We should check that version 3+ notes are being used here... */
18360 start = byte_get ((unsigned char *) pnote->descdata, 4);
18361 end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18365 start = byte_get ((unsigned char *) pnote->descdata, 8);
18371 start = byte_get ((unsigned char *) pnote->descdata, 8);
18372 end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18376 error (_(" <invalid description size: %lx>\n"), pnote->descsz);
18377 printf (_(" <invalid descsz>"));
18382 sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18383 /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18384 in order to avoid them being confused with the start address of the
18385 first function in the file... */
18386 if (sym == NULL && is_open_attr)
18387 sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18390 if (end == 0 && sym != NULL && sym->st_size > 0)
18391 end = start + sym->st_size;
18395 /* FIXME: Need to properly allow for section alignment.
18396 16 is just the alignment used on x86_64. */
18398 && start > BFD_ALIGN (global_end, 16)
18399 /* Build notes are not guaranteed to be organised in order of
18400 increasing address, but we should find the all of the notes
18401 for one section in the same place. */
18402 && same_section (filedata, start, global_end))
18403 warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18404 global_end + 1, start - 1);
18406 printf (_(" Applies to region from %#lx"), start);
18407 global_offset = start;
18411 printf (_(" to %#lx"), end);
18417 printf (_(" Applies to region from %#lx"), start);
18418 func_offset = start;
18422 printf (_(" to %#lx"), end);
18428 printf (_(" (%s)"), name);
18435 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18437 static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18438 static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18439 static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18441 char name_attribute;
18442 const char * expected_types;
18443 const char * name = pnote->namedata;
18447 if (name == NULL || pnote->namesz < 2)
18449 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18450 print_symbol (-20, _(" <corrupt name>"));
18459 /* Version 2 of the spec adds a "GA" prefix to the name field. */
18460 if (name[0] == 'G' && name[1] == 'A')
18462 if (pnote->namesz < 4)
18464 error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18465 print_symbol (-20, _(" <corrupt name>"));
18474 switch ((name_type = * name))
18476 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18477 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18478 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18479 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18480 printf ("%c", * name);
18484 error (_("unrecognised attribute type in name field: %d\n"), name_type);
18485 print_symbol (-20, _("<unknown name type>"));
18492 switch ((name_attribute = * name))
18494 case GNU_BUILD_ATTRIBUTE_VERSION:
18495 text = _("<version>");
18496 expected_types = string_expected;
18499 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18500 text = _("<stack prot>");
18501 expected_types = "!+*";
18504 case GNU_BUILD_ATTRIBUTE_RELRO:
18505 text = _("<relro>");
18506 expected_types = bool_expected;
18509 case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18510 text = _("<stack size>");
18511 expected_types = number_expected;
18514 case GNU_BUILD_ATTRIBUTE_TOOL:
18515 text = _("<tool>");
18516 expected_types = string_expected;
18519 case GNU_BUILD_ATTRIBUTE_ABI:
18521 expected_types = "$*";
18524 case GNU_BUILD_ATTRIBUTE_PIC:
18526 expected_types = number_expected;
18529 case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18530 text = _("<short enum>");
18531 expected_types = bool_expected;
18535 if (ISPRINT (* name))
18537 int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18539 if (len > left && ! do_wide)
18541 printf ("%.*s:", len, name);
18547 static char tmpbuf [128];
18549 error (_("unrecognised byte in name field: %d\n"), * name);
18550 sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18554 expected_types = "*$!+";
18559 left -= printf ("%s", text);
18561 if (strchr (expected_types, name_type) == NULL)
18562 warn (_("attribute does not have an expected type (%c)\n"), name_type);
18564 if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18566 error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18567 (unsigned long) pnote->namesz,
18568 (long) (name - pnote->namedata));
18572 if (left < 1 && ! do_wide)
18577 case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18579 unsigned int bytes;
18580 unsigned long long val = 0;
18581 unsigned int shift = 0;
18582 char * decoded = NULL;
18584 bytes = pnote->namesz - (name - pnote->namedata);
18586 /* The -1 is because the name field is always 0 terminated, and we
18587 want to be able to ensure that the shift in the while loop below
18588 will not overflow. */
18591 if (bytes > sizeof (val))
18593 error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18595 bytes = sizeof (val);
18597 /* We do not bother to warn if bytes == 0 as this can
18598 happen with some early versions of the gcc plugin. */
18602 unsigned long byte = (* name ++) & 0xff;
18604 val |= byte << shift;
18608 switch (name_attribute)
18610 case GNU_BUILD_ATTRIBUTE_PIC:
18613 case 0: decoded = "static"; break;
18614 case 1: decoded = "pic"; break;
18615 case 2: decoded = "PIC"; break;
18616 case 3: decoded = "pie"; break;
18617 case 4: decoded = "PIE"; break;
18621 case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18624 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c. */
18625 case 0: decoded = "off"; break;
18626 case 1: decoded = "on"; break;
18627 case 2: decoded = "all"; break;
18628 case 3: decoded = "strong"; break;
18629 case 4: decoded = "explicit"; break;
18637 if (decoded != NULL)
18639 print_symbol (-left, decoded);
18650 left -= printf ("0x%llx", val);
18652 left -= printf ("0x%-.*llx", left, val);
18656 case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18657 left -= print_symbol (- left, name);
18659 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18660 left -= print_symbol (- left, "true");
18662 case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18663 left -= print_symbol (- left, "false");
18667 if (do_wide && left > 0)
18668 printf ("%-*s", left, " ");
18673 /* Note that by the ELF standard, the name field is already null byte
18674 terminated, and namesz includes the terminating null byte.
18675 I.E. the value of namesz for the name "FSF" is 4.
18677 If the value of namesz is zero, there is no name present. */
18680 process_note (Elf_Internal_Note * pnote,
18681 Filedata * filedata)
18683 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18686 if (pnote->namesz == 0)
18687 /* If there is no note name, then use the default set of
18688 note type strings. */
18689 nt = get_note_type (filedata, pnote->type);
18691 else if (const_strneq (pnote->namedata, "GNU"))
18692 /* GNU-specific object file notes. */
18693 nt = get_gnu_elf_note_type (pnote->type);
18695 else if (const_strneq (pnote->namedata, "FreeBSD"))
18696 /* FreeBSD-specific core file notes. */
18697 nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18699 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18700 /* NetBSD-specific core file notes. */
18701 nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18703 else if (const_strneq (pnote->namedata, "NetBSD"))
18704 /* NetBSD-specific core file notes. */
18705 return process_netbsd_elf_note (pnote);
18707 else if (strneq (pnote->namedata, "SPU/", 4))
18709 /* SPU-specific core file notes. */
18710 nt = pnote->namedata + 4;
18714 else if (const_strneq (pnote->namedata, "IPF/VMS"))
18715 /* VMS/ia64-specific file notes. */
18716 nt = get_ia64_vms_note_type (pnote->type);
18718 else if (const_strneq (pnote->namedata, "stapsdt"))
18719 nt = get_stapsdt_note_type (pnote->type);
18722 /* Don't recognize this note name; just use the default set of
18723 note type strings. */
18724 nt = get_note_type (filedata, pnote->type);
18728 if (((const_strneq (pnote->namedata, "GA")
18729 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18730 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18731 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18732 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18733 print_gnu_build_attribute_name (pnote);
18735 print_symbol (-20, name);
18738 printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18740 printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18742 if (const_strneq (pnote->namedata, "IPF/VMS"))
18743 return print_ia64_vms_note (pnote);
18744 else if (const_strneq (pnote->namedata, "GNU"))
18745 return print_gnu_note (filedata, pnote);
18746 else if (const_strneq (pnote->namedata, "stapsdt"))
18747 return print_stapsdt_note (pnote);
18748 else if (const_strneq (pnote->namedata, "CORE"))
18749 return print_core_note (pnote);
18750 else if (((const_strneq (pnote->namedata, "GA")
18751 && strchr ("*$!+", pnote->namedata[2]) != NULL)
18752 || strchr ("*$!+", pnote->namedata[0]) != NULL)
18753 && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18754 || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18755 return print_gnu_build_attribute_description (pnote, filedata);
18761 printf (_(" description data: "));
18762 for (i = 0; i < pnote->descsz; i++)
18763 printf ("%02x ", pnote->descdata[i]);
18775 process_notes_at (Filedata * filedata,
18776 Elf_Internal_Shdr * section,
18781 Elf_External_Note * pnotes;
18782 Elf_External_Note * external;
18784 bfd_boolean res = TRUE;
18791 pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18794 if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18799 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18802 if (pnotes == NULL)
18808 printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18810 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18811 (unsigned long) offset, (unsigned long) length);
18813 /* NB: Some note sections may have alignment value of 0 or 1. gABI
18814 specifies that notes should be aligned to 4 bytes in 32-bit
18815 objects and to 8 bytes in 64-bit objects. As a Linux extension,
18816 we also support 4 byte alignment in 64-bit objects. If section
18817 alignment is less than 4, we treate alignment as 4 bytes. */
18820 else if (align != 4 && align != 8)
18822 warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18827 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18829 end = (char *) pnotes + length;
18830 while ((char *) external < end)
18832 Elf_Internal_Note inote;
18835 char * temp = NULL;
18836 size_t data_remaining = end - (char *) external;
18838 if (!is_ia64_vms (filedata))
18840 /* PR binutils/15191
18841 Make sure that there is enough data to read. */
18842 min_notesz = offsetof (Elf_External_Note, name);
18843 if (data_remaining < min_notesz)
18845 warn (ngettext ("Corrupt note: only %ld byte remains, "
18846 "not enough for a full note\n",
18847 "Corrupt note: only %ld bytes remain, "
18848 "not enough for a full note\n",
18850 (long) data_remaining);
18853 data_remaining -= min_notesz;
18855 inote.type = BYTE_GET (external->type);
18856 inote.namesz = BYTE_GET (external->namesz);
18857 inote.namedata = external->name;
18858 inote.descsz = BYTE_GET (external->descsz);
18859 inote.descdata = ((char *) external
18860 + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18861 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18862 next = ((char *) external
18863 + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18867 Elf64_External_VMS_Note *vms_external;
18869 /* PR binutils/15191
18870 Make sure that there is enough data to read. */
18871 min_notesz = offsetof (Elf64_External_VMS_Note, name);
18872 if (data_remaining < min_notesz)
18874 warn (ngettext ("Corrupt note: only %ld byte remains, "
18875 "not enough for a full note\n",
18876 "Corrupt note: only %ld bytes remain, "
18877 "not enough for a full note\n",
18879 (long) data_remaining);
18882 data_remaining -= min_notesz;
18884 vms_external = (Elf64_External_VMS_Note *) external;
18885 inote.type = BYTE_GET (vms_external->type);
18886 inote.namesz = BYTE_GET (vms_external->namesz);
18887 inote.namedata = vms_external->name;
18888 inote.descsz = BYTE_GET (vms_external->descsz);
18889 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18890 inote.descpos = offset + (inote.descdata - (char *) pnotes);
18891 next = inote.descdata + align_power (inote.descsz, 3);
18894 /* PR 17531: file: 3443835e. */
18895 /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
18896 if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18897 || (size_t) (inote.descdata - inote.namedata) > data_remaining
18898 || (size_t) (next - inote.descdata) < inote.descsz
18899 || ((size_t) (next - inote.descdata)
18900 > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18902 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18903 (unsigned long) ((char *) external - (char *) pnotes));
18904 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18905 inote.type, inote.namesz, inote.descsz, (int) align);
18909 external = (Elf_External_Note *) next;
18911 /* Verify that name is null terminated. It appears that at least
18912 one version of Linux (RedHat 6.0) generates corefiles that don't
18913 comply with the ELF spec by failing to include the null byte in
18915 if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
18917 if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18919 temp = (char *) malloc (inote.namesz + 1);
18922 error (_("Out of memory allocating space for inote name\n"));
18927 memcpy (temp, inote.namedata, inote.namesz);
18928 inote.namedata = temp;
18930 inote.namedata[inote.namesz] = 0;
18933 if (! process_note (& inote, filedata))
18949 process_corefile_note_segments (Filedata * filedata)
18951 Elf_Internal_Phdr * segment;
18953 bfd_boolean res = TRUE;
18955 if (! get_program_headers (filedata))
18958 for (i = 0, segment = filedata->program_headers;
18959 i < filedata->file_header.e_phnum;
18962 if (segment->p_type == PT_NOTE)
18963 if (! process_notes_at (filedata, NULL,
18964 (bfd_vma) segment->p_offset,
18965 (bfd_vma) segment->p_filesz,
18966 (bfd_vma) segment->p_align))
18974 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18976 Elf_External_Note * pnotes;
18977 Elf_External_Note * external;
18979 bfd_boolean res = TRUE;
18984 pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18986 if (pnotes == NULL)
18990 end = (char*) pnotes + length;
18992 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18993 (unsigned long) offset, (unsigned long) length);
18995 while ((char *) external + sizeof (Elf_External_Note) < end)
18997 Elf_External_Note * next;
18998 Elf_Internal_Note inote;
19000 inote.type = BYTE_GET (external->type);
19001 inote.namesz = BYTE_GET (external->namesz);
19002 inote.namedata = external->name;
19003 inote.descsz = BYTE_GET (external->descsz);
19004 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19005 inote.descpos = offset + (inote.descdata - (char *) pnotes);
19007 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19009 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19010 inote.descdata = inote.namedata;
19014 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19016 if ( ((char *) next > end)
19017 || ((char *) next < (char *) pnotes))
19019 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19020 (unsigned long) ((char *) external - (char *) pnotes));
19021 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19022 inote.type, inote.namesz, inote.descsz);
19028 /* Prevent out-of-bounds indexing. */
19029 if ( inote.namedata + inote.namesz > end
19030 || inote.namedata + inote.namesz < inote.namedata)
19032 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19033 (unsigned long) ((char *) external - (char *) pnotes));
19034 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19035 inote.type, inote.namesz, inote.descsz);
19039 printf (" %s: ", get_v850_elf_note_type (inote.type));
19041 if (! print_v850_note (& inote))
19044 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19045 inote.namesz, inote.descsz);
19055 process_note_sections (Filedata * filedata)
19057 Elf_Internal_Shdr * section;
19059 unsigned int n = 0;
19060 bfd_boolean res = TRUE;
19062 for (i = 0, section = filedata->section_headers;
19063 i < filedata->file_header.e_shnum && section != NULL;
19066 if (section->sh_type == SHT_NOTE)
19068 if (! process_notes_at (filedata, section,
19069 (bfd_vma) section->sh_offset,
19070 (bfd_vma) section->sh_size,
19071 (bfd_vma) section->sh_addralign))
19076 if (( filedata->file_header.e_machine == EM_V800
19077 || filedata->file_header.e_machine == EM_V850
19078 || filedata->file_header.e_machine == EM_CYGNUS_V850)
19079 && section->sh_type == SHT_RENESAS_INFO)
19081 if (! process_v850_notes (filedata,
19082 (bfd_vma) section->sh_offset,
19083 (bfd_vma) section->sh_size))
19090 /* Try processing NOTE segments instead. */
19091 return process_corefile_note_segments (filedata);
19097 process_notes (Filedata * filedata)
19099 /* If we have not been asked to display the notes then do nothing. */
19103 if (filedata->file_header.e_type != ET_CORE)
19104 return process_note_sections (filedata);
19106 /* No program headers means no NOTE segment. */
19107 if (filedata->file_header.e_phnum > 0)
19108 return process_corefile_note_segments (filedata);
19110 printf (_("No note segments present in the core file.\n"));
19114 static unsigned char *
19115 display_public_gnu_attributes (unsigned char * start,
19116 const unsigned char * const end)
19118 printf (_(" Unknown GNU attribute: %s\n"), start);
19120 start += strnlen ((char *) start, end - start);
19121 display_raw_attribute (start, end);
19123 return (unsigned char *) end;
19126 static unsigned char *
19127 display_generic_attribute (unsigned char * start,
19129 const unsigned char * const end)
19132 return (unsigned char *) end;
19134 return display_tag_value (tag, start, end);
19138 process_arch_specific (Filedata * filedata)
19143 switch (filedata->file_header.e_machine)
19146 case EM_ARC_COMPACT:
19147 case EM_ARC_COMPACT2:
19148 return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19149 display_arc_attribute,
19150 display_generic_attribute);
19152 return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19153 display_arm_attribute,
19154 display_generic_attribute);
19157 case EM_MIPS_RS3_LE:
19158 return process_mips_specific (filedata);
19161 return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19162 display_msp430x_attribute,
19163 display_generic_attribute);
19166 return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19167 display_riscv_attribute,
19168 display_generic_attribute);
19171 return process_nds32_specific (filedata);
19175 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19176 display_power_gnu_attribute);
19180 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19181 display_s390_gnu_attribute);
19184 case EM_SPARC32PLUS:
19186 return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19187 display_sparc_gnu_attribute);
19190 return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19191 display_tic6x_attribute,
19192 display_generic_attribute);
19195 return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19196 display_public_gnu_attributes,
19197 display_generic_attribute);
19202 get_file_header (Filedata * filedata)
19204 /* Read in the identity array. */
19205 if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19208 /* Determine how to read the rest of the header. */
19209 switch (filedata->file_header.e_ident[EI_DATA])
19214 byte_get = byte_get_little_endian;
19215 byte_put = byte_put_little_endian;
19218 byte_get = byte_get_big_endian;
19219 byte_put = byte_put_big_endian;
19223 /* For now we only support 32 bit and 64 bit ELF files. */
19224 is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19226 /* Read in the rest of the header. */
19229 Elf32_External_Ehdr ehdr32;
19231 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19234 filedata->file_header.e_type = BYTE_GET (ehdr32.e_type);
19235 filedata->file_header.e_machine = BYTE_GET (ehdr32.e_machine);
19236 filedata->file_header.e_version = BYTE_GET (ehdr32.e_version);
19237 filedata->file_header.e_entry = BYTE_GET (ehdr32.e_entry);
19238 filedata->file_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
19239 filedata->file_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
19240 filedata->file_header.e_flags = BYTE_GET (ehdr32.e_flags);
19241 filedata->file_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
19242 filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19243 filedata->file_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
19244 filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19245 filedata->file_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
19246 filedata->file_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
19250 Elf64_External_Ehdr ehdr64;
19252 /* If we have been compiled with sizeof (bfd_vma) == 4, then
19253 we will not be able to cope with the 64bit data found in
19254 64 ELF files. Detect this now and abort before we start
19255 overwriting things. */
19256 if (sizeof (bfd_vma) < 8)
19258 error (_("This instance of readelf has been built without support for a\n\
19259 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19263 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19266 filedata->file_header.e_type = BYTE_GET (ehdr64.e_type);
19267 filedata->file_header.e_machine = BYTE_GET (ehdr64.e_machine);
19268 filedata->file_header.e_version = BYTE_GET (ehdr64.e_version);
19269 filedata->file_header.e_entry = BYTE_GET (ehdr64.e_entry);
19270 filedata->file_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
19271 filedata->file_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
19272 filedata->file_header.e_flags = BYTE_GET (ehdr64.e_flags);
19273 filedata->file_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
19274 filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19275 filedata->file_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
19276 filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19277 filedata->file_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
19278 filedata->file_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
19281 if (filedata->file_header.e_shoff)
19283 /* There may be some extensions in the first section header. Don't
19284 bomb if we can't read it. */
19286 get_32bit_section_headers (filedata, TRUE);
19288 get_64bit_section_headers (filedata, TRUE);
19295 close_file (Filedata * filedata)
19299 if (filedata->handle)
19300 fclose (filedata->handle);
19306 close_debug_file (void * data)
19308 close_file ((Filedata *) data);
19312 open_file (const char * pathname)
19314 struct stat statbuf;
19315 Filedata * filedata = NULL;
19317 if (stat (pathname, & statbuf) < 0
19318 || ! S_ISREG (statbuf.st_mode))
19321 filedata = calloc (1, sizeof * filedata);
19322 if (filedata == NULL)
19325 filedata->handle = fopen (pathname, "rb");
19326 if (filedata->handle == NULL)
19329 filedata->file_size = (bfd_size_type) statbuf.st_size;
19330 filedata->file_name = pathname;
19332 if (! get_file_header (filedata))
19335 if (filedata->file_header.e_shoff)
19339 /* Read the section headers again, this time for real. */
19341 res = get_32bit_section_headers (filedata, FALSE);
19343 res = get_64bit_section_headers (filedata, FALSE);
19354 if (filedata->handle)
19355 fclose (filedata->handle);
19362 open_debug_file (const char * pathname)
19364 return open_file (pathname);
19367 /* Process one ELF object file according to the command line options.
19368 This file may actually be stored in an archive. The file is
19369 positioned at the start of the ELF object. Returns TRUE if no
19370 problems were encountered, FALSE otherwise. */
19373 process_object (Filedata * filedata)
19375 bfd_boolean have_separate_files;
19377 bfd_boolean res = TRUE;
19379 if (! get_file_header (filedata))
19381 error (_("%s: Failed to read file header\n"), filedata->file_name);
19385 /* Initialise per file variables. */
19386 for (i = ARRAY_SIZE (version_info); i--;)
19387 version_info[i] = 0;
19389 for (i = ARRAY_SIZE (dynamic_info); i--;)
19390 dynamic_info[i] = 0;
19391 dynamic_info_DT_GNU_HASH = 0;
19393 /* Process the file. */
19395 printf (_("\nFile: %s\n"), filedata->file_name);
19397 /* Initialise the dump_sects array from the cmdline_dump_sects array.
19398 Note we do this even if cmdline_dump_sects is empty because we
19399 must make sure that the dump_sets array is zeroed out before each
19400 object file is processed. */
19401 if (filedata->num_dump_sects > cmdline.num_dump_sects)
19402 memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19404 if (cmdline.num_dump_sects > 0)
19406 if (filedata->num_dump_sects == 0)
19407 /* A sneaky way of allocating the dump_sects array. */
19408 request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19410 assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19411 memcpy (filedata->dump_sects, cmdline.dump_sects,
19412 cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19415 if (! process_file_header (filedata))
19418 if (! process_section_headers (filedata))
19420 /* Without loaded section headers we cannot process lots of things. */
19421 do_unwind = do_version = do_dump = do_arch = FALSE;
19423 if (! do_using_dynamic)
19424 do_syms = do_dyn_syms = do_reloc = FALSE;
19427 if (! process_section_groups (filedata))
19428 /* Without loaded section groups we cannot process unwind. */
19431 if (process_program_headers (filedata))
19432 process_dynamic_section (filedata);
19436 if (! process_relocs (filedata))
19439 if (! process_unwind (filedata))
19442 if (! process_symbol_table (filedata))
19445 if (! process_syminfo (filedata))
19448 if (! process_version_sections (filedata))
19451 if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19452 have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19454 have_separate_files = FALSE;
19456 if (! process_section_contents (filedata))
19459 if (have_separate_files)
19463 for (d = first_separate_info; d != NULL; d = d->next)
19465 if (! process_section_headers (d->handle))
19467 else if (! process_section_contents (d->handle))
19471 /* The file handles are closed by the call to free_debug_memory() below. */
19474 if (! process_notes (filedata))
19477 if (! process_gnu_liblist (filedata))
19480 if (! process_arch_specific (filedata))
19483 free (filedata->program_headers);
19484 filedata->program_headers = NULL;
19486 free (filedata->section_headers);
19487 filedata->section_headers = NULL;
19489 free (filedata->string_table);
19490 filedata->string_table = NULL;
19491 filedata->string_table_length = 0;
19493 if (dynamic_strings)
19495 free (dynamic_strings);
19496 dynamic_strings = NULL;
19497 dynamic_strings_length = 0;
19500 if (dynamic_symbols)
19502 free (dynamic_symbols);
19503 dynamic_symbols = NULL;
19504 num_dynamic_syms = 0;
19507 if (dynamic_syminfo)
19509 free (dynamic_syminfo);
19510 dynamic_syminfo = NULL;
19513 if (dynamic_section)
19515 free (dynamic_section);
19516 dynamic_section = NULL;
19519 if (section_headers_groups)
19521 free (section_headers_groups);
19522 section_headers_groups = NULL;
19525 if (section_groups)
19527 struct group_list * g;
19528 struct group_list * next;
19530 for (i = 0; i < group_count; i++)
19532 for (g = section_groups [i].root; g != NULL; g = next)
19539 free (section_groups);
19540 section_groups = NULL;
19543 free_debug_memory ();
19548 /* Process an ELF archive.
19549 On entry the file is positioned just after the ARMAG string.
19550 Returns TRUE upon success, FALSE otherwise. */
19553 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19555 struct archive_info arch;
19556 struct archive_info nested_arch;
19558 bfd_boolean ret = TRUE;
19562 /* The ARCH structure is used to hold information about this archive. */
19563 arch.file_name = NULL;
19565 arch.index_array = NULL;
19566 arch.sym_table = NULL;
19567 arch.longnames = NULL;
19569 /* The NESTED_ARCH structure is used as a single-item cache of information
19570 about a nested archive (when members of a thin archive reside within
19571 another regular archive file). */
19572 nested_arch.file_name = NULL;
19573 nested_arch.file = NULL;
19574 nested_arch.index_array = NULL;
19575 nested_arch.sym_table = NULL;
19576 nested_arch.longnames = NULL;
19578 if (setup_archive (&arch, filedata->file_name, filedata->handle,
19579 is_thin_archive, do_archive_index) != 0)
19585 if (do_archive_index)
19587 if (arch.sym_table == NULL)
19588 error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19591 unsigned long i, l;
19592 unsigned long current_pos;
19594 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19595 filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19597 current_pos = ftell (filedata->handle);
19599 for (i = l = 0; i < arch.index_num; i++)
19601 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19603 char * member_name;
19605 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19607 if (member_name != NULL)
19609 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19611 if (qualified_name != NULL)
19613 printf (_("Contents of binary %s at offset "), qualified_name);
19614 (void) print_vma (arch.index_array[i], PREFIX_HEX);
19616 free (qualified_name);
19621 if (l >= arch.sym_size)
19623 error (_("%s: end of the symbol table reached before the end of the index\n"),
19624 filedata->file_name);
19628 /* PR 17531: file: 0b6630b2. */
19629 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19630 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19633 if (arch.uses_64bit_indices)
19638 if (l < arch.sym_size)
19640 error (ngettext ("%s: %ld byte remains in the symbol table, "
19641 "but without corresponding entries in "
19642 "the index table\n",
19643 "%s: %ld bytes remain in the symbol table, "
19644 "but without corresponding entries in "
19645 "the index table\n",
19646 arch.sym_size - l),
19647 filedata->file_name, arch.sym_size - l);
19651 if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19653 error (_("%s: failed to seek back to start of object files in the archive\n"),
19654 filedata->file_name);
19660 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19661 && !do_segments && !do_header && !do_dump && !do_version
19662 && !do_histogram && !do_debugging && !do_arch && !do_notes
19663 && !do_section_groups && !do_dyn_syms)
19665 ret = TRUE; /* Archive index only. */
19674 char * qualified_name;
19676 /* Read the next archive header. */
19677 if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19679 error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19682 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19683 if (got != sizeof arch.arhdr)
19687 /* PR 24049 - we cannot use filedata->file_name as this will
19688 have already been freed. */
19689 error (_("%s: failed to read archive header\n"), arch.file_name);
19694 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19696 error (_("%s: did not find a valid archive header\n"), arch.file_name);
19701 arch.next_arhdr_offset += sizeof arch.arhdr;
19703 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19704 if (archive_file_size & 01)
19705 ++archive_file_size;
19707 name = get_archive_member_name (&arch, &nested_arch);
19710 error (_("%s: bad archive file name\n"), arch.file_name);
19714 namelen = strlen (name);
19716 qualified_name = make_qualified_name (&arch, &nested_arch, name);
19717 if (qualified_name == NULL)
19719 error (_("%s: bad archive file name\n"), arch.file_name);
19724 if (is_thin_archive && arch.nested_member_origin == 0)
19726 /* This is a proxy for an external member of a thin archive. */
19727 Filedata * member_filedata;
19728 char * member_file_name = adjust_relative_path
19729 (filedata->file_name, name, namelen);
19731 if (member_file_name == NULL)
19737 member_filedata = open_file (member_file_name);
19738 if (member_filedata == NULL)
19740 error (_("Input file '%s' is not readable.\n"), member_file_name);
19741 free (member_file_name);
19746 archive_file_offset = arch.nested_member_origin;
19747 member_filedata->file_name = qualified_name;
19749 if (! process_object (member_filedata))
19752 close_file (member_filedata);
19753 free (member_file_name);
19755 else if (is_thin_archive)
19757 Filedata thin_filedata;
19759 memset (&thin_filedata, 0, sizeof (thin_filedata));
19761 /* PR 15140: Allow for corrupt thin archives. */
19762 if (nested_arch.file == NULL)
19764 error (_("%s: contains corrupt thin archive: %s\n"),
19765 qualified_name, name);
19770 /* This is a proxy for a member of a nested archive. */
19771 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19773 /* The nested archive file will have been opened and setup by
19774 get_archive_member_name. */
19775 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19777 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19782 thin_filedata.handle = nested_arch.file;
19783 thin_filedata.file_name = qualified_name;
19785 if (! process_object (& thin_filedata))
19790 archive_file_offset = arch.next_arhdr_offset;
19791 arch.next_arhdr_offset += archive_file_size;
19793 filedata->file_name = qualified_name;
19794 if (! process_object (filedata))
19798 if (filedata->dump_sects != NULL)
19800 free (filedata->dump_sects);
19801 filedata->dump_sects = NULL;
19802 filedata->num_dump_sects = 0;
19805 free (qualified_name);
19809 if (nested_arch.file != NULL)
19810 fclose (nested_arch.file);
19811 release_archive (&nested_arch);
19812 release_archive (&arch);
19818 process_file (char * file_name)
19820 Filedata * filedata = NULL;
19821 struct stat statbuf;
19822 char armag[SARMAG];
19823 bfd_boolean ret = TRUE;
19825 if (stat (file_name, &statbuf) < 0)
19827 if (errno == ENOENT)
19828 error (_("'%s': No such file\n"), file_name);
19830 error (_("Could not locate '%s'. System error message: %s\n"),
19831 file_name, strerror (errno));
19835 if (! S_ISREG (statbuf.st_mode))
19837 error (_("'%s' is not an ordinary file\n"), file_name);
19841 filedata = calloc (1, sizeof * filedata);
19842 if (filedata == NULL)
19844 error (_("Out of memory allocating file data structure\n"));
19848 filedata->file_name = file_name;
19849 filedata->handle = fopen (file_name, "rb");
19850 if (filedata->handle == NULL)
19852 error (_("Input file '%s' is not readable.\n"), file_name);
19857 if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19859 error (_("%s: Failed to read file's magic number\n"), file_name);
19860 fclose (filedata->handle);
19865 filedata->file_size = (bfd_size_type) statbuf.st_size;
19867 if (memcmp (armag, ARMAG, SARMAG) == 0)
19869 if (! process_archive (filedata, FALSE))
19872 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19874 if ( ! process_archive (filedata, TRUE))
19879 if (do_archive_index)
19880 error (_("File %s is not an archive so its index cannot be displayed.\n"),
19883 rewind (filedata->handle);
19884 archive_file_size = archive_file_offset = 0;
19886 if (! process_object (filedata))
19890 fclose (filedata->handle);
19896 #ifdef SUPPORT_DISASSEMBLY
19897 /* Needed by the i386 disassembler. For extra credit, someone could
19898 fix this so that we insert symbolic addresses here, esp for GOT/PLT
19902 print_address (unsigned int addr, FILE * outfile)
19904 fprintf (outfile,"0x%8.8x", addr);
19907 /* Needed by the i386 disassembler. */
19910 db_task_printsym (unsigned int addr)
19912 print_address (addr, stderr);
19917 main (int argc, char ** argv)
19921 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19922 setlocale (LC_MESSAGES, "");
19924 #if defined (HAVE_SETLOCALE)
19925 setlocale (LC_CTYPE, "");
19927 bindtextdomain (PACKAGE, LOCALEDIR);
19928 textdomain (PACKAGE);
19930 expandargv (&argc, &argv);
19932 cmdline.file_name = "<cmdline>";
19933 parse_args (& cmdline, argc, argv);
19935 if (optind < (argc - 1))
19937 else if (optind >= argc)
19939 warn (_("Nothing to do.\n"));
19944 while (optind < argc)
19945 if (! process_file (argv[optind++]))
19948 if (cmdline.dump_sects != NULL)
19949 free (cmdline.dump_sects);
19951 return err ? EXIT_FAILURE : EXIT_SUCCESS;