1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2016 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capable of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53 as this will allow us to read in and parse 64bit and 32bit ELF files.
54 Only do this if we believe that the compiler can support a 64 bit
55 data type. For now we only rely on GCC being able to do this. */
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70 we can obtain the H8 reloc numbers. We need these for the
71 get_reloc_size() function. We include h8.h again after defining
72 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
77 /* Undo the effects of #including reloc-macros.h. */
79 #undef START_RELOC_NUMBERS
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
86 /* The following headers use the elf/reloc-macros.h file to
87 automatically generate relocation recognition functions
88 such as elf_mips_reloc_type() */
90 #define RELOC_MACROS_GEN_FUNC
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
107 #include "elf/ft32.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
144 #include "elf/sparc.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
167 typedef struct elf_section_list
169 Elf_Internal_Shdr * hdr;
170 struct elf_section_list * next;
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn * dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
201 static int do_dyn_syms;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
222 struct group_list * next;
223 unsigned int section_index;
228 struct group_list * root;
229 unsigned int group_index;
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
237 /* Flag bits indicating particular types of dump. */
238 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
239 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
240 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
241 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
242 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
244 typedef unsigned char dump_type;
246 /* A linked list of the section names for which dumps were requested. */
247 struct dump_list_entry
251 struct dump_list_entry * next;
253 static struct dump_list_entry * dump_sects_byname;
255 /* A dynamic array of flags indicating for which sections a dump
256 has been requested via command line switches. */
257 static dump_type * cmdline_dump_sects = NULL;
258 static unsigned int num_cmdline_dump_sects = 0;
260 /* A dynamic array of flags indicating for which sections a dump of
261 some kind has been requested. It is reset on a per-object file
262 basis and then initialised from the cmdline_dump_sects array,
263 the results of interpreting the -w switch, and the
264 dump_sects_byname list. */
265 static dump_type * dump_sects = NULL;
266 static unsigned int num_dump_sects = 0;
269 /* How to print a vma value. */
270 typedef enum print_mode
282 /* Versioned symbol info. */
283 enum versioned_symbol_info
290 static const char *get_symbol_version_string
291 (FILE *file, int is_dynsym, const char *strtab,
292 unsigned long int strtab_size, unsigned int si,
293 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294 unsigned short *vna_other);
298 #define SECTION_NAME(X) \
299 ((X) == NULL ? _("<none>") \
300 : string_table == NULL ? _("<no-name>") \
301 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
302 : string_table + (X)->sh_name))
304 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
306 #define GET_ELF_SYMBOLS(file, section, sym_count) \
307 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
308 : get_64bit_elf_symbols (file, section, sym_count))
310 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312 already been called and verified that the string exists. */
313 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
315 #define REMOVE_ARCH_BITS(ADDR) \
318 if (elf_header.e_machine == EM_ARM) \
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324 the offset of the current archive member, if we are examining an archive.
325 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
326 using malloc and fill that. In either case return the pointer to the start of
327 the retrieved data or NULL if something went wrong. If something does go wrong
328 and REASON is not NULL then emit an error message using REASON as part of the
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 bfd_size_type nmemb, const char * reason)
336 bfd_size_type amt = size * nmemb;
338 if (size == 0 || nmemb == 0)
341 /* If the size_t type is smaller than the bfd_size_type, eg because
342 you are building a 32-bit tool on a 64-bit host, then make sure
343 that when the sizes are cast to (size_t) no information is lost. */
344 if (sizeof (size_t) < sizeof (bfd_size_type)
345 && ( (bfd_size_type) ((size_t) size) != size
346 || (bfd_size_type) ((size_t) nmemb) != nmemb))
349 error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 nmemb, size, reason);
355 /* Check for size overflow. */
359 error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 nmemb, size, reason);
365 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366 attempting to allocate memory when the read is bound to fail. */
367 if (amt > current_file_size
368 || offset + archive_file_offset + amt > current_file_size)
371 error (_("Reading 0x%" BFD_VMA_FMT "x"
372 " bytes extends past end of file for %s\n"),
377 if (fseek (file, archive_file_offset + offset, SEEK_SET))
380 error (_("Unable to seek to 0x%lx for %s\n"),
381 archive_file_offset + offset, reason);
388 /* Check for overflow. */
389 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390 /* + 1 so that we can '\0' terminate invalid string table sections. */
391 mvar = malloc ((size_t) amt + 1);
396 error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
402 ((char *) mvar)[amt] = '\0';
405 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
408 error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
418 /* Print a VMA value. */
421 print_vma (bfd_vma vma, print_mode mode)
434 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
441 return printf ("%5" BFD_VMA_FMT "d", vma);
449 return nc + printf ("%" BFD_VMA_FMT "x", vma);
452 return printf ("%" BFD_VMA_FMT "d", vma);
455 return printf ("%" BFD_VMA_FMT "u", vma);
460 /* Display a symbol on stdout. Handles the display of control characters and
461 multibye characters (assuming the host environment supports them).
463 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
465 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466 padding as necessary.
468 Returns the number of emitted characters. */
471 print_symbol (int width, const char *symbol)
473 bfd_boolean extra_padding = FALSE;
475 #ifdef HAVE_MBSTATE_T
482 /* Keep the width positive. This also helps. */
484 extra_padding = TRUE;
489 /* Set the remaining width to a very large value.
490 This simplifies the code below. */
491 width_remaining = INT_MAX;
493 width_remaining = width;
495 #ifdef HAVE_MBSTATE_T
496 /* Initialise the multibyte conversion state. */
497 memset (& state, 0, sizeof (state));
500 while (width_remaining)
503 const char c = *symbol++;
508 /* Do not print control characters directly as they can affect terminal
509 settings. Such characters usually appear in the names generated
510 by the assembler for local labels. */
513 if (width_remaining < 2)
516 printf ("^%c", c + 0x40);
517 width_remaining -= 2;
520 else if (ISPRINT (c))
528 #ifdef HAVE_MBSTATE_T
531 /* Let printf do the hard work of displaying multibyte characters. */
532 printf ("%.1s", symbol - 1);
536 #ifdef HAVE_MBSTATE_T
537 /* Try to find out how many bytes made up the character that was
538 just printed. Advance the symbol pointer past the bytes that
540 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
544 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
549 if (extra_padding && num_printed < width)
551 /* Fill in the remaining spaces. */
552 printf ("%-*s", width - num_printed, " ");
559 /* Returns a pointer to a static buffer containing a printable version of
560 the given section's name. Like print_symbol, except that it does not try
561 to print multibyte characters, it just interprets them as hex values. */
564 printable_section_name (const Elf_Internal_Shdr * sec)
566 #define MAX_PRINT_SEC_NAME_LEN 128
567 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568 const char * name = SECTION_NAME (sec);
569 char * buf = sec_name_buf;
571 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
573 while ((c = * name ++) != 0)
584 else if (ISPRINT (c))
591 static char hex[17] = "0123456789ABCDEF";
596 * buf ++ = hex[(c & 0xf0) >> 4];
597 * buf ++ = hex[c & 0x0f];
611 printable_section_name_from_index (unsigned long ndx)
613 if (ndx >= elf_header.e_shnum)
614 return _("<corrupt>");
616 return printable_section_name (section_headers + ndx);
619 /* Return a pointer to section NAME, or NULL if no such section exists. */
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
626 for (i = 0; i < elf_header.e_shnum; i++)
627 if (streq (SECTION_NAME (section_headers + i), name))
628 return section_headers + i;
633 /* Return a pointer to a section containing ADDR, or NULL if no such
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
641 for (i = 0; i < elf_header.e_shnum; i++)
643 Elf_Internal_Shdr *sec = section_headers + i;
644 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
656 for (i = 0; i < elf_header.e_shnum; i++)
658 Elf_Internal_Shdr *sec = section_headers + i;
659 if (sec->sh_type == type)
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667 restricted to the list of sections given in SET. */
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
676 while ((i = *set++) > 0)
677 if (streq (SECTION_NAME (section_headers + i), name))
678 return section_headers + i;
681 return find_section (name);
684 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689 unsigned int *length_return,
690 const unsigned char * const end)
692 return read_leb128 (data, length_return, FALSE, end);
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696 This OS has so many departures from the ELF standard that we test it at
702 return elf_header.e_machine == EM_IA_64
703 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
706 /* Guess the relocation size commonly used by the specific machines. */
709 guess_is_rela (unsigned int e_machine)
713 /* Targets that use REL relocations. */
728 /* Targets that use RELA relocations. */
732 case EM_ADAPTEVA_EPIPHANY:
734 case EM_ALTERA_NIOS2:
737 case EM_ARC_COMPACT2:
757 case EM_LATTICEMICO32:
766 case EM_CYGNUS_MN10200:
768 case EM_CYGNUS_MN10300:
802 case EM_MICROBLAZE_OLD:
823 warn (_("Don't know about relocations on this machine architecture\n"));
829 slurp_rela_relocs (FILE * file,
830 unsigned long rel_offset,
831 unsigned long rel_size,
832 Elf_Internal_Rela ** relasp,
833 unsigned long * nrelasp)
835 Elf_Internal_Rela * relas;
841 Elf32_External_Rela * erelas;
843 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844 rel_size, _("32-bit relocation data"));
848 nrelas = rel_size / sizeof (Elf32_External_Rela);
850 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851 sizeof (Elf_Internal_Rela));
856 error (_("out of memory parsing relocs\n"));
860 for (i = 0; i < nrelas; i++)
862 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863 relas[i].r_info = BYTE_GET (erelas[i].r_info);
864 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
871 Elf64_External_Rela * erelas;
873 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874 rel_size, _("64-bit relocation data"));
878 nrelas = rel_size / sizeof (Elf64_External_Rela);
880 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881 sizeof (Elf_Internal_Rela));
886 error (_("out of memory parsing relocs\n"));
890 for (i = 0; i < nrelas; i++)
892 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893 relas[i].r_info = BYTE_GET (erelas[i].r_info);
894 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
896 /* The #ifdef BFD64 below is to prevent a compile time
897 warning. We know that if we do not have a 64 bit data
898 type that we will never execute this code anyway. */
900 if (elf_header.e_machine == EM_MIPS
901 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
903 /* In little-endian objects, r_info isn't really a
904 64-bit little-endian value: it has a 32-bit
905 little-endian symbol index followed by four
906 individual byte fields. Reorder INFO
908 bfd_vma inf = relas[i].r_info;
909 inf = (((inf & 0xffffffff) << 32)
910 | ((inf >> 56) & 0xff)
911 | ((inf >> 40) & 0xff00)
912 | ((inf >> 24) & 0xff0000)
913 | ((inf >> 8) & 0xff000000));
914 relas[i].r_info = inf;
927 slurp_rel_relocs (FILE * file,
928 unsigned long rel_offset,
929 unsigned long rel_size,
930 Elf_Internal_Rela ** relsp,
931 unsigned long * nrelsp)
933 Elf_Internal_Rela * rels;
939 Elf32_External_Rel * erels;
941 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942 rel_size, _("32-bit relocation data"));
946 nrels = rel_size / sizeof (Elf32_External_Rel);
948 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
953 error (_("out of memory parsing relocs\n"));
957 for (i = 0; i < nrels; i++)
959 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960 rels[i].r_info = BYTE_GET (erels[i].r_info);
961 rels[i].r_addend = 0;
968 Elf64_External_Rel * erels;
970 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971 rel_size, _("64-bit relocation data"));
975 nrels = rel_size / sizeof (Elf64_External_Rel);
977 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
982 error (_("out of memory parsing relocs\n"));
986 for (i = 0; i < nrels; i++)
988 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989 rels[i].r_info = BYTE_GET (erels[i].r_info);
990 rels[i].r_addend = 0;
992 /* The #ifdef BFD64 below is to prevent a compile time
993 warning. We know that if we do not have a 64 bit data
994 type that we will never execute this code anyway. */
996 if (elf_header.e_machine == EM_MIPS
997 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
999 /* In little-endian objects, r_info isn't really a
1000 64-bit little-endian value: it has a 32-bit
1001 little-endian symbol index followed by four
1002 individual byte fields. Reorder INFO
1004 bfd_vma inf = rels[i].r_info;
1005 inf = (((inf & 0xffffffff) << 32)
1006 | ((inf >> 56) & 0xff)
1007 | ((inf >> 40) & 0xff00)
1008 | ((inf >> 24) & 0xff0000)
1009 | ((inf >> 8) & 0xff000000));
1010 rels[i].r_info = inf;
1022 /* Returns the reloc type extracted from the reloc info field. */
1025 get_reloc_type (bfd_vma reloc_info)
1028 return ELF32_R_TYPE (reloc_info);
1030 switch (elf_header.e_machine)
1033 /* Note: We assume that reloc_info has already been adjusted for us. */
1034 return ELF64_MIPS_R_TYPE (reloc_info);
1037 return ELF64_R_TYPE_ID (reloc_info);
1040 return ELF64_R_TYPE (reloc_info);
1044 /* Return the symbol index extracted from the reloc info field. */
1047 get_reloc_symindex (bfd_vma reloc_info)
1049 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1056 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1057 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1058 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059 /* TI compiler uses ELFOSABI_NONE. */
1060 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1063 /* Display the contents of the relocation data found at the specified
1067 dump_relocations (FILE * file,
1068 unsigned long rel_offset,
1069 unsigned long rel_size,
1070 Elf_Internal_Sym * symtab,
1071 unsigned long nsyms,
1073 unsigned long strtablen,
1078 Elf_Internal_Rela * rels;
1080 if (is_rela == UNKNOWN)
1081 is_rela = guess_is_rela (elf_header.e_machine);
1085 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1090 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1099 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1101 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1106 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1108 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1116 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1118 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1123 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1125 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1129 for (i = 0; i < rel_size; i++)
1134 bfd_vma symtab_index;
1137 offset = rels[i].r_offset;
1138 inf = rels[i].r_info;
1140 type = get_reloc_type (inf);
1141 symtab_index = get_reloc_symindex (inf);
1145 printf ("%8.8lx %8.8lx ",
1146 (unsigned long) offset & 0xffffffff,
1147 (unsigned long) inf & 0xffffffff);
1151 #if BFD_HOST_64BIT_LONG
1153 ? "%16.16lx %16.16lx "
1154 : "%12.12lx %12.12lx ",
1156 #elif BFD_HOST_64BIT_LONG_LONG
1159 ? "%16.16llx %16.16llx "
1160 : "%12.12llx %12.12llx ",
1164 ? "%16.16I64x %16.16I64x "
1165 : "%12.12I64x %12.12I64x ",
1170 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1171 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1172 _bfd_int64_high (offset),
1173 _bfd_int64_low (offset),
1174 _bfd_int64_high (inf),
1175 _bfd_int64_low (inf));
1179 switch (elf_header.e_machine)
1186 rtype = elf_aarch64_reloc_type (type);
1190 case EM_CYGNUS_M32R:
1191 rtype = elf_m32r_reloc_type (type);
1196 rtype = elf_i386_reloc_type (type);
1201 rtype = elf_m68hc11_reloc_type (type);
1205 rtype = elf_m68k_reloc_type (type);
1209 rtype = elf_i960_reloc_type (type);
1214 rtype = elf_avr_reloc_type (type);
1217 case EM_OLD_SPARCV9:
1218 case EM_SPARC32PLUS:
1221 rtype = elf_sparc_reloc_type (type);
1225 rtype = elf_spu_reloc_type (type);
1229 rtype = v800_reloc_type (type);
1232 case EM_CYGNUS_V850:
1233 rtype = v850_reloc_type (type);
1237 case EM_CYGNUS_D10V:
1238 rtype = elf_d10v_reloc_type (type);
1242 case EM_CYGNUS_D30V:
1243 rtype = elf_d30v_reloc_type (type);
1247 rtype = elf_dlx_reloc_type (type);
1251 rtype = elf_sh_reloc_type (type);
1255 case EM_CYGNUS_MN10300:
1256 rtype = elf_mn10300_reloc_type (type);
1260 case EM_CYGNUS_MN10200:
1261 rtype = elf_mn10200_reloc_type (type);
1265 case EM_CYGNUS_FR30:
1266 rtype = elf_fr30_reloc_type (type);
1270 rtype = elf_frv_reloc_type (type);
1274 rtype = elf_ft32_reloc_type (type);
1278 rtype = elf_mcore_reloc_type (type);
1282 rtype = elf_mmix_reloc_type (type);
1286 rtype = elf_moxie_reloc_type (type);
1290 if (uses_msp430x_relocs ())
1292 rtype = elf_msp430x_reloc_type (type);
1296 rtype = elf_msp430_reloc_type (type);
1300 rtype = elf_nds32_reloc_type (type);
1304 rtype = elf_ppc_reloc_type (type);
1308 rtype = elf_ppc64_reloc_type (type);
1312 case EM_MIPS_RS3_LE:
1313 rtype = elf_mips_reloc_type (type);
1317 rtype = elf_alpha_reloc_type (type);
1321 rtype = elf_arm_reloc_type (type);
1325 case EM_ARC_COMPACT:
1326 case EM_ARC_COMPACT2:
1327 rtype = elf_arc_reloc_type (type);
1331 rtype = elf_hppa_reloc_type (type);
1337 rtype = elf_h8_reloc_type (type);
1341 rtype = elf_or1k_reloc_type (type);
1346 rtype = elf_pj_reloc_type (type);
1349 rtype = elf_ia64_reloc_type (type);
1353 rtype = elf_cris_reloc_type (type);
1357 rtype = elf_i860_reloc_type (type);
1363 rtype = elf_x86_64_reloc_type (type);
1367 rtype = i370_reloc_type (type);
1372 rtype = elf_s390_reloc_type (type);
1376 rtype = elf_score_reloc_type (type);
1380 rtype = elf_xstormy16_reloc_type (type);
1384 rtype = elf_crx_reloc_type (type);
1388 rtype = elf_vax_reloc_type (type);
1392 rtype = elf_visium_reloc_type (type);
1395 case EM_ADAPTEVA_EPIPHANY:
1396 rtype = elf_epiphany_reloc_type (type);
1401 rtype = elf_ip2k_reloc_type (type);
1405 rtype = elf_iq2000_reloc_type (type);
1410 rtype = elf_xtensa_reloc_type (type);
1413 case EM_LATTICEMICO32:
1414 rtype = elf_lm32_reloc_type (type);
1419 rtype = elf_m32c_reloc_type (type);
1423 rtype = elf_mt_reloc_type (type);
1427 rtype = elf_bfin_reloc_type (type);
1431 rtype = elf_mep_reloc_type (type);
1435 rtype = elf_cr16_reloc_type (type);
1439 case EM_MICROBLAZE_OLD:
1440 rtype = elf_microblaze_reloc_type (type);
1444 rtype = elf_rl78_reloc_type (type);
1448 rtype = elf_rx_reloc_type (type);
1452 rtype = elf_metag_reloc_type (type);
1457 rtype = elf_xc16x_reloc_type (type);
1461 rtype = elf_tic6x_reloc_type (type);
1465 rtype = elf_tilegx_reloc_type (type);
1469 rtype = elf_tilepro_reloc_type (type);
1473 rtype = elf_xgate_reloc_type (type);
1476 case EM_ALTERA_NIOS2:
1477 rtype = elf_nios2_reloc_type (type);
1482 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1484 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1486 if (elf_header.e_machine == EM_ALPHA
1488 && streq (rtype, "R_ALPHA_LITUSE")
1491 switch (rels[i].r_addend)
1493 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1494 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1495 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1497 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1498 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500 default: rtype = NULL;
1503 printf (" (%s)", rtype);
1507 printf (_("<unknown addend: %lx>"),
1508 (unsigned long) rels[i].r_addend);
1511 else if (symtab_index)
1513 if (symtab == NULL || symtab_index >= nsyms)
1514 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1517 Elf_Internal_Sym * psym;
1518 const char * version_string;
1519 enum versioned_symbol_info sym_info;
1520 unsigned short vna_other;
1522 psym = symtab + symtab_index;
1525 = get_symbol_version_string (file, is_dynsym,
1534 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1538 unsigned int width = is_32bit_elf ? 8 : 14;
1540 /* Relocations against GNU_IFUNC symbols do not use the value
1541 of the symbol as the address to relocate against. Instead
1542 they invoke the function named by the symbol and use its
1543 result as the address for relocation.
1545 To indicate this to the user, do not display the value of
1546 the symbol in the "Symbols's Value" field. Instead show
1547 its name followed by () as a hint that the symbol is
1551 || psym->st_name == 0
1552 || psym->st_name >= strtablen)
1555 name = strtab + psym->st_name;
1557 len = print_symbol (width, name);
1559 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1561 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1565 print_vma (psym->st_value, LONG_HEX);
1567 printf (is_32bit_elf ? " " : " ");
1570 if (psym->st_name == 0)
1572 const char * sec_name = "<null>";
1575 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1577 if (psym->st_shndx < elf_header.e_shnum)
1578 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579 else if (psym->st_shndx == SHN_ABS)
1581 else if (psym->st_shndx == SHN_COMMON)
1582 sec_name = "COMMON";
1583 else if ((elf_header.e_machine == EM_MIPS
1584 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585 || (elf_header.e_machine == EM_TI_C6000
1586 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587 sec_name = "SCOMMON";
1588 else if (elf_header.e_machine == EM_MIPS
1589 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590 sec_name = "SUNDEF";
1591 else if ((elf_header.e_machine == EM_X86_64
1592 || elf_header.e_machine == EM_L1OM
1593 || elf_header.e_machine == EM_K1OM)
1594 && psym->st_shndx == SHN_X86_64_LCOMMON)
1595 sec_name = "LARGE_COMMON";
1596 else if (elf_header.e_machine == EM_IA_64
1597 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599 sec_name = "ANSI_COM";
1600 else if (is_ia64_vms ()
1601 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602 sec_name = "VMS_SYMVEC";
1605 sprintf (name_buf, "<section 0x%x>",
1606 (unsigned int) psym->st_shndx);
1607 sec_name = name_buf;
1610 print_symbol (22, sec_name);
1612 else if (strtab == NULL)
1613 printf (_("<string table index: %3ld>"), psym->st_name);
1614 else if (psym->st_name >= strtablen)
1615 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1618 print_symbol (22, strtab + psym->st_name);
1620 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1626 bfd_vma off = rels[i].r_addend;
1628 if ((bfd_signed_vma) off < 0)
1629 printf (" - %" BFD_VMA_FMT "x", - off);
1631 printf (" + %" BFD_VMA_FMT "x", off);
1637 bfd_vma off = rels[i].r_addend;
1639 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640 if ((bfd_signed_vma) off < 0)
1641 printf ("-%" BFD_VMA_FMT "x", - off);
1643 printf ("%" BFD_VMA_FMT "x", off);
1646 if (elf_header.e_machine == EM_SPARCV9
1648 && streq (rtype, "R_SPARC_OLO10"))
1649 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1654 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1656 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658 const char * rtype2 = elf_mips_reloc_type (type2);
1659 const char * rtype3 = elf_mips_reloc_type (type3);
1661 printf (" Type2: ");
1664 printf (_("unrecognized: %-7lx"),
1665 (unsigned long) type2 & 0xffffffff);
1667 printf ("%-17.17s", rtype2);
1669 printf ("\n Type3: ");
1672 printf (_("unrecognized: %-7lx"),
1673 (unsigned long) type3 & 0xffffffff);
1675 printf ("%-17.17s", rtype3);
1686 get_mips_dynamic_type (unsigned long type)
1690 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696 case DT_MIPS_MSYM: return "MIPS_MSYM";
1697 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707 case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1742 get_sparc64_dynamic_type (unsigned long type)
1746 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1753 get_ppc_dynamic_type (unsigned long type)
1757 case DT_PPC_GOT: return "PPC_GOT";
1758 case DT_PPC_OPT: return "PPC_OPT";
1765 get_ppc64_dynamic_type (unsigned long type)
1769 case DT_PPC64_GLINK: return "PPC64_GLINK";
1770 case DT_PPC64_OPD: return "PPC64_OPD";
1771 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1772 case DT_PPC64_OPT: return "PPC64_OPT";
1779 get_parisc_dynamic_type (unsigned long type)
1783 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1784 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1785 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1786 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1787 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1788 case DT_HP_PREINIT: return "HP_PREINIT";
1789 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1790 case DT_HP_NEEDED: return "HP_NEEDED";
1791 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1792 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1793 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1794 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1795 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1796 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1797 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1798 case DT_HP_FILTERED: return "HP_FILTERED";
1799 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1800 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1802 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1803 case DT_PLT: return "PLT";
1804 case DT_PLT_SIZE: return "PLT_SIZE";
1805 case DT_DLT: return "DLT";
1806 case DT_DLT_SIZE: return "DLT_SIZE";
1813 get_ia64_dynamic_type (unsigned long type)
1817 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1818 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1819 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1820 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1821 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1823 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1824 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1825 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1826 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1827 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1828 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1829 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1830 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1831 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1832 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1833 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1834 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1835 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1836 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1837 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1838 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1839 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1840 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1841 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1842 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1843 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1844 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1845 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1846 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1847 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1854 get_solaris_section_type (unsigned long type)
1858 case 0x6fffffee: return "SUNW_ancillary";
1859 case 0x6fffffef: return "SUNW_capchain";
1860 case 0x6ffffff0: return "SUNW_capinfo";
1861 case 0x6ffffff1: return "SUNW_symsort";
1862 case 0x6ffffff2: return "SUNW_tlssort";
1863 case 0x6ffffff3: return "SUNW_LDYNSYM";
1864 case 0x6ffffff4: return "SUNW_dof";
1865 case 0x6ffffff5: return "SUNW_cap";
1866 case 0x6ffffff6: return "SUNW_SIGNATURE";
1867 case 0x6ffffff7: return "SUNW_ANNOTATE";
1868 case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869 case 0x6ffffff9: return "SUNW_DEBUG";
1870 case 0x6ffffffa: return "SUNW_move";
1871 case 0x6ffffffb: return "SUNW_COMDAT";
1872 case 0x6ffffffc: return "SUNW_syminfo";
1873 case 0x6ffffffd: return "SUNW_verdef";
1874 case 0x6ffffffe: return "SUNW_verneed";
1875 case 0x6fffffff: return "SUNW_versym";
1876 case 0x70000000: return "SPARC_GOTDATA";
1877 default: return NULL;
1882 get_alpha_dynamic_type (unsigned long type)
1886 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1893 get_score_dynamic_type (unsigned long type)
1897 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1899 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1900 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1901 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1902 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1909 get_tic6x_dynamic_type (unsigned long type)
1913 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1916 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1917 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1918 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1925 get_nios2_dynamic_type (unsigned long type)
1929 case DT_NIOS2_GP: return "NIOS2_GP";
1936 get_solaris_dynamic_type (unsigned long type)
1940 case 0x6000000d: return "SUNW_AUXILIARY";
1941 case 0x6000000e: return "SUNW_RTLDINF";
1942 case 0x6000000f: return "SUNW_FILTER";
1943 case 0x60000010: return "SUNW_CAP";
1944 case 0x60000011: return "SUNW_SYMTAB";
1945 case 0x60000012: return "SUNW_SYMSZ";
1946 case 0x60000013: return "SUNW_SORTENT";
1947 case 0x60000014: return "SUNW_SYMSORT";
1948 case 0x60000015: return "SUNW_SYMSORTSZ";
1949 case 0x60000016: return "SUNW_TLSSORT";
1950 case 0x60000017: return "SUNW_TLSSORTSZ";
1951 case 0x60000018: return "SUNW_CAPINFO";
1952 case 0x60000019: return "SUNW_STRPAD";
1953 case 0x6000001a: return "SUNW_CAPCHAIN";
1954 case 0x6000001b: return "SUNW_LDMACH";
1955 case 0x6000001d: return "SUNW_CAPCHAINENT";
1956 case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957 case 0x60000021: return "SUNW_PARENT";
1958 case 0x60000023: return "SUNW_ASLR";
1959 case 0x60000025: return "SUNW_RELAX";
1960 case 0x60000029: return "SUNW_NXHEAP";
1961 case 0x6000002b: return "SUNW_NXSTACK";
1963 case 0x70000001: return "SPARC_REGISTER";
1964 case 0x7ffffffd: return "AUXILIARY";
1965 case 0x7ffffffe: return "USED";
1966 case 0x7fffffff: return "FILTER";
1968 default: return NULL;
1973 get_dynamic_type (unsigned long type)
1975 static char buff[64];
1979 case DT_NULL: return "NULL";
1980 case DT_NEEDED: return "NEEDED";
1981 case DT_PLTRELSZ: return "PLTRELSZ";
1982 case DT_PLTGOT: return "PLTGOT";
1983 case DT_HASH: return "HASH";
1984 case DT_STRTAB: return "STRTAB";
1985 case DT_SYMTAB: return "SYMTAB";
1986 case DT_RELA: return "RELA";
1987 case DT_RELASZ: return "RELASZ";
1988 case DT_RELAENT: return "RELAENT";
1989 case DT_STRSZ: return "STRSZ";
1990 case DT_SYMENT: return "SYMENT";
1991 case DT_INIT: return "INIT";
1992 case DT_FINI: return "FINI";
1993 case DT_SONAME: return "SONAME";
1994 case DT_RPATH: return "RPATH";
1995 case DT_SYMBOLIC: return "SYMBOLIC";
1996 case DT_REL: return "REL";
1997 case DT_RELSZ: return "RELSZ";
1998 case DT_RELENT: return "RELENT";
1999 case DT_PLTREL: return "PLTREL";
2000 case DT_DEBUG: return "DEBUG";
2001 case DT_TEXTREL: return "TEXTREL";
2002 case DT_JMPREL: return "JMPREL";
2003 case DT_BIND_NOW: return "BIND_NOW";
2004 case DT_INIT_ARRAY: return "INIT_ARRAY";
2005 case DT_FINI_ARRAY: return "FINI_ARRAY";
2006 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2008 case DT_RUNPATH: return "RUNPATH";
2009 case DT_FLAGS: return "FLAGS";
2011 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2014 case DT_CHECKSUM: return "CHECKSUM";
2015 case DT_PLTPADSZ: return "PLTPADSZ";
2016 case DT_MOVEENT: return "MOVEENT";
2017 case DT_MOVESZ: return "MOVESZ";
2018 case DT_FEATURE: return "FEATURE";
2019 case DT_POSFLAG_1: return "POSFLAG_1";
2020 case DT_SYMINSZ: return "SYMINSZ";
2021 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
2023 case DT_ADDRRNGLO: return "ADDRRNGLO";
2024 case DT_CONFIG: return "CONFIG";
2025 case DT_DEPAUDIT: return "DEPAUDIT";
2026 case DT_AUDIT: return "AUDIT";
2027 case DT_PLTPAD: return "PLTPAD";
2028 case DT_MOVETAB: return "MOVETAB";
2029 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
2031 case DT_VERSYM: return "VERSYM";
2033 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2035 case DT_RELACOUNT: return "RELACOUNT";
2036 case DT_RELCOUNT: return "RELCOUNT";
2037 case DT_FLAGS_1: return "FLAGS_1";
2038 case DT_VERDEF: return "VERDEF";
2039 case DT_VERDEFNUM: return "VERDEFNUM";
2040 case DT_VERNEED: return "VERNEED";
2041 case DT_VERNEEDNUM: return "VERNEEDNUM";
2043 case DT_AUXILIARY: return "AUXILIARY";
2044 case DT_USED: return "USED";
2045 case DT_FILTER: return "FILTER";
2047 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2052 case DT_GNU_HASH: return "GNU_HASH";
2055 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2057 const char * result;
2059 switch (elf_header.e_machine)
2062 case EM_MIPS_RS3_LE:
2063 result = get_mips_dynamic_type (type);
2066 result = get_sparc64_dynamic_type (type);
2069 result = get_ppc_dynamic_type (type);
2072 result = get_ppc64_dynamic_type (type);
2075 result = get_ia64_dynamic_type (type);
2078 result = get_alpha_dynamic_type (type);
2081 result = get_score_dynamic_type (type);
2084 result = get_tic6x_dynamic_type (type);
2086 case EM_ALTERA_NIOS2:
2087 result = get_nios2_dynamic_type (type);
2090 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091 result = get_solaris_dynamic_type (type);
2100 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2102 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103 || (elf_header.e_machine == EM_PARISC
2104 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2106 const char * result;
2108 switch (elf_header.e_machine)
2111 result = get_parisc_dynamic_type (type);
2114 result = get_ia64_dynamic_type (type);
2117 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118 result = get_solaris_dynamic_type (type);
2127 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2131 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2138 get_file_type (unsigned e_type)
2140 static char buff[32];
2144 case ET_NONE: return _("NONE (None)");
2145 case ET_REL: return _("REL (Relocatable file)");
2146 case ET_EXEC: return _("EXEC (Executable file)");
2147 case ET_DYN: return _("DYN (Shared object file)");
2148 case ET_CORE: return _("CORE (Core file)");
2151 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2152 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2153 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2154 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2156 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2162 get_machine_name (unsigned e_machine)
2164 static char buff[64]; /* XXX */
2168 case EM_NONE: return _("None");
2169 case EM_AARCH64: return "AArch64";
2170 case EM_M32: return "WE32100";
2171 case EM_SPARC: return "Sparc";
2172 case EM_SPU: return "SPU";
2173 case EM_386: return "Intel 80386";
2174 case EM_68K: return "MC68000";
2175 case EM_88K: return "MC88000";
2176 case EM_IAMCU: return "Intel MCU";
2177 case EM_860: return "Intel 80860";
2178 case EM_MIPS: return "MIPS R3000";
2179 case EM_S370: return "IBM System/370";
2180 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2181 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2182 case EM_PARISC: return "HPPA";
2183 case EM_PPC_OLD: return "Power PC (old)";
2184 case EM_SPARC32PLUS: return "Sparc v8+" ;
2185 case EM_960: return "Intel 90860";
2186 case EM_PPC: return "PowerPC";
2187 case EM_PPC64: return "PowerPC64";
2188 case EM_FR20: return "Fujitsu FR20";
2189 case EM_FT32: return "FTDI FT32";
2190 case EM_RH32: return "TRW RH32";
2191 case EM_MCORE: return "MCORE";
2192 case EM_ARM: return "ARM";
2193 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2194 case EM_SH: return "Renesas / SuperH SH";
2195 case EM_SPARCV9: return "Sparc v9";
2196 case EM_TRICORE: return "Siemens Tricore";
2197 case EM_ARC: return "ARC";
2198 case EM_ARC_COMPACT: return "ARCompact";
2199 case EM_ARC_COMPACT2: return "ARCv2";
2200 case EM_H8_300: return "Renesas H8/300";
2201 case EM_H8_300H: return "Renesas H8/300H";
2202 case EM_H8S: return "Renesas H8S";
2203 case EM_H8_500: return "Renesas H8/500";
2204 case EM_IA_64: return "Intel IA-64";
2205 case EM_MIPS_X: return "Stanford MIPS-X";
2206 case EM_COLDFIRE: return "Motorola Coldfire";
2207 case EM_ALPHA: return "Alpha";
2208 case EM_CYGNUS_D10V:
2209 case EM_D10V: return "d10v";
2210 case EM_CYGNUS_D30V:
2211 case EM_D30V: return "d30v";
2212 case EM_CYGNUS_M32R:
2213 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2214 case EM_CYGNUS_V850:
2215 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2216 case EM_V850: return "Renesas V850";
2217 case EM_CYGNUS_MN10300:
2218 case EM_MN10300: return "mn10300";
2219 case EM_CYGNUS_MN10200:
2220 case EM_MN10200: return "mn10200";
2221 case EM_MOXIE: return "Moxie";
2222 case EM_CYGNUS_FR30:
2223 case EM_FR30: return "Fujitsu FR30";
2224 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2226 case EM_PJ: return "picoJava";
2227 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2228 case EM_PCP: return "Siemens PCP";
2229 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2230 case EM_NDR1: return "Denso NDR1 microprocesspr";
2231 case EM_STARCORE: return "Motorola Star*Core processor";
2232 case EM_ME16: return "Toyota ME16 processor";
2233 case EM_ST100: return "STMicroelectronics ST100 processor";
2234 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2235 case EM_PDSP: return "Sony DSP processor";
2236 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2237 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2238 case EM_FX66: return "Siemens FX66 microcontroller";
2239 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2241 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2242 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2243 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2244 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2245 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2246 case EM_SVX: return "Silicon Graphics SVx";
2247 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2248 case EM_VAX: return "Digital VAX";
2249 case EM_VISIUM: return "CDS VISIUMcore processor";
2251 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2252 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2253 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2254 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2255 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2256 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2257 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2258 case EM_PRISM: return "Vitesse Prism";
2259 case EM_X86_64: return "Advanced Micro Devices X86-64";
2260 case EM_L1OM: return "Intel L1OM";
2261 case EM_K1OM: return "Intel K1OM";
2263 case EM_S390: return "IBM S/390";
2264 case EM_SCORE: return "SUNPLUS S+Core";
2265 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2266 case EM_OR1K: return "OpenRISC 1000";
2267 case EM_CRX: return "National Semiconductor CRX microprocessor";
2268 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2269 case EM_DLX: return "OpenDLX";
2271 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2272 case EM_IQ2000: return "Vitesse IQ2000";
2274 case EM_XTENSA: return "Tensilica Xtensa Processor";
2275 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2276 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2277 case EM_NS32K: return "National Semiconductor 32000 series";
2278 case EM_TPC: return "Tenor Network TPC processor";
2279 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2280 case EM_MAX: return "MAX Processor";
2281 case EM_CR: return "National Semiconductor CompactRISC";
2282 case EM_F2MC16: return "Fujitsu F2MC16";
2283 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2284 case EM_LATTICEMICO32: return "Lattice Mico32";
2286 case EM_M32C: return "Renesas M32c";
2287 case EM_MT: return "Morpho Techologies MT processor";
2288 case EM_BLACKFIN: return "Analog Devices Blackfin";
2289 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2290 case EM_SEP: return "Sharp embedded microprocessor";
2291 case EM_ARCA: return "Arca RISC microprocessor";
2292 case EM_UNICORE: return "Unicore";
2293 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2294 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2295 case EM_NIOS32: return "Altera Nios";
2296 case EM_ALTERA_NIOS2: return "Altera Nios II";
2298 case EM_XC16X: return "Infineon Technologies xc16x";
2299 case EM_M16C: return "Renesas M16C series microprocessors";
2300 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2301 case EM_CE: return "Freescale Communication Engine RISC core";
2302 case EM_TSK3000: return "Altium TSK3000 core";
2303 case EM_RS08: return "Freescale RS08 embedded processor";
2304 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2305 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2306 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2307 case EM_SE_C17: return "Seiko Epson C17 family";
2308 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2309 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2310 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2311 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2313 case EM_R32C: return "Renesas R32C series microprocessors";
2314 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2315 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2316 case EM_8051: return "Intel 8051 and variants";
2317 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2318 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2319 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2320 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2322 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2323 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2324 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2327 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2328 case EM_RL78: return "Renesas RL78";
2329 case EM_RX: return "Renesas RX";
2330 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2331 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2332 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2333 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2334 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2335 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2336 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2337 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2338 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2339 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2340 case EM_CUDA: return "NVIDIA CUDA architecture";
2341 case EM_XGATE: return "Motorola XGATE embedded processor";
2343 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2349 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2351 /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2. Some
2352 other compilers don't a specific architecture type in the e_flags, and
2353 instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354 architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2357 Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358 but also sets a specific architecture type in the e_flags field.
2360 However, when decoding the flags we don't worry if we see an
2361 unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362 ARCEM architecture type. */
2364 switch (e_flags & EF_ARC_MACH_MSK)
2366 /* We only expect these to occur for EM_ARC_COMPACT2. */
2367 case EF_ARC_CPU_ARCV2EM:
2368 strcat (buf, ", ARC EM");
2370 case EF_ARC_CPU_ARCV2HS:
2371 strcat (buf, ", ARC HS");
2374 /* We only expect these to occur for EM_ARC_COMPACT. */
2375 case E_ARC_MACH_ARC600:
2376 strcat (buf, ", ARC600");
2378 case E_ARC_MACH_ARC601:
2379 strcat (buf, ", ARC601");
2381 case E_ARC_MACH_ARC700:
2382 strcat (buf, ", ARC700");
2385 /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386 new ELF with new architecture being read by an old version of
2387 readelf, or (c) An ELF built with non-GNU compiler that does not
2388 set the architecture in the e_flags. */
2390 if (e_machine == EM_ARC_COMPACT)
2391 strcat (buf, ", Unknown ARCompact");
2393 strcat (buf, ", Unknown ARC");
2397 switch (e_flags & EF_ARC_OSABI_MSK)
2399 case E_ARC_OSABI_ORIG:
2400 strcat (buf, ", (ABI:legacy)");
2402 case E_ARC_OSABI_V2:
2403 strcat (buf, ", (ABI:v2)");
2405 /* Only upstream 3.9+ kernels will support ARCv2 ISA. */
2406 case E_ARC_OSABI_V3:
2407 strcat (buf, ", v3 no-legacy-syscalls ABI");
2410 strcat (buf, ", unrecognised ARC OSABI flag");
2416 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2421 eabi = EF_ARM_EABI_VERSION (e_flags);
2422 e_flags &= ~ EF_ARM_EABIMASK;
2424 /* Handle "generic" ARM flags. */
2425 if (e_flags & EF_ARM_RELEXEC)
2427 strcat (buf, ", relocatable executable");
2428 e_flags &= ~ EF_ARM_RELEXEC;
2431 /* Now handle EABI specific flags. */
2435 strcat (buf, ", <unrecognized EABI>");
2440 case EF_ARM_EABI_VER1:
2441 strcat (buf, ", Version1 EABI");
2446 /* Process flags one bit at a time. */
2447 flag = e_flags & - e_flags;
2452 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2453 strcat (buf, ", sorted symbol tables");
2463 case EF_ARM_EABI_VER2:
2464 strcat (buf, ", Version2 EABI");
2469 /* Process flags one bit at a time. */
2470 flag = e_flags & - e_flags;
2475 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2476 strcat (buf, ", sorted symbol tables");
2479 case EF_ARM_DYNSYMSUSESEGIDX:
2480 strcat (buf, ", dynamic symbols use segment index");
2483 case EF_ARM_MAPSYMSFIRST:
2484 strcat (buf, ", mapping symbols precede others");
2494 case EF_ARM_EABI_VER3:
2495 strcat (buf, ", Version3 EABI");
2498 case EF_ARM_EABI_VER4:
2499 strcat (buf, ", Version4 EABI");
2504 /* Process flags one bit at a time. */
2505 flag = e_flags & - e_flags;
2511 strcat (buf, ", BE8");
2515 strcat (buf, ", LE8");
2526 case EF_ARM_EABI_VER5:
2527 strcat (buf, ", Version5 EABI");
2532 /* Process flags one bit at a time. */
2533 flag = e_flags & - e_flags;
2539 strcat (buf, ", BE8");
2543 strcat (buf, ", LE8");
2546 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2547 strcat (buf, ", soft-float ABI");
2550 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2551 strcat (buf, ", hard-float ABI");
2561 case EF_ARM_EABI_UNKNOWN:
2562 strcat (buf, ", GNU EABI");
2567 /* Process flags one bit at a time. */
2568 flag = e_flags & - e_flags;
2573 case EF_ARM_INTERWORK:
2574 strcat (buf, ", interworking enabled");
2577 case EF_ARM_APCS_26:
2578 strcat (buf, ", uses APCS/26");
2581 case EF_ARM_APCS_FLOAT:
2582 strcat (buf, ", uses APCS/float");
2586 strcat (buf, ", position independent");
2590 strcat (buf, ", 8 bit structure alignment");
2593 case EF_ARM_NEW_ABI:
2594 strcat (buf, ", uses new ABI");
2597 case EF_ARM_OLD_ABI:
2598 strcat (buf, ", uses old ABI");
2601 case EF_ARM_SOFT_FLOAT:
2602 strcat (buf, ", software FP");
2605 case EF_ARM_VFP_FLOAT:
2606 strcat (buf, ", VFP");
2609 case EF_ARM_MAVERICK_FLOAT:
2610 strcat (buf, ", Maverick FP");
2621 strcat (buf,_(", <unknown>"));
2625 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2627 --size; /* Leave space for null terminator. */
2629 switch (e_flags & EF_AVR_MACH)
2631 case E_AVR_MACH_AVR1:
2632 strncat (buf, ", avr:1", size);
2634 case E_AVR_MACH_AVR2:
2635 strncat (buf, ", avr:2", size);
2637 case E_AVR_MACH_AVR25:
2638 strncat (buf, ", avr:25", size);
2640 case E_AVR_MACH_AVR3:
2641 strncat (buf, ", avr:3", size);
2643 case E_AVR_MACH_AVR31:
2644 strncat (buf, ", avr:31", size);
2646 case E_AVR_MACH_AVR35:
2647 strncat (buf, ", avr:35", size);
2649 case E_AVR_MACH_AVR4:
2650 strncat (buf, ", avr:4", size);
2652 case E_AVR_MACH_AVR5:
2653 strncat (buf, ", avr:5", size);
2655 case E_AVR_MACH_AVR51:
2656 strncat (buf, ", avr:51", size);
2658 case E_AVR_MACH_AVR6:
2659 strncat (buf, ", avr:6", size);
2661 case E_AVR_MACH_AVRTINY:
2662 strncat (buf, ", avr:100", size);
2664 case E_AVR_MACH_XMEGA1:
2665 strncat (buf, ", avr:101", size);
2667 case E_AVR_MACH_XMEGA2:
2668 strncat (buf, ", avr:102", size);
2670 case E_AVR_MACH_XMEGA3:
2671 strncat (buf, ", avr:103", size);
2673 case E_AVR_MACH_XMEGA4:
2674 strncat (buf, ", avr:104", size);
2676 case E_AVR_MACH_XMEGA5:
2677 strncat (buf, ", avr:105", size);
2679 case E_AVR_MACH_XMEGA6:
2680 strncat (buf, ", avr:106", size);
2682 case E_AVR_MACH_XMEGA7:
2683 strncat (buf, ", avr:107", size);
2686 strncat (buf, ", avr:<unknown>", size);
2690 size -= strlen (buf);
2691 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692 strncat (buf, ", link-relax", size);
2696 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2705 static const char *ABI_STRINGS[] =
2707 "ABI v0", /* use r5 as return register; only used in N1213HC */
2708 "ABI v1", /* use r0 as return register */
2709 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710 "ABI v2fp", /* for FPU */
2714 static const char *VER_STRINGS[] =
2716 "Andes ELF V1.3 or older",
2720 static const char *ARCH_STRINGS[] =
2729 abi = EF_NDS_ABI & e_flags;
2730 arch = EF_NDS_ARCH & e_flags;
2731 config = EF_NDS_INST & e_flags;
2732 version = EF_NDS32_ELF_VERSION & e_flags;
2734 memset (buf, 0, size);
2741 case E_NDS_ABI_V2FP:
2742 case E_NDS_ABI_AABI:
2743 case E_NDS_ABI_V2FP_PLUS:
2744 /* In case there are holes in the array. */
2745 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2749 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2755 case E_NDS32_ELF_VER_1_2:
2756 case E_NDS32_ELF_VER_1_3:
2757 case E_NDS32_ELF_VER_1_4:
2758 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2762 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2766 if (E_NDS_ABI_V0 == abi)
2768 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2769 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770 if (arch == E_NDS_ARCH_STAR_V1_0)
2771 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2777 case E_NDS_ARCH_STAR_V1_0:
2778 case E_NDS_ARCH_STAR_V2_0:
2779 case E_NDS_ARCH_STAR_V3_0:
2780 case E_NDS_ARCH_STAR_V3_M:
2781 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2785 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786 /* ARCH version determines how the e_flags are interpreted.
2787 If it is unknown, we cannot proceed. */
2791 /* Newer ABI; Now handle architecture specific flags. */
2792 if (arch == E_NDS_ARCH_STAR_V1_0)
2794 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2797 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798 r += snprintf (buf + r, size -r, ", MAC");
2800 if (config & E_NDS32_HAS_DIV_INST)
2801 r += snprintf (buf + r, size -r, ", DIV");
2803 if (config & E_NDS32_HAS_16BIT_INST)
2804 r += snprintf (buf + r, size -r, ", 16b");
2808 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2810 if (version <= E_NDS32_ELF_VER_1_3)
2811 r += snprintf (buf + r, size -r, ", [B8]");
2813 r += snprintf (buf + r, size -r, ", EX9");
2816 if (config & E_NDS32_HAS_MAC_DX_INST)
2817 r += snprintf (buf + r, size -r, ", MAC_DX");
2819 if (config & E_NDS32_HAS_DIV_DX_INST)
2820 r += snprintf (buf + r, size -r, ", DIV_DX");
2822 if (config & E_NDS32_HAS_16BIT_INST)
2824 if (version <= E_NDS32_ELF_VER_1_3)
2825 r += snprintf (buf + r, size -r, ", 16b");
2827 r += snprintf (buf + r, size -r, ", IFC");
2831 if (config & E_NDS32_HAS_EXT_INST)
2832 r += snprintf (buf + r, size -r, ", PERF1");
2834 if (config & E_NDS32_HAS_EXT2_INST)
2835 r += snprintf (buf + r, size -r, ", PERF2");
2837 if (config & E_NDS32_HAS_FPU_INST)
2840 r += snprintf (buf + r, size -r, ", FPU_SP");
2843 if (config & E_NDS32_HAS_FPU_DP_INST)
2846 r += snprintf (buf + r, size -r, ", FPU_DP");
2849 if (config & E_NDS32_HAS_FPU_MAC_INST)
2852 r += snprintf (buf + r, size -r, ", FPU_MAC");
2857 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2859 case E_NDS32_FPU_REG_8SP_4DP:
2860 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2862 case E_NDS32_FPU_REG_16SP_8DP:
2863 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2865 case E_NDS32_FPU_REG_32SP_16DP:
2866 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2868 case E_NDS32_FPU_REG_32SP_32DP:
2869 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2874 if (config & E_NDS32_HAS_AUDIO_INST)
2875 r += snprintf (buf + r, size -r, ", AUDIO");
2877 if (config & E_NDS32_HAS_STRING_INST)
2878 r += snprintf (buf + r, size -r, ", STR");
2880 if (config & E_NDS32_HAS_REDUCED_REGS)
2881 r += snprintf (buf + r, size -r, ", 16REG");
2883 if (config & E_NDS32_HAS_VIDEO_INST)
2885 if (version <= E_NDS32_ELF_VER_1_3)
2886 r += snprintf (buf + r, size -r, ", VIDEO");
2888 r += snprintf (buf + r, size -r, ", SATURATION");
2891 if (config & E_NDS32_HAS_ENCRIPT_INST)
2892 r += snprintf (buf + r, size -r, ", ENCRP");
2894 if (config & E_NDS32_HAS_L2C_INST)
2895 r += snprintf (buf + r, size -r, ", L2C");
2899 get_machine_flags (unsigned e_flags, unsigned e_machine)
2901 static char buf[1024];
2912 case EM_ARC_COMPACT2:
2913 case EM_ARC_COMPACT:
2914 decode_ARC_machine_flags (e_flags, e_machine, buf);
2918 decode_ARM_machine_flags (e_flags, buf);
2922 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2926 if (e_flags & EF_BFIN_PIC)
2927 strcat (buf, ", PIC");
2929 if (e_flags & EF_BFIN_FDPIC)
2930 strcat (buf, ", FDPIC");
2932 if (e_flags & EF_BFIN_CODE_IN_L1)
2933 strcat (buf, ", code in L1");
2935 if (e_flags & EF_BFIN_DATA_IN_L1)
2936 strcat (buf, ", data in L1");
2941 switch (e_flags & EF_FRV_CPU_MASK)
2943 case EF_FRV_CPU_GENERIC:
2947 strcat (buf, ", fr???");
2950 case EF_FRV_CPU_FR300:
2951 strcat (buf, ", fr300");
2954 case EF_FRV_CPU_FR400:
2955 strcat (buf, ", fr400");
2957 case EF_FRV_CPU_FR405:
2958 strcat (buf, ", fr405");
2961 case EF_FRV_CPU_FR450:
2962 strcat (buf, ", fr450");
2965 case EF_FRV_CPU_FR500:
2966 strcat (buf, ", fr500");
2968 case EF_FRV_CPU_FR550:
2969 strcat (buf, ", fr550");
2972 case EF_FRV_CPU_SIMPLE:
2973 strcat (buf, ", simple");
2975 case EF_FRV_CPU_TOMCAT:
2976 strcat (buf, ", tomcat");
2982 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2983 strcat (buf, ", m68000");
2984 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2985 strcat (buf, ", cpu32");
2986 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987 strcat (buf, ", fido_a");
2990 char const * isa = _("unknown");
2991 char const * mac = _("unknown mac");
2992 char const * additional = NULL;
2994 switch (e_flags & EF_M68K_CF_ISA_MASK)
2996 case EF_M68K_CF_ISA_A_NODIV:
2998 additional = ", nodiv";
3000 case EF_M68K_CF_ISA_A:
3003 case EF_M68K_CF_ISA_A_PLUS:
3006 case EF_M68K_CF_ISA_B_NOUSP:
3008 additional = ", nousp";
3010 case EF_M68K_CF_ISA_B:
3013 case EF_M68K_CF_ISA_C:
3016 case EF_M68K_CF_ISA_C_NODIV:
3018 additional = ", nodiv";
3021 strcat (buf, ", cf, isa ");
3024 strcat (buf, additional);
3025 if (e_flags & EF_M68K_CF_FLOAT)
3026 strcat (buf, ", float");
3027 switch (e_flags & EF_M68K_CF_MAC_MASK)
3032 case EF_M68K_CF_MAC:
3035 case EF_M68K_CF_EMAC:
3038 case EF_M68K_CF_EMAC_B:
3051 switch (e_flags & EF_MEP_CPU_MASK)
3053 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3062 switch (e_flags & EF_MEP_COP_MASK)
3064 case EF_MEP_COP_NONE: break;
3065 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069 default: strcat (buf, _("<unknown MeP copro type>")); break;
3072 if (e_flags & EF_MEP_LIBRARY)
3073 strcat (buf, ", Built for Library");
3075 if (e_flags & EF_MEP_INDEX_MASK)
3076 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077 e_flags & EF_MEP_INDEX_MASK);
3079 if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081 e_flags & ~ EF_MEP_ALL_FLAGS);
3085 if (e_flags & EF_PPC_EMB)
3086 strcat (buf, ", emb");
3088 if (e_flags & EF_PPC_RELOCATABLE)
3089 strcat (buf, _(", relocatable"));
3091 if (e_flags & EF_PPC_RELOCATABLE_LIB)
3092 strcat (buf, _(", relocatable-lib"));
3096 if (e_flags & EF_PPC64_ABI)
3098 char abi[] = ", abiv0";
3100 abi[6] += e_flags & EF_PPC64_ABI;
3106 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107 strcat (buf, ", RH850 ABI");
3109 if (e_flags & EF_V800_850E3)
3110 strcat (buf, ", V3 architecture");
3112 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113 strcat (buf, ", FPU not used");
3115 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116 strcat (buf, ", regmode: COMMON");
3118 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119 strcat (buf, ", r4 not used");
3121 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122 strcat (buf, ", r30 not used");
3124 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125 strcat (buf, ", r5 not used");
3127 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128 strcat (buf, ", r2 not used");
3130 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3132 switch (e_flags & - e_flags)
3134 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3136 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3138 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3152 case EM_CYGNUS_V850:
3153 switch (e_flags & EF_V850_ARCH)
3155 case E_V850E3V5_ARCH:
3156 strcat (buf, ", v850e3v5");
3158 case E_V850E2V3_ARCH:
3159 strcat (buf, ", v850e2v3");
3162 strcat (buf, ", v850e2");
3165 strcat (buf, ", v850e1");
3168 strcat (buf, ", v850e");
3171 strcat (buf, ", v850");
3174 strcat (buf, _(", unknown v850 architecture variant"));
3180 case EM_CYGNUS_M32R:
3181 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182 strcat (buf, ", m32r");
3186 case EM_MIPS_RS3_LE:
3187 if (e_flags & EF_MIPS_NOREORDER)
3188 strcat (buf, ", noreorder");
3190 if (e_flags & EF_MIPS_PIC)
3191 strcat (buf, ", pic");
3193 if (e_flags & EF_MIPS_CPIC)
3194 strcat (buf, ", cpic");
3196 if (e_flags & EF_MIPS_UCODE)
3197 strcat (buf, ", ugen_reserved");
3199 if (e_flags & EF_MIPS_ABI2)
3200 strcat (buf, ", abi2");
3202 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203 strcat (buf, ", odk first");
3205 if (e_flags & EF_MIPS_32BITMODE)
3206 strcat (buf, ", 32bitmode");
3208 if (e_flags & EF_MIPS_NAN2008)
3209 strcat (buf, ", nan2008");
3211 if (e_flags & EF_MIPS_FP64)
3212 strcat (buf, ", fp64");
3214 switch ((e_flags & EF_MIPS_MACH))
3216 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3219 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3220 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3224 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3225 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3226 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3228 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3229 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3230 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3231 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3232 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3234 /* We simply ignore the field in this case to avoid confusion:
3235 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3238 default: strcat (buf, _(", unknown CPU")); break;
3241 switch ((e_flags & EF_MIPS_ABI))
3243 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3248 /* We simply ignore the field in this case to avoid confusion:
3249 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250 This means it is likely to be an o32 file, but not for
3253 default: strcat (buf, _(", unknown ABI")); break;
3256 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257 strcat (buf, ", mdmx");
3259 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260 strcat (buf, ", mips16");
3262 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263 strcat (buf, ", micromips");
3265 switch ((e_flags & EF_MIPS_ARCH))
3267 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3273 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3274 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3275 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3276 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3277 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3278 default: strcat (buf, _(", unknown ISA")); break;
3283 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3287 switch ((e_flags & EF_SH_MACH_MASK))
3289 case EF_SH1: strcat (buf, ", sh1"); break;
3290 case EF_SH2: strcat (buf, ", sh2"); break;
3291 case EF_SH3: strcat (buf, ", sh3"); break;
3292 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295 case EF_SH3E: strcat (buf, ", sh3e"); break;
3296 case EF_SH4: strcat (buf, ", sh4"); break;
3297 case EF_SH5: strcat (buf, ", sh5"); break;
3298 case EF_SH2E: strcat (buf, ", sh2e"); break;
3299 case EF_SH4A: strcat (buf, ", sh4a"); break;
3300 case EF_SH2A: strcat (buf, ", sh2a"); break;
3301 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3303 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3304 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3310 default: strcat (buf, _(", unknown ISA")); break;
3313 if (e_flags & EF_SH_PIC)
3314 strcat (buf, ", pic");
3316 if (e_flags & EF_SH_FDPIC)
3317 strcat (buf, ", fdpic");
3321 if (e_flags & EF_OR1K_NODELAY)
3322 strcat (buf, ", no delay");
3326 if (e_flags & EF_SPARC_32PLUS)
3327 strcat (buf, ", v8+");
3329 if (e_flags & EF_SPARC_SUN_US1)
3330 strcat (buf, ", ultrasparcI");
3332 if (e_flags & EF_SPARC_SUN_US3)
3333 strcat (buf, ", ultrasparcIII");
3335 if (e_flags & EF_SPARC_HAL_R1)
3336 strcat (buf, ", halr1");
3338 if (e_flags & EF_SPARC_LEDATA)
3339 strcat (buf, ", ledata");
3341 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342 strcat (buf, ", tso");
3344 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345 strcat (buf, ", pso");
3347 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348 strcat (buf, ", rmo");
3352 switch (e_flags & EF_PARISC_ARCH)
3354 case EFA_PARISC_1_0:
3355 strcpy (buf, ", PA-RISC 1.0");
3357 case EFA_PARISC_1_1:
3358 strcpy (buf, ", PA-RISC 1.1");
3360 case EFA_PARISC_2_0:
3361 strcpy (buf, ", PA-RISC 2.0");
3366 if (e_flags & EF_PARISC_TRAPNIL)
3367 strcat (buf, ", trapnil");
3368 if (e_flags & EF_PARISC_EXT)
3369 strcat (buf, ", ext");
3370 if (e_flags & EF_PARISC_LSB)
3371 strcat (buf, ", lsb");
3372 if (e_flags & EF_PARISC_WIDE)
3373 strcat (buf, ", wide");
3374 if (e_flags & EF_PARISC_NO_KABP)
3375 strcat (buf, ", no kabp");
3376 if (e_flags & EF_PARISC_LAZYSWAP)
3377 strcat (buf, ", lazyswap");
3382 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383 strcat (buf, ", new calling convention");
3385 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386 strcat (buf, ", gnu calling convention");
3390 if ((e_flags & EF_IA_64_ABI64))
3391 strcat (buf, ", 64-bit");
3393 strcat (buf, ", 32-bit");
3394 if ((e_flags & EF_IA_64_REDUCEDFP))
3395 strcat (buf, ", reduced fp model");
3396 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397 strcat (buf, ", no function descriptors, constant gp");
3398 else if ((e_flags & EF_IA_64_CONS_GP))
3399 strcat (buf, ", constant gp");
3400 if ((e_flags & EF_IA_64_ABSOLUTE))
3401 strcat (buf, ", absolute");
3402 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3404 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405 strcat (buf, ", vms_linkages");
3406 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3408 case EF_IA_64_VMS_COMCOD_SUCCESS:
3410 case EF_IA_64_VMS_COMCOD_WARNING:
3411 strcat (buf, ", warning");
3413 case EF_IA_64_VMS_COMCOD_ERROR:
3414 strcat (buf, ", error");
3416 case EF_IA_64_VMS_COMCOD_ABORT:
3417 strcat (buf, ", abort");
3420 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421 e_flags & EF_IA_64_VMS_COMCOD);
3422 strcat (buf, ", <unknown>");
3428 if ((e_flags & EF_VAX_NONPIC))
3429 strcat (buf, ", non-PIC");
3430 if ((e_flags & EF_VAX_DFLOAT))
3431 strcat (buf, ", D-Float");
3432 if ((e_flags & EF_VAX_GFLOAT))
3433 strcat (buf, ", G-Float");
3437 if (e_flags & EF_VISIUM_ARCH_MCM)
3438 strcat (buf, ", mcm");
3439 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440 strcat (buf, ", mcm24");
3441 if (e_flags & EF_VISIUM_ARCH_GR6)
3442 strcat (buf, ", gr6");
3446 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3448 case E_FLAG_RL78_ANY_CPU: break;
3449 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3453 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454 strcat (buf, ", 64-bit doubles");
3458 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459 strcat (buf, ", 64-bit doubles");
3460 if (e_flags & E_FLAG_RX_DSP)
3461 strcat (buf, ", dsp");
3462 if (e_flags & E_FLAG_RX_PID)
3463 strcat (buf, ", pid");
3464 if (e_flags & E_FLAG_RX_ABI)
3465 strcat (buf, ", RX ABI");
3466 if (e_flags & E_FLAG_RX_SINSNS_SET)
3467 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468 ? ", uses String instructions" : ", bans String instructions");
3469 if (e_flags & E_FLAG_RX_V2)
3470 strcat (buf, ", V2");
3474 if (e_flags & EF_S390_HIGH_GPRS)
3475 strcat (buf, ", highgprs");
3479 if ((e_flags & EF_C6000_REL))
3480 strcat (buf, ", relocatable module");
3484 strcat (buf, _(": architecture variant: "));
3485 switch (e_flags & EF_MSP430_MACH)
3487 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3503 strcat (buf, _(": unknown")); break;
3506 if (e_flags & ~ EF_MSP430_MACH)
3507 strcat (buf, _(": unknown extra flag bits also present"));
3515 get_osabi_name (unsigned int osabi)
3517 static char buff[32];
3521 case ELFOSABI_NONE: return "UNIX - System V";
3522 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3523 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3524 case ELFOSABI_GNU: return "UNIX - GNU";
3525 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3526 case ELFOSABI_AIX: return "UNIX - AIX";
3527 case ELFOSABI_IRIX: return "UNIX - IRIX";
3528 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3529 case ELFOSABI_TRU64: return "UNIX - TRU64";
3530 case ELFOSABI_MODESTO: return "Novell - Modesto";
3531 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3532 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3533 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3534 case ELFOSABI_AROS: return "AROS";
3535 case ELFOSABI_FENIXOS: return "FenixOS";
3538 switch (elf_header.e_machine)
3543 case ELFOSABI_ARM: return "ARM";
3554 case ELFOSABI_STANDALONE: return _("Standalone App");
3563 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3564 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3573 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3579 get_aarch64_segment_type (unsigned long type)
3583 case PT_AARCH64_ARCHEXT:
3584 return "AARCH64_ARCHEXT";
3593 get_arm_segment_type (unsigned long type)
3607 get_mips_segment_type (unsigned long type)
3611 case PT_MIPS_REGINFO:
3613 case PT_MIPS_RTPROC:
3615 case PT_MIPS_OPTIONS:
3617 case PT_MIPS_ABIFLAGS:
3627 get_parisc_segment_type (unsigned long type)
3631 case PT_HP_TLS: return "HP_TLS";
3632 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3633 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3634 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3635 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3636 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3637 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3638 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3639 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3640 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3641 case PT_HP_PARALLEL: return "HP_PARALLEL";
3642 case PT_HP_FASTBIND: return "HP_FASTBIND";
3643 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3644 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3645 case PT_HP_STACK: return "HP_STACK";
3646 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3647 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3648 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3649 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3658 get_ia64_segment_type (unsigned long type)
3662 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3663 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3664 case PT_HP_TLS: return "HP_TLS";
3665 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3666 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3667 case PT_IA_64_HP_STACK: return "HP_STACK";
3676 get_tic6x_segment_type (unsigned long type)
3680 case PT_C6000_PHATTR: return "C6000_PHATTR";
3689 get_solaris_segment_type (unsigned long type)
3693 case 0x6464e550: return "PT_SUNW_UNWIND";
3694 case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695 case 0x6ffffff7: return "PT_LOSUNW";
3696 case 0x6ffffffa: return "PT_SUNWBSS";
3697 case 0x6ffffffb: return "PT_SUNWSTACK";
3698 case 0x6ffffffc: return "PT_SUNWDTRACE";
3699 case 0x6ffffffd: return "PT_SUNWCAP";
3700 case 0x6fffffff: return "PT_HISUNW";
3701 default: return NULL;
3706 get_segment_type (unsigned long p_type)
3708 static char buff[32];
3712 case PT_NULL: return "NULL";
3713 case PT_LOAD: return "LOAD";
3714 case PT_DYNAMIC: return "DYNAMIC";
3715 case PT_INTERP: return "INTERP";
3716 case PT_NOTE: return "NOTE";
3717 case PT_SHLIB: return "SHLIB";
3718 case PT_PHDR: return "PHDR";
3719 case PT_TLS: return "TLS";
3721 case PT_GNU_EH_FRAME:
3722 return "GNU_EH_FRAME";
3723 case PT_GNU_STACK: return "GNU_STACK";
3724 case PT_GNU_RELRO: return "GNU_RELRO";
3727 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3729 const char * result;
3731 switch (elf_header.e_machine)
3734 result = get_aarch64_segment_type (p_type);
3737 result = get_arm_segment_type (p_type);
3740 case EM_MIPS_RS3_LE:
3741 result = get_mips_segment_type (p_type);
3744 result = get_parisc_segment_type (p_type);
3747 result = get_ia64_segment_type (p_type);
3750 result = get_tic6x_segment_type (p_type);
3760 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3762 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3764 const char * result;
3766 switch (elf_header.e_machine)
3769 result = get_parisc_segment_type (p_type);
3772 result = get_ia64_segment_type (p_type);
3775 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776 result = get_solaris_segment_type (p_type);
3785 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3788 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3795 get_mips_section_type_name (unsigned int sh_type)
3799 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3800 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3801 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3802 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3803 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3804 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3805 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3806 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3807 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3808 case SHT_MIPS_RELD: return "MIPS_RELD";
3809 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3810 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3811 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3812 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3813 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3814 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3815 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3816 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3817 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3818 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3819 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3820 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3821 case SHT_MIPS_LINE: return "MIPS_LINE";
3822 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3823 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3824 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3825 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3826 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3827 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3828 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3829 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3830 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3831 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3832 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3833 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3834 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3835 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3836 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3837 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3838 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3846 get_parisc_section_type_name (unsigned int sh_type)
3850 case SHT_PARISC_EXT: return "PARISC_EXT";
3851 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3852 case SHT_PARISC_DOC: return "PARISC_DOC";
3853 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3854 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3855 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3856 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3864 get_ia64_section_type_name (unsigned int sh_type)
3866 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3867 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3872 case SHT_IA_64_EXT: return "IA_64_EXT";
3873 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3874 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3875 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3876 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3878 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3879 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3880 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3881 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3889 get_x86_64_section_type_name (unsigned int sh_type)
3893 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3901 get_aarch64_section_type_name (unsigned int sh_type)
3905 case SHT_AARCH64_ATTRIBUTES:
3906 return "AARCH64_ATTRIBUTES";
3914 get_arm_section_type_name (unsigned int sh_type)
3918 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3919 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3920 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3921 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3922 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3930 get_tic6x_section_type_name (unsigned int sh_type)
3934 case SHT_C6000_UNWIND:
3935 return "C6000_UNWIND";
3936 case SHT_C6000_PREEMPTMAP:
3937 return "C6000_PREEMPTMAP";
3938 case SHT_C6000_ATTRIBUTES:
3939 return "C6000_ATTRIBUTES";
3944 case SHT_TI_HANDLER:
3945 return "TI_HANDLER";
3946 case SHT_TI_INITINFO:
3947 return "TI_INITINFO";
3948 case SHT_TI_PHATTRS:
3949 return "TI_PHATTRS";
3957 get_msp430x_section_type_name (unsigned int sh_type)
3961 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3962 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3964 default: return NULL;
3969 get_v850_section_type_name (unsigned int sh_type)
3973 case SHT_V850_SCOMMON: return "V850 Small Common";
3974 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976 case SHT_RENESAS_IOP: return "RENESAS IOP";
3977 case SHT_RENESAS_INFO: return "RENESAS INFO";
3978 default: return NULL;
3983 get_section_type_name (unsigned int sh_type)
3985 static char buff[32];
3986 const char * result;
3990 case SHT_NULL: return "NULL";
3991 case SHT_PROGBITS: return "PROGBITS";
3992 case SHT_SYMTAB: return "SYMTAB";
3993 case SHT_STRTAB: return "STRTAB";
3994 case SHT_RELA: return "RELA";
3995 case SHT_HASH: return "HASH";
3996 case SHT_DYNAMIC: return "DYNAMIC";
3997 case SHT_NOTE: return "NOTE";
3998 case SHT_NOBITS: return "NOBITS";
3999 case SHT_REL: return "REL";
4000 case SHT_SHLIB: return "SHLIB";
4001 case SHT_DYNSYM: return "DYNSYM";
4002 case SHT_INIT_ARRAY: return "INIT_ARRAY";
4003 case SHT_FINI_ARRAY: return "FINI_ARRAY";
4004 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
4005 case SHT_GNU_HASH: return "GNU_HASH";
4006 case SHT_GROUP: return "GROUP";
4007 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
4008 case SHT_GNU_verdef: return "VERDEF";
4009 case SHT_GNU_verneed: return "VERNEED";
4010 case SHT_GNU_versym: return "VERSYM";
4011 case 0x6ffffff0: return "VERSYM";
4012 case 0x6ffffffc: return "VERDEF";
4013 case 0x7ffffffd: return "AUXILIARY";
4014 case 0x7fffffff: return "FILTER";
4015 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
4018 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4020 switch (elf_header.e_machine)
4023 case EM_MIPS_RS3_LE:
4024 result = get_mips_section_type_name (sh_type);
4027 result = get_parisc_section_type_name (sh_type);
4030 result = get_ia64_section_type_name (sh_type);
4035 result = get_x86_64_section_type_name (sh_type);
4038 result = get_aarch64_section_type_name (sh_type);
4041 result = get_arm_section_type_name (sh_type);
4044 result = get_tic6x_section_type_name (sh_type);
4047 result = get_msp430x_section_type_name (sh_type);
4051 case EM_CYGNUS_V850:
4052 result = get_v850_section_type_name (sh_type);
4062 sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4064 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4066 switch (elf_header.e_machine)
4069 result = get_ia64_section_type_name (sh_type);
4072 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073 result = get_solaris_section_type (sh_type);
4082 sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4084 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4086 switch (elf_header.e_machine)
4090 case EM_CYGNUS_V850:
4091 result = get_v850_section_type_name (sh_type);
4101 sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4104 /* This message is probably going to be displayed in a 15
4105 character wide field, so put the hex value first. */
4106 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4112 #define OPTION_DEBUG_DUMP 512
4113 #define OPTION_DYN_SYMS 513
4114 #define OPTION_DWARF_DEPTH 514
4115 #define OPTION_DWARF_START 515
4116 #define OPTION_DWARF_CHECK 516
4118 static struct option options[] =
4120 {"all", no_argument, 0, 'a'},
4121 {"file-header", no_argument, 0, 'h'},
4122 {"program-headers", no_argument, 0, 'l'},
4123 {"headers", no_argument, 0, 'e'},
4124 {"histogram", no_argument, 0, 'I'},
4125 {"segments", no_argument, 0, 'l'},
4126 {"sections", no_argument, 0, 'S'},
4127 {"section-headers", no_argument, 0, 'S'},
4128 {"section-groups", no_argument, 0, 'g'},
4129 {"section-details", no_argument, 0, 't'},
4130 {"full-section-name",no_argument, 0, 'N'},
4131 {"symbols", no_argument, 0, 's'},
4132 {"syms", no_argument, 0, 's'},
4133 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
4134 {"relocs", no_argument, 0, 'r'},
4135 {"notes", no_argument, 0, 'n'},
4136 {"dynamic", no_argument, 0, 'd'},
4137 {"arch-specific", no_argument, 0, 'A'},
4138 {"version-info", no_argument, 0, 'V'},
4139 {"use-dynamic", no_argument, 0, 'D'},
4140 {"unwind", no_argument, 0, 'u'},
4141 {"archive-index", no_argument, 0, 'c'},
4142 {"hex-dump", required_argument, 0, 'x'},
4143 {"relocated-dump", required_argument, 0, 'R'},
4144 {"string-dump", required_argument, 0, 'p'},
4145 {"decompress", no_argument, 0, 'z'},
4146 #ifdef SUPPORT_DISASSEMBLY
4147 {"instruction-dump", required_argument, 0, 'i'},
4149 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
4151 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
4152 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
4153 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
4155 {"version", no_argument, 0, 'v'},
4156 {"wide", no_argument, 0, 'W'},
4157 {"help", no_argument, 0, 'H'},
4158 {0, no_argument, 0, 0}
4162 usage (FILE * stream)
4164 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166 fprintf (stream, _(" Options are:\n\
4167 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168 -h --file-header Display the ELF file header\n\
4169 -l --program-headers Display the program headers\n\
4170 --segments An alias for --program-headers\n\
4171 -S --section-headers Display the sections' header\n\
4172 --sections An alias for --section-headers\n\
4173 -g --section-groups Display the section groups\n\
4174 -t --section-details Display the section details\n\
4175 -e --headers Equivalent to: -h -l -S\n\
4176 -s --syms Display the symbol table\n\
4177 --symbols An alias for --syms\n\
4178 --dyn-syms Display the dynamic symbol table\n\
4179 -n --notes Display the core notes (if present)\n\
4180 -r --relocs Display the relocations (if present)\n\
4181 -u --unwind Display the unwind info (if present)\n\
4182 -d --dynamic Display the dynamic section (if present)\n\
4183 -V --version-info Display the version sections (if present)\n\
4184 -A --arch-specific Display architecture specific information (if any)\n\
4185 -c --archive-index Display the symbol/file index in an archive\n\
4186 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4187 -x --hex-dump=<number|name>\n\
4188 Dump the contents of section <number|name> as bytes\n\
4189 -p --string-dump=<number|name>\n\
4190 Dump the contents of section <number|name> as strings\n\
4191 -R --relocated-dump=<number|name>\n\
4192 Dump the contents of section <number|name> as relocated bytes\n\
4193 -z --decompress Decompress section before dumping it\n\
4194 -w[lLiaprmfFsoRt] or\n\
4195 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4196 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4197 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4199 Display the contents of DWARF2 debug sections\n"));
4200 fprintf (stream, _("\
4201 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4202 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4204 #ifdef SUPPORT_DISASSEMBLY
4205 fprintf (stream, _("\
4206 -i --instruction-dump=<number|name>\n\
4207 Disassemble the contents of section <number|name>\n"));
4209 fprintf (stream, _("\
4210 -I --histogram Display histogram of bucket list lengths\n\
4211 -W --wide Allow output width to exceed 80 characters\n\
4212 @<file> Read options from <file>\n\
4213 -H --help Display this information\n\
4214 -v --version Display the version number of readelf\n"));
4216 if (REPORT_BUGS_TO[0] && stream == stdout)
4217 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4219 exit (stream == stdout ? 0 : 1);
4222 /* Record the fact that the user wants the contents of section number
4223 SECTION to be displayed using the method(s) encoded as flags bits
4224 in TYPE. Note, TYPE can be zero if we are creating the array for
4228 request_dump_bynumber (unsigned int section, dump_type type)
4230 if (section >= num_dump_sects)
4232 dump_type * new_dump_sects;
4234 new_dump_sects = (dump_type *) calloc (section + 1,
4235 sizeof (* dump_sects));
4237 if (new_dump_sects == NULL)
4238 error (_("Out of memory allocating dump request table.\n"));
4241 /* Copy current flag settings. */
4242 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4246 dump_sects = new_dump_sects;
4247 num_dump_sects = section + 1;
4252 dump_sects[section] |= type;
4257 /* Request a dump by section name. */
4260 request_dump_byname (const char * section, dump_type type)
4262 struct dump_list_entry * new_request;
4264 new_request = (struct dump_list_entry *)
4265 malloc (sizeof (struct dump_list_entry));
4267 error (_("Out of memory allocating dump request table.\n"));
4269 new_request->name = strdup (section);
4270 if (!new_request->name)
4271 error (_("Out of memory allocating dump request table.\n"));
4273 new_request->type = type;
4275 new_request->next = dump_sects_byname;
4276 dump_sects_byname = new_request;
4280 request_dump (dump_type type)
4286 section = strtoul (optarg, & cp, 0);
4288 if (! *cp && section >= 0)
4289 request_dump_bynumber (section, type);
4291 request_dump_byname (optarg, type);
4296 parse_args (int argc, char ** argv)
4303 while ((c = getopt_long
4304 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4322 do_section_groups++;
4330 do_section_groups++;
4335 do_section_details++;
4379 request_dump (HEX_DUMP);
4382 request_dump (STRING_DUMP);
4385 request_dump (RELOC_DUMP);
4395 dwarf_select_sections_all ();
4400 dwarf_select_sections_by_letters (optarg);
4403 case OPTION_DEBUG_DUMP:
4410 dwarf_select_sections_by_names (optarg);
4413 case OPTION_DWARF_DEPTH:
4417 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4420 case OPTION_DWARF_START:
4424 dwarf_start_die = strtoul (optarg, & cp, 0);
4427 case OPTION_DWARF_CHECK:
4430 case OPTION_DYN_SYMS:
4433 #ifdef SUPPORT_DISASSEMBLY
4435 request_dump (DISASS_DUMP);
4439 print_version (program_name);
4448 /* xgettext:c-format */
4449 error (_("Invalid option '-%c'\n"), c);
4456 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4457 && !do_segments && !do_header && !do_dump && !do_version
4458 && !do_histogram && !do_debugging && !do_arch && !do_notes
4459 && !do_section_groups && !do_archive_index
4465 get_elf_class (unsigned int elf_class)
4467 static char buff[32];
4471 case ELFCLASSNONE: return _("none");
4472 case ELFCLASS32: return "ELF32";
4473 case ELFCLASS64: return "ELF64";
4475 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4481 get_data_encoding (unsigned int encoding)
4483 static char buff[32];
4487 case ELFDATANONE: return _("none");
4488 case ELFDATA2LSB: return _("2's complement, little endian");
4489 case ELFDATA2MSB: return _("2's complement, big endian");
4491 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4496 /* Decode the data held in 'elf_header'. */
4499 process_file_header (void)
4501 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4502 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4507 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4511 init_dwarf_regnames (elf_header.e_machine);
4517 printf (_("ELF Header:\n"));
4518 printf (_(" Magic: "));
4519 for (i = 0; i < EI_NIDENT; i++)
4520 printf ("%2.2x ", elf_header.e_ident[i]);
4522 printf (_(" Class: %s\n"),
4523 get_elf_class (elf_header.e_ident[EI_CLASS]));
4524 printf (_(" Data: %s\n"),
4525 get_data_encoding (elf_header.e_ident[EI_DATA]));
4526 printf (_(" Version: %d %s\n"),
4527 elf_header.e_ident[EI_VERSION],
4528 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4530 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4531 ? _("<unknown: %lx>")
4533 printf (_(" OS/ABI: %s\n"),
4534 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4535 printf (_(" ABI Version: %d\n"),
4536 elf_header.e_ident[EI_ABIVERSION]);
4537 printf (_(" Type: %s\n"),
4538 get_file_type (elf_header.e_type));
4539 printf (_(" Machine: %s\n"),
4540 get_machine_name (elf_header.e_machine));
4541 printf (_(" Version: 0x%lx\n"),
4542 (unsigned long) elf_header.e_version);
4544 printf (_(" Entry point address: "));
4545 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546 printf (_("\n Start of program headers: "));
4547 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548 printf (_(" (bytes into file)\n Start of section headers: "));
4549 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550 printf (_(" (bytes into file)\n"));
4552 printf (_(" Flags: 0x%lx%s\n"),
4553 (unsigned long) elf_header.e_flags,
4554 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555 printf (_(" Size of this header: %ld (bytes)\n"),
4556 (long) elf_header.e_ehsize);
4557 printf (_(" Size of program headers: %ld (bytes)\n"),
4558 (long) elf_header.e_phentsize);
4559 printf (_(" Number of program headers: %ld"),
4560 (long) elf_header.e_phnum);
4561 if (section_headers != NULL
4562 && elf_header.e_phnum == PN_XNUM
4563 && section_headers[0].sh_info != 0)
4564 printf (" (%ld)", (long) section_headers[0].sh_info);
4565 putc ('\n', stdout);
4566 printf (_(" Size of section headers: %ld (bytes)\n"),
4567 (long) elf_header.e_shentsize);
4568 printf (_(" Number of section headers: %ld"),
4569 (long) elf_header.e_shnum);
4570 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4571 printf (" (%ld)", (long) section_headers[0].sh_size);
4572 putc ('\n', stdout);
4573 printf (_(" Section header string table index: %ld"),
4574 (long) elf_header.e_shstrndx);
4575 if (section_headers != NULL
4576 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4577 printf (" (%u)", section_headers[0].sh_link);
4578 else if (elf_header.e_shstrndx != SHN_UNDEF
4579 && elf_header.e_shstrndx >= elf_header.e_shnum)
4580 printf (_(" <corrupt: out of range>"));
4581 putc ('\n', stdout);
4584 if (section_headers != NULL)
4586 if (elf_header.e_phnum == PN_XNUM
4587 && section_headers[0].sh_info != 0)
4588 elf_header.e_phnum = section_headers[0].sh_info;
4589 if (elf_header.e_shnum == SHN_UNDEF)
4590 elf_header.e_shnum = section_headers[0].sh_size;
4591 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4592 elf_header.e_shstrndx = section_headers[0].sh_link;
4593 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4594 elf_header.e_shstrndx = SHN_UNDEF;
4595 free (section_headers);
4596 section_headers = NULL;
4603 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4605 Elf32_External_Phdr * phdrs;
4606 Elf32_External_Phdr * external;
4607 Elf_Internal_Phdr * internal;
4609 unsigned int size = elf_header.e_phentsize;
4610 unsigned int num = elf_header.e_phnum;
4612 /* PR binutils/17531: Cope with unexpected section header sizes. */
4613 if (size == 0 || num == 0)
4615 if (size < sizeof * phdrs)
4617 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4620 if (size > sizeof * phdrs)
4621 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4623 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4624 size, num, _("program headers"));
4628 for (i = 0, internal = pheaders, external = phdrs;
4629 i < elf_header.e_phnum;
4630 i++, internal++, external++)
4632 internal->p_type = BYTE_GET (external->p_type);
4633 internal->p_offset = BYTE_GET (external->p_offset);
4634 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4635 internal->p_paddr = BYTE_GET (external->p_paddr);
4636 internal->p_filesz = BYTE_GET (external->p_filesz);
4637 internal->p_memsz = BYTE_GET (external->p_memsz);
4638 internal->p_flags = BYTE_GET (external->p_flags);
4639 internal->p_align = BYTE_GET (external->p_align);
4647 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4649 Elf64_External_Phdr * phdrs;
4650 Elf64_External_Phdr * external;
4651 Elf_Internal_Phdr * internal;
4653 unsigned int size = elf_header.e_phentsize;
4654 unsigned int num = elf_header.e_phnum;
4656 /* PR binutils/17531: Cope with unexpected section header sizes. */
4657 if (size == 0 || num == 0)
4659 if (size < sizeof * phdrs)
4661 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4664 if (size > sizeof * phdrs)
4665 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4667 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4668 size, num, _("program headers"));
4672 for (i = 0, internal = pheaders, external = phdrs;
4673 i < elf_header.e_phnum;
4674 i++, internal++, external++)
4676 internal->p_type = BYTE_GET (external->p_type);
4677 internal->p_flags = BYTE_GET (external->p_flags);
4678 internal->p_offset = BYTE_GET (external->p_offset);
4679 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4680 internal->p_paddr = BYTE_GET (external->p_paddr);
4681 internal->p_filesz = BYTE_GET (external->p_filesz);
4682 internal->p_memsz = BYTE_GET (external->p_memsz);
4683 internal->p_align = BYTE_GET (external->p_align);
4690 /* Returns 1 if the program headers were read into `program_headers'. */
4693 get_program_headers (FILE * file)
4695 Elf_Internal_Phdr * phdrs;
4697 /* Check cache of prior read. */
4698 if (program_headers != NULL)
4701 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702 sizeof (Elf_Internal_Phdr));
4706 error (_("Out of memory reading %u program headers\n"),
4707 elf_header.e_phnum);
4712 ? get_32bit_program_headers (file, phdrs)
4713 : get_64bit_program_headers (file, phdrs))
4715 program_headers = phdrs;
4723 /* Returns 1 if the program headers were loaded. */
4726 process_program_headers (FILE * file)
4728 Elf_Internal_Phdr * segment;
4731 if (elf_header.e_phnum == 0)
4733 /* PR binutils/12467. */
4734 if (elf_header.e_phoff != 0)
4735 warn (_("possibly corrupt ELF header - it has a non-zero program"
4736 " header offset, but no program headers\n"));
4737 else if (do_segments)
4738 printf (_("\nThere are no program headers in this file.\n"));
4742 if (do_segments && !do_header)
4744 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745 printf (_("Entry point "));
4746 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747 printf (_("\nThere are %d program headers, starting at offset "),
4748 elf_header.e_phnum);
4749 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4753 if (! get_program_headers (file))
4758 if (elf_header.e_phnum > 1)
4759 printf (_("\nProgram Headers:\n"));
4761 printf (_("\nProgram Headers:\n"));
4765 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4768 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4772 (_(" Type Offset VirtAddr PhysAddr\n"));
4774 (_(" FileSiz MemSiz Flags Align\n"));
4781 for (i = 0, segment = program_headers;
4782 i < elf_header.e_phnum;
4787 printf (" %-14.14s ", get_segment_type (segment->p_type));
4791 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4797 (segment->p_flags & PF_R ? 'R' : ' '),
4798 (segment->p_flags & PF_W ? 'W' : ' '),
4799 (segment->p_flags & PF_X ? 'E' : ' '));
4800 printf ("%#lx", (unsigned long) segment->p_align);
4804 if ((unsigned long) segment->p_offset == segment->p_offset)
4805 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4808 print_vma (segment->p_offset, FULL_HEX);
4812 print_vma (segment->p_vaddr, FULL_HEX);
4814 print_vma (segment->p_paddr, FULL_HEX);
4817 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4821 print_vma (segment->p_filesz, FULL_HEX);
4825 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4829 print_vma (segment->p_memsz, FULL_HEX);
4833 (segment->p_flags & PF_R ? 'R' : ' '),
4834 (segment->p_flags & PF_W ? 'W' : ' '),
4835 (segment->p_flags & PF_X ? 'E' : ' '));
4837 if ((unsigned long) segment->p_align == segment->p_align)
4838 printf ("%#lx", (unsigned long) segment->p_align);
4841 print_vma (segment->p_align, PREFIX_HEX);
4846 print_vma (segment->p_offset, FULL_HEX);
4848 print_vma (segment->p_vaddr, FULL_HEX);
4850 print_vma (segment->p_paddr, FULL_HEX);
4852 print_vma (segment->p_filesz, FULL_HEX);
4854 print_vma (segment->p_memsz, FULL_HEX);
4856 (segment->p_flags & PF_R ? 'R' : ' '),
4857 (segment->p_flags & PF_W ? 'W' : ' '),
4858 (segment->p_flags & PF_X ? 'E' : ' '));
4859 print_vma (segment->p_align, HEX);
4864 putc ('\n', stdout);
4866 switch (segment->p_type)
4870 error (_("more than one dynamic segment\n"));
4872 /* By default, assume that the .dynamic section is the first
4873 section in the DYNAMIC segment. */
4874 dynamic_addr = segment->p_offset;
4875 dynamic_size = segment->p_filesz;
4876 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4877 if (dynamic_addr + dynamic_size >= current_file_size)
4879 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880 dynamic_addr = dynamic_size = 0;
4883 /* Try to locate the .dynamic section. If there is
4884 a section header table, we can easily locate it. */
4885 if (section_headers != NULL)
4887 Elf_Internal_Shdr * sec;
4889 sec = find_section (".dynamic");
4890 if (sec == NULL || sec->sh_size == 0)
4892 /* A corresponding .dynamic section is expected, but on
4893 IA-64/OpenVMS it is OK for it to be missing. */
4894 if (!is_ia64_vms ())
4895 error (_("no .dynamic section in the dynamic segment\n"));
4899 if (sec->sh_type == SHT_NOBITS)
4905 dynamic_addr = sec->sh_offset;
4906 dynamic_size = sec->sh_size;
4908 if (dynamic_addr < segment->p_offset
4909 || dynamic_addr > segment->p_offset + segment->p_filesz)
4910 warn (_("the .dynamic section is not contained"
4911 " within the dynamic segment\n"));
4912 else if (dynamic_addr > segment->p_offset)
4913 warn (_("the .dynamic section is not the first section"
4914 " in the dynamic segment.\n"));
4919 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4921 error (_("Unable to find program interpreter name\n"));
4925 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4927 if (ret >= (int) sizeof (fmt) || ret < 0)
4928 error (_("Internal error: failed to create format string to display program interpreter\n"));
4930 program_interpreter[0] = 0;
4931 if (fscanf (file, fmt, program_interpreter) <= 0)
4932 error (_("Unable to read program interpreter name\n"));
4935 printf (_(" [Requesting program interpreter: %s]\n"),
4936 program_interpreter);
4942 if (do_segments && section_headers != NULL && string_table != NULL)
4944 printf (_("\n Section to Segment mapping:\n"));
4945 printf (_(" Segment Sections...\n"));
4947 for (i = 0; i < elf_header.e_phnum; i++)
4950 Elf_Internal_Shdr * section;
4952 segment = program_headers + i;
4953 section = section_headers + 1;
4955 printf (" %2.2d ", i);
4957 for (j = 1; j < elf_header.e_shnum; j++, section++)
4959 if (!ELF_TBSS_SPECIAL (section, segment)
4960 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4961 printf ("%s ", printable_section_name (section));
4972 /* Find the file offset corresponding to VMA by using the program headers. */
4975 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4977 Elf_Internal_Phdr * seg;
4979 if (! get_program_headers (file))
4981 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4985 for (seg = program_headers;
4986 seg < program_headers + elf_header.e_phnum;
4989 if (seg->p_type != PT_LOAD)
4992 if (vma >= (seg->p_vaddr & -seg->p_align)
4993 && vma + size <= seg->p_vaddr + seg->p_filesz)
4994 return vma - seg->p_vaddr + seg->p_offset;
4997 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4998 (unsigned long) vma);
5003 /* Allocate memory and load the sections headers into the global pointer
5004 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
5005 generate any error messages if the load fails. */
5008 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5010 Elf32_External_Shdr * shdrs;
5011 Elf_Internal_Shdr * internal;
5013 unsigned int size = elf_header.e_shentsize;
5014 unsigned int num = probe ? 1 : elf_header.e_shnum;
5016 /* PR binutils/17531: Cope with unexpected section header sizes. */
5017 if (size == 0 || num == 0)
5019 if (size < sizeof * shdrs)
5022 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5025 if (!probe && size > sizeof * shdrs)
5026 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5028 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5030 probe ? NULL : _("section headers"));
5034 if (section_headers != NULL)
5035 free (section_headers);
5036 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037 sizeof (Elf_Internal_Shdr));
5038 if (section_headers == NULL)
5041 error (_("Out of memory reading %u section headers\n"), num);
5045 for (i = 0, internal = section_headers;
5049 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5050 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5051 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5052 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5053 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5054 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5055 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5056 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5057 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5059 if (!probe && internal->sh_link > num)
5060 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5070 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5072 Elf64_External_Shdr * shdrs;
5073 Elf_Internal_Shdr * internal;
5075 unsigned int size = elf_header.e_shentsize;
5076 unsigned int num = probe ? 1 : elf_header.e_shnum;
5078 /* PR binutils/17531: Cope with unexpected section header sizes. */
5079 if (size == 0 || num == 0)
5081 if (size < sizeof * shdrs)
5084 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5087 if (! probe && size > sizeof * shdrs)
5088 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5090 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5092 probe ? NULL : _("section headers"));
5096 if (section_headers != NULL)
5097 free (section_headers);
5098 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099 sizeof (Elf_Internal_Shdr));
5100 if (section_headers == NULL)
5103 error (_("Out of memory reading %u section headers\n"), num);
5107 for (i = 0, internal = section_headers;
5111 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
5112 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
5113 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
5114 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
5115 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
5116 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
5117 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
5118 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
5119 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
5120 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5121 if (!probe && internal->sh_link > num)
5122 warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123 if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124 warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5131 static Elf_Internal_Sym *
5132 get_32bit_elf_symbols (FILE * file,
5133 Elf_Internal_Shdr * section,
5134 unsigned long * num_syms_return)
5136 unsigned long number = 0;
5137 Elf32_External_Sym * esyms = NULL;
5138 Elf_External_Sym_Shndx * shndx = NULL;
5139 Elf_Internal_Sym * isyms = NULL;
5140 Elf_Internal_Sym * psym;
5143 if (section->sh_size == 0)
5145 if (num_syms_return != NULL)
5146 * num_syms_return = 0;
5150 /* Run some sanity checks first. */
5151 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5153 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154 printable_section_name (section), (unsigned long) section->sh_entsize);
5158 if (section->sh_size > current_file_size)
5160 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5161 printable_section_name (section), (unsigned long) section->sh_size);
5165 number = section->sh_size / section->sh_entsize;
5167 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5169 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5170 (unsigned long) section->sh_size,
5171 printable_section_name (section),
5172 (unsigned long) section->sh_entsize);
5176 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177 section->sh_size, _("symbols"));
5182 elf_section_list * entry;
5185 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5188 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189 entry->hdr->sh_offset,
5190 1, entry->hdr->sh_size,
5191 _("symbol table section indicies"));
5194 /* PR17531: file: heap-buffer-overflow */
5195 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5197 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198 printable_section_name (entry->hdr),
5199 (unsigned long) entry->hdr->sh_size,
5200 (unsigned long) section->sh_size);
5206 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5210 error (_("Out of memory reading %lu symbols\n"),
5211 (unsigned long) number);
5215 for (j = 0, psym = isyms; j < number; j++, psym++)
5217 psym->st_name = BYTE_GET (esyms[j].st_name);
5218 psym->st_value = BYTE_GET (esyms[j].st_value);
5219 psym->st_size = BYTE_GET (esyms[j].st_size);
5220 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5221 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5223 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5224 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5226 psym->st_info = BYTE_GET (esyms[j].st_info);
5227 psym->st_other = BYTE_GET (esyms[j].st_other);
5236 if (num_syms_return != NULL)
5237 * num_syms_return = isyms == NULL ? 0 : number;
5242 static Elf_Internal_Sym *
5243 get_64bit_elf_symbols (FILE * file,
5244 Elf_Internal_Shdr * section,
5245 unsigned long * num_syms_return)
5247 unsigned long number = 0;
5248 Elf64_External_Sym * esyms = NULL;
5249 Elf_External_Sym_Shndx * shndx = NULL;
5250 Elf_Internal_Sym * isyms = NULL;
5251 Elf_Internal_Sym * psym;
5254 if (section->sh_size == 0)
5256 if (num_syms_return != NULL)
5257 * num_syms_return = 0;
5261 /* Run some sanity checks first. */
5262 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5264 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5265 printable_section_name (section),
5266 (unsigned long) section->sh_entsize);
5270 if (section->sh_size > current_file_size)
5272 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5273 printable_section_name (section),
5274 (unsigned long) section->sh_size);
5278 number = section->sh_size / section->sh_entsize;
5280 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5282 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5283 (unsigned long) section->sh_size,
5284 printable_section_name (section),
5285 (unsigned long) section->sh_entsize);
5289 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290 section->sh_size, _("symbols"));
5295 elf_section_list * entry;
5298 for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299 if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5301 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302 entry->hdr->sh_offset,
5303 1, entry->hdr->sh_size,
5304 _("symbol table section indicies"));
5307 /* PR17531: file: heap-buffer-overflow */
5308 else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5310 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311 printable_section_name (entry->hdr),
5312 (unsigned long) entry->hdr->sh_size,
5313 (unsigned long) section->sh_size);
5319 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5323 error (_("Out of memory reading %lu symbols\n"),
5324 (unsigned long) number);
5328 for (j = 0, psym = isyms; j < number; j++, psym++)
5330 psym->st_name = BYTE_GET (esyms[j].st_name);
5331 psym->st_info = BYTE_GET (esyms[j].st_info);
5332 psym->st_other = BYTE_GET (esyms[j].st_other);
5333 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5335 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5337 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5338 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5341 psym->st_value = BYTE_GET (esyms[j].st_value);
5342 psym->st_size = BYTE_GET (esyms[j].st_size);
5351 if (num_syms_return != NULL)
5352 * num_syms_return = isyms == NULL ? 0 : number;
5358 get_elf_section_flags (bfd_vma sh_flags)
5360 static char buff[1024];
5362 int field_size = is_32bit_elf ? 8 : 16;
5364 int size = sizeof (buff) - (field_size + 4 + 1);
5365 bfd_vma os_flags = 0;
5366 bfd_vma proc_flags = 0;
5367 bfd_vma unknown_flags = 0;
5375 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5376 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5377 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5378 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5379 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5380 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5384 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5385 /* IA-64 specific. */
5386 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388 /* IA-64 OpenVMS specific. */
5389 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5396 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5397 /* SPARC specific. */
5398 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5399 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5401 /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5402 /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5403 /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5406 if (do_section_details)
5408 sprintf (buff, "[%*.*lx]: ",
5409 field_size, field_size, (unsigned long) sh_flags);
5410 p += field_size + 4;
5417 flag = sh_flags & - sh_flags;
5420 if (do_section_details)
5424 case SHF_WRITE: sindex = 0; break;
5425 case SHF_ALLOC: sindex = 1; break;
5426 case SHF_EXECINSTR: sindex = 2; break;
5427 case SHF_MERGE: sindex = 3; break;
5428 case SHF_STRINGS: sindex = 4; break;
5429 case SHF_INFO_LINK: sindex = 5; break;
5430 case SHF_LINK_ORDER: sindex = 6; break;
5431 case SHF_OS_NONCONFORMING: sindex = 7; break;
5432 case SHF_GROUP: sindex = 8; break;
5433 case SHF_TLS: sindex = 9; break;
5434 case SHF_EXCLUDE: sindex = 18; break;
5435 case SHF_COMPRESSED: sindex = 20; break;
5439 switch (elf_header.e_machine)
5442 if (flag == SHF_IA_64_SHORT)
5444 else if (flag == SHF_IA_64_NORECOV)
5447 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5450 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5451 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5452 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5453 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5454 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5466 case EM_OLD_SPARCV9:
5467 case EM_SPARC32PLUS:
5470 if (flag == SHF_ORDERED)
5477 case SHF_ENTRYSECT: sindex = 21; break;
5478 case SHF_ARM_PURECODE: sindex = 22; break;
5479 case SHF_COMDEF: sindex = 23; break;
5491 if (p != buff + field_size + 4)
5493 if (size < (10 + 2))
5495 warn (_("Internal error: not enough buffer room for section flag info"));
5496 return _("<unknown>");
5503 size -= flags [sindex].len;
5504 p = stpcpy (p, flags [sindex].str);
5506 else if (flag & SHF_MASKOS)
5508 else if (flag & SHF_MASKPROC)
5511 unknown_flags |= flag;
5517 case SHF_WRITE: *p = 'W'; break;
5518 case SHF_ALLOC: *p = 'A'; break;
5519 case SHF_EXECINSTR: *p = 'X'; break;
5520 case SHF_MERGE: *p = 'M'; break;
5521 case SHF_STRINGS: *p = 'S'; break;
5522 case SHF_INFO_LINK: *p = 'I'; break;
5523 case SHF_LINK_ORDER: *p = 'L'; break;
5524 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5525 case SHF_GROUP: *p = 'G'; break;
5526 case SHF_TLS: *p = 'T'; break;
5527 case SHF_EXCLUDE: *p = 'E'; break;
5528 case SHF_COMPRESSED: *p = 'C'; break;
5531 if ((elf_header.e_machine == EM_X86_64
5532 || elf_header.e_machine == EM_L1OM
5533 || elf_header.e_machine == EM_K1OM)
5534 && flag == SHF_X86_64_LARGE)
5536 else if (elf_header.e_machine == EM_ARM
5537 && flag == SHF_ARM_PURECODE)
5539 else if (flag & SHF_MASKOS)
5542 sh_flags &= ~ SHF_MASKOS;
5544 else if (flag & SHF_MASKPROC)
5547 sh_flags &= ~ SHF_MASKPROC;
5557 if (do_section_details)
5561 size -= 5 + field_size;
5562 if (p != buff + field_size + 4)
5566 warn (_("Internal error: not enough buffer room for section flag info"));
5567 return _("<unknown>");
5573 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574 (unsigned long) os_flags);
5575 p += 5 + field_size;
5579 size -= 7 + field_size;
5580 if (p != buff + field_size + 4)
5584 warn (_("Internal error: not enough buffer room for section flag info"));
5585 return _("<unknown>");
5591 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592 (unsigned long) proc_flags);
5593 p += 7 + field_size;
5597 size -= 10 + field_size;
5598 if (p != buff + field_size + 4)
5602 warn (_("Internal error: not enough buffer room for section flag info"));
5603 return _("<unknown>");
5609 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5610 (unsigned long) unknown_flags);
5611 p += 10 + field_size;
5620 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5624 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5626 chdr->ch_type = BYTE_GET (echdr->ch_type);
5627 chdr->ch_size = BYTE_GET (echdr->ch_size);
5628 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5629 return sizeof (*echdr);
5633 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5635 chdr->ch_type = BYTE_GET (echdr->ch_type);
5636 chdr->ch_size = BYTE_GET (echdr->ch_size);
5637 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5638 return sizeof (*echdr);
5643 process_section_headers (FILE * file)
5645 Elf_Internal_Shdr * section;
5648 section_headers = NULL;
5650 if (elf_header.e_shnum == 0)
5652 /* PR binutils/12467. */
5653 if (elf_header.e_shoff != 0)
5654 warn (_("possibly corrupt ELF file header - it has a non-zero"
5655 " section header offset, but no section headers\n"));
5656 else if (do_sections)
5657 printf (_("\nThere are no sections in this file.\n"));
5662 if (do_sections && !do_header)
5663 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5664 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5668 if (! get_32bit_section_headers (file, FALSE))
5671 else if (! get_64bit_section_headers (file, FALSE))
5674 /* Read in the string table, so that we have names to display. */
5675 if (elf_header.e_shstrndx != SHN_UNDEF
5676 && elf_header.e_shstrndx < elf_header.e_shnum)
5678 section = section_headers + elf_header.e_shstrndx;
5680 if (section->sh_size != 0)
5682 string_table = (char *) get_data (NULL, file, section->sh_offset,
5683 1, section->sh_size,
5686 string_table_length = string_table != NULL ? section->sh_size : 0;
5690 /* Scan the sections for the dynamic symbol table
5691 and dynamic string table and debug sections. */
5692 dynamic_symbols = NULL;
5693 dynamic_strings = NULL;
5694 dynamic_syminfo = NULL;
5695 symtab_shndx_list = NULL;
5697 eh_addr_size = is_32bit_elf ? 4 : 8;
5698 switch (elf_header.e_machine)
5701 case EM_MIPS_RS3_LE:
5702 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5703 FDE addresses. However, the ABI also has a semi-official ILP32
5704 variant for which the normal FDE address size rules apply.
5706 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5707 section, where XX is the size of longs in bits. Unfortunately,
5708 earlier compilers provided no way of distinguishing ILP32 objects
5709 from LP64 objects, so if there's any doubt, we should assume that
5710 the official LP64 form is being used. */
5711 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5712 && find_section (".gcc_compiled_long32") == NULL)
5718 switch (elf_header.e_flags & EF_H8_MACH)
5720 case E_H8_MACH_H8300:
5721 case E_H8_MACH_H8300HN:
5722 case E_H8_MACH_H8300SN:
5723 case E_H8_MACH_H8300SXN:
5726 case E_H8_MACH_H8300H:
5727 case E_H8_MACH_H8300S:
5728 case E_H8_MACH_H8300SX:
5736 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5738 case EF_M32C_CPU_M16C:
5745 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5748 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5749 if (section->sh_entsize != expected_entsize) \
5752 sprintf_vma (buf, section->sh_entsize); \
5753 /* Note: coded this way so that there is a single string for \
5755 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5756 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5757 (unsigned) expected_entsize); \
5758 section->sh_entsize = expected_entsize; \
5763 #define CHECK_ENTSIZE(section, i, type) \
5764 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5765 sizeof (Elf64_External_##type))
5767 for (i = 0, section = section_headers;
5768 i < elf_header.e_shnum;
5771 char * name = SECTION_NAME (section);
5773 if (section->sh_type == SHT_DYNSYM)
5775 if (dynamic_symbols != NULL)
5777 error (_("File contains multiple dynamic symbol tables\n"));
5781 CHECK_ENTSIZE (section, i, Sym);
5782 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5784 else if (section->sh_type == SHT_STRTAB
5785 && streq (name, ".dynstr"))
5787 if (dynamic_strings != NULL)
5789 error (_("File contains multiple dynamic string tables\n"));
5793 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5794 1, section->sh_size,
5795 _("dynamic strings"));
5796 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5798 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5800 elf_section_list * entry = xmalloc (sizeof * entry);
5801 entry->hdr = section;
5802 entry->next = symtab_shndx_list;
5803 symtab_shndx_list = entry;
5805 else if (section->sh_type == SHT_SYMTAB)
5806 CHECK_ENTSIZE (section, i, Sym);
5807 else if (section->sh_type == SHT_GROUP)
5808 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5809 else if (section->sh_type == SHT_REL)
5810 CHECK_ENTSIZE (section, i, Rel);
5811 else if (section->sh_type == SHT_RELA)
5812 CHECK_ENTSIZE (section, i, Rela);
5813 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5814 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5815 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5816 || do_debug_str || do_debug_loc || do_debug_ranges
5817 || do_debug_addr || do_debug_cu_index)
5818 && (const_strneq (name, ".debug_")
5819 || const_strneq (name, ".zdebug_")))
5822 name += sizeof (".zdebug_") - 1;
5824 name += sizeof (".debug_") - 1;
5827 || (do_debug_info && const_strneq (name, "info"))
5828 || (do_debug_info && const_strneq (name, "types"))
5829 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5830 || (do_debug_lines && strcmp (name, "line") == 0)
5831 || (do_debug_lines && const_strneq (name, "line."))
5832 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5833 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5834 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5835 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5836 || (do_debug_aranges && const_strneq (name, "aranges"))
5837 || (do_debug_ranges && const_strneq (name, "ranges"))
5838 || (do_debug_frames && const_strneq (name, "frame"))
5839 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5840 || (do_debug_macinfo && const_strneq (name, "macro"))
5841 || (do_debug_str && const_strneq (name, "str"))
5842 || (do_debug_loc && const_strneq (name, "loc"))
5843 || (do_debug_addr && const_strneq (name, "addr"))
5844 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5845 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5847 request_dump_bynumber (i, DEBUG_DUMP);
5849 /* Linkonce section to be combined with .debug_info at link time. */
5850 else if ((do_debugging || do_debug_info)
5851 && const_strneq (name, ".gnu.linkonce.wi."))
5852 request_dump_bynumber (i, DEBUG_DUMP);
5853 else if (do_debug_frames && streq (name, ".eh_frame"))
5854 request_dump_bynumber (i, DEBUG_DUMP);
5855 else if (do_gdb_index && streq (name, ".gdb_index"))
5856 request_dump_bynumber (i, DEBUG_DUMP);
5857 /* Trace sections for Itanium VMS. */
5858 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5859 || do_trace_aranges)
5860 && const_strneq (name, ".trace_"))
5862 name += sizeof (".trace_") - 1;
5865 || (do_trace_info && streq (name, "info"))
5866 || (do_trace_abbrevs && streq (name, "abbrev"))
5867 || (do_trace_aranges && streq (name, "aranges"))
5869 request_dump_bynumber (i, DEBUG_DUMP);
5876 if (elf_header.e_shnum > 1)
5877 printf (_("\nSection Headers:\n"));
5879 printf (_("\nSection Header:\n"));
5883 if (do_section_details)
5885 printf (_(" [Nr] Name\n"));
5886 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5890 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5894 if (do_section_details)
5896 printf (_(" [Nr] Name\n"));
5897 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5901 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5905 if (do_section_details)
5907 printf (_(" [Nr] Name\n"));
5908 printf (_(" Type Address Offset Link\n"));
5909 printf (_(" Size EntSize Info Align\n"));
5913 printf (_(" [Nr] Name Type Address Offset\n"));
5914 printf (_(" Size EntSize Flags Link Info Align\n"));
5918 if (do_section_details)
5919 printf (_(" Flags\n"));
5921 for (i = 0, section = section_headers;
5922 i < elf_header.e_shnum;
5925 /* Run some sanity checks on the section header. */
5927 /* Check the sh_link field. */
5928 switch (section->sh_type)
5930 case SHT_SYMTAB_SHNDX:
5934 case SHT_GNU_versym:
5937 if (section->sh_link < 1
5938 || section->sh_link > elf_header.e_shnum
5939 || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
5940 && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
5941 warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5942 i, section->sh_link);
5948 case SHT_GNU_verneed:
5949 case SHT_GNU_verdef:
5950 case SHT_GNU_LIBLIST:
5951 if (section->sh_link < 1
5952 || section->sh_link > elf_header.e_shnum
5953 || section_headers[section->sh_link].sh_type != SHT_STRTAB)
5954 warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5955 i, section->sh_link);
5958 case SHT_INIT_ARRAY:
5959 case SHT_FINI_ARRAY:
5960 case SHT_PREINIT_ARRAY:
5961 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5962 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5963 i, section->sh_link);
5967 /* FIXME: Add support for target specific section types. */
5968 #if 0 /* Currently we do not check other section types as there are too
5969 many special cases. Stab sections for example have a type
5970 of SHT_PROGBITS but an sh_link field that links to the .stabstr
5972 if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5973 warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5974 i, section->sh_link);
5979 /* Check the sh_info field. */
5980 switch (section->sh_type)
5984 if (section->sh_info < 1
5985 || section->sh_info > elf_header.e_shnum
5986 || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
5987 && section_headers[section->sh_info].sh_type != SHT_NOBITS
5988 && section_headers[section->sh_info].sh_type != SHT_NOTE
5989 && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
5990 /* FIXME: Are other section types valid ? */
5991 && section_headers[section->sh_info].sh_type < SHT_LOOS))
5993 if (section->sh_info == 0
5994 && (streq (SECTION_NAME (section), ".rel.dyn")
5995 || streq (SECTION_NAME (section), ".rela.dyn")))
5996 /* The .rel.dyn and .rela.dyn sections have an sh_info field
5997 of zero. No idea why. I would have expected the index
5998 of the .plt section. */
6001 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6002 i, section->sh_info);
6008 case SHT_SYMTAB_SHNDX:
6009 case SHT_INIT_ARRAY:
6010 case SHT_FINI_ARRAY:
6011 case SHT_PREINIT_ARRAY:
6012 if (section->sh_info != 0)
6013 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6014 i, section->sh_info);
6020 /* A symbol index - we assume that it is valid. */
6024 /* FIXME: Add support for target specific section types. */
6025 if (section->sh_type == SHT_NOBITS)
6026 /* NOBITS section headers with non-zero sh_info fields can be
6027 created when a binary is stripped of everything but its debug
6028 information. The stripped sections have their headers preserved but their types set to SHT_NOBITS. so do not check this type of section. */
6030 else if (section->sh_flags & SHF_INFO_LINK)
6032 if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum)
6033 warn (_("[%2u]: Expected link to another section in info field"), i);
6035 else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6036 warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6037 i, section->sh_info);
6041 printf (" [%2u] ", i);
6042 if (do_section_details)
6043 printf ("%s\n ", printable_section_name (section));
6045 print_symbol (-17, SECTION_NAME (section));
6047 printf (do_wide ? " %-15s " : " %-15.15s ",
6048 get_section_type_name (section->sh_type));
6052 const char * link_too_big = NULL;
6054 print_vma (section->sh_addr, LONG_HEX);
6056 printf ( " %6.6lx %6.6lx %2.2lx",
6057 (unsigned long) section->sh_offset,
6058 (unsigned long) section->sh_size,
6059 (unsigned long) section->sh_entsize);
6061 if (do_section_details)
6062 fputs (" ", stdout);
6064 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6066 if (section->sh_link >= elf_header.e_shnum)
6069 /* The sh_link value is out of range. Normally this indicates
6070 an error but it can have special values in Solaris binaries. */
6071 switch (elf_header.e_machine)
6078 case EM_OLD_SPARCV9:
6079 case EM_SPARC32PLUS:
6082 if (section->sh_link == (SHN_BEFORE & 0xffff))
6083 link_too_big = "BEFORE";
6084 else if (section->sh_link == (SHN_AFTER & 0xffff))
6085 link_too_big = "AFTER";
6092 if (do_section_details)
6094 if (link_too_big != NULL && * link_too_big)
6095 printf ("<%s> ", link_too_big);
6097 printf ("%2u ", section->sh_link);
6098 printf ("%3u %2lu\n", section->sh_info,
6099 (unsigned long) section->sh_addralign);
6102 printf ("%2u %3u %2lu\n",
6105 (unsigned long) section->sh_addralign);
6107 if (link_too_big && ! * link_too_big)
6108 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6109 i, section->sh_link);
6113 print_vma (section->sh_addr, LONG_HEX);
6115 if ((long) section->sh_offset == section->sh_offset)
6116 printf (" %6.6lx", (unsigned long) section->sh_offset);
6120 print_vma (section->sh_offset, LONG_HEX);
6123 if ((unsigned long) section->sh_size == section->sh_size)
6124 printf (" %6.6lx", (unsigned long) section->sh_size);
6128 print_vma (section->sh_size, LONG_HEX);
6131 if ((unsigned long) section->sh_entsize == section->sh_entsize)
6132 printf (" %2.2lx", (unsigned long) section->sh_entsize);
6136 print_vma (section->sh_entsize, LONG_HEX);
6139 if (do_section_details)
6140 fputs (" ", stdout);
6142 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6144 printf ("%2u %3u ", section->sh_link, section->sh_info);
6146 if ((unsigned long) section->sh_addralign == section->sh_addralign)
6147 printf ("%2lu\n", (unsigned long) section->sh_addralign);
6150 print_vma (section->sh_addralign, DEC);
6154 else if (do_section_details)
6156 printf (" %-15.15s ",
6157 get_section_type_name (section->sh_type));
6158 print_vma (section->sh_addr, LONG_HEX);
6159 if ((long) section->sh_offset == section->sh_offset)
6160 printf (" %16.16lx", (unsigned long) section->sh_offset);
6164 print_vma (section->sh_offset, LONG_HEX);
6166 printf (" %u\n ", section->sh_link);
6167 print_vma (section->sh_size, LONG_HEX);
6169 print_vma (section->sh_entsize, LONG_HEX);
6171 printf (" %-16u %lu\n",
6173 (unsigned long) section->sh_addralign);
6178 print_vma (section->sh_addr, LONG_HEX);
6179 if ((long) section->sh_offset == section->sh_offset)
6180 printf (" %8.8lx", (unsigned long) section->sh_offset);
6184 print_vma (section->sh_offset, LONG_HEX);
6187 print_vma (section->sh_size, LONG_HEX);
6189 print_vma (section->sh_entsize, LONG_HEX);
6191 printf (" %3s ", get_elf_section_flags (section->sh_flags));
6193 printf (" %2u %3u %lu\n",
6196 (unsigned long) section->sh_addralign);
6199 if (do_section_details)
6201 printf (" %s\n", get_elf_section_flags (section->sh_flags));
6202 if ((section->sh_flags & SHF_COMPRESSED) != 0)
6204 /* Minimum section size is 12 bytes for 32-bit compression
6205 header + 12 bytes for compressed data header. */
6206 unsigned char buf[24];
6208 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6209 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6210 sizeof (buf), _("compression header")))
6212 Elf_Internal_Chdr chdr;
6214 (void) get_compression_header (&chdr, buf);
6216 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6219 printf (_(" [<unknown>: 0x%x], "),
6221 print_vma (chdr.ch_size, LONG_HEX);
6222 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6228 if (!do_section_details)
6230 /* The ordering of the letters shown here matches the ordering of the
6231 corresponding SHF_xxx values, and hence the order in which these
6232 letters will be displayed to the user. */
6233 printf (_("Key to Flags:\n\
6234 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6235 L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6236 C (compressed), x (unknown), o (OS specific), E (exclude),\n "));
6237 if (elf_header.e_machine == EM_X86_64
6238 || elf_header.e_machine == EM_L1OM
6239 || elf_header.e_machine == EM_K1OM)
6240 printf (_("l (large), "));
6241 else if (elf_header.e_machine == EM_ARM)
6242 printf (_("y (purecode), "));
6243 printf ("p (processor specific)\n");
6250 get_group_flags (unsigned int flags)
6252 static char buff[32];
6262 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6269 process_section_groups (FILE * file)
6271 Elf_Internal_Shdr * section;
6273 struct group * group;
6274 Elf_Internal_Shdr * symtab_sec;
6275 Elf_Internal_Shdr * strtab_sec;
6276 Elf_Internal_Sym * symtab;
6277 unsigned long num_syms;
6281 /* Don't process section groups unless needed. */
6282 if (!do_unwind && !do_section_groups)
6285 if (elf_header.e_shnum == 0)
6287 if (do_section_groups)
6288 printf (_("\nThere are no sections to group in this file.\n"));
6293 if (section_headers == NULL)
6295 error (_("Section headers are not available!\n"));
6296 /* PR 13622: This can happen with a corrupt ELF header. */
6300 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6301 sizeof (struct group *));
6303 if (section_headers_groups == NULL)
6305 error (_("Out of memory reading %u section group headers\n"),
6306 elf_header.e_shnum);
6310 /* Scan the sections for the group section. */
6312 for (i = 0, section = section_headers;
6313 i < elf_header.e_shnum;
6315 if (section->sh_type == SHT_GROUP)
6318 if (group_count == 0)
6320 if (do_section_groups)
6321 printf (_("\nThere are no section groups in this file.\n"));
6326 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6328 if (section_groups == NULL)
6330 error (_("Out of memory reading %lu groups\n"),
6331 (unsigned long) group_count);
6341 for (i = 0, section = section_headers, group = section_groups;
6342 i < elf_header.e_shnum;
6345 if (section->sh_type == SHT_GROUP)
6347 const char * name = printable_section_name (section);
6348 const char * group_name;
6349 unsigned char * start;
6350 unsigned char * indices;
6351 unsigned int entry, j, size;
6352 Elf_Internal_Shdr * sec;
6353 Elf_Internal_Sym * sym;
6355 /* Get the symbol table. */
6356 if (section->sh_link >= elf_header.e_shnum
6357 || ((sec = section_headers + section->sh_link)->sh_type
6360 error (_("Bad sh_link in group section `%s'\n"), name);
6364 if (symtab_sec != sec)
6369 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6374 error (_("Corrupt header in group section `%s'\n"), name);
6378 if (section->sh_info >= num_syms)
6380 error (_("Bad sh_info in group section `%s'\n"), name);
6384 sym = symtab + section->sh_info;
6386 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6388 if (sym->st_shndx == 0
6389 || sym->st_shndx >= elf_header.e_shnum)
6391 error (_("Bad sh_info in group section `%s'\n"), name);
6395 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6404 /* Get the string table. */
6405 if (symtab_sec->sh_link >= elf_header.e_shnum)
6414 != (sec = section_headers + symtab_sec->sh_link))
6420 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6421 1, strtab_sec->sh_size,
6423 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6425 group_name = sym->st_name < strtab_size
6426 ? strtab + sym->st_name : _("<corrupt>");
6429 /* PR 17531: file: loop. */
6430 if (section->sh_entsize > section->sh_size)
6432 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6433 printable_section_name (section),
6434 (unsigned long) section->sh_entsize,
6435 (unsigned long) section->sh_size);
6439 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6440 1, section->sh_size,
6446 size = (section->sh_size / section->sh_entsize) - 1;
6447 entry = byte_get (indices, 4);
6450 if (do_section_groups)
6452 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6453 get_group_flags (entry), i, name, group_name, size);
6455 printf (_(" [Index] Name\n"));
6458 group->group_index = i;
6460 for (j = 0; j < size; j++)
6462 struct group_list * g;
6464 entry = byte_get (indices, 4);
6467 if (entry >= elf_header.e_shnum)
6469 static unsigned num_group_errors = 0;
6471 if (num_group_errors ++ < 10)
6473 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6474 entry, i, elf_header.e_shnum - 1);
6475 if (num_group_errors == 10)
6476 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6481 if (section_headers_groups [entry] != NULL)
6485 static unsigned num_errs = 0;
6487 if (num_errs ++ < 10)
6489 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6491 section_headers_groups [entry]->group_index);
6493 warn (_("Further error messages about already contained group sections suppressed\n"));
6499 /* Intel C/C++ compiler may put section 0 in a
6500 section group. We just warn it the first time
6501 and ignore it afterwards. */
6502 static int warned = 0;
6505 error (_("section 0 in group section [%5u]\n"),
6506 section_headers_groups [entry]->group_index);
6512 section_headers_groups [entry] = group;
6514 if (do_section_groups)
6516 sec = section_headers + entry;
6517 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6520 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6521 g->section_index = entry;
6522 g->next = group->root;
6540 /* Data used to display dynamic fixups. */
6542 struct ia64_vms_dynfixup
6544 bfd_vma needed_ident; /* Library ident number. */
6545 bfd_vma needed; /* Index in the dstrtab of the library name. */
6546 bfd_vma fixup_needed; /* Index of the library. */
6547 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6548 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6551 /* Data used to display dynamic relocations. */
6553 struct ia64_vms_dynimgrela
6555 bfd_vma img_rela_cnt; /* Number of relocations. */
6556 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6559 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6563 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6564 const char *strtab, unsigned int strtab_sz)
6566 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6568 const char *lib_name;
6570 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6571 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6572 _("dynamic section image fixups"));
6576 if (fixup->needed < strtab_sz)
6577 lib_name = strtab + fixup->needed;
6580 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6581 (unsigned long) fixup->needed);
6584 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6585 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6587 (_("Seg Offset Type SymVec DataType\n"));
6589 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6594 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6595 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6596 type = BYTE_GET (imfs [i].type);
6597 rtype = elf_ia64_reloc_type (type);
6599 printf (" 0x%08x ", type);
6601 printf (" %-32s ", rtype);
6602 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6603 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6609 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6612 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6614 Elf64_External_VMS_IMAGE_RELA *imrs;
6617 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6618 1, imgrela->img_rela_cnt * sizeof (*imrs),
6619 _("dynamic section image relocations"));
6623 printf (_("\nImage relocs\n"));
6625 (_("Seg Offset Type Addend Seg Sym Off\n"));
6627 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6632 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6633 printf ("%08" BFD_VMA_FMT "x ",
6634 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6635 type = BYTE_GET (imrs [i].type);
6636 rtype = elf_ia64_reloc_type (type);
6638 printf ("0x%08x ", type);
6640 printf ("%-31s ", rtype);
6641 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6642 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6643 printf ("%08" BFD_VMA_FMT "x\n",
6644 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6650 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6653 process_ia64_vms_dynamic_relocs (FILE *file)
6655 struct ia64_vms_dynfixup fixup;
6656 struct ia64_vms_dynimgrela imgrela;
6657 Elf_Internal_Dyn *entry;
6659 bfd_vma strtab_off = 0;
6660 bfd_vma strtab_sz = 0;
6661 char *strtab = NULL;
6663 memset (&fixup, 0, sizeof (fixup));
6664 memset (&imgrela, 0, sizeof (imgrela));
6666 /* Note: the order of the entries is specified by the OpenVMS specs. */
6667 for (entry = dynamic_section;
6668 entry < dynamic_section + dynamic_nent;
6671 switch (entry->d_tag)
6673 case DT_IA_64_VMS_STRTAB_OFFSET:
6674 strtab_off = entry->d_un.d_val;
6677 strtab_sz = entry->d_un.d_val;
6679 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6680 1, strtab_sz, _("dynamic string section"));
6683 case DT_IA_64_VMS_NEEDED_IDENT:
6684 fixup.needed_ident = entry->d_un.d_val;
6687 fixup.needed = entry->d_un.d_val;
6689 case DT_IA_64_VMS_FIXUP_NEEDED:
6690 fixup.fixup_needed = entry->d_un.d_val;
6692 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6693 fixup.fixup_rela_cnt = entry->d_un.d_val;
6695 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6696 fixup.fixup_rela_off = entry->d_un.d_val;
6698 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6701 case DT_IA_64_VMS_IMG_RELA_CNT:
6702 imgrela.img_rela_cnt = entry->d_un.d_val;
6704 case DT_IA_64_VMS_IMG_RELA_OFF:
6705 imgrela.img_rela_off = entry->d_un.d_val;
6707 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6727 } dynamic_relocations [] =
6729 { "REL", DT_REL, DT_RELSZ, FALSE },
6730 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6731 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6734 /* Process the reloc section. */
6737 process_relocs (FILE * file)
6739 unsigned long rel_size;
6740 unsigned long rel_offset;
6746 if (do_using_dynamic)
6750 int has_dynamic_reloc;
6753 has_dynamic_reloc = 0;
6755 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6757 is_rela = dynamic_relocations [i].rela;
6758 name = dynamic_relocations [i].name;
6759 rel_size = dynamic_info [dynamic_relocations [i].size];
6760 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6762 has_dynamic_reloc |= rel_size;
6764 if (is_rela == UNKNOWN)
6766 if (dynamic_relocations [i].reloc == DT_JMPREL)
6767 switch (dynamic_info[DT_PLTREL])
6781 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6782 name, rel_offset, rel_size);
6784 dump_relocations (file,
6785 offset_from_vma (file, rel_offset, rel_size),
6787 dynamic_symbols, num_dynamic_syms,
6788 dynamic_strings, dynamic_strings_length,
6794 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6796 if (! has_dynamic_reloc)
6797 printf (_("\nThere are no dynamic relocations in this file.\n"));
6801 Elf_Internal_Shdr * section;
6805 for (i = 0, section = section_headers;
6806 i < elf_header.e_shnum;
6809 if ( section->sh_type != SHT_RELA
6810 && section->sh_type != SHT_REL)
6813 rel_offset = section->sh_offset;
6814 rel_size = section->sh_size;
6818 Elf_Internal_Shdr * strsec;
6821 printf (_("\nRelocation section "));
6823 if (string_table == NULL)
6824 printf ("%d", section->sh_name);
6826 printf ("'%s'", printable_section_name (section));
6828 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6829 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6831 is_rela = section->sh_type == SHT_RELA;
6833 if (section->sh_link != 0
6834 && section->sh_link < elf_header.e_shnum)
6836 Elf_Internal_Shdr * symsec;
6837 Elf_Internal_Sym * symtab;
6838 unsigned long nsyms;
6839 unsigned long strtablen = 0;
6840 char * strtab = NULL;
6842 symsec = section_headers + section->sh_link;
6843 if (symsec->sh_type != SHT_SYMTAB
6844 && symsec->sh_type != SHT_DYNSYM)
6847 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6852 if (symsec->sh_link != 0
6853 && symsec->sh_link < elf_header.e_shnum)
6855 strsec = section_headers + symsec->sh_link;
6857 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6860 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6863 dump_relocations (file, rel_offset, rel_size,
6864 symtab, nsyms, strtab, strtablen,
6866 symsec->sh_type == SHT_DYNSYM);
6872 dump_relocations (file, rel_offset, rel_size,
6873 NULL, 0, NULL, 0, is_rela, 0);
6880 printf (_("\nThere are no relocations in this file.\n"));
6886 /* An absolute address consists of a section and an offset. If the
6887 section is NULL, the offset itself is the address, otherwise, the
6888 address equals to LOAD_ADDRESS(section) + offset. */
6892 unsigned short section;
6896 #define ABSADDR(a) \
6898 ? section_headers [(a).section].sh_addr + (a).offset \
6901 /* Find the nearest symbol at or below ADDR. Returns the symbol
6902 name, if found, and the offset from the symbol to ADDR. */
6905 find_symbol_for_address (Elf_Internal_Sym * symtab,
6906 unsigned long nsyms,
6907 const char * strtab,
6908 unsigned long strtab_size,
6909 struct absaddr addr,
6910 const char ** symname,
6913 bfd_vma dist = 0x100000;
6914 Elf_Internal_Sym * sym;
6915 Elf_Internal_Sym * beg;
6916 Elf_Internal_Sym * end;
6917 Elf_Internal_Sym * best = NULL;
6919 REMOVE_ARCH_BITS (addr.offset);
6921 end = symtab + nsyms;
6927 sym = beg + (end - beg) / 2;
6929 value = sym->st_value;
6930 REMOVE_ARCH_BITS (value);
6932 if (sym->st_name != 0
6933 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6934 && addr.offset >= value
6935 && addr.offset - value < dist)
6938 dist = addr.offset - value;
6943 if (addr.offset < value)
6951 *symname = (best->st_name >= strtab_size
6952 ? _("<corrupt>") : strtab + best->st_name);
6958 *offset = addr.offset;
6962 symcmp (const void *p, const void *q)
6964 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6965 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6967 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6970 /* Process the unwind section. */
6972 #include "unwind-ia64.h"
6974 struct ia64_unw_table_entry
6976 struct absaddr start;
6978 struct absaddr info;
6981 struct ia64_unw_aux_info
6983 struct ia64_unw_table_entry *table; /* Unwind table. */
6984 unsigned long table_len; /* Length of unwind table. */
6985 unsigned char * info; /* Unwind info. */
6986 unsigned long info_size; /* Size of unwind info. */
6987 bfd_vma info_addr; /* Starting address of unwind info. */
6988 bfd_vma seg_base; /* Starting address of segment. */
6989 Elf_Internal_Sym * symtab; /* The symbol table. */
6990 unsigned long nsyms; /* Number of symbols. */
6991 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6992 unsigned long nfuns; /* Number of entries in funtab. */
6993 char * strtab; /* The string table. */
6994 unsigned long strtab_size; /* Size of string table. */
6998 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
7000 struct ia64_unw_table_entry * tp;
7001 unsigned long j, nfuns;
7004 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7005 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7006 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7007 aux->funtab[nfuns++] = aux->symtab[j];
7009 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7011 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7015 const unsigned char * dp;
7016 const unsigned char * head;
7017 const unsigned char * end;
7018 const char * procname;
7020 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7021 aux->strtab_size, tp->start, &procname, &offset);
7023 fputs ("\n<", stdout);
7027 fputs (procname, stdout);
7030 printf ("+%lx", (unsigned long) offset);
7033 fputs (">: [", stdout);
7034 print_vma (tp->start.offset, PREFIX_HEX);
7035 fputc ('-', stdout);
7036 print_vma (tp->end.offset, PREFIX_HEX);
7037 printf ("], info at +0x%lx\n",
7038 (unsigned long) (tp->info.offset - aux->seg_base));
7040 /* PR 17531: file: 86232b32. */
7041 if (aux->info == NULL)
7044 /* PR 17531: file: 0997b4d1. */
7045 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7047 warn (_("Invalid offset %lx in table entry %ld\n"),
7048 (long) tp->info.offset, (long) (tp - aux->table));
7052 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7053 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7055 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7056 (unsigned) UNW_VER (stamp),
7057 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7058 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7059 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7060 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7062 if (UNW_VER (stamp) != 1)
7064 printf (_("\tUnknown version.\n"));
7069 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7070 /* PR 17531: file: 16ceda89. */
7071 if (end > aux->info + aux->info_size)
7072 end = aux->info + aux->info_size;
7073 for (dp = head + 8; dp < end;)
7074 dp = unw_decode (dp, in_body, & in_body, end);
7081 slurp_ia64_unwind_table (FILE * file,
7082 struct ia64_unw_aux_info * aux,
7083 Elf_Internal_Shdr * sec)
7085 unsigned long size, nrelas, i;
7086 Elf_Internal_Phdr * seg;
7087 struct ia64_unw_table_entry * tep;
7088 Elf_Internal_Shdr * relsec;
7089 Elf_Internal_Rela * rela;
7090 Elf_Internal_Rela * rp;
7091 unsigned char * table;
7093 Elf_Internal_Sym * sym;
7094 const char * relname;
7098 /* First, find the starting address of the segment that includes
7101 if (elf_header.e_phnum)
7103 if (! get_program_headers (file))
7106 for (seg = program_headers;
7107 seg < program_headers + elf_header.e_phnum;
7110 if (seg->p_type != PT_LOAD)
7113 if (sec->sh_addr >= seg->p_vaddr
7114 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7116 aux->seg_base = seg->p_vaddr;
7122 /* Second, build the unwind table from the contents of the unwind section: */
7123 size = sec->sh_size;
7124 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7129 aux->table_len = size / (3 * eh_addr_size);
7130 aux->table = (struct ia64_unw_table_entry *)
7131 xcmalloc (aux->table_len, sizeof (aux->table[0]));
7134 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7136 tep->start.section = SHN_UNDEF;
7137 tep->end.section = SHN_UNDEF;
7138 tep->info.section = SHN_UNDEF;
7139 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7140 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7141 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7142 tep->start.offset += aux->seg_base;
7143 tep->end.offset += aux->seg_base;
7144 tep->info.offset += aux->seg_base;
7148 /* Third, apply any relocations to the unwind table: */
7149 for (relsec = section_headers;
7150 relsec < section_headers + elf_header.e_shnum;
7153 if (relsec->sh_type != SHT_RELA
7154 || relsec->sh_info >= elf_header.e_shnum
7155 || section_headers + relsec->sh_info != sec)
7158 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7167 for (rp = rela; rp < rela + nrelas; ++rp)
7169 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7170 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7172 /* PR 17531: file: 9fa67536. */
7173 if (relname == NULL)
7175 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7179 if (! const_strneq (relname, "R_IA64_SEGREL"))
7181 warn (_("Skipping unexpected relocation type: %s\n"), relname);
7185 i = rp->r_offset / (3 * eh_addr_size);
7187 /* PR 17531: file: 5bc8d9bf. */
7188 if (i >= aux->table_len)
7190 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7194 switch (rp->r_offset / eh_addr_size % 3)
7197 aux->table[i].start.section = sym->st_shndx;
7198 aux->table[i].start.offset = rp->r_addend + sym->st_value;
7201 aux->table[i].end.section = sym->st_shndx;
7202 aux->table[i].end.offset = rp->r_addend + sym->st_value;
7205 aux->table[i].info.section = sym->st_shndx;
7206 aux->table[i].info.offset = rp->r_addend + sym->st_value;
7220 ia64_process_unwind (FILE * file)
7222 Elf_Internal_Shdr * sec;
7223 Elf_Internal_Shdr * unwsec = NULL;
7224 Elf_Internal_Shdr * strsec;
7225 unsigned long i, unwcount = 0, unwstart = 0;
7226 struct ia64_unw_aux_info aux;
7228 memset (& aux, 0, sizeof (aux));
7230 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7232 if (sec->sh_type == SHT_SYMTAB
7233 && sec->sh_link < elf_header.e_shnum)
7235 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7237 strsec = section_headers + sec->sh_link;
7238 if (aux.strtab != NULL)
7240 error (_("Multiple auxillary string tables encountered\n"));
7243 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7246 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7248 else if (sec->sh_type == SHT_IA_64_UNWIND)
7253 printf (_("\nThere are no unwind sections in this file.\n"));
7255 while (unwcount-- > 0)
7260 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7261 i < elf_header.e_shnum; ++i, ++sec)
7262 if (sec->sh_type == SHT_IA_64_UNWIND)
7267 /* We have already counted the number of SHT_IA64_UNWIND
7268 sections so the loop above should never fail. */
7269 assert (unwsec != NULL);
7272 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7274 if ((unwsec->sh_flags & SHF_GROUP) != 0)
7276 /* We need to find which section group it is in. */
7277 struct group_list * g;
7279 if (section_headers_groups == NULL
7280 || section_headers_groups [i] == NULL)
7281 i = elf_header.e_shnum;
7284 g = section_headers_groups [i]->root;
7286 for (; g != NULL; g = g->next)
7288 sec = section_headers + g->section_index;
7290 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7295 i = elf_header.e_shnum;
7298 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7300 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
7301 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7302 suffix = SECTION_NAME (unwsec) + len;
7303 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7305 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7306 && streq (SECTION_NAME (sec) + len2, suffix))
7311 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7312 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
7313 len = sizeof (ELF_STRING_ia64_unwind) - 1;
7314 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7316 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7317 suffix = SECTION_NAME (unwsec) + len;
7318 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7320 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7321 && streq (SECTION_NAME (sec) + len2, suffix))
7325 if (i == elf_header.e_shnum)
7327 printf (_("\nCould not find unwind info section for "));
7329 if (string_table == NULL)
7330 printf ("%d", unwsec->sh_name);
7332 printf ("'%s'", printable_section_name (unwsec));
7336 aux.info_addr = sec->sh_addr;
7337 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7340 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7342 printf (_("\nUnwind section "));
7344 if (string_table == NULL)
7345 printf ("%d", unwsec->sh_name);
7347 printf ("'%s'", printable_section_name (unwsec));
7349 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7350 (unsigned long) unwsec->sh_offset,
7351 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7353 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7354 && aux.table_len > 0)
7355 dump_ia64_unwind (& aux);
7358 free ((char *) aux.table);
7360 free ((char *) aux.info);
7369 free ((char *) aux.strtab);
7372 struct hppa_unw_table_entry
7374 struct absaddr start;
7376 unsigned int Cannot_unwind:1; /* 0 */
7377 unsigned int Millicode:1; /* 1 */
7378 unsigned int Millicode_save_sr0:1; /* 2 */
7379 unsigned int Region_description:2; /* 3..4 */
7380 unsigned int reserved1:1; /* 5 */
7381 unsigned int Entry_SR:1; /* 6 */
7382 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7383 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7384 unsigned int Args_stored:1; /* 16 */
7385 unsigned int Variable_Frame:1; /* 17 */
7386 unsigned int Separate_Package_Body:1; /* 18 */
7387 unsigned int Frame_Extension_Millicode:1; /* 19 */
7388 unsigned int Stack_Overflow_Check:1; /* 20 */
7389 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7390 unsigned int Ada_Region:1; /* 22 */
7391 unsigned int cxx_info:1; /* 23 */
7392 unsigned int cxx_try_catch:1; /* 24 */
7393 unsigned int sched_entry_seq:1; /* 25 */
7394 unsigned int reserved2:1; /* 26 */
7395 unsigned int Save_SP:1; /* 27 */
7396 unsigned int Save_RP:1; /* 28 */
7397 unsigned int Save_MRP_in_frame:1; /* 29 */
7398 unsigned int extn_ptr_defined:1; /* 30 */
7399 unsigned int Cleanup_defined:1; /* 31 */
7401 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7402 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7403 unsigned int Large_frame:1; /* 2 */
7404 unsigned int Pseudo_SP_Set:1; /* 3 */
7405 unsigned int reserved4:1; /* 4 */
7406 unsigned int Total_frame_size:27; /* 5..31 */
7409 struct hppa_unw_aux_info
7411 struct hppa_unw_table_entry * table; /* Unwind table. */
7412 unsigned long table_len; /* Length of unwind table. */
7413 bfd_vma seg_base; /* Starting address of segment. */
7414 Elf_Internal_Sym * symtab; /* The symbol table. */
7415 unsigned long nsyms; /* Number of symbols. */
7416 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7417 unsigned long nfuns; /* Number of entries in funtab. */
7418 char * strtab; /* The string table. */
7419 unsigned long strtab_size; /* Size of string table. */
7423 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7425 struct hppa_unw_table_entry * tp;
7426 unsigned long j, nfuns;
7428 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7429 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7430 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7431 aux->funtab[nfuns++] = aux->symtab[j];
7433 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7435 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7438 const char * procname;
7440 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7441 aux->strtab_size, tp->start, &procname,
7444 fputs ("\n<", stdout);
7448 fputs (procname, stdout);
7451 printf ("+%lx", (unsigned long) offset);
7454 fputs (">: [", stdout);
7455 print_vma (tp->start.offset, PREFIX_HEX);
7456 fputc ('-', stdout);
7457 print_vma (tp->end.offset, PREFIX_HEX);
7460 #define PF(_m) if (tp->_m) printf (#_m " ");
7461 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7464 PF(Millicode_save_sr0);
7465 /* PV(Region_description); */
7471 PF(Separate_Package_Body);
7472 PF(Frame_Extension_Millicode);
7473 PF(Stack_Overflow_Check);
7474 PF(Two_Instruction_SP_Increment);
7478 PF(sched_entry_seq);
7481 PF(Save_MRP_in_frame);
7482 PF(extn_ptr_defined);
7483 PF(Cleanup_defined);
7484 PF(MPE_XL_interrupt_marker);
7485 PF(HP_UX_interrupt_marker);
7488 PV(Total_frame_size);
7499 slurp_hppa_unwind_table (FILE * file,
7500 struct hppa_unw_aux_info * aux,
7501 Elf_Internal_Shdr * sec)
7503 unsigned long size, unw_ent_size, nentries, nrelas, i;
7504 Elf_Internal_Phdr * seg;
7505 struct hppa_unw_table_entry * tep;
7506 Elf_Internal_Shdr * relsec;
7507 Elf_Internal_Rela * rela;
7508 Elf_Internal_Rela * rp;
7509 unsigned char * table;
7511 Elf_Internal_Sym * sym;
7512 const char * relname;
7514 /* First, find the starting address of the segment that includes
7517 if (elf_header.e_phnum)
7519 if (! get_program_headers (file))
7522 for (seg = program_headers;
7523 seg < program_headers + elf_header.e_phnum;
7526 if (seg->p_type != PT_LOAD)
7529 if (sec->sh_addr >= seg->p_vaddr
7530 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7532 aux->seg_base = seg->p_vaddr;
7538 /* Second, build the unwind table from the contents of the unwind
7540 size = sec->sh_size;
7541 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7547 nentries = size / unw_ent_size;
7548 size = unw_ent_size * nentries;
7550 tep = aux->table = (struct hppa_unw_table_entry *)
7551 xcmalloc (nentries, sizeof (aux->table[0]));
7553 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7555 unsigned int tmp1, tmp2;
7557 tep->start.section = SHN_UNDEF;
7558 tep->end.section = SHN_UNDEF;
7560 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7561 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7562 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7563 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7565 tep->start.offset += aux->seg_base;
7566 tep->end.offset += aux->seg_base;
7568 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7569 tep->Millicode = (tmp1 >> 30) & 0x1;
7570 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7571 tep->Region_description = (tmp1 >> 27) & 0x3;
7572 tep->reserved1 = (tmp1 >> 26) & 0x1;
7573 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7574 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7575 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7576 tep->Args_stored = (tmp1 >> 15) & 0x1;
7577 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7578 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7579 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7580 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7581 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7582 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7583 tep->cxx_info = (tmp1 >> 8) & 0x1;
7584 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7585 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7586 tep->reserved2 = (tmp1 >> 5) & 0x1;
7587 tep->Save_SP = (tmp1 >> 4) & 0x1;
7588 tep->Save_RP = (tmp1 >> 3) & 0x1;
7589 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7590 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7591 tep->Cleanup_defined = tmp1 & 0x1;
7593 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7594 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7595 tep->Large_frame = (tmp2 >> 29) & 0x1;
7596 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7597 tep->reserved4 = (tmp2 >> 27) & 0x1;
7598 tep->Total_frame_size = tmp2 & 0x7ffffff;
7602 /* Third, apply any relocations to the unwind table. */
7603 for (relsec = section_headers;
7604 relsec < section_headers + elf_header.e_shnum;
7607 if (relsec->sh_type != SHT_RELA
7608 || relsec->sh_info >= elf_header.e_shnum
7609 || section_headers + relsec->sh_info != sec)
7612 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7616 for (rp = rela; rp < rela + nrelas; ++rp)
7618 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7619 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7621 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7622 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7624 warn (_("Skipping unexpected relocation type %s\n"), relname);
7628 i = rp->r_offset / unw_ent_size;
7630 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7633 aux->table[i].start.section = sym->st_shndx;
7634 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7637 aux->table[i].end.section = sym->st_shndx;
7638 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7648 aux->table_len = nentries;
7654 hppa_process_unwind (FILE * file)
7656 struct hppa_unw_aux_info aux;
7657 Elf_Internal_Shdr * unwsec = NULL;
7658 Elf_Internal_Shdr * strsec;
7659 Elf_Internal_Shdr * sec;
7662 if (string_table == NULL)
7665 memset (& aux, 0, sizeof (aux));
7667 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7669 if (sec->sh_type == SHT_SYMTAB
7670 && sec->sh_link < elf_header.e_shnum)
7672 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7674 strsec = section_headers + sec->sh_link;
7675 if (aux.strtab != NULL)
7677 error (_("Multiple auxillary string tables encountered\n"));
7680 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7683 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7685 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7690 printf (_("\nThere are no unwind sections in this file.\n"));
7692 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7694 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7696 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7697 printable_section_name (sec),
7698 (unsigned long) sec->sh_offset,
7699 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7701 slurp_hppa_unwind_table (file, &aux, sec);
7702 if (aux.table_len > 0)
7703 dump_hppa_unwind (&aux);
7706 free ((char *) aux.table);
7714 free ((char *) aux.strtab);
7719 unsigned char * data; /* The unwind data. */
7720 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7721 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7722 unsigned long nrelas; /* The number of relocations. */
7723 unsigned int rel_type; /* REL or RELA ? */
7724 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7727 struct arm_unw_aux_info
7729 FILE * file; /* The file containing the unwind sections. */
7730 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7731 unsigned long nsyms; /* Number of symbols. */
7732 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7733 unsigned long nfuns; /* Number of these symbols. */
7734 char * strtab; /* The file's string table. */
7735 unsigned long strtab_size; /* Size of string table. */
7739 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7740 bfd_vma fn, struct absaddr addr)
7742 const char *procname;
7745 if (addr.section == SHN_UNDEF)
7748 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7749 aux->strtab_size, addr, &procname,
7752 print_vma (fn, PREFIX_HEX);
7756 fputs (" <", stdout);
7757 fputs (procname, stdout);
7760 printf ("+0x%lx", (unsigned long) sym_offset);
7761 fputc ('>', stdout);
7768 arm_free_section (struct arm_section *arm_sec)
7770 if (arm_sec->data != NULL)
7771 free (arm_sec->data);
7773 if (arm_sec->rela != NULL)
7774 free (arm_sec->rela);
7777 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7778 cached section and install SEC instead.
7779 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7780 and return its valued in * WORDP, relocating if necessary.
7781 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7782 relocation's offset in ADDR.
7783 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7784 into the string table of the symbol associated with the reloc. If no
7785 reloc was applied store -1 there.
7786 5) Return TRUE upon success, FALSE otherwise. */
7789 get_unwind_section_word (struct arm_unw_aux_info * aux,
7790 struct arm_section * arm_sec,
7791 Elf_Internal_Shdr * sec,
7792 bfd_vma word_offset,
7793 unsigned int * wordp,
7794 struct absaddr * addr,
7797 Elf_Internal_Rela *rp;
7798 Elf_Internal_Sym *sym;
7799 const char * relname;
7801 bfd_boolean wrapped;
7803 if (sec == NULL || arm_sec == NULL)
7806 addr->section = SHN_UNDEF;
7809 if (sym_name != NULL)
7810 *sym_name = (bfd_vma) -1;
7812 /* If necessary, update the section cache. */
7813 if (sec != arm_sec->sec)
7815 Elf_Internal_Shdr *relsec;
7817 arm_free_section (arm_sec);
7820 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7821 sec->sh_size, _("unwind data"));
7822 arm_sec->rela = NULL;
7823 arm_sec->nrelas = 0;
7825 for (relsec = section_headers;
7826 relsec < section_headers + elf_header.e_shnum;
7829 if (relsec->sh_info >= elf_header.e_shnum
7830 || section_headers + relsec->sh_info != sec
7831 /* PR 15745: Check the section type as well. */
7832 || (relsec->sh_type != SHT_REL
7833 && relsec->sh_type != SHT_RELA))
7836 arm_sec->rel_type = relsec->sh_type;
7837 if (relsec->sh_type == SHT_REL)
7839 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7841 & arm_sec->rela, & arm_sec->nrelas))
7844 else /* relsec->sh_type == SHT_RELA */
7846 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7848 & arm_sec->rela, & arm_sec->nrelas))
7854 arm_sec->next_rela = arm_sec->rela;
7857 /* If there is no unwind data we can do nothing. */
7858 if (arm_sec->data == NULL)
7861 /* If the offset is invalid then fail. */
7862 if (word_offset > (sec->sh_size - 4)
7864 || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7865 || ((bfd_signed_vma) word_offset) < 0)
7868 /* Get the word at the required offset. */
7869 word = byte_get (arm_sec->data + word_offset, 4);
7871 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7872 if (arm_sec->rela == NULL)
7878 /* Look through the relocs to find the one that applies to the provided offset. */
7880 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7882 bfd_vma prelval, offset;
7884 if (rp->r_offset > word_offset && !wrapped)
7889 if (rp->r_offset > word_offset)
7892 if (rp->r_offset & 3)
7894 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7895 (unsigned long) rp->r_offset);
7899 if (rp->r_offset < word_offset)
7902 /* PR 17531: file: 027-161405-0.004 */
7903 if (aux->symtab == NULL)
7906 if (arm_sec->rel_type == SHT_REL)
7908 offset = word & 0x7fffffff;
7909 if (offset & 0x40000000)
7910 offset |= ~ (bfd_vma) 0x7fffffff;
7912 else if (arm_sec->rel_type == SHT_RELA)
7913 offset = rp->r_addend;
7916 error (_("Unknown section relocation type %d encountered\n"),
7921 /* PR 17531 file: 027-1241568-0.004. */
7922 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7924 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7925 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7929 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7930 offset += sym->st_value;
7931 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7933 /* Check that we are processing the expected reloc type. */
7934 if (elf_header.e_machine == EM_ARM)
7936 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7937 if (relname == NULL)
7939 warn (_("Skipping unknown ARM relocation type: %d\n"),
7940 (int) ELF32_R_TYPE (rp->r_info));
7944 if (streq (relname, "R_ARM_NONE"))
7947 if (! streq (relname, "R_ARM_PREL31"))
7949 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7953 else if (elf_header.e_machine == EM_TI_C6000)
7955 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7956 if (relname == NULL)
7958 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7959 (int) ELF32_R_TYPE (rp->r_info));
7963 if (streq (relname, "R_C6000_NONE"))
7966 if (! streq (relname, "R_C6000_PREL31"))
7968 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7976 /* This function currently only supports ARM and TI unwinders. */
7977 warn (_("Only TI and ARM unwinders are currently supported\n"));
7981 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7982 addr->section = sym->st_shndx;
7983 addr->offset = offset;
7986 * sym_name = sym->st_name;
7991 arm_sec->next_rela = rp;
7996 static const char *tic6x_unwind_regnames[16] =
7998 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7999 "A14", "A13", "A12", "A11", "A10",
8000 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8004 decode_tic6x_unwind_regmask (unsigned int mask)
8008 for (i = 12; mask; mask >>= 1, i--)
8012 fputs (tic6x_unwind_regnames[i], stdout);
8014 fputs (", ", stdout);
8020 if (remaining == 0 && more_words) \
8023 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
8024 data_offset, & word, & addr, NULL)) \
8030 #define GET_OP(OP) \
8035 (OP) = word >> 24; \
8040 printf (_("[Truncated opcode]\n")); \
8043 printf ("0x%02x ", OP)
8046 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
8048 unsigned int remaining,
8049 unsigned int more_words,
8050 bfd_vma data_offset,
8051 Elf_Internal_Shdr * data_sec,
8052 struct arm_section * data_arm_sec)
8054 struct absaddr addr;
8056 /* Decode the unwinding instructions. */
8059 unsigned int op, op2;
8068 printf (" 0x%02x ", op);
8070 if ((op & 0xc0) == 0x00)
8072 int offset = ((op & 0x3f) << 2) + 4;
8074 printf (" vsp = vsp + %d", offset);
8076 else if ((op & 0xc0) == 0x40)
8078 int offset = ((op & 0x3f) << 2) + 4;
8080 printf (" vsp = vsp - %d", offset);
8082 else if ((op & 0xf0) == 0x80)
8085 if (op == 0x80 && op2 == 0)
8086 printf (_("Refuse to unwind"));
8089 unsigned int mask = ((op & 0x0f) << 8) | op2;
8094 for (i = 0; i < 12; i++)
8095 if (mask & (1 << i))
8101 printf ("r%d", 4 + i);
8106 else if ((op & 0xf0) == 0x90)
8108 if (op == 0x9d || op == 0x9f)
8109 printf (_(" [Reserved]"));
8111 printf (" vsp = r%d", op & 0x0f);
8113 else if ((op & 0xf0) == 0xa0)
8115 int end = 4 + (op & 0x07);
8120 for (i = 4; i <= end; i++)
8136 else if (op == 0xb0)
8137 printf (_(" finish"));
8138 else if (op == 0xb1)
8141 if (op2 == 0 || (op2 & 0xf0) != 0)
8142 printf (_("[Spare]"));
8145 unsigned int mask = op2 & 0x0f;
8150 for (i = 0; i < 12; i++)
8151 if (mask & (1 << i))
8162 else if (op == 0xb2)
8164 unsigned char buf[9];
8165 unsigned int i, len;
8166 unsigned long offset;
8168 for (i = 0; i < sizeof (buf); i++)
8171 if ((buf[i] & 0x80) == 0)
8174 if (i == sizeof (buf))
8175 printf (_("corrupt change to vsp"));
8178 offset = read_uleb128 (buf, &len, buf + i + 1);
8179 assert (len == i + 1);
8180 offset = offset * 4 + 0x204;
8181 printf ("vsp = vsp + %ld", offset);
8184 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8186 unsigned int first, last;
8193 printf ("pop {D%d", first);
8195 printf ("-D%d", first + last);
8198 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8200 unsigned int count = op & 0x07;
8204 printf ("-D%d", 8 + count);
8207 else if (op >= 0xc0 && op <= 0xc5)
8209 unsigned int count = op & 0x07;
8211 printf (" pop {wR10");
8213 printf ("-wR%d", 10 + count);
8216 else if (op == 0xc6)
8218 unsigned int first, last;
8223 printf ("pop {wR%d", first);
8225 printf ("-wR%d", first + last);
8228 else if (op == 0xc7)
8231 if (op2 == 0 || (op2 & 0xf0) != 0)
8232 printf (_("[Spare]"));
8235 unsigned int mask = op2 & 0x0f;
8240 for (i = 0; i < 4; i++)
8241 if (mask & (1 << i))
8247 printf ("wCGR%d", i);
8253 printf (_(" [unsupported opcode]"));
8259 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
8261 unsigned int remaining,
8262 unsigned int more_words,
8263 bfd_vma data_offset,
8264 Elf_Internal_Shdr * data_sec,
8265 struct arm_section * data_arm_sec)
8267 struct absaddr addr;
8269 /* Decode the unwinding instructions. */
8272 unsigned int op, op2;
8281 printf (" 0x%02x ", op);
8283 if ((op & 0xc0) == 0x00)
8285 int offset = ((op & 0x3f) << 3) + 8;
8286 printf (" sp = sp + %d", offset);
8288 else if ((op & 0xc0) == 0x80)
8291 if (op == 0x80 && op2 == 0)
8292 printf (_("Refuse to unwind"));
8295 unsigned int mask = ((op & 0x1f) << 8) | op2;
8297 printf ("pop compact {");
8301 decode_tic6x_unwind_regmask (mask);
8305 else if ((op & 0xf0) == 0xc0)
8313 unsigned int offset;
8317 /* Scan entire instruction first so that GET_OP output is not
8318 interleaved with disassembly. */
8320 for (i = 0; nregs < (op & 0xf); i++)
8326 regpos[nregs].offset = i * 2;
8327 regpos[nregs].reg = reg;
8334 regpos[nregs].offset = i * 2 + 1;
8335 regpos[nregs].reg = reg;
8340 printf (_("pop frame {"));
8342 for (i = i * 2; i > 0; i--)
8344 if (regpos[reg].offset == i - 1)
8346 name = tic6x_unwind_regnames[regpos[reg].reg];
8353 fputs (name, stdout);
8360 else if (op == 0xd0)
8361 printf (" MOV FP, SP");
8362 else if (op == 0xd1)
8363 printf (" __c6xabi_pop_rts");
8364 else if (op == 0xd2)
8366 unsigned char buf[9];
8367 unsigned int i, len;
8368 unsigned long offset;
8370 for (i = 0; i < sizeof (buf); i++)
8373 if ((buf[i] & 0x80) == 0)
8376 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8377 if (i == sizeof (buf))
8379 printf ("<corrupt sp adjust>\n");
8380 warn (_("Corrupt stack pointer adjustment detected\n"));
8384 offset = read_uleb128 (buf, &len, buf + i + 1);
8385 assert (len == i + 1);
8386 offset = offset * 8 + 0x408;
8387 printf (_("sp = sp + %ld"), offset);
8389 else if ((op & 0xf0) == 0xe0)
8391 if ((op & 0x0f) == 7)
8394 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8398 printf (_(" [unsupported opcode]"));
8405 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8409 offset = word & 0x7fffffff;
8410 if (offset & 0x40000000)
8411 offset |= ~ (bfd_vma) 0x7fffffff;
8413 if (elf_header.e_machine == EM_TI_C6000)
8416 return offset + where;
8420 decode_arm_unwind (struct arm_unw_aux_info * aux,
8422 unsigned int remaining,
8423 bfd_vma data_offset,
8424 Elf_Internal_Shdr * data_sec,
8425 struct arm_section * data_arm_sec)
8428 unsigned int more_words = 0;
8429 struct absaddr addr;
8430 bfd_vma sym_name = (bfd_vma) -1;
8434 /* Fetch the first word.
8435 Note - when decoding an object file the address extracted
8436 here will always be 0. So we also pass in the sym_name
8437 parameter so that we can find the symbol associated with
8438 the personality routine. */
8439 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8440 & word, & addr, & sym_name))
8446 if ((word & 0x80000000) == 0)
8448 /* Expand prel31 for personality routine. */
8450 const char *procname;
8452 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8453 printf (_(" Personality routine: "));
8455 && addr.section == SHN_UNDEF && addr.offset == 0
8456 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8458 procname = aux->strtab + sym_name;
8459 print_vma (fn, PREFIX_HEX);
8462 fputs (" <", stdout);
8463 fputs (procname, stdout);
8464 fputc ('>', stdout);
8468 procname = arm_print_vma_and_name (aux, fn, addr);
8469 fputc ('\n', stdout);
8471 /* The GCC personality routines use the standard compact
8472 encoding, starting with one byte giving the number of
8474 if (procname != NULL
8475 && (const_strneq (procname, "__gcc_personality_v0")
8476 || const_strneq (procname, "__gxx_personality_v0")
8477 || const_strneq (procname, "__gcj_personality_v0")
8478 || const_strneq (procname, "__gnu_objc_personality_v0")))
8485 printf (_(" [Truncated data]\n"));
8488 more_words = word >> 24;
8498 /* ARM EHABI Section 6.3:
8500 An exception-handling table entry for the compact model looks like:
8504 1 0 index Data for personalityRoutine[index] */
8506 if (elf_header.e_machine == EM_ARM
8507 && (word & 0x70000000))
8508 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8510 per_index = (word >> 24) & 0x7f;
8511 printf (_(" Compact model index: %d\n"), per_index);
8518 else if (per_index < 3)
8520 more_words = (word >> 16) & 0xff;
8526 switch (elf_header.e_machine)
8531 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8532 data_offset, data_sec, data_arm_sec);
8536 warn (_("Unknown ARM compact model index encountered\n"));
8537 printf (_(" [reserved]\n"));
8544 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8545 data_offset, data_sec, data_arm_sec);
8547 else if (per_index < 5)
8549 if (((word >> 17) & 0x7f) == 0x7f)
8550 printf (_(" Restore stack from frame pointer\n"));
8552 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8553 printf (_(" Registers restored: "));
8555 printf (" (compact) ");
8556 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8558 printf (_(" Return register: %s\n"),
8559 tic6x_unwind_regnames[word & 0xf]);
8562 printf (_(" [reserved (%d)]\n"), per_index);
8566 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8567 elf_header.e_machine);
8570 /* Decode the descriptors. Not implemented. */
8574 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8576 struct arm_section exidx_arm_sec, extab_arm_sec;
8577 unsigned int i, exidx_len;
8578 unsigned long j, nfuns;
8580 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8581 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8582 exidx_len = exidx_sec->sh_size / 8;
8584 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8585 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8586 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8587 aux->funtab[nfuns++] = aux->symtab[j];
8589 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8591 for (i = 0; i < exidx_len; i++)
8593 unsigned int exidx_fn, exidx_entry;
8594 struct absaddr fn_addr, entry_addr;
8597 fputc ('\n', stdout);
8599 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8600 8 * i, & exidx_fn, & fn_addr, NULL)
8601 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8602 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8605 arm_free_section (& exidx_arm_sec);
8606 arm_free_section (& extab_arm_sec);
8610 /* ARM EHABI, Section 5:
8611 An index table entry consists of 2 words.
8612 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8613 if (exidx_fn & 0x80000000)
8614 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8616 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8618 arm_print_vma_and_name (aux, fn, fn_addr);
8619 fputs (": ", stdout);
8621 if (exidx_entry == 1)
8623 print_vma (exidx_entry, PREFIX_HEX);
8624 fputs (" [cantunwind]\n", stdout);
8626 else if (exidx_entry & 0x80000000)
8628 print_vma (exidx_entry, PREFIX_HEX);
8629 fputc ('\n', stdout);
8630 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8634 bfd_vma table, table_offset = 0;
8635 Elf_Internal_Shdr *table_sec;
8637 fputs ("@", stdout);
8638 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8639 print_vma (table, PREFIX_HEX);
8642 /* Locate the matching .ARM.extab. */
8643 if (entry_addr.section != SHN_UNDEF
8644 && entry_addr.section < elf_header.e_shnum)
8646 table_sec = section_headers + entry_addr.section;
8647 table_offset = entry_addr.offset;
8649 if (table_offset > table_sec->sh_size
8650 || ((bfd_signed_vma) table_offset) < 0)
8652 warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8653 (unsigned long) table_offset,
8654 printable_section_name (table_sec));
8660 table_sec = find_section_by_address (table);
8661 if (table_sec != NULL)
8662 table_offset = table - table_sec->sh_addr;
8664 if (table_sec == NULL)
8666 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8667 (unsigned long) table);
8670 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8678 arm_free_section (&exidx_arm_sec);
8679 arm_free_section (&extab_arm_sec);
8682 /* Used for both ARM and C6X unwinding tables. */
8685 arm_process_unwind (FILE *file)
8687 struct arm_unw_aux_info aux;
8688 Elf_Internal_Shdr *unwsec = NULL;
8689 Elf_Internal_Shdr *strsec;
8690 Elf_Internal_Shdr *sec;
8692 unsigned int sec_type;
8694 switch (elf_header.e_machine)
8697 sec_type = SHT_ARM_EXIDX;
8701 sec_type = SHT_C6000_UNWIND;
8705 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8706 elf_header.e_machine);
8710 if (string_table == NULL)
8713 memset (& aux, 0, sizeof (aux));
8716 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8718 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8720 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8722 strsec = section_headers + sec->sh_link;
8724 /* PR binutils/17531 file: 011-12666-0.004. */
8725 if (aux.strtab != NULL)
8727 error (_("Multiple string tables found in file.\n"));
8730 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8731 1, strsec->sh_size, _("string table"));
8732 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8734 else if (sec->sh_type == sec_type)
8739 printf (_("\nThere are no unwind sections in this file.\n"));
8741 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8743 if (sec->sh_type == sec_type)
8745 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8746 printable_section_name (sec),
8747 (unsigned long) sec->sh_offset,
8748 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8750 dump_arm_unwind (&aux, sec);
8757 free ((char *) aux.strtab);
8761 process_unwind (FILE * file)
8763 struct unwind_handler
8766 void (* handler)(FILE *);
8769 { EM_ARM, arm_process_unwind },
8770 { EM_IA_64, ia64_process_unwind },
8771 { EM_PARISC, hppa_process_unwind },
8772 { EM_TI_C6000, arm_process_unwind },
8780 for (i = 0; handlers[i].handler != NULL; i++)
8781 if (elf_header.e_machine == handlers[i].machtype)
8783 handlers[i].handler (file);
8787 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8788 get_machine_name (elf_header.e_machine));
8792 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8794 switch (entry->d_tag)
8797 if (entry->d_un.d_val == 0)
8801 static const char * opts[] =
8803 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8804 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8805 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8806 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8812 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8813 if (entry->d_un.d_val & (1 << cnt))
8815 printf ("%s%s", first ? "" : " ", opts[cnt]);
8821 case DT_MIPS_IVERSION:
8822 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8823 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8827 sprintf_vma (buf, entry->d_un.d_ptr);
8828 /* Note: coded this way so that there is a single string for translation. */
8829 printf (_("<corrupt: %s>"), buf);
8833 case DT_MIPS_TIME_STAMP:
8837 time_t atime = entry->d_un.d_val;
8839 tmp = gmtime (&atime);
8840 /* PR 17531: file: 6accc532. */
8842 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8844 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8845 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8846 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8847 printf (_("Time Stamp: %s"), timebuf);
8851 case DT_MIPS_RLD_VERSION:
8852 case DT_MIPS_LOCAL_GOTNO:
8853 case DT_MIPS_CONFLICTNO:
8854 case DT_MIPS_LIBLISTNO:
8855 case DT_MIPS_SYMTABNO:
8856 case DT_MIPS_UNREFEXTNO:
8857 case DT_MIPS_HIPAGENO:
8858 case DT_MIPS_DELTA_CLASS_NO:
8859 case DT_MIPS_DELTA_INSTANCE_NO:
8860 case DT_MIPS_DELTA_RELOC_NO:
8861 case DT_MIPS_DELTA_SYM_NO:
8862 case DT_MIPS_DELTA_CLASSSYM_NO:
8863 case DT_MIPS_COMPACT_SIZE:
8864 print_vma (entry->d_un.d_val, DEC);
8868 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8874 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8876 switch (entry->d_tag)
8878 case DT_HP_DLD_FLAGS:
8887 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8888 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8889 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8890 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8891 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8892 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8893 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8894 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8895 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8896 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8897 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8898 { DT_HP_GST, "HP_GST" },
8899 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8900 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8901 { DT_HP_NODELETE, "HP_NODELETE" },
8902 { DT_HP_GROUP, "HP_GROUP" },
8903 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8907 bfd_vma val = entry->d_un.d_val;
8909 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8910 if (val & flags[cnt].bit)
8914 fputs (flags[cnt].str, stdout);
8916 val ^= flags[cnt].bit;
8919 if (val != 0 || first)
8923 print_vma (val, HEX);
8929 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8937 /* VMS vs Unix time offset and factor. */
8939 #define VMS_EPOCH_OFFSET 35067168000000000LL
8940 #define VMS_GRANULARITY_FACTOR 10000000
8942 /* Display a VMS time in a human readable format. */
8945 print_vms_time (bfd_int64_t vmstime)
8950 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8951 tm = gmtime (&unxtime);
8952 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8953 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8954 tm->tm_hour, tm->tm_min, tm->tm_sec);
8959 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8961 switch (entry->d_tag)
8963 case DT_IA_64_PLT_RESERVE:
8964 /* First 3 slots reserved. */
8965 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8967 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8970 case DT_IA_64_VMS_LINKTIME:
8972 print_vms_time (entry->d_un.d_val);
8976 case DT_IA_64_VMS_LNKFLAGS:
8977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8978 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8979 printf (" CALL_DEBUG");
8980 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8981 printf (" NOP0BUFS");
8982 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8983 printf (" P0IMAGE");
8984 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8985 printf (" MKTHREADS");
8986 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8987 printf (" UPCALLS");
8988 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8990 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8991 printf (" INITIALIZE");
8992 if (entry->d_un.d_val & VMS_LF_MAIN)
8994 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8995 printf (" EXE_INIT");
8996 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8997 printf (" TBK_IN_IMG");
8998 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8999 printf (" DBG_IN_IMG");
9000 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9001 printf (" TBK_IN_DSF");
9002 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9003 printf (" DBG_IN_DSF");
9004 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9005 printf (" SIGNATURES");
9006 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9007 printf (" REL_SEG_OFF");
9011 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9018 get_32bit_dynamic_section (FILE * file)
9020 Elf32_External_Dyn * edyn;
9021 Elf32_External_Dyn * ext;
9022 Elf_Internal_Dyn * entry;
9024 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9025 dynamic_size, _("dynamic section"));
9029 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9030 might not have the luxury of section headers. Look for the DT_NULL
9031 terminator to determine the number of entries. */
9032 for (ext = edyn, dynamic_nent = 0;
9033 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9037 if (BYTE_GET (ext->d_tag) == DT_NULL)
9041 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9043 if (dynamic_section == NULL)
9045 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9046 (unsigned long) dynamic_nent);
9051 for (ext = edyn, entry = dynamic_section;
9052 entry < dynamic_section + dynamic_nent;
9055 entry->d_tag = BYTE_GET (ext->d_tag);
9056 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9065 get_64bit_dynamic_section (FILE * file)
9067 Elf64_External_Dyn * edyn;
9068 Elf64_External_Dyn * ext;
9069 Elf_Internal_Dyn * entry;
9071 /* Read in the data. */
9072 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9073 dynamic_size, _("dynamic section"));
9077 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9078 might not have the luxury of section headers. Look for the DT_NULL
9079 terminator to determine the number of entries. */
9080 for (ext = edyn, dynamic_nent = 0;
9081 /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer. */
9082 (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9086 if (BYTE_GET (ext->d_tag) == DT_NULL)
9090 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9092 if (dynamic_section == NULL)
9094 error (_("Out of memory allocating space for %lu dynamic entries\n"),
9095 (unsigned long) dynamic_nent);
9100 /* Convert from external to internal formats. */
9101 for (ext = edyn, entry = dynamic_section;
9102 entry < dynamic_section + dynamic_nent;
9105 entry->d_tag = BYTE_GET (ext->d_tag);
9106 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9115 print_dynamic_flags (bfd_vma flags)
9123 flag = flags & - flags;
9133 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
9134 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
9135 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
9136 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
9137 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
9138 default: fputs (_("unknown"), stdout); break;
9144 /* Parse and display the contents of the dynamic section. */
9147 process_dynamic_section (FILE * file)
9149 Elf_Internal_Dyn * entry;
9151 if (dynamic_size == 0)
9154 printf (_("\nThere is no dynamic section in this file.\n"));
9161 if (! get_32bit_dynamic_section (file))
9164 else if (! get_64bit_dynamic_section (file))
9167 /* Find the appropriate symbol table. */
9168 if (dynamic_symbols == NULL)
9170 for (entry = dynamic_section;
9171 entry < dynamic_section + dynamic_nent;
9174 Elf_Internal_Shdr section;
9176 if (entry->d_tag != DT_SYMTAB)
9179 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9181 /* Since we do not know how big the symbol table is,
9182 we default to reading in the entire file (!) and
9183 processing that. This is overkill, I know, but it
9185 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9187 if (archive_file_offset != 0)
9188 section.sh_size = archive_file_size - section.sh_offset;
9191 if (fseek (file, 0, SEEK_END))
9192 error (_("Unable to seek to end of file!\n"));
9194 section.sh_size = ftell (file) - section.sh_offset;
9198 section.sh_entsize = sizeof (Elf32_External_Sym);
9200 section.sh_entsize = sizeof (Elf64_External_Sym);
9201 section.sh_name = string_table_length;
9203 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion, & num_dynamic_syms);
9204 if (num_dynamic_syms < 1)
9206 error (_("Unable to determine the number of symbols to load\n"));
9212 /* Similarly find a string table. */
9213 if (dynamic_strings == NULL)
9215 for (entry = dynamic_section;
9216 entry < dynamic_section + dynamic_nent;
9219 unsigned long offset;
9222 if (entry->d_tag != DT_STRTAB)
9225 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9227 /* Since we do not know how big the string table is,
9228 we default to reading in the entire file (!) and
9229 processing that. This is overkill, I know, but it
9232 offset = offset_from_vma (file, entry->d_un.d_val, 0);
9234 if (archive_file_offset != 0)
9235 str_tab_len = archive_file_size - offset;
9238 if (fseek (file, 0, SEEK_END))
9239 error (_("Unable to seek to end of file\n"));
9240 str_tab_len = ftell (file) - offset;
9243 if (str_tab_len < 1)
9246 (_("Unable to determine the length of the dynamic string table\n"));
9250 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9252 _("dynamic string table"));
9253 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9258 /* And find the syminfo section if available. */
9259 if (dynamic_syminfo == NULL)
9261 unsigned long syminsz = 0;
9263 for (entry = dynamic_section;
9264 entry < dynamic_section + dynamic_nent;
9267 if (entry->d_tag == DT_SYMINENT)
9269 /* Note: these braces are necessary to avoid a syntax
9270 error from the SunOS4 C compiler. */
9271 /* PR binutils/17531: A corrupt file can trigger this test.
9272 So do not use an assert, instead generate an error message. */
9273 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9274 error (_("Bad value (%d) for SYMINENT entry\n"),
9275 (int) entry->d_un.d_val);
9277 else if (entry->d_tag == DT_SYMINSZ)
9278 syminsz = entry->d_un.d_val;
9279 else if (entry->d_tag == DT_SYMINFO)
9280 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9284 if (dynamic_syminfo_offset != 0 && syminsz != 0)
9286 Elf_External_Syminfo * extsyminfo;
9287 Elf_External_Syminfo * extsym;
9288 Elf_Internal_Syminfo * syminfo;
9290 /* There is a syminfo section. Read the data. */
9291 extsyminfo = (Elf_External_Syminfo *)
9292 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9293 _("symbol information"));
9297 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9298 if (dynamic_syminfo == NULL)
9300 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9301 (unsigned long) syminsz);
9305 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9306 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9307 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9308 ++syminfo, ++extsym)
9310 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9311 syminfo->si_flags = BYTE_GET (extsym->si_flags);
9318 if (do_dynamic && dynamic_addr)
9319 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9320 dynamic_addr, (unsigned long) dynamic_nent);
9322 printf (_(" Tag Type Name/Value\n"));
9324 for (entry = dynamic_section;
9325 entry < dynamic_section + dynamic_nent;
9333 print_vma (entry->d_tag, FULL_HEX);
9334 dtype = get_dynamic_type (entry->d_tag);
9335 printf (" (%s)%*s", dtype,
9336 ((is_32bit_elf ? 27 : 19)
9337 - (int) strlen (dtype)),
9341 switch (entry->d_tag)
9345 print_dynamic_flags (entry->d_un.d_val);
9355 switch (entry->d_tag)
9358 printf (_("Auxiliary library"));
9362 printf (_("Filter library"));
9366 printf (_("Configuration file"));
9370 printf (_("Dependency audit library"));
9374 printf (_("Audit library"));
9378 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9379 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9383 print_vma (entry->d_un.d_val, PREFIX_HEX);
9392 printf (_("Flags:"));
9394 if (entry->d_un.d_val == 0)
9395 printf (_(" None\n"));
9398 unsigned long int val = entry->d_un.d_val;
9400 if (val & DTF_1_PARINIT)
9402 printf (" PARINIT");
9403 val ^= DTF_1_PARINIT;
9405 if (val & DTF_1_CONFEXP)
9407 printf (" CONFEXP");
9408 val ^= DTF_1_CONFEXP;
9411 printf (" %lx", val);
9420 printf (_("Flags:"));
9422 if (entry->d_un.d_val == 0)
9423 printf (_(" None\n"));
9426 unsigned long int val = entry->d_un.d_val;
9428 if (val & DF_P1_LAZYLOAD)
9430 printf (" LAZYLOAD");
9431 val ^= DF_P1_LAZYLOAD;
9433 if (val & DF_P1_GROUPPERM)
9435 printf (" GROUPPERM");
9436 val ^= DF_P1_GROUPPERM;
9439 printf (" %lx", val);
9448 printf (_("Flags:"));
9449 if (entry->d_un.d_val == 0)
9450 printf (_(" None\n"));
9453 unsigned long int val = entry->d_un.d_val;
9460 if (val & DF_1_GLOBAL)
9465 if (val & DF_1_GROUP)
9470 if (val & DF_1_NODELETE)
9472 printf (" NODELETE");
9473 val ^= DF_1_NODELETE;
9475 if (val & DF_1_LOADFLTR)
9477 printf (" LOADFLTR");
9478 val ^= DF_1_LOADFLTR;
9480 if (val & DF_1_INITFIRST)
9482 printf (" INITFIRST");
9483 val ^= DF_1_INITFIRST;
9485 if (val & DF_1_NOOPEN)
9490 if (val & DF_1_ORIGIN)
9495 if (val & DF_1_DIRECT)
9500 if (val & DF_1_TRANS)
9505 if (val & DF_1_INTERPOSE)
9507 printf (" INTERPOSE");
9508 val ^= DF_1_INTERPOSE;
9510 if (val & DF_1_NODEFLIB)
9512 printf (" NODEFLIB");
9513 val ^= DF_1_NODEFLIB;
9515 if (val & DF_1_NODUMP)
9520 if (val & DF_1_CONFALT)
9522 printf (" CONFALT");
9523 val ^= DF_1_CONFALT;
9525 if (val & DF_1_ENDFILTEE)
9527 printf (" ENDFILTEE");
9528 val ^= DF_1_ENDFILTEE;
9530 if (val & DF_1_DISPRELDNE)
9532 printf (" DISPRELDNE");
9533 val ^= DF_1_DISPRELDNE;
9535 if (val & DF_1_DISPRELPND)
9537 printf (" DISPRELPND");
9538 val ^= DF_1_DISPRELPND;
9540 if (val & DF_1_NODIRECT)
9542 printf (" NODIRECT");
9543 val ^= DF_1_NODIRECT;
9545 if (val & DF_1_IGNMULDEF)
9547 printf (" IGNMULDEF");
9548 val ^= DF_1_IGNMULDEF;
9550 if (val & DF_1_NOKSYMS)
9552 printf (" NOKSYMS");
9553 val ^= DF_1_NOKSYMS;
9555 if (val & DF_1_NOHDR)
9560 if (val & DF_1_EDITED)
9565 if (val & DF_1_NORELOC)
9567 printf (" NORELOC");
9568 val ^= DF_1_NORELOC;
9570 if (val & DF_1_SYMINTPOSE)
9572 printf (" SYMINTPOSE");
9573 val ^= DF_1_SYMINTPOSE;
9575 if (val & DF_1_GLOBAUDIT)
9577 printf (" GLOBAUDIT");
9578 val ^= DF_1_GLOBAUDIT;
9580 if (val & DF_1_SINGLETON)
9582 printf (" SINGLETON");
9583 val ^= DF_1_SINGLETON;
9585 if (val & DF_1_STUB)
9596 printf (" %lx", val);
9603 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9605 puts (get_dynamic_type (entry->d_un.d_val));
9625 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9631 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9632 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9638 switch (entry->d_tag)
9641 printf (_("Shared library: [%s]"), name);
9643 if (streq (name, program_interpreter))
9644 printf (_(" program interpreter"));
9648 printf (_("Library soname: [%s]"), name);
9652 printf (_("Library rpath: [%s]"), name);
9656 printf (_("Library runpath: [%s]"), name);
9660 print_vma (entry->d_un.d_val, PREFIX_HEX);
9665 print_vma (entry->d_un.d_val, PREFIX_HEX);
9678 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9682 case DT_INIT_ARRAYSZ:
9683 case DT_FINI_ARRAYSZ:
9684 case DT_GNU_CONFLICTSZ:
9685 case DT_GNU_LIBLISTSZ:
9688 print_vma (entry->d_un.d_val, UNSIGNED);
9689 printf (_(" (bytes)\n"));
9699 print_vma (entry->d_un.d_val, UNSIGNED);
9712 if (entry->d_tag == DT_USED
9713 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9715 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9719 printf (_("Not needed object: [%s]\n"), name);
9724 print_vma (entry->d_un.d_val, PREFIX_HEX);
9730 /* The value of this entry is ignored. */
9735 case DT_GNU_PRELINKED:
9739 time_t atime = entry->d_un.d_val;
9741 tmp = gmtime (&atime);
9742 /* PR 17533 file: 041-1244816-0.004. */
9744 printf (_("<corrupt time val: %lx"),
9745 (unsigned long) atime);
9747 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9748 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9749 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9755 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9758 print_vma (entry->d_un.d_val, PREFIX_HEX);
9764 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9765 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9770 switch (elf_header.e_machine)
9773 case EM_MIPS_RS3_LE:
9774 dynamic_section_mips_val (entry);
9777 dynamic_section_parisc_val (entry);
9780 dynamic_section_ia64_val (entry);
9783 print_vma (entry->d_un.d_val, PREFIX_HEX);
9795 get_ver_flags (unsigned int flags)
9797 static char buff[32];
9804 if (flags & VER_FLG_BASE)
9805 strcat (buff, "BASE ");
9807 if (flags & VER_FLG_WEAK)
9809 if (flags & VER_FLG_BASE)
9810 strcat (buff, "| ");
9812 strcat (buff, "WEAK ");
9815 if (flags & VER_FLG_INFO)
9817 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9818 strcat (buff, "| ");
9820 strcat (buff, "INFO ");
9823 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9824 strcat (buff, _("| <unknown>"));
9829 /* Display the contents of the version sections. */
9832 process_version_sections (FILE * file)
9834 Elf_Internal_Shdr * section;
9841 for (i = 0, section = section_headers;
9842 i < elf_header.e_shnum;
9845 switch (section->sh_type)
9847 case SHT_GNU_verdef:
9849 Elf_External_Verdef * edefs;
9856 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9857 printable_section_name (section),
9860 printf (_(" Addr: 0x"));
9861 printf_vma (section->sh_addr);
9862 printf (_(" Offset: %#08lx Link: %u (%s)"),
9863 (unsigned long) section->sh_offset, section->sh_link,
9864 printable_section_name_from_index (section->sh_link));
9866 edefs = (Elf_External_Verdef *)
9867 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9868 _("version definition section"));
9871 endbuf = (char *) edefs + section->sh_size;
9873 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9876 Elf_External_Verdef * edef;
9877 Elf_Internal_Verdef ent;
9878 Elf_External_Verdaux * eaux;
9879 Elf_Internal_Verdaux aux;
9883 /* Check for very large indicies. */
9884 if (idx > (size_t) (endbuf - (char *) edefs))
9887 vstart = ((char *) edefs) + idx;
9888 if (vstart + sizeof (*edef) > endbuf)
9891 edef = (Elf_External_Verdef *) vstart;
9893 ent.vd_version = BYTE_GET (edef->vd_version);
9894 ent.vd_flags = BYTE_GET (edef->vd_flags);
9895 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9896 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9897 ent.vd_hash = BYTE_GET (edef->vd_hash);
9898 ent.vd_aux = BYTE_GET (edef->vd_aux);
9899 ent.vd_next = BYTE_GET (edef->vd_next);
9901 printf (_(" %#06x: Rev: %d Flags: %s"),
9902 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9904 printf (_(" Index: %d Cnt: %d "),
9905 ent.vd_ndx, ent.vd_cnt);
9907 /* Check for overflow. */
9908 if (ent.vd_aux > (size_t) (endbuf - vstart))
9911 vstart += ent.vd_aux;
9913 eaux = (Elf_External_Verdaux *) vstart;
9915 aux.vda_name = BYTE_GET (eaux->vda_name);
9916 aux.vda_next = BYTE_GET (eaux->vda_next);
9918 if (VALID_DYNAMIC_NAME (aux.vda_name))
9919 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9921 printf (_("Name index: %ld\n"), aux.vda_name);
9923 isum = idx + ent.vd_aux;
9925 for (j = 1; j < ent.vd_cnt; j++)
9927 /* Check for overflow. */
9928 if (aux.vda_next > (size_t) (endbuf - vstart))
9931 isum += aux.vda_next;
9932 vstart += aux.vda_next;
9934 eaux = (Elf_External_Verdaux *) vstart;
9935 if (vstart + sizeof (*eaux) > endbuf)
9938 aux.vda_name = BYTE_GET (eaux->vda_name);
9939 aux.vda_next = BYTE_GET (eaux->vda_next);
9941 if (VALID_DYNAMIC_NAME (aux.vda_name))
9942 printf (_(" %#06x: Parent %d: %s\n"),
9943 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9945 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9946 isum, j, aux.vda_name);
9950 printf (_(" Version def aux past end of section\n"));
9952 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9953 if (idx + ent.vd_next <= idx)
9959 if (cnt < section->sh_info)
9960 printf (_(" Version definition past end of section\n"));
9966 case SHT_GNU_verneed:
9968 Elf_External_Verneed * eneed;
9975 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9976 printable_section_name (section), section->sh_info);
9978 printf (_(" Addr: 0x"));
9979 printf_vma (section->sh_addr);
9980 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9981 (unsigned long) section->sh_offset, section->sh_link,
9982 printable_section_name_from_index (section->sh_link));
9984 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9985 section->sh_offset, 1,
9987 _("Version Needs section"));
9990 endbuf = (char *) eneed + section->sh_size;
9992 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9994 Elf_External_Verneed * entry;
9995 Elf_Internal_Verneed ent;
10000 if (idx > (size_t) (endbuf - (char *) eneed))
10003 vstart = ((char *) eneed) + idx;
10004 if (vstart + sizeof (*entry) > endbuf)
10007 entry = (Elf_External_Verneed *) vstart;
10009 ent.vn_version = BYTE_GET (entry->vn_version);
10010 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
10011 ent.vn_file = BYTE_GET (entry->vn_file);
10012 ent.vn_aux = BYTE_GET (entry->vn_aux);
10013 ent.vn_next = BYTE_GET (entry->vn_next);
10015 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
10017 if (VALID_DYNAMIC_NAME (ent.vn_file))
10018 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10020 printf (_(" File: %lx"), ent.vn_file);
10022 printf (_(" Cnt: %d\n"), ent.vn_cnt);
10024 /* Check for overflow. */
10025 if (ent.vn_aux > (size_t) (endbuf - vstart))
10027 vstart += ent.vn_aux;
10029 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10031 Elf_External_Vernaux * eaux;
10032 Elf_Internal_Vernaux aux;
10034 if (vstart + sizeof (*eaux) > endbuf)
10036 eaux = (Elf_External_Vernaux *) vstart;
10038 aux.vna_hash = BYTE_GET (eaux->vna_hash);
10039 aux.vna_flags = BYTE_GET (eaux->vna_flags);
10040 aux.vna_other = BYTE_GET (eaux->vna_other);
10041 aux.vna_name = BYTE_GET (eaux->vna_name);
10042 aux.vna_next = BYTE_GET (eaux->vna_next);
10044 if (VALID_DYNAMIC_NAME (aux.vna_name))
10045 printf (_(" %#06x: Name: %s"),
10046 isum, GET_DYNAMIC_NAME (aux.vna_name));
10048 printf (_(" %#06x: Name index: %lx"),
10049 isum, aux.vna_name);
10051 printf (_(" Flags: %s Version: %d\n"),
10052 get_ver_flags (aux.vna_flags), aux.vna_other);
10054 /* Check for overflow. */
10055 if (aux.vna_next > (size_t) (endbuf - vstart)
10056 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10058 warn (_("Invalid vna_next field of %lx\n"),
10063 isum += aux.vna_next;
10064 vstart += aux.vna_next;
10067 if (j < ent.vn_cnt)
10068 warn (_("Missing Version Needs auxillary information\n"));
10070 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10072 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10073 cnt = section->sh_info;
10076 idx += ent.vn_next;
10079 if (cnt < section->sh_info)
10080 warn (_("Missing Version Needs information\n"));
10086 case SHT_GNU_versym:
10088 Elf_Internal_Shdr * link_section;
10091 unsigned char * edata;
10092 unsigned short * data;
10094 Elf_Internal_Sym * symbols;
10095 Elf_Internal_Shdr * string_sec;
10096 unsigned long num_syms;
10099 if (section->sh_link >= elf_header.e_shnum)
10102 link_section = section_headers + section->sh_link;
10103 total = section->sh_size / sizeof (Elf_External_Versym);
10105 if (link_section->sh_link >= elf_header.e_shnum)
10110 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10111 if (symbols == NULL)
10114 string_sec = section_headers + link_section->sh_link;
10116 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10117 string_sec->sh_size,
10118 _("version string table"));
10125 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10126 printable_section_name (section), (unsigned long) total);
10128 printf (_(" Addr: "));
10129 printf_vma (section->sh_addr);
10130 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
10131 (unsigned long) section->sh_offset, section->sh_link,
10132 printable_section_name (link_section));
10134 off = offset_from_vma (file,
10135 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10136 total * sizeof (short));
10137 edata = (unsigned char *) get_data (NULL, file, off, total,
10139 _("version symbol data"));
10147 data = (short unsigned int *) cmalloc (total, sizeof (short));
10149 for (cnt = total; cnt --;)
10150 data[cnt] = byte_get (edata + cnt * sizeof (short),
10155 for (cnt = 0; cnt < total; cnt += 4)
10159 char *invalid = _("*invalid*");
10161 printf (" %03x:", cnt);
10163 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10164 switch (data[cnt + j])
10167 fputs (_(" 0 (*local*) "), stdout);
10171 fputs (_(" 1 (*global*) "), stdout);
10175 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10176 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10178 /* If this index value is greater than the size of the symbols
10179 array, break to avoid an out-of-bounds read. */
10180 if ((unsigned long)(cnt + j) >= num_syms)
10182 warn (_("invalid index into symbol array\n"));
10187 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10189 Elf_Internal_Verneed ivn;
10190 unsigned long offset;
10192 offset = offset_from_vma
10193 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10194 sizeof (Elf_External_Verneed));
10198 Elf_Internal_Vernaux ivna;
10199 Elf_External_Verneed evn;
10200 Elf_External_Vernaux evna;
10201 unsigned long a_off;
10203 if (get_data (&evn, file, offset, sizeof (evn), 1,
10204 _("version need")) == NULL)
10207 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10208 ivn.vn_next = BYTE_GET (evn.vn_next);
10210 a_off = offset + ivn.vn_aux;
10214 if (get_data (&evna, file, a_off, sizeof (evna),
10215 1, _("version need aux (2)")) == NULL)
10218 ivna.vna_other = 0;
10222 ivna.vna_next = BYTE_GET (evna.vna_next);
10223 ivna.vna_other = BYTE_GET (evna.vna_other);
10226 a_off += ivna.vna_next;
10228 while (ivna.vna_other != data[cnt + j]
10229 && ivna.vna_next != 0);
10231 if (ivna.vna_other == data[cnt + j])
10233 ivna.vna_name = BYTE_GET (evna.vna_name);
10235 if (ivna.vna_name >= string_sec->sh_size)
10238 name = strtab + ivna.vna_name;
10242 offset += ivn.vn_next;
10244 while (ivn.vn_next);
10247 if (data[cnt + j] != 0x8001
10248 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10250 Elf_Internal_Verdef ivd;
10251 Elf_External_Verdef evd;
10252 unsigned long offset;
10254 offset = offset_from_vma
10255 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10260 if (get_data (&evd, file, offset, sizeof (evd), 1,
10261 _("version def")) == NULL)
10264 /* PR 17531: file: 046-1082287-0.004. */
10265 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
10270 ivd.vd_next = BYTE_GET (evd.vd_next);
10271 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10274 offset += ivd.vd_next;
10276 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10277 && ivd.vd_next != 0);
10279 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10281 Elf_External_Verdaux evda;
10282 Elf_Internal_Verdaux ivda;
10284 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10286 if (get_data (&evda, file,
10287 offset - ivd.vd_next + ivd.vd_aux,
10289 _("version def aux")) == NULL)
10292 ivda.vda_name = BYTE_GET (evda.vda_name);
10294 if (ivda.vda_name >= string_sec->sh_size)
10296 else if (name != NULL && name != invalid)
10297 name = _("*both*");
10299 name = strtab + ivda.vda_name;
10303 nn += printf ("(%s%-*s",
10305 12 - (int) strlen (name),
10309 printf ("%*c", 18 - nn, ' ');
10327 printf (_("\nNo version information found in this file.\n"));
10332 static const char *
10333 get_symbol_binding (unsigned int binding)
10335 static char buff[32];
10339 case STB_LOCAL: return "LOCAL";
10340 case STB_GLOBAL: return "GLOBAL";
10341 case STB_WEAK: return "WEAK";
10343 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10344 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10346 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10348 if (binding == STB_GNU_UNIQUE
10349 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10350 /* GNU is still using the default value 0. */
10351 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10353 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10356 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10361 static const char *
10362 get_symbol_type (unsigned int type)
10364 static char buff[32];
10368 case STT_NOTYPE: return "NOTYPE";
10369 case STT_OBJECT: return "OBJECT";
10370 case STT_FUNC: return "FUNC";
10371 case STT_SECTION: return "SECTION";
10372 case STT_FILE: return "FILE";
10373 case STT_COMMON: return "COMMON";
10374 case STT_TLS: return "TLS";
10375 case STT_RELC: return "RELC";
10376 case STT_SRELC: return "SRELC";
10378 if (type >= STT_LOPROC && type <= STT_HIPROC)
10380 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10381 return "THUMB_FUNC";
10383 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10386 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10387 return "PARISC_MILLI";
10389 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10391 else if (type >= STT_LOOS && type <= STT_HIOS)
10393 if (elf_header.e_machine == EM_PARISC)
10395 if (type == STT_HP_OPAQUE)
10396 return "HP_OPAQUE";
10397 if (type == STT_HP_STUB)
10401 if (type == STT_GNU_IFUNC
10402 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10403 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10404 /* GNU is still using the default value 0. */
10405 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10408 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10411 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10416 static const char *
10417 get_symbol_visibility (unsigned int visibility)
10419 switch (visibility)
10421 case STV_DEFAULT: return "DEFAULT";
10422 case STV_INTERNAL: return "INTERNAL";
10423 case STV_HIDDEN: return "HIDDEN";
10424 case STV_PROTECTED: return "PROTECTED";
10426 error (_("Unrecognized visibility value: %u"), visibility);
10427 return _("<unknown>");
10431 static const char *
10432 get_solaris_symbol_visibility (unsigned int visibility)
10434 switch (visibility)
10436 case 4: return "EXPORTED";
10437 case 5: return "SINGLETON";
10438 case 6: return "ELIMINATE";
10439 default: return get_symbol_visibility (visibility);
10443 static const char *
10444 get_mips_symbol_other (unsigned int other)
10454 case STO_MICROMIPS:
10455 return "MICROMIPS";
10456 case STO_MICROMIPS | STO_MIPS_PIC:
10457 return "MICROMIPS, MIPS PIC";
10465 static const char *
10466 get_ia64_symbol_other (unsigned int other)
10468 if (is_ia64_vms ())
10470 static char res[32];
10474 /* Function types is for images and .STB files only. */
10475 switch (elf_header.e_type)
10479 switch (VMS_ST_FUNC_TYPE (other))
10481 case VMS_SFT_CODE_ADDR:
10482 strcat (res, " CA");
10484 case VMS_SFT_SYMV_IDX:
10485 strcat (res, " VEC");
10488 strcat (res, " FD");
10490 case VMS_SFT_RESERVE:
10491 strcat (res, " RSV");
10494 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10495 VMS_ST_FUNC_TYPE (other));
10496 strcat (res, " <unknown>");
10503 switch (VMS_ST_LINKAGE (other))
10505 case VMS_STL_IGNORE:
10506 strcat (res, " IGN");
10508 case VMS_STL_RESERVE:
10509 strcat (res, " RSV");
10512 strcat (res, " STD");
10515 strcat (res, " LNK");
10518 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10519 VMS_ST_LINKAGE (other));
10520 strcat (res, " <unknown>");
10532 static const char *
10533 get_ppc64_symbol_other (unsigned int other)
10535 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10537 static char buf[32];
10538 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10539 PPC64_LOCAL_ENTRY_OFFSET (other));
10545 static const char *
10546 get_symbol_other (unsigned int other)
10548 const char * result = NULL;
10549 static char buff [32];
10554 switch (elf_header.e_machine)
10557 result = get_mips_symbol_other (other);
10560 result = get_ia64_symbol_other (other);
10563 result = get_ppc64_symbol_other (other);
10573 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10577 static const char *
10578 get_symbol_index_type (unsigned int type)
10580 static char buff[32];
10584 case SHN_UNDEF: return "UND";
10585 case SHN_ABS: return "ABS";
10586 case SHN_COMMON: return "COM";
10588 if (type == SHN_IA_64_ANSI_COMMON
10589 && elf_header.e_machine == EM_IA_64
10590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10592 else if ((elf_header.e_machine == EM_X86_64
10593 || elf_header.e_machine == EM_L1OM
10594 || elf_header.e_machine == EM_K1OM)
10595 && type == SHN_X86_64_LCOMMON)
10596 return "LARGE_COM";
10597 else if ((type == SHN_MIPS_SCOMMON
10598 && elf_header.e_machine == EM_MIPS)
10599 || (type == SHN_TIC6X_SCOMMON
10600 && elf_header.e_machine == EM_TI_C6000))
10602 else if (type == SHN_MIPS_SUNDEFINED
10603 && elf_header.e_machine == EM_MIPS)
10605 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10606 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10607 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10608 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10609 else if (type >= SHN_LORESERVE)
10610 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10611 else if (type >= elf_header.e_shnum)
10612 sprintf (buff, _("bad section index[%3d]"), type);
10614 sprintf (buff, "%3d", type);
10622 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10624 unsigned char * e_data;
10627 /* If the size_t type is smaller than the bfd_size_type, eg because
10628 you are building a 32-bit tool on a 64-bit host, then make sure
10629 that when (number) is cast to (size_t) no information is lost. */
10630 if (sizeof (size_t) < sizeof (bfd_size_type)
10631 && (bfd_size_type) ((size_t) number) != number)
10633 error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10634 " elements of size %u\n"),
10639 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10640 attempting to allocate memory when the read is bound to fail. */
10641 if (ent_size * number > current_file_size)
10643 error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10648 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10649 if (e_data == NULL)
10651 error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10656 if (fread (e_data, ent_size, (size_t) number, file) != number)
10658 error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10659 number * ent_size);
10664 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10665 if (i_data == NULL)
10667 error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10668 " dynamic entries\n"),
10675 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10683 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10685 Elf_Internal_Sym * psym;
10688 n = print_vma (si, DEC_5);
10690 fputs (&" "[n], stdout);
10691 printf (" %3lu: ", hn);
10693 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10695 printf (_("<No info available for dynamic symbol number %lu>\n"),
10696 (unsigned long) si);
10700 psym = dynamic_symbols + si;
10701 print_vma (psym->st_value, LONG_HEX);
10703 print_vma (psym->st_size, DEC_5);
10705 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10706 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10708 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10709 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
10712 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10714 printf (" %-7s", get_symbol_visibility (vis));
10715 /* Check to see if any other bits in the st_other field are set.
10716 Note - displaying this information disrupts the layout of the
10717 table being generated, but for the moment this case is very
10719 if (psym->st_other ^ vis)
10720 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10723 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10724 if (VALID_DYNAMIC_NAME (psym->st_name))
10725 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10727 printf (_(" <corrupt: %14ld>"), psym->st_name);
10731 static const char *
10732 get_symbol_version_string (FILE *file, int is_dynsym,
10733 const char *strtab,
10734 unsigned long int strtab_size,
10735 unsigned int si, Elf_Internal_Sym *psym,
10736 enum versioned_symbol_info *sym_info,
10737 unsigned short *vna_other)
10739 unsigned char data[2];
10740 unsigned short vers_data;
10741 unsigned long offset;
10744 || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10747 offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10748 sizeof data + si * sizeof (vers_data));
10750 if (get_data (&data, file, offset + si * sizeof (vers_data),
10751 sizeof (data), 1, _("version data")) == NULL)
10754 vers_data = byte_get (data, 2);
10756 if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10759 /* Usually we'd only see verdef for defined symbols, and verneed for
10760 undefined symbols. However, symbols defined by the linker in
10761 .dynbss for variables copied from a shared library in order to
10762 avoid text relocations are defined yet have verneed. We could
10763 use a heuristic to detect the special case, for example, check
10764 for verneed first on symbols defined in SHT_NOBITS sections, but
10765 it is simpler and more reliable to just look for both verdef and
10766 verneed. .dynbss might not be mapped to a SHT_NOBITS section. */
10768 if (psym->st_shndx != SHN_UNDEF
10769 && vers_data != 0x8001
10770 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10772 Elf_Internal_Verdef ivd;
10773 Elf_Internal_Verdaux ivda;
10774 Elf_External_Verdaux evda;
10777 off = offset_from_vma (file,
10778 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10779 sizeof (Elf_External_Verdef));
10783 Elf_External_Verdef evd;
10785 if (get_data (&evd, file, off, sizeof (evd), 1,
10786 _("version def")) == NULL)
10794 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10795 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10796 ivd.vd_next = BYTE_GET (evd.vd_next);
10799 off += ivd.vd_next;
10801 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10803 if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10805 off -= ivd.vd_next;
10808 if (get_data (&evda, file, off, sizeof (evda), 1,
10809 _("version def aux")) != NULL)
10811 ivda.vda_name = BYTE_GET (evda.vda_name);
10813 if (psym->st_name != ivda.vda_name)
10815 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10816 ? symbol_hidden : symbol_public);
10817 return (ivda.vda_name < strtab_size
10818 ? strtab + ivda.vda_name : _("<corrupt>"));
10824 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10826 Elf_External_Verneed evn;
10827 Elf_Internal_Verneed ivn;
10828 Elf_Internal_Vernaux ivna;
10830 offset = offset_from_vma (file,
10831 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10835 unsigned long vna_off;
10837 if (get_data (&evn, file, offset, sizeof (evn), 1,
10838 _("version need")) == NULL)
10841 ivna.vna_other = 0;
10846 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10847 ivn.vn_next = BYTE_GET (evn.vn_next);
10849 vna_off = offset + ivn.vn_aux;
10853 Elf_External_Vernaux evna;
10855 if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10856 _("version need aux (3)")) == NULL)
10859 ivna.vna_other = 0;
10864 ivna.vna_other = BYTE_GET (evna.vna_other);
10865 ivna.vna_next = BYTE_GET (evna.vna_next);
10866 ivna.vna_name = BYTE_GET (evna.vna_name);
10869 vna_off += ivna.vna_next;
10871 while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10873 if (ivna.vna_other == vers_data)
10876 offset += ivn.vn_next;
10878 while (ivn.vn_next != 0);
10880 if (ivna.vna_other == vers_data)
10882 *sym_info = symbol_undefined;
10883 *vna_other = ivna.vna_other;
10884 return (ivna.vna_name < strtab_size
10885 ? strtab + ivna.vna_name : _("<corrupt>"));
10891 /* Dump the symbol table. */
10893 process_symbol_table (FILE * file)
10895 Elf_Internal_Shdr * section;
10896 bfd_size_type nbuckets = 0;
10897 bfd_size_type nchains = 0;
10898 bfd_vma * buckets = NULL;
10899 bfd_vma * chains = NULL;
10900 bfd_vma ngnubuckets = 0;
10901 bfd_vma * gnubuckets = NULL;
10902 bfd_vma * gnuchains = NULL;
10903 bfd_vma gnusymidx = 0;
10904 bfd_size_type ngnuchains = 0;
10906 if (!do_syms && !do_dyn_syms && !do_histogram)
10909 if (dynamic_info[DT_HASH]
10911 || (do_using_dynamic
10913 && dynamic_strings != NULL)))
10915 unsigned char nb[8];
10916 unsigned char nc[8];
10917 unsigned int hash_ent_size = 4;
10919 if ((elf_header.e_machine == EM_ALPHA
10920 || elf_header.e_machine == EM_S390
10921 || elf_header.e_machine == EM_S390_OLD)
10922 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10926 (archive_file_offset
10927 + offset_from_vma (file, dynamic_info[DT_HASH],
10928 sizeof nb + sizeof nc)),
10931 error (_("Unable to seek to start of dynamic information\n"));
10935 if (fread (nb, hash_ent_size, 1, file) != 1)
10937 error (_("Failed to read in number of buckets\n"));
10941 if (fread (nc, hash_ent_size, 1, file) != 1)
10943 error (_("Failed to read in number of chains\n"));
10947 nbuckets = byte_get (nb, hash_ent_size);
10948 nchains = byte_get (nc, hash_ent_size);
10950 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10951 chains = get_dynamic_data (file, nchains, hash_ent_size);
10954 if (buckets == NULL || chains == NULL)
10956 if (do_using_dynamic)
10967 if (dynamic_info_DT_GNU_HASH
10969 || (do_using_dynamic
10971 && dynamic_strings != NULL)))
10973 unsigned char nb[16];
10974 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10975 bfd_vma buckets_vma;
10978 (archive_file_offset
10979 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10983 error (_("Unable to seek to start of dynamic information\n"));
10987 if (fread (nb, 16, 1, file) != 1)
10989 error (_("Failed to read in number of buckets\n"));
10993 ngnubuckets = byte_get (nb, 4);
10994 gnusymidx = byte_get (nb + 4, 4);
10995 bitmaskwords = byte_get (nb + 8, 4);
10996 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10998 buckets_vma += bitmaskwords * 4;
11000 buckets_vma += bitmaskwords * 8;
11003 (archive_file_offset
11004 + offset_from_vma (file, buckets_vma, 4)),
11007 error (_("Unable to seek to start of dynamic information\n"));
11011 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11013 if (gnubuckets == NULL)
11016 for (i = 0; i < ngnubuckets; i++)
11017 if (gnubuckets[i] != 0)
11019 if (gnubuckets[i] < gnusymidx)
11022 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11023 maxchain = gnubuckets[i];
11026 if (maxchain == 0xffffffff)
11029 maxchain -= gnusymidx;
11032 (archive_file_offset
11033 + offset_from_vma (file, buckets_vma
11034 + 4 * (ngnubuckets + maxchain), 4)),
11037 error (_("Unable to seek to start of dynamic information\n"));
11043 if (fread (nb, 4, 1, file) != 1)
11045 error (_("Failed to determine last chain length\n"));
11049 if (maxchain + 1 == 0)
11054 while ((byte_get (nb, 4) & 1) == 0);
11057 (archive_file_offset
11058 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11061 error (_("Unable to seek to start of dynamic information\n"));
11065 gnuchains = get_dynamic_data (file, maxchain, 4);
11066 ngnuchains = maxchain;
11069 if (gnuchains == NULL)
11074 if (do_using_dynamic)
11079 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11081 && do_using_dynamic
11082 && dynamic_strings != NULL
11083 && dynamic_symbols != NULL)
11087 if (dynamic_info[DT_HASH])
11091 printf (_("\nSymbol table for image:\n"));
11093 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11095 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11097 for (hn = 0; hn < nbuckets; hn++)
11102 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11103 print_dynamic_symbol (si, hn);
11107 if (dynamic_info_DT_GNU_HASH)
11109 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11111 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11113 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
11115 for (hn = 0; hn < ngnubuckets; ++hn)
11116 if (gnubuckets[hn] != 0)
11118 bfd_vma si = gnubuckets[hn];
11119 bfd_vma off = si - gnusymidx;
11123 print_dynamic_symbol (si, hn);
11126 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11130 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11131 && section_headers != NULL)
11135 for (i = 0, section = section_headers;
11136 i < elf_header.e_shnum;
11140 char * strtab = NULL;
11141 unsigned long int strtab_size = 0;
11142 Elf_Internal_Sym * symtab;
11143 Elf_Internal_Sym * psym;
11144 unsigned long num_syms;
11146 if ((section->sh_type != SHT_SYMTAB
11147 && section->sh_type != SHT_DYNSYM)
11149 && section->sh_type == SHT_SYMTAB))
11152 if (section->sh_entsize == 0)
11154 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11155 printable_section_name (section));
11159 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11160 printable_section_name (section),
11161 (unsigned long) (section->sh_size / section->sh_entsize));
11164 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11166 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
11168 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11169 if (symtab == NULL)
11172 if (section->sh_link == elf_header.e_shstrndx)
11174 strtab = string_table;
11175 strtab_size = string_table_length;
11177 else if (section->sh_link < elf_header.e_shnum)
11179 Elf_Internal_Shdr * string_sec;
11181 string_sec = section_headers + section->sh_link;
11183 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11184 1, string_sec->sh_size,
11185 _("string table"));
11186 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11189 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11191 const char *version_string;
11192 enum versioned_symbol_info sym_info;
11193 unsigned short vna_other;
11195 printf ("%6d: ", si);
11196 print_vma (psym->st_value, LONG_HEX);
11198 print_vma (psym->st_size, DEC_5);
11199 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11200 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11201 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11202 printf (" %-7s", get_solaris_symbol_visibility (psym->st_other));
11205 unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11207 printf (" %-7s", get_symbol_visibility (vis));
11208 /* Check to see if any other bits in the st_other field are set.
11209 Note - displaying this information disrupts the layout of the
11210 table being generated, but for the moment this case is very rare. */
11211 if (psym->st_other ^ vis)
11212 printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11214 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11215 print_symbol (25, psym->st_name < strtab_size
11216 ? strtab + psym->st_name : _("<corrupt>"));
11219 = get_symbol_version_string (file,
11220 section->sh_type == SHT_DYNSYM,
11221 strtab, strtab_size, si,
11222 psym, &sym_info, &vna_other);
11223 if (version_string)
11225 if (sym_info == symbol_undefined)
11226 printf ("@%s (%d)", version_string, vna_other);
11228 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11234 if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11235 && si >= section->sh_info
11236 /* Irix 5 and 6 MIPS binaries are known to ignore this requirement. */
11237 && elf_header.e_machine != EM_MIPS
11238 /* Solaris binaries have been found to violate this requirement as
11239 well. Not sure if this is a bug or an ABI requirement. */
11240 && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11241 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11242 si, printable_section_name (section), section->sh_info);
11246 if (strtab != string_table)
11252 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11254 if (do_histogram && buckets != NULL)
11256 unsigned long * lengths;
11257 unsigned long * counts;
11260 unsigned long maxlength = 0;
11261 unsigned long nzero_counts = 0;
11262 unsigned long nsyms = 0;
11263 unsigned long chained;
11265 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11266 (unsigned long) nbuckets);
11268 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11269 if (lengths == NULL)
11271 error (_("Out of memory allocating space for histogram buckets\n"));
11275 printf (_(" Length Number %% of total Coverage\n"));
11276 for (hn = 0; hn < nbuckets; ++hn)
11278 for (si = buckets[hn], chained = 0;
11279 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11280 si = chains[si], ++chained)
11283 if (maxlength < ++lengths[hn])
11287 /* PR binutils/17531: A corrupt binary could contain broken
11288 histogram data. Do not go into an infinite loop trying
11290 if (chained > nchains)
11292 error (_("histogram chain is corrupt\n"));
11297 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11298 if (counts == NULL)
11301 error (_("Out of memory allocating space for histogram counts\n"));
11305 for (hn = 0; hn < nbuckets; ++hn)
11306 ++counts[lengths[hn]];
11311 printf (" 0 %-10lu (%5.1f%%)\n",
11312 counts[0], (counts[0] * 100.0) / nbuckets);
11313 for (i = 1; i <= maxlength; ++i)
11315 nzero_counts += counts[i] * i;
11316 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11317 i, counts[i], (counts[i] * 100.0) / nbuckets,
11318 (nzero_counts * 100.0) / nsyms);
11326 if (buckets != NULL)
11332 if (do_histogram && gnubuckets != NULL)
11334 unsigned long * lengths;
11335 unsigned long * counts;
11337 unsigned long maxlength = 0;
11338 unsigned long nzero_counts = 0;
11339 unsigned long nsyms = 0;
11341 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11342 (unsigned long) ngnubuckets);
11344 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11345 if (lengths == NULL)
11347 error (_("Out of memory allocating space for gnu histogram buckets\n"));
11351 printf (_(" Length Number %% of total Coverage\n"));
11353 for (hn = 0; hn < ngnubuckets; ++hn)
11354 if (gnubuckets[hn] != 0)
11356 bfd_vma off, length = 1;
11358 for (off = gnubuckets[hn] - gnusymidx;
11359 /* PR 17531 file: 010-77222-0.004. */
11360 off < ngnuchains && (gnuchains[off] & 1) == 0;
11363 lengths[hn] = length;
11364 if (length > maxlength)
11365 maxlength = length;
11369 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11370 if (counts == NULL)
11373 error (_("Out of memory allocating space for gnu histogram counts\n"));
11377 for (hn = 0; hn < ngnubuckets; ++hn)
11378 ++counts[lengths[hn]];
11380 if (ngnubuckets > 0)
11383 printf (" 0 %-10lu (%5.1f%%)\n",
11384 counts[0], (counts[0] * 100.0) / ngnubuckets);
11385 for (j = 1; j <= maxlength; ++j)
11387 nzero_counts += counts[j] * j;
11388 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11389 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11390 (nzero_counts * 100.0) / nsyms);
11404 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11408 if (dynamic_syminfo == NULL
11410 /* No syminfo, this is ok. */
11413 /* There better should be a dynamic symbol section. */
11414 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11418 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11419 dynamic_syminfo_offset, dynamic_syminfo_nent);
11421 printf (_(" Num: Name BoundTo Flags\n"));
11422 for (i = 0; i < dynamic_syminfo_nent; ++i)
11424 unsigned short int flags = dynamic_syminfo[i].si_flags;
11426 printf ("%4d: ", i);
11427 if (i >= num_dynamic_syms)
11428 printf (_("<corrupt index>"));
11429 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11430 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11432 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11435 switch (dynamic_syminfo[i].si_boundto)
11437 case SYMINFO_BT_SELF:
11438 fputs ("SELF ", stdout);
11440 case SYMINFO_BT_PARENT:
11441 fputs ("PARENT ", stdout);
11444 if (dynamic_syminfo[i].si_boundto > 0
11445 && dynamic_syminfo[i].si_boundto < dynamic_nent
11446 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11448 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11452 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11456 if (flags & SYMINFO_FLG_DIRECT)
11457 printf (" DIRECT");
11458 if (flags & SYMINFO_FLG_PASSTHRU)
11459 printf (" PASSTHRU");
11460 if (flags & SYMINFO_FLG_COPY)
11462 if (flags & SYMINFO_FLG_LAZYLOAD)
11463 printf (" LAZYLOAD");
11471 /* Check to see if the given reloc needs to be handled in a target specific
11472 manner. If so then process the reloc and return TRUE otherwise return
11476 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11477 unsigned char * start,
11478 Elf_Internal_Sym * symtab)
11480 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11482 switch (elf_header.e_machine)
11485 case EM_MSP430_OLD:
11487 static Elf_Internal_Sym * saved_sym = NULL;
11489 switch (reloc_type)
11491 case 10: /* R_MSP430_SYM_DIFF */
11492 if (uses_msp430x_relocs ())
11494 case 21: /* R_MSP430X_SYM_DIFF */
11495 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11498 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11499 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11500 goto handle_sym_diff;
11502 case 5: /* R_MSP430_16_BYTE */
11503 case 9: /* R_MSP430_8 */
11504 if (uses_msp430x_relocs ())
11506 goto handle_sym_diff;
11508 case 2: /* R_MSP430_ABS16 */
11509 case 15: /* R_MSP430X_ABS16 */
11510 if (! uses_msp430x_relocs ())
11512 goto handle_sym_diff;
11515 if (saved_sym != NULL)
11519 value = reloc->r_addend
11520 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11521 - saved_sym->st_value);
11523 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11531 if (saved_sym != NULL)
11532 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11539 case EM_CYGNUS_MN10300:
11541 static Elf_Internal_Sym * saved_sym = NULL;
11543 switch (reloc_type)
11545 case 34: /* R_MN10300_ALIGN */
11547 case 33: /* R_MN10300_SYM_DIFF */
11548 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11550 case 1: /* R_MN10300_32 */
11551 case 2: /* R_MN10300_16 */
11552 if (saved_sym != NULL)
11556 value = reloc->r_addend
11557 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11558 - saved_sym->st_value);
11560 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11567 if (saved_sym != NULL)
11568 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11576 static bfd_vma saved_sym1 = 0;
11577 static bfd_vma saved_sym2 = 0;
11578 static bfd_vma value;
11580 switch (reloc_type)
11582 case 0x80: /* R_RL78_SYM. */
11583 saved_sym1 = saved_sym2;
11584 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11585 saved_sym2 += reloc->r_addend;
11588 case 0x83: /* R_RL78_OPsub. */
11589 value = saved_sym1 - saved_sym2;
11590 saved_sym2 = saved_sym1 = 0;
11594 case 0x41: /* R_RL78_ABS32. */
11595 byte_put (start + reloc->r_offset, value, 4);
11599 case 0x43: /* R_RL78_ABS16. */
11600 byte_put (start + reloc->r_offset, value, 2);
11614 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11615 DWARF debug sections. This is a target specific test. Note - we do not
11616 go through the whole including-target-headers-multiple-times route, (as
11617 we have already done with <elf/h8.h>) because this would become very
11618 messy and even then this function would have to contain target specific
11619 information (the names of the relocs instead of their numeric values).
11620 FIXME: This is not the correct way to solve this problem. The proper way
11621 is to have target specific reloc sizing and typing functions created by
11622 the reloc-macros.h header, in the same way that it already creates the
11623 reloc naming functions. */
11626 is_32bit_abs_reloc (unsigned int reloc_type)
11628 /* Please keep this table alpha-sorted for ease of visual lookup. */
11629 switch (elf_header.e_machine)
11633 return reloc_type == 1; /* R_386_32. */
11635 return reloc_type == 1; /* R_68K_32. */
11637 return reloc_type == 1; /* R_860_32. */
11639 return reloc_type == 2; /* R_960_32. */
11641 return reloc_type == 258; /* R_AARCH64_ABS32 */
11642 case EM_ADAPTEVA_EPIPHANY:
11643 return reloc_type == 3;
11645 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11647 return reloc_type == 1; /* R_ARC_32. */
11648 case EM_ARC_COMPACT:
11649 case EM_ARC_COMPACT2:
11650 return reloc_type == 4; /* R_ARC_32. */
11652 return reloc_type == 2; /* R_ARM_ABS32 */
11655 return reloc_type == 1;
11657 return reloc_type == 0x12; /* R_byte4_data. */
11659 return reloc_type == 3; /* R_CRIS_32. */
11661 return reloc_type == 3; /* R_CR16_NUM32. */
11663 return reloc_type == 15; /* R_CRX_NUM32. */
11664 case EM_CYGNUS_FRV:
11665 return reloc_type == 1;
11666 case EM_CYGNUS_D10V:
11668 return reloc_type == 6; /* R_D10V_32. */
11669 case EM_CYGNUS_D30V:
11671 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11673 return reloc_type == 3; /* R_DLX_RELOC_32. */
11674 case EM_CYGNUS_FR30:
11676 return reloc_type == 3; /* R_FR30_32. */
11678 return reloc_type == 1; /* R_FT32_32. */
11682 return reloc_type == 1; /* R_H8_DIR32. */
11684 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11685 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11688 return reloc_type == 2; /* R_IP2K_32. */
11690 return reloc_type == 2; /* R_IQ2000_32. */
11691 case EM_LATTICEMICO32:
11692 return reloc_type == 3; /* R_LM32_32. */
11695 return reloc_type == 3; /* R_M32C_32. */
11697 return reloc_type == 34; /* R_M32R_32_RELA. */
11700 return reloc_type == 6; /* R_M68HC11_32. */
11702 return reloc_type == 1; /* R_MCORE_ADDR32. */
11703 case EM_CYGNUS_MEP:
11704 return reloc_type == 4; /* R_MEP_32. */
11706 return reloc_type == 2; /* R_METAG_ADDR32. */
11707 case EM_MICROBLAZE:
11708 return reloc_type == 1; /* R_MICROBLAZE_32. */
11710 return reloc_type == 2; /* R_MIPS_32. */
11712 return reloc_type == 4; /* R_MMIX_32. */
11713 case EM_CYGNUS_MN10200:
11715 return reloc_type == 1; /* R_MN10200_32. */
11716 case EM_CYGNUS_MN10300:
11718 return reloc_type == 1; /* R_MN10300_32. */
11720 return reloc_type == 1; /* R_MOXIE_32. */
11721 case EM_MSP430_OLD:
11723 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11725 return reloc_type == 2; /* R_MT_32. */
11727 return reloc_type == 20; /* R_NDS32_RELA. */
11728 case EM_ALTERA_NIOS2:
11729 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11731 return reloc_type == 1; /* R_NIOS_32. */
11733 return reloc_type == 1; /* R_OR1K_32. */
11735 return (reloc_type == 1 /* R_PARISC_DIR32. */
11736 || reloc_type == 41); /* R_PARISC_SECREL32. */
11739 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11741 return reloc_type == 1; /* R_PPC64_ADDR32. */
11743 return reloc_type == 1; /* R_PPC_ADDR32. */
11745 return reloc_type == 1; /* R_RL78_DIR32. */
11747 return reloc_type == 1; /* R_RX_DIR32. */
11749 return reloc_type == 1; /* R_I370_ADDR31. */
11752 return reloc_type == 4; /* R_S390_32. */
11754 return reloc_type == 8; /* R_SCORE_ABS32. */
11756 return reloc_type == 1; /* R_SH_DIR32. */
11757 case EM_SPARC32PLUS:
11760 return reloc_type == 3 /* R_SPARC_32. */
11761 || reloc_type == 23; /* R_SPARC_UA32. */
11763 return reloc_type == 6; /* R_SPU_ADDR32 */
11765 return reloc_type == 1; /* R_C6000_ABS32. */
11767 return reloc_type == 2; /* R_TILEGX_32. */
11769 return reloc_type == 1; /* R_TILEPRO_32. */
11770 case EM_CYGNUS_V850:
11772 return reloc_type == 6; /* R_V850_ABS32. */
11774 return reloc_type == 0x33; /* R_V810_WORD. */
11776 return reloc_type == 1; /* R_VAX_32. */
11778 return reloc_type == 3; /* R_VISIUM_32. */
11782 return reloc_type == 10; /* R_X86_64_32. */
11785 return reloc_type == 3; /* R_XC16C_ABS_32. */
11787 return reloc_type == 4; /* R_XGATE_32. */
11789 return reloc_type == 1; /* R_XSTROMY16_32. */
11790 case EM_XTENSA_OLD:
11792 return reloc_type == 1; /* R_XTENSA_32. */
11795 static unsigned int prev_warn = 0;
11797 /* Avoid repeating the same warning multiple times. */
11798 if (prev_warn != elf_header.e_machine)
11799 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11800 elf_header.e_machine);
11801 prev_warn = elf_header.e_machine;
11807 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11808 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11811 is_32bit_pcrel_reloc (unsigned int reloc_type)
11813 switch (elf_header.e_machine)
11814 /* Please keep this table alpha-sorted for ease of visual lookup. */
11818 return reloc_type == 2; /* R_386_PC32. */
11820 return reloc_type == 4; /* R_68K_PC32. */
11822 return reloc_type == 261; /* R_AARCH64_PREL32 */
11823 case EM_ADAPTEVA_EPIPHANY:
11824 return reloc_type == 6;
11826 return reloc_type == 10; /* R_ALPHA_SREL32. */
11827 case EM_ARC_COMPACT:
11828 case EM_ARC_COMPACT2:
11829 return reloc_type == 49; /* R_ARC_32_PCREL. */
11831 return reloc_type == 3; /* R_ARM_REL32 */
11834 return reloc_type == 36; /* R_AVR_32_PCREL. */
11835 case EM_MICROBLAZE:
11836 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11838 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11840 return reloc_type == 9; /* R_PARISC_PCREL32. */
11842 return reloc_type == 26; /* R_PPC_REL32. */
11844 return reloc_type == 26; /* R_PPC64_REL32. */
11847 return reloc_type == 5; /* R_390_PC32. */
11849 return reloc_type == 2; /* R_SH_REL32. */
11850 case EM_SPARC32PLUS:
11853 return reloc_type == 6; /* R_SPARC_DISP32. */
11855 return reloc_type == 13; /* R_SPU_REL32. */
11857 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11859 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11861 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11865 return reloc_type == 2; /* R_X86_64_PC32. */
11866 case EM_XTENSA_OLD:
11868 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11870 /* Do not abort or issue an error message here. Not all targets use
11871 pc-relative 32-bit relocs in their DWARF debug information and we
11872 have already tested for target coverage in is_32bit_abs_reloc. A
11873 more helpful warning message will be generated by apply_relocations
11874 anyway, so just return. */
11879 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11880 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11883 is_64bit_abs_reloc (unsigned int reloc_type)
11885 switch (elf_header.e_machine)
11888 return reloc_type == 257; /* R_AARCH64_ABS64. */
11890 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11892 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11894 return reloc_type == 80; /* R_PARISC_DIR64. */
11896 return reloc_type == 38; /* R_PPC64_ADDR64. */
11897 case EM_SPARC32PLUS:
11900 return reloc_type == 54; /* R_SPARC_UA64. */
11904 return reloc_type == 1; /* R_X86_64_64. */
11907 return reloc_type == 22; /* R_S390_64. */
11909 return reloc_type == 1; /* R_TILEGX_64. */
11911 return reloc_type == 18; /* R_MIPS_64. */
11917 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11918 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11921 is_64bit_pcrel_reloc (unsigned int reloc_type)
11923 switch (elf_header.e_machine)
11926 return reloc_type == 260; /* R_AARCH64_PREL64. */
11928 return reloc_type == 11; /* R_ALPHA_SREL64. */
11930 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11932 return reloc_type == 72; /* R_PARISC_PCREL64. */
11934 return reloc_type == 44; /* R_PPC64_REL64. */
11935 case EM_SPARC32PLUS:
11938 return reloc_type == 46; /* R_SPARC_DISP64. */
11942 return reloc_type == 24; /* R_X86_64_PC64. */
11945 return reloc_type == 23; /* R_S390_PC64. */
11947 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11953 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11954 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11957 is_24bit_abs_reloc (unsigned int reloc_type)
11959 switch (elf_header.e_machine)
11961 case EM_CYGNUS_MN10200:
11963 return reloc_type == 4; /* R_MN10200_24. */
11965 return reloc_type == 5; /* R_FT32_20. */
11971 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11972 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11975 is_16bit_abs_reloc (unsigned int reloc_type)
11977 /* Please keep this table alpha-sorted for ease of visual lookup. */
11978 switch (elf_header.e_machine)
11981 case EM_ARC_COMPACT:
11982 case EM_ARC_COMPACT2:
11983 return reloc_type == 2; /* R_ARC_16. */
11984 case EM_ADAPTEVA_EPIPHANY:
11985 return reloc_type == 5;
11988 return reloc_type == 4; /* R_AVR_16. */
11989 case EM_CYGNUS_D10V:
11991 return reloc_type == 3; /* R_D10V_16. */
11995 return reloc_type == R_H8_DIR16;
11998 return reloc_type == 1; /* R_IP2K_16. */
12001 return reloc_type == 1; /* R_M32C_16 */
12002 case EM_CYGNUS_MN10200:
12004 return reloc_type == 2; /* R_MN10200_16. */
12005 case EM_CYGNUS_MN10300:
12007 return reloc_type == 2; /* R_MN10300_16. */
12009 if (uses_msp430x_relocs ())
12010 return reloc_type == 2; /* R_MSP430_ABS16. */
12011 case EM_MSP430_OLD:
12012 return reloc_type == 5; /* R_MSP430_16_BYTE. */
12014 return reloc_type == 19; /* R_NDS32_RELA. */
12015 case EM_ALTERA_NIOS2:
12016 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
12018 return reloc_type == 9; /* R_NIOS_16. */
12020 return reloc_type == 2; /* R_OR1K_16. */
12022 return reloc_type == 2; /* R_C6000_ABS16. */
12024 return reloc_type == 2; /* R_VISIUM_16. */
12027 return reloc_type == 2; /* R_XC16C_ABS_16. */
12029 return reloc_type == 3; /* R_XGATE_16. */
12035 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12036 relocation entries (possibly formerly used for SHT_GROUP sections). */
12039 is_none_reloc (unsigned int reloc_type)
12041 switch (elf_header.e_machine)
12043 case EM_386: /* R_386_NONE. */
12044 case EM_68K: /* R_68K_NONE. */
12045 case EM_ADAPTEVA_EPIPHANY:
12046 case EM_ALPHA: /* R_ALPHA_NONE. */
12047 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
12048 case EM_ARC: /* R_ARC_NONE. */
12049 case EM_ARC_COMPACT2: /* R_ARC_NONE. */
12050 case EM_ARC_COMPACT: /* R_ARC_NONE. */
12051 case EM_ARM: /* R_ARM_NONE. */
12052 case EM_C166: /* R_XC16X_NONE. */
12053 case EM_CRIS: /* R_CRIS_NONE. */
12054 case EM_FT32: /* R_FT32_NONE. */
12055 case EM_IA_64: /* R_IA64_NONE. */
12056 case EM_K1OM: /* R_X86_64_NONE. */
12057 case EM_L1OM: /* R_X86_64_NONE. */
12058 case EM_M32R: /* R_M32R_NONE. */
12059 case EM_MIPS: /* R_MIPS_NONE. */
12060 case EM_MN10300: /* R_MN10300_NONE. */
12061 case EM_MOXIE: /* R_MOXIE_NONE. */
12062 case EM_NIOS32: /* R_NIOS_NONE. */
12063 case EM_OR1K: /* R_OR1K_NONE. */
12064 case EM_PARISC: /* R_PARISC_NONE. */
12065 case EM_PPC64: /* R_PPC64_NONE. */
12066 case EM_PPC: /* R_PPC_NONE. */
12067 case EM_S390: /* R_390_NONE. */
12069 case EM_SH: /* R_SH_NONE. */
12070 case EM_SPARC32PLUS:
12071 case EM_SPARC: /* R_SPARC_NONE. */
12073 case EM_TILEGX: /* R_TILEGX_NONE. */
12074 case EM_TILEPRO: /* R_TILEPRO_NONE. */
12075 case EM_TI_C6000:/* R_C6000_NONE. */
12076 case EM_X86_64: /* R_X86_64_NONE. */
12078 return reloc_type == 0;
12081 return reloc_type == 0 || reloc_type == 256;
12084 return (reloc_type == 0 /* R_AVR_NONE. */
12085 || reloc_type == 30 /* R_AVR_DIFF8. */
12086 || reloc_type == 31 /* R_AVR_DIFF16. */
12087 || reloc_type == 32 /* R_AVR_DIFF32. */);
12089 return reloc_type == 3; /* R_METAG_NONE. */
12091 return (reloc_type == 0 /* R_XTENSA_NONE. */
12092 || reloc_type == 204 /* R_NDS32_DIFF8. */
12093 || reloc_type == 205 /* R_NDS32_DIFF16. */
12094 || reloc_type == 206 /* R_NDS32_DIFF32. */
12095 || reloc_type == 207 /* R_NDS32_ULEB128. */);
12096 case EM_XTENSA_OLD:
12098 return (reloc_type == 0 /* R_XTENSA_NONE. */
12099 || reloc_type == 17 /* R_XTENSA_DIFF8. */
12100 || reloc_type == 18 /* R_XTENSA_DIFF16. */
12101 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
12106 /* Returns TRUE if there is a relocation against
12107 section NAME at OFFSET bytes. */
12110 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12112 Elf_Internal_Rela * relocs;
12113 Elf_Internal_Rela * rp;
12115 if (dsec == NULL || dsec->reloc_info == NULL)
12118 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12120 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12121 if (rp->r_offset == offset)
12127 /* Apply relocations to a section.
12128 Note: So far support has been added only for those relocations
12129 which can be found in debug sections.
12130 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12131 loaded relocs. It is then the caller's responsibility to free them.
12132 FIXME: Add support for more relocations ? */
12135 apply_relocations (void * file,
12136 const Elf_Internal_Shdr * section,
12137 unsigned char * start,
12138 bfd_size_type size,
12139 void ** relocs_return,
12140 unsigned long * num_relocs_return)
12142 Elf_Internal_Shdr * relsec;
12143 unsigned char * end = start + size;
12145 if (relocs_return != NULL)
12147 * (Elf_Internal_Rela **) relocs_return = NULL;
12148 * num_relocs_return = 0;
12151 if (elf_header.e_type != ET_REL)
12154 /* Find the reloc section associated with the section. */
12155 for (relsec = section_headers;
12156 relsec < section_headers + elf_header.e_shnum;
12159 bfd_boolean is_rela;
12160 unsigned long num_relocs;
12161 Elf_Internal_Rela * relocs;
12162 Elf_Internal_Rela * rp;
12163 Elf_Internal_Shdr * symsec;
12164 Elf_Internal_Sym * symtab;
12165 unsigned long num_syms;
12166 Elf_Internal_Sym * sym;
12168 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12169 || relsec->sh_info >= elf_header.e_shnum
12170 || section_headers + relsec->sh_info != section
12171 || relsec->sh_size == 0
12172 || relsec->sh_link >= elf_header.e_shnum)
12175 is_rela = relsec->sh_type == SHT_RELA;
12179 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12180 relsec->sh_size, & relocs, & num_relocs))
12185 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12186 relsec->sh_size, & relocs, & num_relocs))
12190 /* SH uses RELA but uses in place value instead of the addend field. */
12191 if (elf_header.e_machine == EM_SH)
12194 symsec = section_headers + relsec->sh_link;
12195 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12197 for (rp = relocs; rp < relocs + num_relocs; ++rp)
12200 unsigned int reloc_type;
12201 unsigned int reloc_size;
12202 unsigned char * rloc;
12203 unsigned long sym_index;
12205 reloc_type = get_reloc_type (rp->r_info);
12207 if (target_specific_reloc_handling (rp, start, symtab))
12209 else if (is_none_reloc (reloc_type))
12211 else if (is_32bit_abs_reloc (reloc_type)
12212 || is_32bit_pcrel_reloc (reloc_type))
12214 else if (is_64bit_abs_reloc (reloc_type)
12215 || is_64bit_pcrel_reloc (reloc_type))
12217 else if (is_24bit_abs_reloc (reloc_type))
12219 else if (is_16bit_abs_reloc (reloc_type))
12223 static unsigned int prev_reloc = 0;
12224 if (reloc_type != prev_reloc)
12225 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12226 reloc_type, printable_section_name (section));
12227 prev_reloc = reloc_type;
12231 rloc = start + rp->r_offset;
12232 if ((rloc + reloc_size) > end || (rloc < start))
12234 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12235 (unsigned long) rp->r_offset,
12236 printable_section_name (section));
12240 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12241 if (sym_index >= num_syms)
12243 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12244 sym_index, printable_section_name (section));
12247 sym = symtab + sym_index;
12249 /* If the reloc has a symbol associated with it,
12250 make sure that it is of an appropriate type.
12252 Relocations against symbols without type can happen.
12253 Gcc -feliminate-dwarf2-dups may generate symbols
12254 without type for debug info.
12256 Icc generates relocations against function symbols
12257 instead of local labels.
12259 Relocations against object symbols can happen, eg when
12260 referencing a global array. For an example of this see
12261 the _clz.o binary in libgcc.a. */
12263 && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12264 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12266 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12267 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12268 (long int)(rp - relocs),
12269 printable_section_name (relsec));
12275 addend += rp->r_addend;
12276 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12277 partial_inplace. */
12279 || (elf_header.e_machine == EM_XTENSA
12280 && reloc_type == 1)
12281 || ((elf_header.e_machine == EM_PJ
12282 || elf_header.e_machine == EM_PJ_OLD)
12283 && reloc_type == 1)
12284 || ((elf_header.e_machine == EM_D30V
12285 || elf_header.e_machine == EM_CYGNUS_D30V)
12286 && reloc_type == 12))
12287 addend += byte_get (rloc, reloc_size);
12289 if (is_32bit_pcrel_reloc (reloc_type)
12290 || is_64bit_pcrel_reloc (reloc_type))
12292 /* On HPPA, all pc-relative relocations are biased by 8. */
12293 if (elf_header.e_machine == EM_PARISC)
12295 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12299 byte_put (rloc, addend + sym->st_value, reloc_size);
12306 * (Elf_Internal_Rela **) relocs_return = relocs;
12307 * num_relocs_return = num_relocs;
12316 #ifdef SUPPORT_DISASSEMBLY
12318 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12320 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12322 /* FIXME: XXX -- to be done --- XXX */
12328 /* Reads in the contents of SECTION from FILE, returning a pointer
12329 to a malloc'ed buffer or NULL if something went wrong. */
12332 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12334 bfd_size_type num_bytes;
12336 num_bytes = section->sh_size;
12338 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12340 printf (_("\nSection '%s' has no data to dump.\n"),
12341 printable_section_name (section));
12345 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12346 _("section contents"));
12349 /* Uncompresses a section that was compressed using zlib, in place. */
12352 uncompress_section_contents (unsigned char **buffer,
12353 dwarf_size_type uncompressed_size,
12354 dwarf_size_type *size)
12356 dwarf_size_type compressed_size = *size;
12357 unsigned char * compressed_buffer = *buffer;
12358 unsigned char * uncompressed_buffer;
12362 /* It is possible the section consists of several compressed
12363 buffers concatenated together, so we uncompress in a loop. */
12364 /* PR 18313: The state field in the z_stream structure is supposed
12365 to be invisible to the user (ie us), but some compilers will
12366 still complain about it being used without initialisation. So
12367 we first zero the entire z_stream structure and then set the fields
12369 memset (& strm, 0, sizeof strm);
12370 strm.avail_in = compressed_size;
12371 strm.next_in = (Bytef *) compressed_buffer;
12372 strm.avail_out = uncompressed_size;
12373 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12375 rc = inflateInit (& strm);
12376 while (strm.avail_in > 0)
12380 strm.next_out = ((Bytef *) uncompressed_buffer
12381 + (uncompressed_size - strm.avail_out));
12382 rc = inflate (&strm, Z_FINISH);
12383 if (rc != Z_STREAM_END)
12385 rc = inflateReset (& strm);
12387 rc = inflateEnd (& strm);
12389 || strm.avail_out != 0)
12392 *buffer = uncompressed_buffer;
12393 *size = uncompressed_size;
12397 free (uncompressed_buffer);
12398 /* Indicate decompression failure. */
12404 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12406 Elf_Internal_Shdr * relsec;
12407 bfd_size_type num_bytes;
12408 unsigned char * data;
12409 unsigned char * end;
12410 unsigned char * real_start;
12411 unsigned char * start;
12412 bfd_boolean some_strings_shown;
12414 real_start = start = (unsigned char *) get_section_contents (section,
12418 num_bytes = section->sh_size;
12420 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12422 if (decompress_dumps)
12424 dwarf_size_type new_size = num_bytes;
12425 dwarf_size_type uncompressed_size = 0;
12427 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12429 Elf_Internal_Chdr chdr;
12430 unsigned int compression_header_size
12431 = get_compression_header (& chdr, (unsigned char *) start);
12433 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12435 warn (_("section '%s' has unsupported compress type: %d\n"),
12436 printable_section_name (section), chdr.ch_type);
12439 else if (chdr.ch_addralign != section->sh_addralign)
12441 warn (_("compressed section '%s' is corrupted\n"),
12442 printable_section_name (section));
12445 uncompressed_size = chdr.ch_size;
12446 start += compression_header_size;
12447 new_size -= compression_header_size;
12449 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12451 /* Read the zlib header. In this case, it should be "ZLIB"
12452 followed by the uncompressed section size, 8 bytes in
12453 big-endian order. */
12454 uncompressed_size = start[4]; uncompressed_size <<= 8;
12455 uncompressed_size += start[5]; uncompressed_size <<= 8;
12456 uncompressed_size += start[6]; uncompressed_size <<= 8;
12457 uncompressed_size += start[7]; uncompressed_size <<= 8;
12458 uncompressed_size += start[8]; uncompressed_size <<= 8;
12459 uncompressed_size += start[9]; uncompressed_size <<= 8;
12460 uncompressed_size += start[10]; uncompressed_size <<= 8;
12461 uncompressed_size += start[11];
12466 if (uncompressed_size
12467 && uncompress_section_contents (& start,
12468 uncompressed_size, & new_size))
12469 num_bytes = new_size;
12472 /* If the section being dumped has relocations against it the user might
12473 be expecting these relocations to have been applied. Check for this
12474 case and issue a warning message in order to avoid confusion.
12475 FIXME: Maybe we ought to have an option that dumps a section with
12476 relocs applied ? */
12477 for (relsec = section_headers;
12478 relsec < section_headers + elf_header.e_shnum;
12481 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12482 || relsec->sh_info >= elf_header.e_shnum
12483 || section_headers + relsec->sh_info != section
12484 || relsec->sh_size == 0
12485 || relsec->sh_link >= elf_header.e_shnum)
12488 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12493 end = start + num_bytes;
12494 some_strings_shown = FALSE;
12498 while (!ISPRINT (* data))
12499 if (++ data >= end)
12504 size_t maxlen = end - data;
12507 /* PR 11128: Use two separate invocations in order to work
12508 around bugs in the Solaris 8 implementation of printf. */
12509 printf (" [%6tx] ", data - start);
12511 printf (" [%6Ix] ", (size_t) (data - start));
12515 print_symbol ((int) maxlen, (const char *) data);
12517 data += strnlen ((const char *) data, maxlen);
12521 printf (_("<corrupt>\n"));
12524 some_strings_shown = TRUE;
12528 if (! some_strings_shown)
12529 printf (_(" No strings found in this section."));
12537 dump_section_as_bytes (Elf_Internal_Shdr * section,
12539 bfd_boolean relocate)
12541 Elf_Internal_Shdr * relsec;
12542 bfd_size_type bytes;
12543 bfd_size_type section_size;
12545 unsigned char * data;
12546 unsigned char * real_start;
12547 unsigned char * start;
12549 real_start = start = (unsigned char *) get_section_contents (section, file);
12552 section_size = section->sh_size;
12554 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12556 if (decompress_dumps)
12558 dwarf_size_type new_size = section_size;
12559 dwarf_size_type uncompressed_size = 0;
12561 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12563 Elf_Internal_Chdr chdr;
12564 unsigned int compression_header_size
12565 = get_compression_header (& chdr, start);
12567 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12569 warn (_("section '%s' has unsupported compress type: %d\n"),
12570 printable_section_name (section), chdr.ch_type);
12573 else if (chdr.ch_addralign != section->sh_addralign)
12575 warn (_("compressed section '%s' is corrupted\n"),
12576 printable_section_name (section));
12579 uncompressed_size = chdr.ch_size;
12580 start += compression_header_size;
12581 new_size -= compression_header_size;
12583 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12585 /* Read the zlib header. In this case, it should be "ZLIB"
12586 followed by the uncompressed section size, 8 bytes in
12587 big-endian order. */
12588 uncompressed_size = start[4]; uncompressed_size <<= 8;
12589 uncompressed_size += start[5]; uncompressed_size <<= 8;
12590 uncompressed_size += start[6]; uncompressed_size <<= 8;
12591 uncompressed_size += start[7]; uncompressed_size <<= 8;
12592 uncompressed_size += start[8]; uncompressed_size <<= 8;
12593 uncompressed_size += start[9]; uncompressed_size <<= 8;
12594 uncompressed_size += start[10]; uncompressed_size <<= 8;
12595 uncompressed_size += start[11];
12600 if (uncompressed_size
12601 && uncompress_section_contents (& start, uncompressed_size,
12603 section_size = new_size;
12608 apply_relocations (file, section, start, section_size, NULL, NULL);
12612 /* If the section being dumped has relocations against it the user might
12613 be expecting these relocations to have been applied. Check for this
12614 case and issue a warning message in order to avoid confusion.
12615 FIXME: Maybe we ought to have an option that dumps a section with
12616 relocs applied ? */
12617 for (relsec = section_headers;
12618 relsec < section_headers + elf_header.e_shnum;
12621 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12622 || relsec->sh_info >= elf_header.e_shnum
12623 || section_headers + relsec->sh_info != section
12624 || relsec->sh_size == 0
12625 || relsec->sh_link >= elf_header.e_shnum)
12628 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12633 addr = section->sh_addr;
12634 bytes = section_size;
12643 lbytes = (bytes > 16 ? 16 : bytes);
12645 printf (" 0x%8.8lx ", (unsigned long) addr);
12647 for (j = 0; j < 16; j++)
12650 printf ("%2.2x", data[j]);
12658 for (j = 0; j < lbytes; j++)
12661 if (k >= ' ' && k < 0x7f)
12680 load_specific_debug_section (enum dwarf_section_display_enum debug,
12681 const Elf_Internal_Shdr * sec, void * file)
12683 struct dwarf_section * section = &debug_displays [debug].section;
12686 /* If it is already loaded, do nothing. */
12687 if (section->start != NULL)
12690 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12691 section->address = sec->sh_addr;
12692 section->user_data = NULL;
12693 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12695 sec->sh_size, buf);
12696 if (section->start == NULL)
12700 unsigned char *start = section->start;
12701 dwarf_size_type size = sec->sh_size;
12702 dwarf_size_type uncompressed_size = 0;
12704 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12706 Elf_Internal_Chdr chdr;
12707 unsigned int compression_header_size;
12709 if (size < (is_32bit_elf
12710 ? sizeof (Elf32_External_Chdr)
12711 : sizeof (Elf64_External_Chdr)))
12713 warn (_("compressed section %s is too small to contain a compression header"),
12718 compression_header_size = get_compression_header (&chdr, start);
12720 if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12722 warn (_("section '%s' has unsupported compress type: %d\n"),
12723 section->name, chdr.ch_type);
12726 else if (chdr.ch_addralign != sec->sh_addralign)
12728 warn (_("compressed section '%s' is corrupted\n"),
12732 uncompressed_size = chdr.ch_size;
12733 start += compression_header_size;
12734 size -= compression_header_size;
12736 else if (size > 12 && streq ((char *) start, "ZLIB"))
12738 /* Read the zlib header. In this case, it should be "ZLIB"
12739 followed by the uncompressed section size, 8 bytes in
12740 big-endian order. */
12741 uncompressed_size = start[4]; uncompressed_size <<= 8;
12742 uncompressed_size += start[5]; uncompressed_size <<= 8;
12743 uncompressed_size += start[6]; uncompressed_size <<= 8;
12744 uncompressed_size += start[7]; uncompressed_size <<= 8;
12745 uncompressed_size += start[8]; uncompressed_size <<= 8;
12746 uncompressed_size += start[9]; uncompressed_size <<= 8;
12747 uncompressed_size += start[10]; uncompressed_size <<= 8;
12748 uncompressed_size += start[11];
12753 if (uncompressed_size
12754 && uncompress_section_contents (&start, uncompressed_size,
12757 /* Free the compressed buffer, update the section buffer
12758 and the section size if uncompress is successful. */
12759 free (section->start);
12760 section->start = start;
12762 section->size = size;
12765 if (section->start == NULL)
12768 if (debug_displays [debug].relocate)
12769 apply_relocations ((FILE *) file, sec, section->start, section->size,
12770 & section->reloc_info, & section->num_relocs);
12773 section->reloc_info = NULL;
12774 section->num_relocs = 0;
12780 /* If this is not NULL, load_debug_section will only look for sections
12781 within the list of sections given here. */
12782 unsigned int *section_subset = NULL;
12785 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12787 struct dwarf_section * section = &debug_displays [debug].section;
12788 Elf_Internal_Shdr * sec;
12790 /* Locate the debug section. */
12791 sec = find_section_in_set (section->uncompressed_name, section_subset);
12793 section->name = section->uncompressed_name;
12796 sec = find_section_in_set (section->compressed_name, section_subset);
12798 section->name = section->compressed_name;
12803 /* If we're loading from a subset of sections, and we've loaded
12804 a section matching this name before, it's likely that it's a
12806 if (section_subset != NULL)
12807 free_debug_section (debug);
12809 return load_specific_debug_section (debug, sec, (FILE *) file);
12813 free_debug_section (enum dwarf_section_display_enum debug)
12815 struct dwarf_section * section = &debug_displays [debug].section;
12817 if (section->start == NULL)
12820 free ((char *) section->start);
12821 section->start = NULL;
12822 section->address = 0;
12827 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12829 char * name = SECTION_NAME (section);
12830 const char * print_name = printable_section_name (section);
12831 bfd_size_type length;
12835 length = section->sh_size;
12838 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12841 if (section->sh_type == SHT_NOBITS)
12843 /* There is no point in dumping the contents of a debugging section
12844 which has the NOBITS type - the bits in the file will be random.
12845 This can happen when a file containing a .eh_frame section is
12846 stripped with the --only-keep-debug command line option. */
12847 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12852 if (const_strneq (name, ".gnu.linkonce.wi."))
12853 name = ".debug_info";
12855 /* See if we know how to display the contents of this section. */
12856 for (i = 0; i < max; i++)
12857 if (streq (debug_displays[i].section.uncompressed_name, name)
12858 || (i == line && const_strneq (name, ".debug_line."))
12859 || streq (debug_displays[i].section.compressed_name, name))
12861 struct dwarf_section * sec = &debug_displays [i].section;
12862 int secondary = (section != find_section (name));
12865 free_debug_section ((enum dwarf_section_display_enum) i);
12867 if (i == line && const_strneq (name, ".debug_line."))
12869 else if (streq (sec->uncompressed_name, name))
12870 sec->name = sec->uncompressed_name;
12872 sec->name = sec->compressed_name;
12873 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12876 /* If this debug section is part of a CU/TU set in a .dwp file,
12877 restrict load_debug_section to the sections in that set. */
12878 section_subset = find_cu_tu_set (file, shndx);
12880 result &= debug_displays[i].display (sec, file);
12882 section_subset = NULL;
12884 if (secondary || (i != info && i != abbrev))
12885 free_debug_section ((enum dwarf_section_display_enum) i);
12893 printf (_("Unrecognized debug section: %s\n"), print_name);
12900 /* Set DUMP_SECTS for all sections where dumps were requested
12901 based on section name. */
12904 initialise_dumps_byname (void)
12906 struct dump_list_entry * cur;
12908 for (cur = dump_sects_byname; cur; cur = cur->next)
12913 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12914 if (streq (SECTION_NAME (section_headers + i), cur->name))
12916 request_dump_bynumber (i, cur->type);
12921 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12927 process_section_contents (FILE * file)
12929 Elf_Internal_Shdr * section;
12935 initialise_dumps_byname ();
12937 for (i = 0, section = section_headers;
12938 i < elf_header.e_shnum && i < num_dump_sects;
12941 #ifdef SUPPORT_DISASSEMBLY
12942 if (dump_sects[i] & DISASS_DUMP)
12943 disassemble_section (section, file);
12945 if (dump_sects[i] & HEX_DUMP)
12946 dump_section_as_bytes (section, file, FALSE);
12948 if (dump_sects[i] & RELOC_DUMP)
12949 dump_section_as_bytes (section, file, TRUE);
12951 if (dump_sects[i] & STRING_DUMP)
12952 dump_section_as_strings (section, file);
12954 if (dump_sects[i] & DEBUG_DUMP)
12955 display_debug_section (i, section, file);
12958 /* Check to see if the user requested a
12959 dump of a section that does not exist. */
12960 while (i++ < num_dump_sects)
12962 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12966 process_mips_fpe_exception (int mask)
12971 if (mask & OEX_FPU_INEX)
12972 fputs ("INEX", stdout), first = 0;
12973 if (mask & OEX_FPU_UFLO)
12974 printf ("%sUFLO", first ? "" : "|"), first = 0;
12975 if (mask & OEX_FPU_OFLO)
12976 printf ("%sOFLO", first ? "" : "|"), first = 0;
12977 if (mask & OEX_FPU_DIV0)
12978 printf ("%sDIV0", first ? "" : "|"), first = 0;
12979 if (mask & OEX_FPU_INVAL)
12980 printf ("%sINVAL", first ? "" : "|");
12983 fputs ("0", stdout);
12986 /* Display's the value of TAG at location P. If TAG is
12987 greater than 0 it is assumed to be an unknown tag, and
12988 a message is printed to this effect. Otherwise it is
12989 assumed that a message has already been printed.
12991 If the bottom bit of TAG is set it assumed to have a
12992 string value, otherwise it is assumed to have an integer
12995 Returns an updated P pointing to the first unread byte
12996 beyond the end of TAG's value.
12998 Reads at or beyond END will not be made. */
13000 static unsigned char *
13001 display_tag_value (int tag,
13003 const unsigned char * const end)
13008 printf (" Tag_unknown_%d: ", tag);
13012 warn (_("<corrupt tag>\n"));
13016 /* PR 17531 file: 027-19978-0.004. */
13017 size_t maxlen = (end - p) - 1;
13022 print_symbol ((int) maxlen, (const char *) p);
13023 p += strnlen ((char *) p, maxlen) + 1;
13027 printf (_("<corrupt string tag>"));
13028 p = (unsigned char *) end;
13036 val = read_uleb128 (p, &len, end);
13038 printf ("%ld (0x%lx)\n", val, val);
13045 /* ARM EABI attributes section. */
13050 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
13052 const char ** table;
13053 } arm_attr_public_tag;
13055 static const char * arm_attr_tag_CPU_arch[] =
13056 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13057 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13059 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13060 static const char * arm_attr_tag_THUMB_ISA_use[] =
13061 {"No", "Thumb-1", "Thumb-2", "Yes"};
13062 static const char * arm_attr_tag_FP_arch[] =
13063 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13064 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13065 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13066 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13067 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13068 "NEON for ARMv8.1"};
13069 static const char * arm_attr_tag_PCS_config[] =
13070 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13071 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13072 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13073 {"V6", "SB", "TLS", "Unused"};
13074 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13075 {"Absolute", "PC-relative", "SB-relative", "None"};
13076 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13077 {"Absolute", "PC-relative", "None"};
13078 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13079 {"None", "direct", "GOT-indirect"};
13080 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13081 {"None", "??? 1", "2", "??? 3", "4"};
13082 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13083 static const char * arm_attr_tag_ABI_FP_denormal[] =
13084 {"Unused", "Needed", "Sign only"};
13085 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13086 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13087 static const char * arm_attr_tag_ABI_FP_number_model[] =
13088 {"Unused", "Finite", "RTABI", "IEEE 754"};
13089 static const char * arm_attr_tag_ABI_enum_size[] =
13090 {"Unused", "small", "int", "forced to int"};
13091 static const char * arm_attr_tag_ABI_HardFP_use[] =
13092 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13093 static const char * arm_attr_tag_ABI_VFP_args[] =
13094 {"AAPCS", "VFP registers", "custom", "compatible"};
13095 static const char * arm_attr_tag_ABI_WMMX_args[] =
13096 {"AAPCS", "WMMX registers", "custom"};
13097 static const char * arm_attr_tag_ABI_optimization_goals[] =
13098 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13099 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13100 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13101 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13102 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13103 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13104 static const char * arm_attr_tag_FP_HP_extension[] =
13105 {"Not Allowed", "Allowed"};
13106 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13107 {"None", "IEEE 754", "Alternative Format"};
13108 static const char * arm_attr_tag_DSP_extension[] =
13109 {"Follow architecture", "Allowed"};
13110 static const char * arm_attr_tag_MPextension_use[] =
13111 {"Not Allowed", "Allowed"};
13112 static const char * arm_attr_tag_DIV_use[] =
13113 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13114 "Allowed in v7-A with integer division extension"};
13115 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13116 static const char * arm_attr_tag_Virtualization_use[] =
13117 {"Not Allowed", "TrustZone", "Virtualization Extensions",
13118 "TrustZone and Virtualization Extensions"};
13119 static const char * arm_attr_tag_MPextension_use_legacy[] =
13120 {"Not Allowed", "Allowed"};
13122 #define LOOKUP(id, name) \
13123 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13124 static arm_attr_public_tag arm_attr_public_tags[] =
13126 {4, "CPU_raw_name", 1, NULL},
13127 {5, "CPU_name", 1, NULL},
13128 LOOKUP(6, CPU_arch),
13129 {7, "CPU_arch_profile", 0, NULL},
13130 LOOKUP(8, ARM_ISA_use),
13131 LOOKUP(9, THUMB_ISA_use),
13132 LOOKUP(10, FP_arch),
13133 LOOKUP(11, WMMX_arch),
13134 LOOKUP(12, Advanced_SIMD_arch),
13135 LOOKUP(13, PCS_config),
13136 LOOKUP(14, ABI_PCS_R9_use),
13137 LOOKUP(15, ABI_PCS_RW_data),
13138 LOOKUP(16, ABI_PCS_RO_data),
13139 LOOKUP(17, ABI_PCS_GOT_use),
13140 LOOKUP(18, ABI_PCS_wchar_t),
13141 LOOKUP(19, ABI_FP_rounding),
13142 LOOKUP(20, ABI_FP_denormal),
13143 LOOKUP(21, ABI_FP_exceptions),
13144 LOOKUP(22, ABI_FP_user_exceptions),
13145 LOOKUP(23, ABI_FP_number_model),
13146 {24, "ABI_align_needed", 0, NULL},
13147 {25, "ABI_align_preserved", 0, NULL},
13148 LOOKUP(26, ABI_enum_size),
13149 LOOKUP(27, ABI_HardFP_use),
13150 LOOKUP(28, ABI_VFP_args),
13151 LOOKUP(29, ABI_WMMX_args),
13152 LOOKUP(30, ABI_optimization_goals),
13153 LOOKUP(31, ABI_FP_optimization_goals),
13154 {32, "compatibility", 0, NULL},
13155 LOOKUP(34, CPU_unaligned_access),
13156 LOOKUP(36, FP_HP_extension),
13157 LOOKUP(38, ABI_FP_16bit_format),
13158 LOOKUP(42, MPextension_use),
13159 LOOKUP(44, DIV_use),
13160 LOOKUP(46, DSP_extension),
13161 {64, "nodefaults", 0, NULL},
13162 {65, "also_compatible_with", 0, NULL},
13163 LOOKUP(66, T2EE_use),
13164 {67, "conformance", 1, NULL},
13165 LOOKUP(68, Virtualization_use),
13166 LOOKUP(70, MPextension_use_legacy)
13170 static unsigned char *
13171 display_arm_attribute (unsigned char * p,
13172 const unsigned char * const end)
13177 arm_attr_public_tag * attr;
13181 tag = read_uleb128 (p, &len, end);
13184 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13186 if (arm_attr_public_tags[i].tag == tag)
13188 attr = &arm_attr_public_tags[i];
13195 printf (" Tag_%s: ", attr->name);
13196 switch (attr->type)
13201 case 7: /* Tag_CPU_arch_profile. */
13202 val = read_uleb128 (p, &len, end);
13206 case 0: printf (_("None\n")); break;
13207 case 'A': printf (_("Application\n")); break;
13208 case 'R': printf (_("Realtime\n")); break;
13209 case 'M': printf (_("Microcontroller\n")); break;
13210 case 'S': printf (_("Application or Realtime\n")); break;
13211 default: printf ("??? (%d)\n", val); break;
13215 case 24: /* Tag_align_needed. */
13216 val = read_uleb128 (p, &len, end);
13220 case 0: printf (_("None\n")); break;
13221 case 1: printf (_("8-byte\n")); break;
13222 case 2: printf (_("4-byte\n")); break;
13223 case 3: printf ("??? 3\n"); break;
13226 printf (_("8-byte and up to %d-byte extended\n"),
13229 printf ("??? (%d)\n", val);
13234 case 25: /* Tag_align_preserved. */
13235 val = read_uleb128 (p, &len, end);
13239 case 0: printf (_("None\n")); break;
13240 case 1: printf (_("8-byte, except leaf SP\n")); break;
13241 case 2: printf (_("8-byte\n")); break;
13242 case 3: printf ("??? 3\n"); break;
13245 printf (_("8-byte and up to %d-byte extended\n"),
13248 printf ("??? (%d)\n", val);
13253 case 32: /* Tag_compatibility. */
13255 val = read_uleb128 (p, &len, end);
13257 printf (_("flag = %d, vendor = "), val);
13260 size_t maxlen = (end - p) - 1;
13262 print_symbol ((int) maxlen, (const char *) p);
13263 p += strnlen ((char *) p, maxlen) + 1;
13267 printf (_("<corrupt>"));
13268 p = (unsigned char *) end;
13274 case 64: /* Tag_nodefaults. */
13275 /* PR 17531: file: 001-505008-0.01. */
13278 printf (_("True\n"));
13281 case 65: /* Tag_also_compatible_with. */
13282 val = read_uleb128 (p, &len, end);
13284 if (val == 6 /* Tag_CPU_arch. */)
13286 val = read_uleb128 (p, &len, end);
13288 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13289 printf ("??? (%d)\n", val);
13291 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13295 while (p < end && *(p++) != '\0' /* NUL terminator. */)
13300 printf (_("<unknown: %d>\n"), tag);
13306 return display_tag_value (-1, p, end);
13308 return display_tag_value (0, p, end);
13311 assert (attr->type & 0x80);
13312 val = read_uleb128 (p, &len, end);
13314 type = attr->type & 0x7f;
13316 printf ("??? (%d)\n", val);
13318 printf ("%s\n", attr->table[val]);
13323 return display_tag_value (tag, p, end);
13326 static unsigned char *
13327 display_gnu_attribute (unsigned char * p,
13328 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13329 const unsigned char * const end)
13335 tag = read_uleb128 (p, &len, end);
13338 /* Tag_compatibility is the only generic GNU attribute defined at
13342 val = read_uleb128 (p, &len, end);
13345 printf (_("flag = %d, vendor = "), val);
13348 printf (_("<corrupt>\n"));
13349 warn (_("corrupt vendor attribute\n"));
13355 size_t maxlen = (end - p) - 1;
13357 print_symbol ((int) maxlen, (const char *) p);
13358 p += strnlen ((char *) p, maxlen) + 1;
13362 printf (_("<corrupt>"));
13363 p = (unsigned char *) end;
13370 if ((tag & 2) == 0 && display_proc_gnu_attribute)
13371 return display_proc_gnu_attribute (p, tag, end);
13373 return display_tag_value (tag, p, end);
13376 static unsigned char *
13377 display_power_gnu_attribute (unsigned char * p,
13379 const unsigned char * const end)
13384 if (tag == Tag_GNU_Power_ABI_FP)
13386 val = read_uleb128 (p, &len, end);
13388 printf (" Tag_GNU_Power_ABI_FP: ");
13393 printf (_("Hard or soft float\n"));
13396 printf (_("Hard float\n"));
13399 printf (_("Soft float\n"));
13402 printf (_("Single-precision hard float\n"));
13405 printf ("??? (%d)\n", val);
13411 if (tag == Tag_GNU_Power_ABI_Vector)
13413 val = read_uleb128 (p, &len, end);
13415 printf (" Tag_GNU_Power_ABI_Vector: ");
13419 printf (_("Any\n"));
13422 printf (_("Generic\n"));
13425 printf ("AltiVec\n");
13431 printf ("??? (%d)\n", val);
13437 if (tag == Tag_GNU_Power_ABI_Struct_Return)
13441 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13445 val = read_uleb128 (p, &len, end);
13447 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13451 printf (_("Any\n"));
13454 printf ("r3/r4\n");
13457 printf (_("Memory\n"));
13460 printf ("??? (%d)\n", val);
13466 return display_tag_value (tag & 1, p, end);
13469 static unsigned char *
13470 display_s390_gnu_attribute (unsigned char * p,
13472 const unsigned char * const end)
13477 if (tag == Tag_GNU_S390_ABI_Vector)
13479 val = read_uleb128 (p, &len, end);
13481 printf (" Tag_GNU_S390_ABI_Vector: ");
13486 printf (_("any\n"));
13489 printf (_("software\n"));
13492 printf (_("hardware\n"));
13495 printf ("??? (%d)\n", val);
13501 return display_tag_value (tag & 1, p, end);
13505 display_sparc_hwcaps (int mask)
13511 if (mask & ELF_SPARC_HWCAP_MUL32)
13512 fputs ("mul32", stdout), first = 0;
13513 if (mask & ELF_SPARC_HWCAP_DIV32)
13514 printf ("%sdiv32", first ? "" : "|"), first = 0;
13515 if (mask & ELF_SPARC_HWCAP_FSMULD)
13516 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13517 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13518 printf ("%sv8plus", first ? "" : "|"), first = 0;
13519 if (mask & ELF_SPARC_HWCAP_POPC)
13520 printf ("%spopc", first ? "" : "|"), first = 0;
13521 if (mask & ELF_SPARC_HWCAP_VIS)
13522 printf ("%svis", first ? "" : "|"), first = 0;
13523 if (mask & ELF_SPARC_HWCAP_VIS2)
13524 printf ("%svis2", first ? "" : "|"), first = 0;
13525 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13526 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13527 if (mask & ELF_SPARC_HWCAP_FMAF)
13528 printf ("%sfmaf", first ? "" : "|"), first = 0;
13529 if (mask & ELF_SPARC_HWCAP_VIS3)
13530 printf ("%svis3", first ? "" : "|"), first = 0;
13531 if (mask & ELF_SPARC_HWCAP_HPC)
13532 printf ("%shpc", first ? "" : "|"), first = 0;
13533 if (mask & ELF_SPARC_HWCAP_RANDOM)
13534 printf ("%srandom", first ? "" : "|"), first = 0;
13535 if (mask & ELF_SPARC_HWCAP_TRANS)
13536 printf ("%strans", first ? "" : "|"), first = 0;
13537 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13538 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13539 if (mask & ELF_SPARC_HWCAP_IMA)
13540 printf ("%sima", first ? "" : "|"), first = 0;
13541 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13542 printf ("%scspare", first ? "" : "|"), first = 0;
13545 fputc ('0', stdout);
13546 fputc ('\n', stdout);
13550 display_sparc_hwcaps2 (int mask)
13556 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13557 fputs ("fjathplus", stdout), first = 0;
13558 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13559 printf ("%svis3b", first ? "" : "|"), first = 0;
13560 if (mask & ELF_SPARC_HWCAP2_ADP)
13561 printf ("%sadp", first ? "" : "|"), first = 0;
13562 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13563 printf ("%ssparc5", first ? "" : "|"), first = 0;
13564 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13565 printf ("%smwait", first ? "" : "|"), first = 0;
13566 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13567 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13568 if (mask & ELF_SPARC_HWCAP2_XMONT)
13569 printf ("%sxmont2", first ? "" : "|"), first = 0;
13570 if (mask & ELF_SPARC_HWCAP2_NSEC)
13571 printf ("%snsec", first ? "" : "|"), first = 0;
13572 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13573 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13574 if (mask & ELF_SPARC_HWCAP2_FJDES)
13575 printf ("%sfjdes", first ? "" : "|"), first = 0;
13576 if (mask & ELF_SPARC_HWCAP2_FJAES)
13577 printf ("%sfjaes", first ? "" : "|"), first = 0;
13580 fputc ('0', stdout);
13581 fputc ('\n', stdout);
13584 static unsigned char *
13585 display_sparc_gnu_attribute (unsigned char * p,
13587 const unsigned char * const end)
13592 if (tag == Tag_GNU_Sparc_HWCAPS)
13594 val = read_uleb128 (p, &len, end);
13596 printf (" Tag_GNU_Sparc_HWCAPS: ");
13597 display_sparc_hwcaps (val);
13600 if (tag == Tag_GNU_Sparc_HWCAPS2)
13602 val = read_uleb128 (p, &len, end);
13604 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13605 display_sparc_hwcaps2 (val);
13609 return display_tag_value (tag, p, end);
13613 print_mips_fp_abi_value (int val)
13617 case Val_GNU_MIPS_ABI_FP_ANY:
13618 printf (_("Hard or soft float\n"));
13620 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13621 printf (_("Hard float (double precision)\n"));
13623 case Val_GNU_MIPS_ABI_FP_SINGLE:
13624 printf (_("Hard float (single precision)\n"));
13626 case Val_GNU_MIPS_ABI_FP_SOFT:
13627 printf (_("Soft float\n"));
13629 case Val_GNU_MIPS_ABI_FP_OLD_64:
13630 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13632 case Val_GNU_MIPS_ABI_FP_XX:
13633 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13635 case Val_GNU_MIPS_ABI_FP_64:
13636 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13638 case Val_GNU_MIPS_ABI_FP_64A:
13639 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13641 case Val_GNU_MIPS_ABI_FP_NAN2008:
13642 printf (_("NaN 2008 compatibility\n"));
13645 printf ("??? (%d)\n", val);
13650 static unsigned char *
13651 display_mips_gnu_attribute (unsigned char * p,
13653 const unsigned char * const end)
13655 if (tag == Tag_GNU_MIPS_ABI_FP)
13660 val = read_uleb128 (p, &len, end);
13662 printf (" Tag_GNU_MIPS_ABI_FP: ");
13664 print_mips_fp_abi_value (val);
13669 if (tag == Tag_GNU_MIPS_ABI_MSA)
13674 val = read_uleb128 (p, &len, end);
13676 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13680 case Val_GNU_MIPS_ABI_MSA_ANY:
13681 printf (_("Any MSA or not\n"));
13683 case Val_GNU_MIPS_ABI_MSA_128:
13684 printf (_("128-bit MSA\n"));
13687 printf ("??? (%d)\n", val);
13693 return display_tag_value (tag & 1, p, end);
13696 static unsigned char *
13697 display_tic6x_attribute (unsigned char * p,
13698 const unsigned char * const end)
13704 tag = read_uleb128 (p, &len, end);
13710 val = read_uleb128 (p, &len, end);
13712 printf (" Tag_ISA: ");
13716 case C6XABI_Tag_ISA_none:
13717 printf (_("None\n"));
13719 case C6XABI_Tag_ISA_C62X:
13722 case C6XABI_Tag_ISA_C67X:
13725 case C6XABI_Tag_ISA_C67XP:
13726 printf ("C67x+\n");
13728 case C6XABI_Tag_ISA_C64X:
13731 case C6XABI_Tag_ISA_C64XP:
13732 printf ("C64x+\n");
13734 case C6XABI_Tag_ISA_C674X:
13735 printf ("C674x\n");
13738 printf ("??? (%d)\n", val);
13743 case Tag_ABI_wchar_t:
13744 val = read_uleb128 (p, &len, end);
13746 printf (" Tag_ABI_wchar_t: ");
13750 printf (_("Not used\n"));
13753 printf (_("2 bytes\n"));
13756 printf (_("4 bytes\n"));
13759 printf ("??? (%d)\n", val);
13764 case Tag_ABI_stack_align_needed:
13765 val = read_uleb128 (p, &len, end);
13767 printf (" Tag_ABI_stack_align_needed: ");
13771 printf (_("8-byte\n"));
13774 printf (_("16-byte\n"));
13777 printf ("??? (%d)\n", val);
13782 case Tag_ABI_stack_align_preserved:
13783 val = read_uleb128 (p, &len, end);
13785 printf (" Tag_ABI_stack_align_preserved: ");
13789 printf (_("8-byte\n"));
13792 printf (_("16-byte\n"));
13795 printf ("??? (%d)\n", val);
13801 val = read_uleb128 (p, &len, end);
13803 printf (" Tag_ABI_DSBT: ");
13807 printf (_("DSBT addressing not used\n"));
13810 printf (_("DSBT addressing used\n"));
13813 printf ("??? (%d)\n", val);
13819 val = read_uleb128 (p, &len, end);
13821 printf (" Tag_ABI_PID: ");
13825 printf (_("Data addressing position-dependent\n"));
13828 printf (_("Data addressing position-independent, GOT near DP\n"));
13831 printf (_("Data addressing position-independent, GOT far from DP\n"));
13834 printf ("??? (%d)\n", val);
13840 val = read_uleb128 (p, &len, end);
13842 printf (" Tag_ABI_PIC: ");
13846 printf (_("Code addressing position-dependent\n"));
13849 printf (_("Code addressing position-independent\n"));
13852 printf ("??? (%d)\n", val);
13857 case Tag_ABI_array_object_alignment:
13858 val = read_uleb128 (p, &len, end);
13860 printf (" Tag_ABI_array_object_alignment: ");
13864 printf (_("8-byte\n"));
13867 printf (_("4-byte\n"));
13870 printf (_("16-byte\n"));
13873 printf ("??? (%d)\n", val);
13878 case Tag_ABI_array_object_align_expected:
13879 val = read_uleb128 (p, &len, end);
13881 printf (" Tag_ABI_array_object_align_expected: ");
13885 printf (_("8-byte\n"));
13888 printf (_("4-byte\n"));
13891 printf (_("16-byte\n"));
13894 printf ("??? (%d)\n", val);
13899 case Tag_ABI_compatibility:
13901 val = read_uleb128 (p, &len, end);
13903 printf (" Tag_ABI_compatibility: ");
13904 printf (_("flag = %d, vendor = "), val);
13907 size_t maxlen = (end - p) - 1;
13909 print_symbol ((int) maxlen, (const char *) p);
13910 p += strnlen ((char *) p, maxlen) + 1;
13914 printf (_("<corrupt>"));
13915 p = (unsigned char *) end;
13921 case Tag_ABI_conformance:
13923 printf (" Tag_ABI_conformance: \"");
13926 size_t maxlen = (end - p) - 1;
13928 print_symbol ((int) maxlen, (const char *) p);
13929 p += strnlen ((char *) p, maxlen) + 1;
13933 printf (_("<corrupt>"));
13934 p = (unsigned char *) end;
13941 return display_tag_value (tag, p, end);
13945 display_raw_attribute (unsigned char * p, unsigned char * end)
13947 unsigned long addr = 0;
13948 size_t bytes = end - p;
13955 int lbytes = (bytes > 16 ? 16 : bytes);
13957 printf (" 0x%8.8lx ", addr);
13959 for (j = 0; j < 16; j++)
13962 printf ("%2.2x", p[j]);
13970 for (j = 0; j < lbytes; j++)
13973 if (k >= ' ' && k < 0x7f)
13989 static unsigned char *
13990 display_msp430x_attribute (unsigned char * p,
13991 const unsigned char * const end)
13997 tag = read_uleb128 (p, & len, end);
14002 case OFBA_MSPABI_Tag_ISA:
14003 val = read_uleb128 (p, &len, end);
14005 printf (" Tag_ISA: ");
14008 case 0: printf (_("None\n")); break;
14009 case 1: printf (_("MSP430\n")); break;
14010 case 2: printf (_("MSP430X\n")); break;
14011 default: printf ("??? (%d)\n", val); break;
14015 case OFBA_MSPABI_Tag_Code_Model:
14016 val = read_uleb128 (p, &len, end);
14018 printf (" Tag_Code_Model: ");
14021 case 0: printf (_("None\n")); break;
14022 case 1: printf (_("Small\n")); break;
14023 case 2: printf (_("Large\n")); break;
14024 default: printf ("??? (%d)\n", val); break;
14028 case OFBA_MSPABI_Tag_Data_Model:
14029 val = read_uleb128 (p, &len, end);
14031 printf (" Tag_Data_Model: ");
14034 case 0: printf (_("None\n")); break;
14035 case 1: printf (_("Small\n")); break;
14036 case 2: printf (_("Large\n")); break;
14037 case 3: printf (_("Restricted Large\n")); break;
14038 default: printf ("??? (%d)\n", val); break;
14043 printf (_(" <unknown tag %d>: "), tag);
14050 size_t maxlen = (end - p) - 1;
14052 print_symbol ((int) maxlen, (const char *) p);
14053 p += strnlen ((char *) p, maxlen) + 1;
14057 printf (_("<corrupt>"));
14058 p = (unsigned char *) end;
14064 val = read_uleb128 (p, &len, end);
14066 printf ("%d (0x%x)\n", val, val);
14076 process_attributes (FILE * file,
14077 const char * public_name,
14078 unsigned int proc_type,
14079 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14080 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14082 Elf_Internal_Shdr * sect;
14085 /* Find the section header so that we get the size. */
14086 for (i = 0, sect = section_headers;
14087 i < elf_header.e_shnum;
14090 unsigned char * contents;
14093 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14096 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14097 sect->sh_size, _("attributes"));
14098 if (contents == NULL)
14104 bfd_vma section_len;
14106 section_len = sect->sh_size - 1;
14109 while (section_len > 0)
14112 unsigned int namelen;
14113 bfd_boolean public_section;
14114 bfd_boolean gnu_section;
14116 if (section_len <= 4)
14118 error (_("Tag section ends prematurely\n"));
14121 attr_len = byte_get (p, 4);
14124 if (attr_len > section_len)
14126 error (_("Bad attribute length (%u > %u)\n"),
14127 (unsigned) attr_len, (unsigned) section_len);
14128 attr_len = section_len;
14130 /* PR 17531: file: 001-101425-0.004 */
14131 else if (attr_len < 5)
14133 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14137 section_len -= attr_len;
14140 namelen = strnlen ((char *) p, attr_len) + 1;
14141 if (namelen == 0 || namelen >= attr_len)
14143 error (_("Corrupt attribute section name\n"));
14147 printf (_("Attribute Section: "));
14148 print_symbol (INT_MAX, (const char *) p);
14151 if (public_name && streq ((char *) p, public_name))
14152 public_section = TRUE;
14154 public_section = FALSE;
14156 if (streq ((char *) p, "gnu"))
14157 gnu_section = TRUE;
14159 gnu_section = FALSE;
14162 attr_len -= namelen;
14164 while (attr_len > 0 && p < contents + sect->sh_size)
14169 unsigned char * end;
14171 /* PR binutils/17531: Safe handling of corrupt files. */
14174 error (_("Unused bytes at end of section\n"));
14180 size = byte_get (p, 4);
14181 if (size > attr_len)
14183 error (_("Bad subsection length (%u > %u)\n"),
14184 (unsigned) size, (unsigned) attr_len);
14187 /* PR binutils/17531: Safe handling of corrupt files. */
14190 error (_("Bad subsection length (%u < 6)\n"),
14197 end = p + size - 1;
14198 assert (end <= contents + sect->sh_size);
14204 printf (_("File Attributes\n"));
14207 printf (_("Section Attributes:"));
14210 printf (_("Symbol Attributes:"));
14216 val = read_uleb128 (p, &j, end);
14220 printf (" %d", val);
14225 printf (_("Unknown tag: %d\n"), tag);
14226 public_section = FALSE;
14230 if (public_section && display_pub_attribute != NULL)
14233 p = display_pub_attribute (p, end);
14236 else if (gnu_section && display_proc_gnu_attribute != NULL)
14239 p = display_gnu_attribute (p,
14240 display_proc_gnu_attribute,
14246 printf (_(" Unknown attribute:\n"));
14247 display_raw_attribute (p, end);
14256 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14264 process_arm_specific (FILE * file)
14266 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14267 display_arm_attribute, NULL);
14271 process_power_specific (FILE * file)
14273 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14274 display_power_gnu_attribute);
14278 process_s390_specific (FILE * file)
14280 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14281 display_s390_gnu_attribute);
14285 process_sparc_specific (FILE * file)
14287 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14288 display_sparc_gnu_attribute);
14292 process_tic6x_specific (FILE * file)
14294 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14295 display_tic6x_attribute, NULL);
14299 process_msp430x_specific (FILE * file)
14301 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14302 display_msp430x_attribute, NULL);
14305 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14306 Print the Address, Access and Initial fields of an entry at VMA ADDR
14307 and return the VMA of the next entry, or -1 if there was a problem.
14308 Does not read from DATA_END or beyond. */
14311 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14312 unsigned char * data_end)
14315 print_vma (addr, LONG_HEX);
14317 if (addr < pltgot + 0xfff0)
14318 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14320 printf ("%10s", "");
14323 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14327 unsigned char * from = data + addr - pltgot;
14329 if (from + (is_32bit_elf ? 4 : 8) > data_end)
14331 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14332 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14333 return (bfd_vma) -1;
14337 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14338 print_vma (entry, LONG_HEX);
14341 return addr + (is_32bit_elf ? 4 : 8);
14344 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14345 PLTGOT. Print the Address and Initial fields of an entry at VMA
14346 ADDR and return the VMA of the next entry. */
14349 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14352 print_vma (addr, LONG_HEX);
14355 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14360 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14361 print_vma (entry, LONG_HEX);
14363 return addr + (is_32bit_elf ? 4 : 8);
14367 print_mips_ases (unsigned int mask)
14369 if (mask & AFL_ASE_DSP)
14370 fputs ("\n\tDSP ASE", stdout);
14371 if (mask & AFL_ASE_DSPR2)
14372 fputs ("\n\tDSP R2 ASE", stdout);
14373 if (mask & AFL_ASE_DSPR3)
14374 fputs ("\n\tDSP R3 ASE", stdout);
14375 if (mask & AFL_ASE_EVA)
14376 fputs ("\n\tEnhanced VA Scheme", stdout);
14377 if (mask & AFL_ASE_MCU)
14378 fputs ("\n\tMCU (MicroController) ASE", stdout);
14379 if (mask & AFL_ASE_MDMX)
14380 fputs ("\n\tMDMX ASE", stdout);
14381 if (mask & AFL_ASE_MIPS3D)
14382 fputs ("\n\tMIPS-3D ASE", stdout);
14383 if (mask & AFL_ASE_MT)
14384 fputs ("\n\tMT ASE", stdout);
14385 if (mask & AFL_ASE_SMARTMIPS)
14386 fputs ("\n\tSmartMIPS ASE", stdout);
14387 if (mask & AFL_ASE_VIRT)
14388 fputs ("\n\tVZ ASE", stdout);
14389 if (mask & AFL_ASE_MSA)
14390 fputs ("\n\tMSA ASE", stdout);
14391 if (mask & AFL_ASE_MIPS16)
14392 fputs ("\n\tMIPS16 ASE", stdout);
14393 if (mask & AFL_ASE_MICROMIPS)
14394 fputs ("\n\tMICROMIPS ASE", stdout);
14395 if (mask & AFL_ASE_XPA)
14396 fputs ("\n\tXPA ASE", stdout);
14398 fprintf (stdout, "\n\t%s", _("None"));
14399 else if ((mask & ~AFL_ASE_MASK) != 0)
14400 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14404 print_mips_isa_ext (unsigned int isa_ext)
14409 fputs (_("None"), stdout);
14412 fputs ("RMI XLR", stdout);
14414 case AFL_EXT_OCTEON3:
14415 fputs ("Cavium Networks Octeon3", stdout);
14417 case AFL_EXT_OCTEON2:
14418 fputs ("Cavium Networks Octeon2", stdout);
14420 case AFL_EXT_OCTEONP:
14421 fputs ("Cavium Networks OcteonP", stdout);
14423 case AFL_EXT_LOONGSON_3A:
14424 fputs ("Loongson 3A", stdout);
14426 case AFL_EXT_OCTEON:
14427 fputs ("Cavium Networks Octeon", stdout);
14430 fputs ("Toshiba R5900", stdout);
14433 fputs ("MIPS R4650", stdout);
14436 fputs ("LSI R4010", stdout);
14439 fputs ("NEC VR4100", stdout);
14442 fputs ("Toshiba R3900", stdout);
14444 case AFL_EXT_10000:
14445 fputs ("MIPS R10000", stdout);
14448 fputs ("Broadcom SB-1", stdout);
14451 fputs ("NEC VR4111/VR4181", stdout);
14454 fputs ("NEC VR4120", stdout);
14457 fputs ("NEC VR5400", stdout);
14460 fputs ("NEC VR5500", stdout);
14462 case AFL_EXT_LOONGSON_2E:
14463 fputs ("ST Microelectronics Loongson 2E", stdout);
14465 case AFL_EXT_LOONGSON_2F:
14466 fputs ("ST Microelectronics Loongson 2F", stdout);
14469 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14474 get_mips_reg_size (int reg_size)
14476 return (reg_size == AFL_REG_NONE) ? 0
14477 : (reg_size == AFL_REG_32) ? 32
14478 : (reg_size == AFL_REG_64) ? 64
14479 : (reg_size == AFL_REG_128) ? 128
14484 process_mips_specific (FILE * file)
14486 Elf_Internal_Dyn * entry;
14487 Elf_Internal_Shdr *sect = NULL;
14488 size_t liblist_offset = 0;
14489 size_t liblistno = 0;
14490 size_t conflictsno = 0;
14491 size_t options_offset = 0;
14492 size_t conflicts_offset = 0;
14493 size_t pltrelsz = 0;
14495 bfd_vma pltgot = 0;
14496 bfd_vma mips_pltgot = 0;
14497 bfd_vma jmprel = 0;
14498 bfd_vma local_gotno = 0;
14499 bfd_vma gotsym = 0;
14500 bfd_vma symtabno = 0;
14502 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14503 display_mips_gnu_attribute);
14505 sect = find_section (".MIPS.abiflags");
14509 Elf_External_ABIFlags_v0 *abiflags_ext;
14510 Elf_Internal_ABIFlags_v0 abiflags_in;
14512 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14513 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14516 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14517 sect->sh_size, _("MIPS ABI Flags section"));
14520 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14521 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14522 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14523 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14524 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14525 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14526 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14527 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14528 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14529 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14530 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14532 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14533 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14534 if (abiflags_in.isa_rev > 1)
14535 printf ("r%d", abiflags_in.isa_rev);
14536 printf ("\nGPR size: %d",
14537 get_mips_reg_size (abiflags_in.gpr_size));
14538 printf ("\nCPR1 size: %d",
14539 get_mips_reg_size (abiflags_in.cpr1_size));
14540 printf ("\nCPR2 size: %d",
14541 get_mips_reg_size (abiflags_in.cpr2_size));
14542 fputs ("\nFP ABI: ", stdout);
14543 print_mips_fp_abi_value (abiflags_in.fp_abi);
14544 fputs ("ISA Extension: ", stdout);
14545 print_mips_isa_ext (abiflags_in.isa_ext);
14546 fputs ("\nASEs:", stdout);
14547 print_mips_ases (abiflags_in.ases);
14548 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14549 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14550 fputc ('\n', stdout);
14551 free (abiflags_ext);
14556 /* We have a lot of special sections. Thanks SGI! */
14557 if (dynamic_section == NULL)
14558 /* No information available. */
14561 for (entry = dynamic_section;
14562 /* PR 17531 file: 012-50589-0.004. */
14563 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14565 switch (entry->d_tag)
14567 case DT_MIPS_LIBLIST:
14569 = offset_from_vma (file, entry->d_un.d_val,
14570 liblistno * sizeof (Elf32_External_Lib));
14572 case DT_MIPS_LIBLISTNO:
14573 liblistno = entry->d_un.d_val;
14575 case DT_MIPS_OPTIONS:
14576 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14578 case DT_MIPS_CONFLICT:
14580 = offset_from_vma (file, entry->d_un.d_val,
14581 conflictsno * sizeof (Elf32_External_Conflict));
14583 case DT_MIPS_CONFLICTNO:
14584 conflictsno = entry->d_un.d_val;
14587 pltgot = entry->d_un.d_ptr;
14589 case DT_MIPS_LOCAL_GOTNO:
14590 local_gotno = entry->d_un.d_val;
14592 case DT_MIPS_GOTSYM:
14593 gotsym = entry->d_un.d_val;
14595 case DT_MIPS_SYMTABNO:
14596 symtabno = entry->d_un.d_val;
14598 case DT_MIPS_PLTGOT:
14599 mips_pltgot = entry->d_un.d_ptr;
14602 pltrel = entry->d_un.d_val;
14605 pltrelsz = entry->d_un.d_val;
14608 jmprel = entry->d_un.d_ptr;
14614 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14616 Elf32_External_Lib * elib;
14619 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14621 sizeof (Elf32_External_Lib),
14622 _("liblist section data"));
14625 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14626 (unsigned long) liblistno);
14627 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14630 for (cnt = 0; cnt < liblistno; ++cnt)
14637 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14638 atime = BYTE_GET (elib[cnt].l_time_stamp);
14639 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14640 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14641 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14643 tmp = gmtime (&atime);
14644 snprintf (timebuf, sizeof (timebuf),
14645 "%04u-%02u-%02uT%02u:%02u:%02u",
14646 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14647 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14649 printf ("%3lu: ", (unsigned long) cnt);
14650 if (VALID_DYNAMIC_NAME (liblist.l_name))
14651 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14653 printf (_("<corrupt: %9ld>"), liblist.l_name);
14654 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14655 liblist.l_version);
14657 if (liblist.l_flags == 0)
14661 static const struct
14668 { " EXACT_MATCH", LL_EXACT_MATCH },
14669 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14670 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14671 { " EXPORTS", LL_EXPORTS },
14672 { " DELAY_LOAD", LL_DELAY_LOAD },
14673 { " DELTA", LL_DELTA }
14675 int flags = liblist.l_flags;
14678 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14679 if ((flags & l_flags_vals[fcnt].bit) != 0)
14681 fputs (l_flags_vals[fcnt].name, stdout);
14682 flags ^= l_flags_vals[fcnt].bit;
14685 printf (" %#x", (unsigned int) flags);
14695 if (options_offset != 0)
14697 Elf_External_Options * eopt;
14698 Elf_Internal_Options * iopt;
14699 Elf_Internal_Options * option;
14702 sect = section_headers;
14704 /* Find the section header so that we get the size. */
14705 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14706 /* PR 17533 file: 012-277276-0.004. */
14709 error (_("No MIPS_OPTIONS header found\n"));
14713 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14714 sect->sh_size, _("options"));
14717 iopt = (Elf_Internal_Options *)
14718 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14721 error (_("Out of memory allocatinf space for MIPS options\n"));
14728 while (offset <= sect->sh_size - sizeof (* eopt))
14730 Elf_External_Options * eoption;
14732 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14734 option->kind = BYTE_GET (eoption->kind);
14735 option->size = BYTE_GET (eoption->size);
14736 option->section = BYTE_GET (eoption->section);
14737 option->info = BYTE_GET (eoption->info);
14739 /* PR 17531: file: ffa0fa3b. */
14740 if (option->size < sizeof (* eopt)
14741 || offset + option->size > sect->sh_size)
14743 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14746 offset += option->size;
14752 printf (_("\nSection '%s' contains %d entries:\n"),
14753 printable_section_name (sect), cnt);
14762 switch (option->kind)
14765 /* This shouldn't happen. */
14766 printf (" NULL %d %lx", option->section, option->info);
14769 printf (" REGINFO ");
14770 if (elf_header.e_machine == EM_MIPS)
14773 Elf32_External_RegInfo * ereg;
14774 Elf32_RegInfo reginfo;
14776 ereg = (Elf32_External_RegInfo *) (option + 1);
14777 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14778 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14779 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14780 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14781 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14782 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14784 printf ("GPR %08lx GP 0x%lx\n",
14785 reginfo.ri_gprmask,
14786 (unsigned long) reginfo.ri_gp_value);
14787 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14788 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14789 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14794 Elf64_External_RegInfo * ereg;
14795 Elf64_Internal_RegInfo reginfo;
14797 ereg = (Elf64_External_RegInfo *) (option + 1);
14798 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14799 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14800 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14801 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14802 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14803 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14805 printf ("GPR %08lx GP 0x",
14806 reginfo.ri_gprmask);
14807 printf_vma (reginfo.ri_gp_value);
14810 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14811 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14812 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14816 case ODK_EXCEPTIONS:
14817 fputs (" EXCEPTIONS fpe_min(", stdout);
14818 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14819 fputs (") fpe_max(", stdout);
14820 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14821 fputs (")", stdout);
14823 if (option->info & OEX_PAGE0)
14824 fputs (" PAGE0", stdout);
14825 if (option->info & OEX_SMM)
14826 fputs (" SMM", stdout);
14827 if (option->info & OEX_FPDBUG)
14828 fputs (" FPDBUG", stdout);
14829 if (option->info & OEX_DISMISS)
14830 fputs (" DISMISS", stdout);
14833 fputs (" PAD ", stdout);
14834 if (option->info & OPAD_PREFIX)
14835 fputs (" PREFIX", stdout);
14836 if (option->info & OPAD_POSTFIX)
14837 fputs (" POSTFIX", stdout);
14838 if (option->info & OPAD_SYMBOL)
14839 fputs (" SYMBOL", stdout);
14842 fputs (" HWPATCH ", stdout);
14843 if (option->info & OHW_R4KEOP)
14844 fputs (" R4KEOP", stdout);
14845 if (option->info & OHW_R8KPFETCH)
14846 fputs (" R8KPFETCH", stdout);
14847 if (option->info & OHW_R5KEOP)
14848 fputs (" R5KEOP", stdout);
14849 if (option->info & OHW_R5KCVTL)
14850 fputs (" R5KCVTL", stdout);
14853 fputs (" FILL ", stdout);
14854 /* XXX Print content of info word? */
14857 fputs (" TAGS ", stdout);
14858 /* XXX Print content of info word? */
14861 fputs (" HWAND ", stdout);
14862 if (option->info & OHWA0_R4KEOP_CHECKED)
14863 fputs (" R4KEOP_CHECKED", stdout);
14864 if (option->info & OHWA0_R4KEOP_CLEAN)
14865 fputs (" R4KEOP_CLEAN", stdout);
14868 fputs (" HWOR ", stdout);
14869 if (option->info & OHWA0_R4KEOP_CHECKED)
14870 fputs (" R4KEOP_CHECKED", stdout);
14871 if (option->info & OHWA0_R4KEOP_CLEAN)
14872 fputs (" R4KEOP_CLEAN", stdout);
14875 printf (" GP_GROUP %#06lx self-contained %#06lx",
14876 option->info & OGP_GROUP,
14877 (option->info & OGP_SELF) >> 16);
14880 printf (" IDENT %#06lx self-contained %#06lx",
14881 option->info & OGP_GROUP,
14882 (option->info & OGP_SELF) >> 16);
14885 /* This shouldn't happen. */
14886 printf (" %3d ??? %d %lx",
14887 option->kind, option->section, option->info);
14891 len = sizeof (* eopt);
14892 while (len < option->size)
14894 unsigned char datum = * ((unsigned char *) eopt + offset + len);
14896 if (ISPRINT (datum))
14897 printf ("%c", datum);
14899 printf ("\\%03o", datum);
14902 fputs ("\n", stdout);
14904 offset += option->size;
14912 if (conflicts_offset != 0 && conflictsno != 0)
14914 Elf32_Conflict * iconf;
14917 if (dynamic_symbols == NULL)
14919 error (_("conflict list found without a dynamic symbol table\n"));
14923 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14926 error (_("Out of memory allocating space for dynamic conflicts\n"));
14932 Elf32_External_Conflict * econf32;
14934 econf32 = (Elf32_External_Conflict *)
14935 get_data (NULL, file, conflicts_offset, conflictsno,
14936 sizeof (* econf32), _("conflict"));
14940 for (cnt = 0; cnt < conflictsno; ++cnt)
14941 iconf[cnt] = BYTE_GET (econf32[cnt]);
14947 Elf64_External_Conflict * econf64;
14949 econf64 = (Elf64_External_Conflict *)
14950 get_data (NULL, file, conflicts_offset, conflictsno,
14951 sizeof (* econf64), _("conflict"));
14955 for (cnt = 0; cnt < conflictsno; ++cnt)
14956 iconf[cnt] = BYTE_GET (econf64[cnt]);
14961 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14962 (unsigned long) conflictsno);
14963 puts (_(" Num: Index Value Name"));
14965 for (cnt = 0; cnt < conflictsno; ++cnt)
14967 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14969 if (iconf[cnt] >= num_dynamic_syms)
14970 printf (_("<corrupt symbol index>"));
14973 Elf_Internal_Sym * psym;
14975 psym = & dynamic_symbols[iconf[cnt]];
14976 print_vma (psym->st_value, FULL_HEX);
14978 if (VALID_DYNAMIC_NAME (psym->st_name))
14979 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14981 printf (_("<corrupt: %14ld>"), psym->st_name);
14989 if (pltgot != 0 && local_gotno != 0)
14991 bfd_vma ent, local_end, global_end;
14993 unsigned char * data;
14994 unsigned char * data_end;
14998 addr_size = (is_32bit_elf ? 4 : 8);
14999 local_end = pltgot + local_gotno * addr_size;
15001 /* PR binutils/17533 file: 012-111227-0.004 */
15002 if (symtabno < gotsym)
15004 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15005 (unsigned long) gotsym, (unsigned long) symtabno);
15009 global_end = local_end + (symtabno - gotsym) * addr_size;
15010 /* PR 17531: file: 54c91a34. */
15011 if (global_end < local_end)
15013 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15017 offset = offset_from_vma (file, pltgot, global_end - pltgot);
15018 data = (unsigned char *) get_data (NULL, file, offset,
15019 global_end - pltgot, 1,
15020 _("Global Offset Table data"));
15023 data_end = data + (global_end - pltgot);
15025 printf (_("\nPrimary GOT:\n"));
15026 printf (_(" Canonical gp value: "));
15027 print_vma (pltgot + 0x7ff0, LONG_HEX);
15030 printf (_(" Reserved entries:\n"));
15031 printf (_(" %*s %10s %*s Purpose\n"),
15032 addr_size * 2, _("Address"), _("Access"),
15033 addr_size * 2, _("Initial"));
15034 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15035 printf (_(" Lazy resolver\n"));
15036 if (ent == (bfd_vma) -1)
15037 goto got_print_fail;
15039 && (byte_get (data + ent - pltgot, addr_size)
15040 >> (addr_size * 8 - 1)) != 0)
15042 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15043 printf (_(" Module pointer (GNU extension)\n"));
15044 if (ent == (bfd_vma) -1)
15045 goto got_print_fail;
15049 if (ent < local_end)
15051 printf (_(" Local entries:\n"));
15052 printf (" %*s %10s %*s\n",
15053 addr_size * 2, _("Address"), _("Access"),
15054 addr_size * 2, _("Initial"));
15055 while (ent < local_end)
15057 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15059 if (ent == (bfd_vma) -1)
15060 goto got_print_fail;
15065 if (gotsym < symtabno)
15069 printf (_(" Global entries:\n"));
15070 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
15071 addr_size * 2, _("Address"),
15073 addr_size * 2, _("Initial"),
15074 addr_size * 2, _("Sym.Val."),
15076 /* Note for translators: "Ndx" = abbreviated form of "Index". */
15077 _("Ndx"), _("Name"));
15079 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15081 for (i = gotsym; i < symtabno; i++)
15083 ent = print_mips_got_entry (data, pltgot, ent, data_end);
15086 if (dynamic_symbols == NULL)
15087 printf (_("<no dynamic symbols>"));
15088 else if (i < num_dynamic_syms)
15090 Elf_Internal_Sym * psym = dynamic_symbols + i;
15092 print_vma (psym->st_value, LONG_HEX);
15093 printf (" %-7s %3s ",
15094 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15095 get_symbol_index_type (psym->st_shndx));
15097 if (VALID_DYNAMIC_NAME (psym->st_name))
15098 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15100 printf (_("<corrupt: %14ld>"), psym->st_name);
15103 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15104 (unsigned long) i);
15107 if (ent == (bfd_vma) -1)
15118 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15121 size_t offset, rel_offset;
15122 unsigned long count, i;
15123 unsigned char * data;
15124 int addr_size, sym_width;
15125 Elf_Internal_Rela * rels;
15127 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15128 if (pltrel == DT_RELA)
15130 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15135 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15140 addr_size = (is_32bit_elf ? 4 : 8);
15141 end = mips_pltgot + (2 + count) * addr_size;
15143 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15144 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15145 1, _("Procedure Linkage Table data"));
15149 printf ("\nPLT GOT:\n\n");
15150 printf (_(" Reserved entries:\n"));
15151 printf (_(" %*s %*s Purpose\n"),
15152 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15153 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15154 printf (_(" PLT lazy resolver\n"));
15155 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15156 printf (_(" Module pointer\n"));
15159 printf (_(" Entries:\n"));
15160 printf (" %*s %*s %*s %-7s %3s %s\n",
15161 addr_size * 2, _("Address"),
15162 addr_size * 2, _("Initial"),
15163 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15164 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15165 for (i = 0; i < count; i++)
15167 unsigned long idx = get_reloc_symindex (rels[i].r_info);
15169 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15172 if (idx >= num_dynamic_syms)
15173 printf (_("<corrupt symbol index: %lu>"), idx);
15176 Elf_Internal_Sym * psym = dynamic_symbols + idx;
15178 print_vma (psym->st_value, LONG_HEX);
15179 printf (" %-7s %3s ",
15180 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15181 get_symbol_index_type (psym->st_shndx));
15182 if (VALID_DYNAMIC_NAME (psym->st_name))
15183 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15185 printf (_("<corrupt: %14ld>"), psym->st_name);
15200 process_nds32_specific (FILE * file)
15202 Elf_Internal_Shdr *sect = NULL;
15204 sect = find_section (".nds32_e_flags");
15207 unsigned int *flag;
15209 printf ("\nNDS32 elf flags section:\n");
15210 flag = get_data (NULL, file, sect->sh_offset, 1,
15211 sect->sh_size, _("NDS32 elf flags section"));
15213 switch ((*flag) & 0x3)
15216 printf ("(VEC_SIZE):\tNo entry.\n");
15219 printf ("(VEC_SIZE):\t4 bytes\n");
15222 printf ("(VEC_SIZE):\t16 bytes\n");
15225 printf ("(VEC_SIZE):\treserved\n");
15234 process_gnu_liblist (FILE * file)
15236 Elf_Internal_Shdr * section;
15237 Elf_Internal_Shdr * string_sec;
15238 Elf32_External_Lib * elib;
15240 size_t strtab_size;
15247 for (i = 0, section = section_headers;
15248 i < elf_header.e_shnum;
15251 switch (section->sh_type)
15253 case SHT_GNU_LIBLIST:
15254 if (section->sh_link >= elf_header.e_shnum)
15257 elib = (Elf32_External_Lib *)
15258 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15259 _("liblist section data"));
15263 string_sec = section_headers + section->sh_link;
15265 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15266 string_sec->sh_size,
15267 _("liblist string table"));
15269 || section->sh_entsize != sizeof (Elf32_External_Lib))
15275 strtab_size = string_sec->sh_size;
15277 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15278 printable_section_name (section),
15279 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15281 puts (_(" Library Time Stamp Checksum Version Flags"));
15283 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15291 liblist.l_name = BYTE_GET (elib[cnt].l_name);
15292 atime = BYTE_GET (elib[cnt].l_time_stamp);
15293 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15294 liblist.l_version = BYTE_GET (elib[cnt].l_version);
15295 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15297 tmp = gmtime (&atime);
15298 snprintf (timebuf, sizeof (timebuf),
15299 "%04u-%02u-%02uT%02u:%02u:%02u",
15300 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15301 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15303 printf ("%3lu: ", (unsigned long) cnt);
15305 printf ("%-20s", liblist.l_name < strtab_size
15306 ? strtab + liblist.l_name : _("<corrupt>"));
15308 printf ("%-20.20s", liblist.l_name < strtab_size
15309 ? strtab + liblist.l_name : _("<corrupt>"));
15310 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15311 liblist.l_version, liblist.l_flags);
15322 static const char *
15323 get_note_type (unsigned e_type)
15325 static char buff[64];
15327 if (elf_header.e_type == ET_CORE)
15331 return _("NT_AUXV (auxiliary vector)");
15333 return _("NT_PRSTATUS (prstatus structure)");
15335 return _("NT_FPREGSET (floating point registers)");
15337 return _("NT_PRPSINFO (prpsinfo structure)");
15338 case NT_TASKSTRUCT:
15339 return _("NT_TASKSTRUCT (task structure)");
15341 return _("NT_PRXFPREG (user_xfpregs structure)");
15343 return _("NT_PPC_VMX (ppc Altivec registers)");
15345 return _("NT_PPC_VSX (ppc VSX registers)");
15347 return _("NT_386_TLS (x86 TLS information)");
15348 case NT_386_IOPERM:
15349 return _("NT_386_IOPERM (x86 I/O permissions)");
15350 case NT_X86_XSTATE:
15351 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15352 case NT_S390_HIGH_GPRS:
15353 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15354 case NT_S390_TIMER:
15355 return _("NT_S390_TIMER (s390 timer register)");
15356 case NT_S390_TODCMP:
15357 return _("NT_S390_TODCMP (s390 TOD comparator register)");
15358 case NT_S390_TODPREG:
15359 return _("NT_S390_TODPREG (s390 TOD programmable register)");
15361 return _("NT_S390_CTRS (s390 control registers)");
15362 case NT_S390_PREFIX:
15363 return _("NT_S390_PREFIX (s390 prefix register)");
15364 case NT_S390_LAST_BREAK:
15365 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15366 case NT_S390_SYSTEM_CALL:
15367 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15369 return _("NT_S390_TDB (s390 transaction diagnostic block)");
15370 case NT_S390_VXRS_LOW:
15371 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15372 case NT_S390_VXRS_HIGH:
15373 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15375 return _("NT_ARM_VFP (arm VFP registers)");
15377 return _("NT_ARM_TLS (AArch TLS registers)");
15378 case NT_ARM_HW_BREAK:
15379 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15380 case NT_ARM_HW_WATCH:
15381 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15383 return _("NT_PSTATUS (pstatus structure)");
15385 return _("NT_FPREGS (floating point registers)");
15387 return _("NT_PSINFO (psinfo structure)");
15389 return _("NT_LWPSTATUS (lwpstatus_t structure)");
15391 return _("NT_LWPSINFO (lwpsinfo_t structure)");
15392 case NT_WIN32PSTATUS:
15393 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15395 return _("NT_SIGINFO (siginfo_t data)");
15397 return _("NT_FILE (mapped files)");
15405 return _("NT_VERSION (version)");
15407 return _("NT_ARCH (architecture)");
15412 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15417 print_core_note (Elf_Internal_Note *pnote)
15419 unsigned int addr_size = is_32bit_elf ? 4 : 8;
15420 bfd_vma count, page_size;
15421 unsigned char *descdata, *filenames, *descend;
15423 if (pnote->type != NT_FILE)
15429 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
15430 /* Still "successful". */
15435 if (pnote->descsz < 2 * addr_size)
15437 printf (_(" Malformed note - too short for header\n"));
15441 descdata = (unsigned char *) pnote->descdata;
15442 descend = descdata + pnote->descsz;
15444 if (descdata[pnote->descsz - 1] != '\0')
15446 printf (_(" Malformed note - does not end with \\0\n"));
15450 count = byte_get (descdata, addr_size);
15451 descdata += addr_size;
15453 page_size = byte_get (descdata, addr_size);
15454 descdata += addr_size;
15456 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15458 printf (_(" Malformed note - too short for supplied file count\n"));
15462 printf (_(" Page size: "));
15463 print_vma (page_size, DEC);
15466 printf (_(" %*s%*s%*s\n"),
15467 (int) (2 + 2 * addr_size), _("Start"),
15468 (int) (4 + 2 * addr_size), _("End"),
15469 (int) (4 + 2 * addr_size), _("Page Offset"));
15470 filenames = descdata + count * 3 * addr_size;
15471 while (count-- > 0)
15473 bfd_vma start, end, file_ofs;
15475 if (filenames == descend)
15477 printf (_(" Malformed note - filenames end too early\n"));
15481 start = byte_get (descdata, addr_size);
15482 descdata += addr_size;
15483 end = byte_get (descdata, addr_size);
15484 descdata += addr_size;
15485 file_ofs = byte_get (descdata, addr_size);
15486 descdata += addr_size;
15489 print_vma (start, FULL_HEX);
15491 print_vma (end, FULL_HEX);
15493 print_vma (file_ofs, FULL_HEX);
15494 printf ("\n %s\n", filenames);
15496 filenames += 1 + strlen ((char *) filenames);
15502 static const char *
15503 get_gnu_elf_note_type (unsigned e_type)
15505 static char buff[64];
15509 case NT_GNU_ABI_TAG:
15510 return _("NT_GNU_ABI_TAG (ABI version tag)");
15512 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15513 case NT_GNU_BUILD_ID:
15514 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15515 case NT_GNU_GOLD_VERSION:
15516 return _("NT_GNU_GOLD_VERSION (gold version)");
15521 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15526 print_gnu_note (Elf_Internal_Note *pnote)
15528 switch (pnote->type)
15530 case NT_GNU_BUILD_ID:
15534 printf (_(" Build ID: "));
15535 for (i = 0; i < pnote->descsz; ++i)
15536 printf ("%02x", pnote->descdata[i] & 0xff);
15541 case NT_GNU_ABI_TAG:
15543 unsigned long os, major, minor, subminor;
15544 const char *osname;
15546 /* PR 17531: file: 030-599401-0.004. */
15547 if (pnote->descsz < 16)
15549 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15553 os = byte_get ((unsigned char *) pnote->descdata, 4);
15554 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15555 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15556 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15560 case GNU_ABI_TAG_LINUX:
15563 case GNU_ABI_TAG_HURD:
15566 case GNU_ABI_TAG_SOLARIS:
15567 osname = "Solaris";
15569 case GNU_ABI_TAG_FREEBSD:
15570 osname = "FreeBSD";
15572 case GNU_ABI_TAG_NETBSD:
15575 case GNU_ABI_TAG_SYLLABLE:
15576 osname = "Syllable";
15578 case GNU_ABI_TAG_NACL:
15582 osname = "Unknown";
15586 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15587 major, minor, subminor);
15591 case NT_GNU_GOLD_VERSION:
15595 printf (_(" Version: "));
15596 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15597 printf ("%c", pnote->descdata[i]);
15606 static const char *
15607 get_v850_elf_note_type (enum v850_notes n_type)
15609 static char buff[64];
15613 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15614 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15615 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15616 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15617 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15618 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15620 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15626 print_v850_note (Elf_Internal_Note * pnote)
15630 if (pnote->descsz != 4)
15632 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15636 printf (_("not set\n"));
15640 switch (pnote->type)
15642 case V850_NOTE_ALIGNMENT:
15645 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15646 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15650 case V850_NOTE_DATA_SIZE:
15653 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15654 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15658 case V850_NOTE_FPU_INFO:
15661 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15662 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15666 case V850_NOTE_MMU_INFO:
15667 case V850_NOTE_CACHE_INFO:
15668 case V850_NOTE_SIMD_INFO:
15669 if (val == EF_RH850_SIMD)
15671 printf (_("yes\n"));
15677 /* An 'unknown note type' message will already have been displayed. */
15681 printf (_("unknown value: %x\n"), val);
15686 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15688 unsigned int version;
15690 switch (pnote->type)
15692 case NT_NETBSD_IDENT:
15693 version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15694 if ((version / 10000) % 100)
15695 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15696 version, version / 100000000, (version / 1000000) % 100,
15697 (version / 10000) % 100 > 26 ? "Z" : "",
15698 'A' + (version / 10000) % 26);
15700 printf (" NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15701 version, version / 100000000, (version / 1000000) % 100,
15702 (version / 100) % 100);
15705 case NT_NETBSD_MARCH:
15706 printf (" NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15714 printf (" NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15719 static const char *
15720 get_freebsd_elfcore_note_type (unsigned e_type)
15724 case NT_FREEBSD_THRMISC:
15725 return _("NT_THRMISC (thrmisc structure)");
15726 case NT_FREEBSD_PROCSTAT_PROC:
15727 return _("NT_PROCSTAT_PROC (proc data)");
15728 case NT_FREEBSD_PROCSTAT_FILES:
15729 return _("NT_PROCSTAT_FILES (files data)");
15730 case NT_FREEBSD_PROCSTAT_VMMAP:
15731 return _("NT_PROCSTAT_VMMAP (vmmap data)");
15732 case NT_FREEBSD_PROCSTAT_GROUPS:
15733 return _("NT_PROCSTAT_GROUPS (groups data)");
15734 case NT_FREEBSD_PROCSTAT_UMASK:
15735 return _("NT_PROCSTAT_UMASK (umask data)");
15736 case NT_FREEBSD_PROCSTAT_RLIMIT:
15737 return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15738 case NT_FREEBSD_PROCSTAT_OSREL:
15739 return _("NT_PROCSTAT_OSREL (osreldate data)");
15740 case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15741 return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15742 case NT_FREEBSD_PROCSTAT_AUXV:
15743 return _("NT_PROCSTAT_AUXV (auxv data)");
15745 return get_note_type (e_type);
15748 static const char *
15749 get_netbsd_elfcore_note_type (unsigned e_type)
15751 static char buff[64];
15753 if (e_type == NT_NETBSDCORE_PROCINFO)
15755 /* NetBSD core "procinfo" structure. */
15756 return _("NetBSD procinfo structure");
15759 /* As of Jan 2002 there are no other machine-independent notes
15760 defined for NetBSD core files. If the note type is less
15761 than the start of the machine-dependent note types, we don't
15764 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15766 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15770 switch (elf_header.e_machine)
15772 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15773 and PT_GETFPREGS == mach+2. */
15778 case EM_SPARC32PLUS:
15782 case NT_NETBSDCORE_FIRSTMACH + 0:
15783 return _("PT_GETREGS (reg structure)");
15784 case NT_NETBSDCORE_FIRSTMACH + 2:
15785 return _("PT_GETFPREGS (fpreg structure)");
15791 /* On all other arch's, PT_GETREGS == mach+1 and
15792 PT_GETFPREGS == mach+3. */
15796 case NT_NETBSDCORE_FIRSTMACH + 1:
15797 return _("PT_GETREGS (reg structure)");
15798 case NT_NETBSDCORE_FIRSTMACH + 3:
15799 return _("PT_GETFPREGS (fpreg structure)");
15805 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15806 e_type - NT_NETBSDCORE_FIRSTMACH);
15810 static const char *
15811 get_stapsdt_note_type (unsigned e_type)
15813 static char buff[64];
15818 return _("NT_STAPSDT (SystemTap probe descriptors)");
15824 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15829 print_stapsdt_note (Elf_Internal_Note *pnote)
15831 int addr_size = is_32bit_elf ? 4 : 8;
15832 char *data = pnote->descdata;
15833 char *data_end = pnote->descdata + pnote->descsz;
15834 bfd_vma pc, base_addr, semaphore;
15835 char *provider, *probe, *arg_fmt;
15837 pc = byte_get ((unsigned char *) data, addr_size);
15839 base_addr = byte_get ((unsigned char *) data, addr_size);
15841 semaphore = byte_get ((unsigned char *) data, addr_size);
15845 data += strlen (data) + 1;
15847 data += strlen (data) + 1;
15849 data += strlen (data) + 1;
15851 printf (_(" Provider: %s\n"), provider);
15852 printf (_(" Name: %s\n"), probe);
15853 printf (_(" Location: "));
15854 print_vma (pc, FULL_HEX);
15855 printf (_(", Base: "));
15856 print_vma (base_addr, FULL_HEX);
15857 printf (_(", Semaphore: "));
15858 print_vma (semaphore, FULL_HEX);
15860 printf (_(" Arguments: %s\n"), arg_fmt);
15862 return data == data_end;
15865 static const char *
15866 get_ia64_vms_note_type (unsigned e_type)
15868 static char buff[64];
15873 return _("NT_VMS_MHD (module header)");
15875 return _("NT_VMS_LNM (language name)");
15877 return _("NT_VMS_SRC (source files)");
15879 return "NT_VMS_TITLE";
15881 return _("NT_VMS_EIDC (consistency check)");
15882 case NT_VMS_FPMODE:
15883 return _("NT_VMS_FPMODE (FP mode)");
15884 case NT_VMS_LINKTIME:
15885 return "NT_VMS_LINKTIME";
15886 case NT_VMS_IMGNAM:
15887 return _("NT_VMS_IMGNAM (image name)");
15889 return _("NT_VMS_IMGID (image id)");
15890 case NT_VMS_LINKID:
15891 return _("NT_VMS_LINKID (link id)");
15892 case NT_VMS_IMGBID:
15893 return _("NT_VMS_IMGBID (build id)");
15894 case NT_VMS_GSTNAM:
15895 return _("NT_VMS_GSTNAM (sym table name)");
15896 case NT_VMS_ORIG_DYN:
15897 return "NT_VMS_ORIG_DYN";
15898 case NT_VMS_PATCHTIME:
15899 return "NT_VMS_PATCHTIME";
15901 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15907 print_ia64_vms_note (Elf_Internal_Note * pnote)
15909 switch (pnote->type)
15912 if (pnote->descsz > 36)
15914 size_t l = strlen (pnote->descdata + 34);
15915 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15916 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15917 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15918 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15921 printf (_(" Invalid size\n"));
15924 printf (_(" Language: %s\n"), pnote->descdata);
15927 case NT_VMS_FPMODE:
15928 printf (_(" Floating Point mode: "));
15929 printf ("0x%016" BFD_VMA_FMT "x\n",
15930 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15932 case NT_VMS_LINKTIME:
15933 printf (_(" Link time: "));
15935 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15938 case NT_VMS_PATCHTIME:
15939 printf (_(" Patch time: "));
15941 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15944 case NT_VMS_ORIG_DYN:
15945 printf (_(" Major id: %u, minor id: %u\n"),
15946 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15947 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15948 printf (_(" Last modified : "));
15950 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15951 printf (_("\n Link flags : "));
15952 printf ("0x%016" BFD_VMA_FMT "x\n",
15953 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15954 printf (_(" Header flags: 0x%08x\n"),
15955 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15956 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15959 case NT_VMS_IMGNAM:
15960 printf (_(" Image name: %s\n"), pnote->descdata);
15962 case NT_VMS_GSTNAM:
15963 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15966 printf (_(" Image id: %s\n"), pnote->descdata);
15968 case NT_VMS_LINKID:
15969 printf (_(" Linker id: %s\n"), pnote->descdata);
15977 /* Note that by the ELF standard, the name field is already null byte
15978 terminated, and namesz includes the terminating null byte.
15979 I.E. the value of namesz for the name "FSF" is 4.
15981 If the value of namesz is zero, there is no name present. */
15983 process_note (Elf_Internal_Note * pnote)
15985 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15988 if (pnote->namesz == 0)
15989 /* If there is no note name, then use the default set of
15990 note type strings. */
15991 nt = get_note_type (pnote->type);
15993 else if (const_strneq (pnote->namedata, "GNU"))
15994 /* GNU-specific object file notes. */
15995 nt = get_gnu_elf_note_type (pnote->type);
15997 else if (const_strneq (pnote->namedata, "FreeBSD"))
15998 /* FreeBSD-specific core file notes. */
15999 nt = get_freebsd_elfcore_note_type (pnote->type);
16001 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16002 /* NetBSD-specific core file notes. */
16003 nt = get_netbsd_elfcore_note_type (pnote->type);
16005 else if (const_strneq (pnote->namedata, "NetBSD"))
16006 /* NetBSD-specific core file notes. */
16007 return process_netbsd_elf_note (pnote);
16009 else if (strneq (pnote->namedata, "SPU/", 4))
16011 /* SPU-specific core file notes. */
16012 nt = pnote->namedata + 4;
16016 else if (const_strneq (pnote->namedata, "IPF/VMS"))
16017 /* VMS/ia64-specific file notes. */
16018 nt = get_ia64_vms_note_type (pnote->type);
16020 else if (const_strneq (pnote->namedata, "stapsdt"))
16021 nt = get_stapsdt_note_type (pnote->type);
16024 /* Don't recognize this note name; just use the default set of
16025 note type strings. */
16026 nt = get_note_type (pnote->type);
16028 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
16030 if (const_strneq (pnote->namedata, "IPF/VMS"))
16031 return print_ia64_vms_note (pnote);
16032 else if (const_strneq (pnote->namedata, "GNU"))
16033 return print_gnu_note (pnote);
16034 else if (const_strneq (pnote->namedata, "stapsdt"))
16035 return print_stapsdt_note (pnote);
16036 else if (const_strneq (pnote->namedata, "CORE"))
16037 return print_core_note (pnote);
16044 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
16046 Elf_External_Note * pnotes;
16047 Elf_External_Note * external;
16054 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16056 if (pnotes == NULL)
16061 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16062 (unsigned long) offset, (unsigned long) length);
16063 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16065 end = (char *) pnotes + length;
16066 while ((char *) external < end)
16068 Elf_Internal_Note inote;
16071 char * temp = NULL;
16072 size_t data_remaining = end - (char *) external;
16074 if (!is_ia64_vms ())
16076 /* PR binutils/15191
16077 Make sure that there is enough data to read. */
16078 min_notesz = offsetof (Elf_External_Note, name);
16079 if (data_remaining < min_notesz)
16081 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16082 (int) data_remaining);
16085 inote.type = BYTE_GET (external->type);
16086 inote.namesz = BYTE_GET (external->namesz);
16087 inote.namedata = external->name;
16088 inote.descsz = BYTE_GET (external->descsz);
16089 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16090 /* PR 17531: file: 3443835e. */
16091 if (inote.descdata < (char *) pnotes || inote.descdata > end)
16093 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16094 inote.descdata = inote.namedata;
16098 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16099 next = inote.descdata + align_power (inote.descsz, 2);
16103 Elf64_External_VMS_Note *vms_external;
16105 /* PR binutils/15191
16106 Make sure that there is enough data to read. */
16107 min_notesz = offsetof (Elf64_External_VMS_Note, name);
16108 if (data_remaining < min_notesz)
16110 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16111 (int) data_remaining);
16115 vms_external = (Elf64_External_VMS_Note *) external;
16116 inote.type = BYTE_GET (vms_external->type);
16117 inote.namesz = BYTE_GET (vms_external->namesz);
16118 inote.namedata = vms_external->name;
16119 inote.descsz = BYTE_GET (vms_external->descsz);
16120 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16121 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16122 next = inote.descdata + align_power (inote.descsz, 3);
16125 if (inote.descdata < (char *) external + min_notesz
16126 || next < (char *) external + min_notesz
16127 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
16128 || inote.namedata + inote.namesz < inote.namedata
16129 || inote.descdata + inote.descsz < inote.descdata
16130 || data_remaining < (size_t)(next - (char *) external))
16132 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16133 (unsigned long) ((char *) external - (char *) pnotes));
16134 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16135 inote.type, inote.namesz, inote.descsz);
16139 external = (Elf_External_Note *) next;
16141 /* Verify that name is null terminated. It appears that at least
16142 one version of Linux (RedHat 6.0) generates corefiles that don't
16143 comply with the ELF spec by failing to include the null byte in
16145 if (inote.namedata[inote.namesz - 1] != '\0')
16147 temp = (char *) malloc (inote.namesz + 1);
16150 error (_("Out of memory allocating space for inote name\n"));
16155 strncpy (temp, inote.namedata, inote.namesz);
16156 temp[inote.namesz] = 0;
16158 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
16159 inote.namedata = temp;
16162 res &= process_note (& inote);
16177 process_corefile_note_segments (FILE * file)
16179 Elf_Internal_Phdr * segment;
16183 if (! get_program_headers (file))
16186 for (i = 0, segment = program_headers;
16187 i < elf_header.e_phnum;
16190 if (segment->p_type == PT_NOTE)
16191 res &= process_corefile_note_segment (file,
16192 (bfd_vma) segment->p_offset,
16193 (bfd_vma) segment->p_filesz);
16200 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16202 Elf_External_Note * pnotes;
16203 Elf_External_Note * external;
16210 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16212 if (pnotes == NULL)
16216 end = (char*) pnotes + length;
16218 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16219 (unsigned long) offset, (unsigned long) length);
16221 while ((char *) external + sizeof (Elf_External_Note) < end)
16223 Elf_External_Note * next;
16224 Elf_Internal_Note inote;
16226 inote.type = BYTE_GET (external->type);
16227 inote.namesz = BYTE_GET (external->namesz);
16228 inote.namedata = external->name;
16229 inote.descsz = BYTE_GET (external->descsz);
16230 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16231 inote.descpos = offset + (inote.descdata - (char *) pnotes);
16233 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16235 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16236 inote.descdata = inote.namedata;
16240 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16242 if ( ((char *) next > end)
16243 || ((char *) next < (char *) pnotes))
16245 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16246 (unsigned long) ((char *) external - (char *) pnotes));
16247 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16248 inote.type, inote.namesz, inote.descsz);
16254 /* Prevent out-of-bounds indexing. */
16255 if ( inote.namedata + inote.namesz > end
16256 || inote.namedata + inote.namesz < inote.namedata)
16258 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16259 (unsigned long) ((char *) external - (char *) pnotes));
16260 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16261 inote.type, inote.namesz, inote.descsz);
16265 printf (" %s: ", get_v850_elf_note_type (inote.type));
16267 if (! print_v850_note (& inote))
16270 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16271 inote.namesz, inote.descsz);
16281 process_note_sections (FILE * file)
16283 Elf_Internal_Shdr * section;
16288 for (i = 0, section = section_headers;
16289 i < elf_header.e_shnum && section != NULL;
16292 if (section->sh_type == SHT_NOTE)
16294 res &= process_corefile_note_segment (file,
16295 (bfd_vma) section->sh_offset,
16296 (bfd_vma) section->sh_size);
16300 if (( elf_header.e_machine == EM_V800
16301 || elf_header.e_machine == EM_V850
16302 || elf_header.e_machine == EM_CYGNUS_V850)
16303 && section->sh_type == SHT_RENESAS_INFO)
16305 res &= process_v850_notes (file,
16306 (bfd_vma) section->sh_offset,
16307 (bfd_vma) section->sh_size);
16313 /* Try processing NOTE segments instead. */
16314 return process_corefile_note_segments (file);
16320 process_notes (FILE * file)
16322 /* If we have not been asked to display the notes then do nothing. */
16326 if (elf_header.e_type != ET_CORE)
16327 return process_note_sections (file);
16329 /* No program headers means no NOTE segment. */
16330 if (elf_header.e_phnum > 0)
16331 return process_corefile_note_segments (file);
16333 printf (_("No note segments present in the core file.\n"));
16338 process_arch_specific (FILE * file)
16343 switch (elf_header.e_machine)
16346 return process_arm_specific (file);
16348 case EM_MIPS_RS3_LE:
16349 return process_mips_specific (file);
16352 return process_nds32_specific (file);
16355 return process_power_specific (file);
16359 return process_s390_specific (file);
16362 case EM_SPARC32PLUS:
16364 return process_sparc_specific (file);
16367 return process_tic6x_specific (file);
16370 return process_msp430x_specific (file);
16378 get_file_header (FILE * file)
16380 /* Read in the identity array. */
16381 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16384 /* Determine how to read the rest of the header. */
16385 switch (elf_header.e_ident[EI_DATA])
16387 default: /* fall through */
16388 case ELFDATANONE: /* fall through */
16390 byte_get = byte_get_little_endian;
16391 byte_put = byte_put_little_endian;
16394 byte_get = byte_get_big_endian;
16395 byte_put = byte_put_big_endian;
16399 /* For now we only support 32 bit and 64 bit ELF files. */
16400 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16402 /* Read in the rest of the header. */
16405 Elf32_External_Ehdr ehdr32;
16407 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16410 elf_header.e_type = BYTE_GET (ehdr32.e_type);
16411 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
16412 elf_header.e_version = BYTE_GET (ehdr32.e_version);
16413 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
16414 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
16415 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
16416 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
16417 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
16418 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16419 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
16420 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16421 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
16422 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
16426 Elf64_External_Ehdr ehdr64;
16428 /* If we have been compiled with sizeof (bfd_vma) == 4, then
16429 we will not be able to cope with the 64bit data found in
16430 64 ELF files. Detect this now and abort before we start
16431 overwriting things. */
16432 if (sizeof (bfd_vma) < 8)
16434 error (_("This instance of readelf has been built without support for a\n\
16435 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16439 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16442 elf_header.e_type = BYTE_GET (ehdr64.e_type);
16443 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
16444 elf_header.e_version = BYTE_GET (ehdr64.e_version);
16445 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
16446 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
16447 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
16448 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
16449 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
16450 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16451 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
16452 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16453 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
16454 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
16457 if (elf_header.e_shoff)
16459 /* There may be some extensions in the first section header. Don't
16460 bomb if we can't read it. */
16462 get_32bit_section_headers (file, TRUE);
16464 get_64bit_section_headers (file, TRUE);
16470 /* Process one ELF object file according to the command line options.
16471 This file may actually be stored in an archive. The file is
16472 positioned at the start of the ELF object. */
16475 process_object (char * file_name, FILE * file)
16479 if (! get_file_header (file))
16481 error (_("%s: Failed to read file header\n"), file_name);
16485 /* Initialise per file variables. */
16486 for (i = ARRAY_SIZE (version_info); i--;)
16487 version_info[i] = 0;
16489 for (i = ARRAY_SIZE (dynamic_info); i--;)
16490 dynamic_info[i] = 0;
16491 dynamic_info_DT_GNU_HASH = 0;
16493 /* Process the file. */
16495 printf (_("\nFile: %s\n"), file_name);
16497 /* Initialise the dump_sects array from the cmdline_dump_sects array.
16498 Note we do this even if cmdline_dump_sects is empty because we
16499 must make sure that the dump_sets array is zeroed out before each
16500 object file is processed. */
16501 if (num_dump_sects > num_cmdline_dump_sects)
16502 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16504 if (num_cmdline_dump_sects > 0)
16506 if (num_dump_sects == 0)
16507 /* A sneaky way of allocating the dump_sects array. */
16508 request_dump_bynumber (num_cmdline_dump_sects, 0);
16510 assert (num_dump_sects >= num_cmdline_dump_sects);
16511 memcpy (dump_sects, cmdline_dump_sects,
16512 num_cmdline_dump_sects * sizeof (* dump_sects));
16515 if (! process_file_header ())
16518 if (! process_section_headers (file))
16520 /* Without loaded section headers we cannot process lots of
16522 do_unwind = do_version = do_dump = do_arch = 0;
16524 if (! do_using_dynamic)
16525 do_syms = do_dyn_syms = do_reloc = 0;
16528 if (! process_section_groups (file))
16530 /* Without loaded section groups we cannot process unwind. */
16534 if (process_program_headers (file))
16535 process_dynamic_section (file);
16537 process_relocs (file);
16539 process_unwind (file);
16541 process_symbol_table (file);
16543 process_syminfo (file);
16545 process_version_sections (file);
16547 process_section_contents (file);
16549 process_notes (file);
16551 process_gnu_liblist (file);
16553 process_arch_specific (file);
16555 if (program_headers)
16557 free (program_headers);
16558 program_headers = NULL;
16561 if (section_headers)
16563 free (section_headers);
16564 section_headers = NULL;
16569 free (string_table);
16570 string_table = NULL;
16571 string_table_length = 0;
16574 if (dynamic_strings)
16576 free (dynamic_strings);
16577 dynamic_strings = NULL;
16578 dynamic_strings_length = 0;
16581 if (dynamic_symbols)
16583 free (dynamic_symbols);
16584 dynamic_symbols = NULL;
16585 num_dynamic_syms = 0;
16588 if (dynamic_syminfo)
16590 free (dynamic_syminfo);
16591 dynamic_syminfo = NULL;
16594 if (dynamic_section)
16596 free (dynamic_section);
16597 dynamic_section = NULL;
16600 if (section_headers_groups)
16602 free (section_headers_groups);
16603 section_headers_groups = NULL;
16606 if (section_groups)
16608 struct group_list * g;
16609 struct group_list * next;
16611 for (i = 0; i < group_count; i++)
16613 for (g = section_groups [i].root; g != NULL; g = next)
16620 free (section_groups);
16621 section_groups = NULL;
16624 free_debug_memory ();
16629 /* Process an ELF archive.
16630 On entry the file is positioned just after the ARMAG string. */
16633 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16635 struct archive_info arch;
16636 struct archive_info nested_arch;
16642 /* The ARCH structure is used to hold information about this archive. */
16643 arch.file_name = NULL;
16645 arch.index_array = NULL;
16646 arch.sym_table = NULL;
16647 arch.longnames = NULL;
16649 /* The NESTED_ARCH structure is used as a single-item cache of information
16650 about a nested archive (when members of a thin archive reside within
16651 another regular archive file). */
16652 nested_arch.file_name = NULL;
16653 nested_arch.file = NULL;
16654 nested_arch.index_array = NULL;
16655 nested_arch.sym_table = NULL;
16656 nested_arch.longnames = NULL;
16658 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16664 if (do_archive_index)
16666 if (arch.sym_table == NULL)
16667 error (_("%s: unable to dump the index as none was found\n"), file_name);
16670 unsigned long i, l;
16671 unsigned long current_pos;
16673 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16674 file_name, (unsigned long) arch.index_num, arch.sym_size);
16675 current_pos = ftell (file);
16677 for (i = l = 0; i < arch.index_num; i++)
16679 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16681 char * member_name;
16683 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16685 if (member_name != NULL)
16687 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16689 if (qualified_name != NULL)
16691 printf (_("Contents of binary %s at offset "), qualified_name);
16692 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16694 free (qualified_name);
16699 if (l >= arch.sym_size)
16701 error (_("%s: end of the symbol table reached before the end of the index\n"),
16705 /* PR 17531: file: 0b6630b2. */
16706 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16707 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16710 if (arch.uses_64bit_indicies)
16715 if (l < arch.sym_size)
16716 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16717 file_name, arch.sym_size - l);
16719 if (fseek (file, current_pos, SEEK_SET) != 0)
16721 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16727 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16728 && !do_segments && !do_header && !do_dump && !do_version
16729 && !do_histogram && !do_debugging && !do_arch && !do_notes
16730 && !do_section_groups && !do_dyn_syms)
16732 ret = 0; /* Archive index only. */
16743 char * qualified_name;
16745 /* Read the next archive header. */
16746 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16748 error (_("%s: failed to seek to next archive header\n"), file_name);
16751 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16752 if (got != sizeof arch.arhdr)
16756 error (_("%s: failed to read archive header\n"), file_name);
16760 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16762 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16767 arch.next_arhdr_offset += sizeof arch.arhdr;
16769 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16770 if (archive_file_size & 01)
16771 ++archive_file_size;
16773 name = get_archive_member_name (&arch, &nested_arch);
16776 error (_("%s: bad archive file name\n"), file_name);
16780 namelen = strlen (name);
16782 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16783 if (qualified_name == NULL)
16785 error (_("%s: bad archive file name\n"), file_name);
16790 if (is_thin_archive && arch.nested_member_origin == 0)
16792 /* This is a proxy for an external member of a thin archive. */
16793 FILE * member_file;
16794 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16795 if (member_file_name == NULL)
16801 member_file = fopen (member_file_name, "rb");
16802 if (member_file == NULL)
16804 error (_("Input file '%s' is not readable.\n"), member_file_name);
16805 free (member_file_name);
16810 archive_file_offset = arch.nested_member_origin;
16812 ret |= process_object (qualified_name, member_file);
16814 fclose (member_file);
16815 free (member_file_name);
16817 else if (is_thin_archive)
16819 /* PR 15140: Allow for corrupt thin archives. */
16820 if (nested_arch.file == NULL)
16822 error (_("%s: contains corrupt thin archive: %s\n"),
16828 /* This is a proxy for a member of a nested archive. */
16829 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16831 /* The nested archive file will have been opened and setup by
16832 get_archive_member_name. */
16833 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16835 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16840 ret |= process_object (qualified_name, nested_arch.file);
16844 archive_file_offset = arch.next_arhdr_offset;
16845 arch.next_arhdr_offset += archive_file_size;
16847 ret |= process_object (qualified_name, file);
16850 if (dump_sects != NULL)
16854 num_dump_sects = 0;
16857 free (qualified_name);
16861 if (nested_arch.file != NULL)
16862 fclose (nested_arch.file);
16863 release_archive (&nested_arch);
16864 release_archive (&arch);
16870 process_file (char * file_name)
16873 struct stat statbuf;
16874 char armag[SARMAG];
16877 if (stat (file_name, &statbuf) < 0)
16879 if (errno == ENOENT)
16880 error (_("'%s': No such file\n"), file_name);
16882 error (_("Could not locate '%s'. System error message: %s\n"),
16883 file_name, strerror (errno));
16887 if (! S_ISREG (statbuf.st_mode))
16889 error (_("'%s' is not an ordinary file\n"), file_name);
16893 file = fopen (file_name, "rb");
16896 error (_("Input file '%s' is not readable.\n"), file_name);
16900 if (fread (armag, SARMAG, 1, file) != 1)
16902 error (_("%s: Failed to read file's magic number\n"), file_name);
16907 current_file_size = (bfd_size_type) statbuf.st_size;
16909 if (memcmp (armag, ARMAG, SARMAG) == 0)
16910 ret = process_archive (file_name, file, FALSE);
16911 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16912 ret = process_archive (file_name, file, TRUE);
16915 if (do_archive_index)
16916 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16920 archive_file_size = archive_file_offset = 0;
16921 ret = process_object (file_name, file);
16926 current_file_size = 0;
16930 #ifdef SUPPORT_DISASSEMBLY
16931 /* Needed by the i386 disassembler. For extra credit, someone could
16932 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16936 print_address (unsigned int addr, FILE * outfile)
16938 fprintf (outfile,"0x%8.8x", addr);
16941 /* Needed by the i386 disassembler. */
16943 db_task_printsym (unsigned int addr)
16945 print_address (addr, stderr);
16950 main (int argc, char ** argv)
16954 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16955 setlocale (LC_MESSAGES, "");
16957 #if defined (HAVE_SETLOCALE)
16958 setlocale (LC_CTYPE, "");
16960 bindtextdomain (PACKAGE, LOCALEDIR);
16961 textdomain (PACKAGE);
16963 expandargv (&argc, &argv);
16965 parse_args (argc, argv);
16967 if (num_dump_sects > 0)
16969 /* Make a copy of the dump_sects array. */
16970 cmdline_dump_sects = (dump_type *)
16971 malloc (num_dump_sects * sizeof (* dump_sects));
16972 if (cmdline_dump_sects == NULL)
16973 error (_("Out of memory allocating dump request table.\n"));
16976 memcpy (cmdline_dump_sects, dump_sects,
16977 num_dump_sects * sizeof (* dump_sects));
16978 num_cmdline_dump_sects = num_dump_sects;
16982 if (optind < (argc - 1))
16984 else if (optind >= argc)
16986 warn (_("Nothing to do.\n"));
16991 while (optind < argc)
16992 err |= process_file (argv[optind++]);
16994 if (dump_sects != NULL)
16996 if (cmdline_dump_sects != NULL)
16997 free (cmdline_dump_sects);