1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998-2015 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 char * program_name = "readelf";
168 static unsigned long archive_file_offset;
169 static unsigned long archive_file_size;
170 static bfd_size_type current_file_size;
171 static unsigned long dynamic_addr;
172 static bfd_size_type dynamic_size;
173 static size_t dynamic_nent;
174 static char * dynamic_strings;
175 static unsigned long dynamic_strings_length;
176 static char * string_table;
177 static unsigned long string_table_length;
178 static unsigned long num_dynamic_syms;
179 static Elf_Internal_Sym * dynamic_symbols;
180 static Elf_Internal_Syminfo * dynamic_syminfo;
181 static unsigned long dynamic_syminfo_offset;
182 static unsigned int dynamic_syminfo_nent;
183 static char program_interpreter[PATH_MAX];
184 static bfd_vma dynamic_info[DT_ENCODING];
185 static bfd_vma dynamic_info_DT_GNU_HASH;
186 static bfd_vma version_info[16];
187 static Elf_Internal_Ehdr elf_header;
188 static Elf_Internal_Shdr * section_headers;
189 static Elf_Internal_Phdr * program_headers;
190 static Elf_Internal_Dyn * dynamic_section;
191 static Elf_Internal_Shdr * symtab_shndx_hdr;
192 static int show_name;
193 static int do_dynamic;
195 static int do_dyn_syms;
197 static int do_sections;
198 static int do_section_groups;
199 static int do_section_details;
200 static int do_segments;
201 static int do_unwind;
202 static int do_using_dynamic;
203 static int do_header;
205 static int do_version;
206 static int do_histogram;
207 static int do_debugging;
210 static int do_archive_index;
211 static int is_32bit_elf;
212 static int decompress_dumps;
216 struct group_list * next;
217 unsigned int section_index;
222 struct group_list * root;
223 unsigned int group_index;
226 static size_t group_count;
227 static struct group * section_groups;
228 static struct group ** section_headers_groups;
231 /* Flag bits indicating particular types of dump. */
232 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
233 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
234 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
235 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
236 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
238 typedef unsigned char dump_type;
240 /* A linked list of the section names for which dumps were requested. */
241 struct dump_list_entry
245 struct dump_list_entry * next;
247 static struct dump_list_entry * dump_sects_byname;
249 /* A dynamic array of flags indicating for which sections a dump
250 has been requested via command line switches. */
251 static dump_type * cmdline_dump_sects = NULL;
252 static unsigned int num_cmdline_dump_sects = 0;
254 /* A dynamic array of flags indicating for which sections a dump of
255 some kind has been requested. It is reset on a per-object file
256 basis and then initialised from the cmdline_dump_sects array,
257 the results of interpreting the -w switch, and the
258 dump_sects_byname list. */
259 static dump_type * dump_sects = NULL;
260 static unsigned int num_dump_sects = 0;
263 /* How to print a vma value. */
264 typedef enum print_mode
276 /* Versioned symbol info. */
277 enum versioned_symbol_info
284 static const char *get_symbol_version_string
285 (FILE *file, int is_dynsym, const char *strtab,
286 unsigned long int strtab_size, unsigned int si,
287 Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
288 unsigned short *vna_other);
292 #define SECTION_NAME(X) \
293 ((X) == NULL ? _("<none>") \
294 : string_table == NULL ? _("<no-name>") \
295 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
296 : string_table + (X)->sh_name))
298 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
300 #define GET_ELF_SYMBOLS(file, section, sym_count) \
301 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
302 : get_64bit_elf_symbols (file, section, sym_count))
304 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
305 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
306 already been called and verified that the string exists. */
307 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
309 #define REMOVE_ARCH_BITS(ADDR) \
312 if (elf_header.e_machine == EM_ARM) \
317 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
318 the offset of the current archive member, if we are examining an archive.
319 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
320 using malloc and fill that. In either case return the pointer to the start of
321 the retrieved data or NULL if something went wrong. If something does go wrong
322 and REASON is not NULL then emit an error message using REASON as part of the
326 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
327 bfd_size_type nmemb, const char * reason)
330 bfd_size_type amt = size * nmemb;
332 if (size == 0 || nmemb == 0)
335 /* If the size_t type is smaller than the bfd_size_type, eg because
336 you are building a 32-bit tool on a 64-bit host, then make sure
337 that when the sizes are cast to (size_t) no information is lost. */
338 if (sizeof (size_t) < sizeof (bfd_size_type)
339 && ( (bfd_size_type) ((size_t) size) != size
340 || (bfd_size_type) ((size_t) nmemb) != nmemb))
343 error (_("Size truncation prevents reading 0x%llx elements of size 0x%llx for %s\n"),
344 (unsigned long long) nmemb, (unsigned long long) size, reason);
348 /* Check for size overflow. */
352 error (_("Size overflow prevents reading 0x%llx elements of size 0x%llx for %s\n"),
353 (unsigned long long) nmemb, (unsigned long long) size, reason);
357 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
358 attempting to allocate memory when the read is bound to fail. */
359 if (amt > current_file_size
360 || offset + archive_file_offset + amt > current_file_size)
363 error (_("Reading 0x%llx bytes extends past end of file for %s\n"),
364 (unsigned long long) amt, reason);
368 if (fseek (file, archive_file_offset + offset, SEEK_SET))
371 error (_("Unable to seek to 0x%lx for %s\n"),
372 (unsigned long) archive_file_offset + offset, reason);
379 /* Check for overflow. */
380 if (nmemb < (~(bfd_size_type) 0 - 1) / size)
381 /* + 1 so that we can '\0' terminate invalid string table sections. */
382 mvar = malloc ((size_t) amt + 1);
387 error (_("Out of memory allocating 0x%llx bytes for %s\n"),
388 (unsigned long long) amt, reason);
392 ((char *) mvar)[amt] = '\0';
395 if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
398 error (_("Unable to read in 0x%llx bytes of %s\n"),
399 (unsigned long long) amt, reason);
408 /* Print a VMA value. */
411 print_vma (bfd_vma vma, print_mode mode)
424 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
431 return printf ("%5" BFD_VMA_FMT "d", vma);
439 return nc + printf ("%" BFD_VMA_FMT "x", vma);
442 return printf ("%" BFD_VMA_FMT "d", vma);
445 return printf ("%" BFD_VMA_FMT "u", vma);
450 /* Display a symbol on stdout. Handles the display of control characters and
451 multibye characters (assuming the host environment supports them).
453 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
455 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
456 padding as necessary.
458 Returns the number of emitted characters. */
461 print_symbol (int width, const char *symbol)
463 bfd_boolean extra_padding = FALSE;
465 #ifdef HAVE_MBSTATE_T
472 /* Keep the width positive. This also helps. */
474 extra_padding = TRUE;
479 /* Set the remaining width to a very large value.
480 This simplifies the code below. */
481 width_remaining = INT_MAX;
483 width_remaining = width;
485 #ifdef HAVE_MBSTATE_T
486 /* Initialise the multibyte conversion state. */
487 memset (& state, 0, sizeof (state));
490 while (width_remaining)
493 const char c = *symbol++;
498 /* Do not print control characters directly as they can affect terminal
499 settings. Such characters usually appear in the names generated
500 by the assembler for local labels. */
503 if (width_remaining < 2)
506 printf ("^%c", c + 0x40);
507 width_remaining -= 2;
510 else if (ISPRINT (c))
518 #ifdef HAVE_MBSTATE_T
521 /* Let printf do the hard work of displaying multibyte characters. */
522 printf ("%.1s", symbol - 1);
526 #ifdef HAVE_MBSTATE_T
527 /* Try to find out how many bytes made up the character that was
528 just printed. Advance the symbol pointer past the bytes that
530 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
534 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
539 if (extra_padding && num_printed < width)
541 /* Fill in the remaining spaces. */
542 printf ("%-*s", width - num_printed, " ");
549 /* Returns a pointer to a static buffer containing a printable version of
550 the given section's name. Like print_symbol, except that it does not try
551 to print multibyte characters, it just interprets them as hex values. */
554 printable_section_name (const Elf_Internal_Shdr * sec)
556 #define MAX_PRINT_SEC_NAME_LEN 128
557 static char sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
558 const char * name = SECTION_NAME (sec);
559 char * buf = sec_name_buf;
561 unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
563 while ((c = * name ++) != 0)
574 else if (ISPRINT (c))
581 static char hex[17] = "0123456789ABCDEF";
586 * buf ++ = hex[(c & 0xf0) >> 4];
587 * buf ++ = hex[c & 0x0f];
601 printable_section_name_from_index (unsigned long ndx)
603 if (ndx >= elf_header.e_shnum)
604 return _("<corrupt>");
606 return printable_section_name (section_headers + ndx);
609 /* Return a pointer to section NAME, or NULL if no such section exists. */
611 static Elf_Internal_Shdr *
612 find_section (const char * name)
616 for (i = 0; i < elf_header.e_shnum; i++)
617 if (streq (SECTION_NAME (section_headers + i), name))
618 return section_headers + i;
623 /* Return a pointer to a section containing ADDR, or NULL if no such
626 static Elf_Internal_Shdr *
627 find_section_by_address (bfd_vma addr)
631 for (i = 0; i < elf_header.e_shnum; i++)
633 Elf_Internal_Shdr *sec = section_headers + i;
634 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
641 static Elf_Internal_Shdr *
642 find_section_by_type (unsigned int type)
646 for (i = 0; i < elf_header.e_shnum; i++)
648 Elf_Internal_Shdr *sec = section_headers + i;
649 if (sec->sh_type == type)
656 /* Return a pointer to section NAME, or NULL if no such section exists,
657 restricted to the list of sections given in SET. */
659 static Elf_Internal_Shdr *
660 find_section_in_set (const char * name, unsigned int * set)
666 while ((i = *set++) > 0)
667 if (streq (SECTION_NAME (section_headers + i), name))
668 return section_headers + i;
671 return find_section (name);
674 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
677 static inline unsigned long
678 read_uleb128 (unsigned char *data,
679 unsigned int *length_return,
680 const unsigned char * const end)
682 return read_leb128 (data, length_return, FALSE, end);
685 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
686 This OS has so many departures from the ELF standard that we test it at
692 return elf_header.e_machine == EM_IA_64
693 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
696 /* Guess the relocation size commonly used by the specific machines. */
699 guess_is_rela (unsigned int e_machine)
703 /* Targets that use REL relocations. */
718 /* Targets that use RELA relocations. */
722 case EM_ADAPTEVA_EPIPHANY:
724 case EM_ALTERA_NIOS2:
744 case EM_LATTICEMICO32:
753 case EM_CYGNUS_MN10200:
755 case EM_CYGNUS_MN10300:
789 case EM_MICROBLAZE_OLD:
810 warn (_("Don't know about relocations on this machine architecture\n"));
816 slurp_rela_relocs (FILE * file,
817 unsigned long rel_offset,
818 unsigned long rel_size,
819 Elf_Internal_Rela ** relasp,
820 unsigned long * nrelasp)
822 Elf_Internal_Rela * relas;
828 Elf32_External_Rela * erelas;
830 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
831 rel_size, _("32-bit relocation data"));
835 nrelas = rel_size / sizeof (Elf32_External_Rela);
837 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
838 sizeof (Elf_Internal_Rela));
843 error (_("out of memory parsing relocs\n"));
847 for (i = 0; i < nrelas; i++)
849 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
850 relas[i].r_info = BYTE_GET (erelas[i].r_info);
851 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
858 Elf64_External_Rela * erelas;
860 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
861 rel_size, _("64-bit relocation data"));
865 nrelas = rel_size / sizeof (Elf64_External_Rela);
867 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
868 sizeof (Elf_Internal_Rela));
873 error (_("out of memory parsing relocs\n"));
877 for (i = 0; i < nrelas; i++)
879 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
880 relas[i].r_info = BYTE_GET (erelas[i].r_info);
881 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
883 /* The #ifdef BFD64 below is to prevent a compile time
884 warning. We know that if we do not have a 64 bit data
885 type that we will never execute this code anyway. */
887 if (elf_header.e_machine == EM_MIPS
888 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
890 /* In little-endian objects, r_info isn't really a
891 64-bit little-endian value: it has a 32-bit
892 little-endian symbol index followed by four
893 individual byte fields. Reorder INFO
895 bfd_vma inf = relas[i].r_info;
896 inf = (((inf & 0xffffffff) << 32)
897 | ((inf >> 56) & 0xff)
898 | ((inf >> 40) & 0xff00)
899 | ((inf >> 24) & 0xff0000)
900 | ((inf >> 8) & 0xff000000));
901 relas[i].r_info = inf;
914 slurp_rel_relocs (FILE * file,
915 unsigned long rel_offset,
916 unsigned long rel_size,
917 Elf_Internal_Rela ** relsp,
918 unsigned long * nrelsp)
920 Elf_Internal_Rela * rels;
926 Elf32_External_Rel * erels;
928 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
929 rel_size, _("32-bit relocation data"));
933 nrels = rel_size / sizeof (Elf32_External_Rel);
935 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
940 error (_("out of memory parsing relocs\n"));
944 for (i = 0; i < nrels; i++)
946 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
947 rels[i].r_info = BYTE_GET (erels[i].r_info);
948 rels[i].r_addend = 0;
955 Elf64_External_Rel * erels;
957 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
958 rel_size, _("64-bit relocation data"));
962 nrels = rel_size / sizeof (Elf64_External_Rel);
964 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
969 error (_("out of memory parsing relocs\n"));
973 for (i = 0; i < nrels; i++)
975 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
976 rels[i].r_info = BYTE_GET (erels[i].r_info);
977 rels[i].r_addend = 0;
979 /* The #ifdef BFD64 below is to prevent a compile time
980 warning. We know that if we do not have a 64 bit data
981 type that we will never execute this code anyway. */
983 if (elf_header.e_machine == EM_MIPS
984 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
986 /* In little-endian objects, r_info isn't really a
987 64-bit little-endian value: it has a 32-bit
988 little-endian symbol index followed by four
989 individual byte fields. Reorder INFO
991 bfd_vma inf = rels[i].r_info;
992 inf = (((inf & 0xffffffff) << 32)
993 | ((inf >> 56) & 0xff)
994 | ((inf >> 40) & 0xff00)
995 | ((inf >> 24) & 0xff0000)
996 | ((inf >> 8) & 0xff000000));
997 rels[i].r_info = inf;
1009 /* Returns the reloc type extracted from the reloc info field. */
1012 get_reloc_type (bfd_vma reloc_info)
1015 return ELF32_R_TYPE (reloc_info);
1017 switch (elf_header.e_machine)
1020 /* Note: We assume that reloc_info has already been adjusted for us. */
1021 return ELF64_MIPS_R_TYPE (reloc_info);
1024 return ELF64_R_TYPE_ID (reloc_info);
1027 return ELF64_R_TYPE (reloc_info);
1031 /* Return the symbol index extracted from the reloc info field. */
1034 get_reloc_symindex (bfd_vma reloc_info)
1036 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1039 static inline bfd_boolean
1040 uses_msp430x_relocs (void)
1043 elf_header.e_machine == EM_MSP430 /* Paranoia. */
1044 /* GCC uses osabi == ELFOSBI_STANDALONE. */
1045 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1046 /* TI compiler uses ELFOSABI_NONE. */
1047 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1050 /* Display the contents of the relocation data found at the specified
1054 dump_relocations (FILE * file,
1055 unsigned long rel_offset,
1056 unsigned long rel_size,
1057 Elf_Internal_Sym * symtab,
1058 unsigned long nsyms,
1060 unsigned long strtablen,
1065 Elf_Internal_Rela * rels;
1067 if (is_rela == UNKNOWN)
1068 is_rela = guess_is_rela (elf_header.e_machine);
1072 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1077 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1088 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1093 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1095 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1103 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1105 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1110 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1112 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1116 for (i = 0; i < rel_size; i++)
1121 bfd_vma symtab_index;
1124 offset = rels[i].r_offset;
1125 inf = rels[i].r_info;
1127 type = get_reloc_type (inf);
1128 symtab_index = get_reloc_symindex (inf);
1132 printf ("%8.8lx %8.8lx ",
1133 (unsigned long) offset & 0xffffffff,
1134 (unsigned long) inf & 0xffffffff);
1138 #if BFD_HOST_64BIT_LONG
1140 ? "%16.16lx %16.16lx "
1141 : "%12.12lx %12.12lx ",
1143 #elif BFD_HOST_64BIT_LONG_LONG
1146 ? "%16.16llx %16.16llx "
1147 : "%12.12llx %12.12llx ",
1151 ? "%16.16I64x %16.16I64x "
1152 : "%12.12I64x %12.12I64x ",
1157 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1158 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1159 _bfd_int64_high (offset),
1160 _bfd_int64_low (offset),
1161 _bfd_int64_high (inf),
1162 _bfd_int64_low (inf));
1166 switch (elf_header.e_machine)
1173 rtype = elf_aarch64_reloc_type (type);
1177 case EM_CYGNUS_M32R:
1178 rtype = elf_m32r_reloc_type (type);
1183 rtype = elf_i386_reloc_type (type);
1188 rtype = elf_m68hc11_reloc_type (type);
1192 rtype = elf_m68k_reloc_type (type);
1196 rtype = elf_i960_reloc_type (type);
1201 rtype = elf_avr_reloc_type (type);
1204 case EM_OLD_SPARCV9:
1205 case EM_SPARC32PLUS:
1208 rtype = elf_sparc_reloc_type (type);
1212 rtype = elf_spu_reloc_type (type);
1216 rtype = v800_reloc_type (type);
1219 case EM_CYGNUS_V850:
1220 rtype = v850_reloc_type (type);
1224 case EM_CYGNUS_D10V:
1225 rtype = elf_d10v_reloc_type (type);
1229 case EM_CYGNUS_D30V:
1230 rtype = elf_d30v_reloc_type (type);
1234 rtype = elf_dlx_reloc_type (type);
1238 rtype = elf_sh_reloc_type (type);
1242 case EM_CYGNUS_MN10300:
1243 rtype = elf_mn10300_reloc_type (type);
1247 case EM_CYGNUS_MN10200:
1248 rtype = elf_mn10200_reloc_type (type);
1252 case EM_CYGNUS_FR30:
1253 rtype = elf_fr30_reloc_type (type);
1257 rtype = elf_frv_reloc_type (type);
1261 rtype = elf_ft32_reloc_type (type);
1265 rtype = elf_mcore_reloc_type (type);
1269 rtype = elf_mmix_reloc_type (type);
1273 rtype = elf_moxie_reloc_type (type);
1277 if (uses_msp430x_relocs ())
1279 rtype = elf_msp430x_reloc_type (type);
1283 rtype = elf_msp430_reloc_type (type);
1287 rtype = elf_nds32_reloc_type (type);
1291 rtype = elf_ppc_reloc_type (type);
1295 rtype = elf_ppc64_reloc_type (type);
1299 case EM_MIPS_RS3_LE:
1300 rtype = elf_mips_reloc_type (type);
1304 rtype = elf_alpha_reloc_type (type);
1308 rtype = elf_arm_reloc_type (type);
1312 rtype = elf_arc_reloc_type (type);
1316 rtype = elf_hppa_reloc_type (type);
1322 rtype = elf_h8_reloc_type (type);
1326 rtype = elf_or1k_reloc_type (type);
1331 rtype = elf_pj_reloc_type (type);
1334 rtype = elf_ia64_reloc_type (type);
1338 rtype = elf_cris_reloc_type (type);
1342 rtype = elf_i860_reloc_type (type);
1348 rtype = elf_x86_64_reloc_type (type);
1352 rtype = i370_reloc_type (type);
1357 rtype = elf_s390_reloc_type (type);
1361 rtype = elf_score_reloc_type (type);
1365 rtype = elf_xstormy16_reloc_type (type);
1369 rtype = elf_crx_reloc_type (type);
1373 rtype = elf_vax_reloc_type (type);
1377 rtype = elf_visium_reloc_type (type);
1380 case EM_ADAPTEVA_EPIPHANY:
1381 rtype = elf_epiphany_reloc_type (type);
1386 rtype = elf_ip2k_reloc_type (type);
1390 rtype = elf_iq2000_reloc_type (type);
1395 rtype = elf_xtensa_reloc_type (type);
1398 case EM_LATTICEMICO32:
1399 rtype = elf_lm32_reloc_type (type);
1404 rtype = elf_m32c_reloc_type (type);
1408 rtype = elf_mt_reloc_type (type);
1412 rtype = elf_bfin_reloc_type (type);
1416 rtype = elf_mep_reloc_type (type);
1420 rtype = elf_cr16_reloc_type (type);
1424 case EM_MICROBLAZE_OLD:
1425 rtype = elf_microblaze_reloc_type (type);
1429 rtype = elf_rl78_reloc_type (type);
1433 rtype = elf_rx_reloc_type (type);
1437 rtype = elf_metag_reloc_type (type);
1442 rtype = elf_xc16x_reloc_type (type);
1446 rtype = elf_tic6x_reloc_type (type);
1450 rtype = elf_tilegx_reloc_type (type);
1454 rtype = elf_tilepro_reloc_type (type);
1458 rtype = elf_xgate_reloc_type (type);
1461 case EM_ALTERA_NIOS2:
1462 rtype = elf_nios2_reloc_type (type);
1467 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1469 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1471 if (elf_header.e_machine == EM_ALPHA
1473 && streq (rtype, "R_ALPHA_LITUSE")
1476 switch (rels[i].r_addend)
1478 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1479 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1480 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1481 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1482 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1483 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1484 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1485 default: rtype = NULL;
1488 printf (" (%s)", rtype);
1492 printf (_("<unknown addend: %lx>"),
1493 (unsigned long) rels[i].r_addend);
1496 else if (symtab_index)
1498 if (symtab == NULL || symtab_index >= nsyms)
1499 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1502 Elf_Internal_Sym * psym;
1503 const char * version_string;
1504 enum versioned_symbol_info sym_info;
1505 unsigned short vna_other;
1507 psym = symtab + symtab_index;
1510 = get_symbol_version_string (file, is_dynsym,
1519 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1523 unsigned int width = is_32bit_elf ? 8 : 14;
1525 /* Relocations against GNU_IFUNC symbols do not use the value
1526 of the symbol as the address to relocate against. Instead
1527 they invoke the function named by the symbol and use its
1528 result as the address for relocation.
1530 To indicate this to the user, do not display the value of
1531 the symbol in the "Symbols's Value" field. Instead show
1532 its name followed by () as a hint that the symbol is
1536 || psym->st_name == 0
1537 || psym->st_name >= strtablen)
1540 name = strtab + psym->st_name;
1542 len = print_symbol (width, name);
1544 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1546 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1550 print_vma (psym->st_value, LONG_HEX);
1552 printf (is_32bit_elf ? " " : " ");
1555 if (psym->st_name == 0)
1557 const char * sec_name = "<null>";
1560 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1562 if (psym->st_shndx < elf_header.e_shnum)
1563 sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1564 else if (psym->st_shndx == SHN_ABS)
1566 else if (psym->st_shndx == SHN_COMMON)
1567 sec_name = "COMMON";
1568 else if ((elf_header.e_machine == EM_MIPS
1569 && psym->st_shndx == SHN_MIPS_SCOMMON)
1570 || (elf_header.e_machine == EM_TI_C6000
1571 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1572 sec_name = "SCOMMON";
1573 else if (elf_header.e_machine == EM_MIPS
1574 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1575 sec_name = "SUNDEF";
1576 else if ((elf_header.e_machine == EM_X86_64
1577 || elf_header.e_machine == EM_L1OM
1578 || elf_header.e_machine == EM_K1OM)
1579 && psym->st_shndx == SHN_X86_64_LCOMMON)
1580 sec_name = "LARGE_COMMON";
1581 else if (elf_header.e_machine == EM_IA_64
1582 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1583 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1584 sec_name = "ANSI_COM";
1585 else if (is_ia64_vms ()
1586 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1587 sec_name = "VMS_SYMVEC";
1590 sprintf (name_buf, "<section 0x%x>",
1591 (unsigned int) psym->st_shndx);
1592 sec_name = name_buf;
1595 print_symbol (22, sec_name);
1597 else if (strtab == NULL)
1598 printf (_("<string table index: %3ld>"), psym->st_name);
1599 else if (psym->st_name >= strtablen)
1600 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1603 print_symbol (22, strtab + psym->st_name);
1605 printf (sym_info == symbol_public ? "@@%s" : "@%s",
1611 bfd_signed_vma off = rels[i].r_addend;
1613 /* PR 17531: file: 2e63226f. */
1614 if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1615 printf (" + %" BFD_VMA_FMT "x", off);
1617 printf (" - %" BFD_VMA_FMT "x", - off);
1619 printf (" + %" BFD_VMA_FMT "x", off);
1625 bfd_signed_vma off = rels[i].r_addend;
1627 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1628 /* PR 17531: file: 2e63226f. */
1629 if (off == ((bfd_signed_vma) 1) << ((sizeof (bfd_signed_vma) * 8) - 1))
1630 printf ("%" BFD_VMA_FMT "x", off);
1632 printf ("-%" BFD_VMA_FMT "x", - off);
1634 printf ("%" BFD_VMA_FMT "x", off);
1637 if (elf_header.e_machine == EM_SPARCV9
1639 && streq (rtype, "R_SPARC_OLO10"))
1640 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1645 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1647 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1648 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1649 const char * rtype2 = elf_mips_reloc_type (type2);
1650 const char * rtype3 = elf_mips_reloc_type (type3);
1652 printf (" Type2: ");
1655 printf (_("unrecognized: %-7lx"),
1656 (unsigned long) type2 & 0xffffffff);
1658 printf ("%-17.17s", rtype2);
1660 printf ("\n Type3: ");
1663 printf (_("unrecognized: %-7lx"),
1664 (unsigned long) type3 & 0xffffffff);
1666 printf ("%-17.17s", rtype3);
1677 get_mips_dynamic_type (unsigned long type)
1681 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1682 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1683 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1684 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1685 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1686 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1687 case DT_MIPS_MSYM: return "MIPS_MSYM";
1688 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1689 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1690 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1691 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1692 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1693 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1694 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1695 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1696 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1697 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1698 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1699 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1700 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1701 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1702 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1703 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1704 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1705 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1706 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1707 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1708 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1709 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1710 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1711 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1712 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1713 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1714 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1715 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1716 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1717 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1718 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1719 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1720 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1721 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1722 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1723 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1724 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1725 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1732 get_sparc64_dynamic_type (unsigned long type)
1736 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1743 get_ppc_dynamic_type (unsigned long type)
1747 case DT_PPC_GOT: return "PPC_GOT";
1748 case DT_PPC_OPT: return "PPC_OPT";
1755 get_ppc64_dynamic_type (unsigned long type)
1759 case DT_PPC64_GLINK: return "PPC64_GLINK";
1760 case DT_PPC64_OPD: return "PPC64_OPD";
1761 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1762 case DT_PPC64_OPT: return "PPC64_OPT";
1769 get_parisc_dynamic_type (unsigned long type)
1773 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1774 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1775 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1776 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1777 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1778 case DT_HP_PREINIT: return "HP_PREINIT";
1779 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1780 case DT_HP_NEEDED: return "HP_NEEDED";
1781 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1782 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1783 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1784 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1785 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1786 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1787 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1788 case DT_HP_FILTERED: return "HP_FILTERED";
1789 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1790 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1791 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1792 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1793 case DT_PLT: return "PLT";
1794 case DT_PLT_SIZE: return "PLT_SIZE";
1795 case DT_DLT: return "DLT";
1796 case DT_DLT_SIZE: return "DLT_SIZE";
1803 get_ia64_dynamic_type (unsigned long type)
1807 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1808 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1809 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1810 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1811 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1812 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1813 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1814 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1815 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1816 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1817 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1818 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1819 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1820 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1821 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1822 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1823 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1824 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1825 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1826 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1827 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1828 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1829 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1830 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1831 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1832 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1833 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1834 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1835 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1836 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1837 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1844 get_alpha_dynamic_type (unsigned long type)
1848 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1855 get_score_dynamic_type (unsigned long type)
1859 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1860 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1861 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1862 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1863 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1864 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1871 get_tic6x_dynamic_type (unsigned long type)
1875 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1876 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1877 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1878 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1879 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1880 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1887 get_nios2_dynamic_type (unsigned long type)
1891 case DT_NIOS2_GP: return "NIOS2_GP";
1898 get_dynamic_type (unsigned long type)
1900 static char buff[64];
1904 case DT_NULL: return "NULL";
1905 case DT_NEEDED: return "NEEDED";
1906 case DT_PLTRELSZ: return "PLTRELSZ";
1907 case DT_PLTGOT: return "PLTGOT";
1908 case DT_HASH: return "HASH";
1909 case DT_STRTAB: return "STRTAB";
1910 case DT_SYMTAB: return "SYMTAB";
1911 case DT_RELA: return "RELA";
1912 case DT_RELASZ: return "RELASZ";
1913 case DT_RELAENT: return "RELAENT";
1914 case DT_STRSZ: return "STRSZ";
1915 case DT_SYMENT: return "SYMENT";
1916 case DT_INIT: return "INIT";
1917 case DT_FINI: return "FINI";
1918 case DT_SONAME: return "SONAME";
1919 case DT_RPATH: return "RPATH";
1920 case DT_SYMBOLIC: return "SYMBOLIC";
1921 case DT_REL: return "REL";
1922 case DT_RELSZ: return "RELSZ";
1923 case DT_RELENT: return "RELENT";
1924 case DT_PLTREL: return "PLTREL";
1925 case DT_DEBUG: return "DEBUG";
1926 case DT_TEXTREL: return "TEXTREL";
1927 case DT_JMPREL: return "JMPREL";
1928 case DT_BIND_NOW: return "BIND_NOW";
1929 case DT_INIT_ARRAY: return "INIT_ARRAY";
1930 case DT_FINI_ARRAY: return "FINI_ARRAY";
1931 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1932 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1933 case DT_RUNPATH: return "RUNPATH";
1934 case DT_FLAGS: return "FLAGS";
1936 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1937 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1939 case DT_CHECKSUM: return "CHECKSUM";
1940 case DT_PLTPADSZ: return "PLTPADSZ";
1941 case DT_MOVEENT: return "MOVEENT";
1942 case DT_MOVESZ: return "MOVESZ";
1943 case DT_FEATURE: return "FEATURE";
1944 case DT_POSFLAG_1: return "POSFLAG_1";
1945 case DT_SYMINSZ: return "SYMINSZ";
1946 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1948 case DT_ADDRRNGLO: return "ADDRRNGLO";
1949 case DT_CONFIG: return "CONFIG";
1950 case DT_DEPAUDIT: return "DEPAUDIT";
1951 case DT_AUDIT: return "AUDIT";
1952 case DT_PLTPAD: return "PLTPAD";
1953 case DT_MOVETAB: return "MOVETAB";
1954 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1956 case DT_VERSYM: return "VERSYM";
1958 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1959 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1960 case DT_RELACOUNT: return "RELACOUNT";
1961 case DT_RELCOUNT: return "RELCOUNT";
1962 case DT_FLAGS_1: return "FLAGS_1";
1963 case DT_VERDEF: return "VERDEF";
1964 case DT_VERDEFNUM: return "VERDEFNUM";
1965 case DT_VERNEED: return "VERNEED";
1966 case DT_VERNEEDNUM: return "VERNEEDNUM";
1968 case DT_AUXILIARY: return "AUXILIARY";
1969 case DT_USED: return "USED";
1970 case DT_FILTER: return "FILTER";
1972 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1973 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1974 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1975 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1976 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1977 case DT_GNU_HASH: return "GNU_HASH";
1980 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1982 const char * result;
1984 switch (elf_header.e_machine)
1987 case EM_MIPS_RS3_LE:
1988 result = get_mips_dynamic_type (type);
1991 result = get_sparc64_dynamic_type (type);
1994 result = get_ppc_dynamic_type (type);
1997 result = get_ppc64_dynamic_type (type);
2000 result = get_ia64_dynamic_type (type);
2003 result = get_alpha_dynamic_type (type);
2006 result = get_score_dynamic_type (type);
2009 result = get_tic6x_dynamic_type (type);
2011 case EM_ALTERA_NIOS2:
2012 result = get_nios2_dynamic_type (type);
2022 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2024 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2025 || (elf_header.e_machine == EM_PARISC
2026 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2028 const char * result;
2030 switch (elf_header.e_machine)
2033 result = get_parisc_dynamic_type (type);
2036 result = get_ia64_dynamic_type (type);
2046 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2050 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2057 get_file_type (unsigned e_type)
2059 static char buff[32];
2063 case ET_NONE: return _("NONE (None)");
2064 case ET_REL: return _("REL (Relocatable file)");
2065 case ET_EXEC: return _("EXEC (Executable file)");
2066 case ET_DYN: return _("DYN (Shared object file)");
2067 case ET_CORE: return _("CORE (Core file)");
2070 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2071 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2072 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2073 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2075 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2081 get_machine_name (unsigned e_machine)
2083 static char buff[64]; /* XXX */
2087 case EM_NONE: return _("None");
2088 case EM_AARCH64: return "AArch64";
2089 case EM_M32: return "WE32100";
2090 case EM_SPARC: return "Sparc";
2091 case EM_SPU: return "SPU";
2092 case EM_386: return "Intel 80386";
2093 case EM_68K: return "MC68000";
2094 case EM_88K: return "MC88000";
2095 case EM_IAMCU: return "Intel MCU";
2096 case EM_860: return "Intel 80860";
2097 case EM_MIPS: return "MIPS R3000";
2098 case EM_S370: return "IBM System/370";
2099 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
2100 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
2101 case EM_PARISC: return "HPPA";
2102 case EM_PPC_OLD: return "Power PC (old)";
2103 case EM_SPARC32PLUS: return "Sparc v8+" ;
2104 case EM_960: return "Intel 90860";
2105 case EM_PPC: return "PowerPC";
2106 case EM_PPC64: return "PowerPC64";
2107 case EM_FR20: return "Fujitsu FR20";
2108 case EM_FT32: return "FTDI FT32";
2109 case EM_RH32: return "TRW RH32";
2110 case EM_MCORE: return "MCORE";
2111 case EM_ARM: return "ARM";
2112 case EM_OLD_ALPHA: return "Digital Alpha (old)";
2113 case EM_SH: return "Renesas / SuperH SH";
2114 case EM_SPARCV9: return "Sparc v9";
2115 case EM_TRICORE: return "Siemens Tricore";
2116 case EM_ARC: return "ARC";
2117 case EM_H8_300: return "Renesas H8/300";
2118 case EM_H8_300H: return "Renesas H8/300H";
2119 case EM_H8S: return "Renesas H8S";
2120 case EM_H8_500: return "Renesas H8/500";
2121 case EM_IA_64: return "Intel IA-64";
2122 case EM_MIPS_X: return "Stanford MIPS-X";
2123 case EM_COLDFIRE: return "Motorola Coldfire";
2124 case EM_ALPHA: return "Alpha";
2125 case EM_CYGNUS_D10V:
2126 case EM_D10V: return "d10v";
2127 case EM_CYGNUS_D30V:
2128 case EM_D30V: return "d30v";
2129 case EM_CYGNUS_M32R:
2130 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
2131 case EM_CYGNUS_V850:
2132 case EM_V800: return "Renesas V850 (using RH850 ABI)";
2133 case EM_V850: return "Renesas V850";
2134 case EM_CYGNUS_MN10300:
2135 case EM_MN10300: return "mn10300";
2136 case EM_CYGNUS_MN10200:
2137 case EM_MN10200: return "mn10200";
2138 case EM_MOXIE: return "Moxie";
2139 case EM_CYGNUS_FR30:
2140 case EM_FR30: return "Fujitsu FR30";
2141 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
2143 case EM_PJ: return "picoJava";
2144 case EM_MMA: return "Fujitsu Multimedia Accelerator";
2145 case EM_PCP: return "Siemens PCP";
2146 case EM_NCPU: return "Sony nCPU embedded RISC processor";
2147 case EM_NDR1: return "Denso NDR1 microprocesspr";
2148 case EM_STARCORE: return "Motorola Star*Core processor";
2149 case EM_ME16: return "Toyota ME16 processor";
2150 case EM_ST100: return "STMicroelectronics ST100 processor";
2151 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
2152 case EM_PDSP: return "Sony DSP processor";
2153 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
2154 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
2155 case EM_FX66: return "Siemens FX66 microcontroller";
2156 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2157 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
2158 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
2159 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
2160 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
2161 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
2162 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
2163 case EM_SVX: return "Silicon Graphics SVx";
2164 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
2165 case EM_VAX: return "Digital VAX";
2166 case EM_VISIUM: return "CDS VISIUMcore processor";
2168 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
2169 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
2170 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
2171 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2172 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2173 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2174 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2175 case EM_PRISM: return "Vitesse Prism";
2176 case EM_X86_64: return "Advanced Micro Devices X86-64";
2177 case EM_L1OM: return "Intel L1OM";
2178 case EM_K1OM: return "Intel K1OM";
2180 case EM_S390: return "IBM S/390";
2181 case EM_SCORE: return "SUNPLUS S+Core";
2182 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2183 case EM_OR1K: return "OpenRISC 1000";
2184 case EM_ARC_A5: return "ARC International ARCompact processor";
2185 case EM_CRX: return "National Semiconductor CRX microprocessor";
2186 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2187 case EM_DLX: return "OpenDLX";
2189 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2190 case EM_IQ2000: return "Vitesse IQ2000";
2192 case EM_XTENSA: return "Tensilica Xtensa Processor";
2193 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2194 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2195 case EM_NS32K: return "National Semiconductor 32000 series";
2196 case EM_TPC: return "Tenor Network TPC processor";
2197 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2198 case EM_MAX: return "MAX Processor";
2199 case EM_CR: return "National Semiconductor CompactRISC";
2200 case EM_F2MC16: return "Fujitsu F2MC16";
2201 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2202 case EM_LATTICEMICO32: return "Lattice Mico32";
2204 case EM_M32C: return "Renesas M32c";
2205 case EM_MT: return "Morpho Techologies MT processor";
2206 case EM_BLACKFIN: return "Analog Devices Blackfin";
2207 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2208 case EM_SEP: return "Sharp embedded microprocessor";
2209 case EM_ARCA: return "Arca RISC microprocessor";
2210 case EM_UNICORE: return "Unicore";
2211 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2212 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2213 case EM_NIOS32: return "Altera Nios";
2214 case EM_ALTERA_NIOS2: return "Altera Nios II";
2216 case EM_XC16X: return "Infineon Technologies xc16x";
2217 case EM_M16C: return "Renesas M16C series microprocessors";
2218 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2219 case EM_CE: return "Freescale Communication Engine RISC core";
2220 case EM_TSK3000: return "Altium TSK3000 core";
2221 case EM_RS08: return "Freescale RS08 embedded processor";
2222 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2223 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2224 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2225 case EM_SE_C17: return "Seiko Epson C17 family";
2226 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2227 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2228 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2229 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2230 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2231 case EM_R32C: return "Renesas R32C series microprocessors";
2232 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2233 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2234 case EM_8051: return "Intel 8051 and variants";
2235 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2236 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2237 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2238 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2239 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2240 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2241 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2242 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2245 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2246 case EM_RL78: return "Renesas RL78";
2247 case EM_RX: return "Renesas RX";
2248 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2249 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2250 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2251 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2252 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2253 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2254 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2255 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2256 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2257 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2258 case EM_CUDA: return "NVIDIA CUDA architecture";
2259 case EM_XGATE: return "Motorola XGATE embedded processor";
2261 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2267 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2272 eabi = EF_ARM_EABI_VERSION (e_flags);
2273 e_flags &= ~ EF_ARM_EABIMASK;
2275 /* Handle "generic" ARM flags. */
2276 if (e_flags & EF_ARM_RELEXEC)
2278 strcat (buf, ", relocatable executable");
2279 e_flags &= ~ EF_ARM_RELEXEC;
2282 /* Now handle EABI specific flags. */
2286 strcat (buf, ", <unrecognized EABI>");
2291 case EF_ARM_EABI_VER1:
2292 strcat (buf, ", Version1 EABI");
2297 /* Process flags one bit at a time. */
2298 flag = e_flags & - e_flags;
2303 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2304 strcat (buf, ", sorted symbol tables");
2314 case EF_ARM_EABI_VER2:
2315 strcat (buf, ", Version2 EABI");
2320 /* Process flags one bit at a time. */
2321 flag = e_flags & - e_flags;
2326 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2327 strcat (buf, ", sorted symbol tables");
2330 case EF_ARM_DYNSYMSUSESEGIDX:
2331 strcat (buf, ", dynamic symbols use segment index");
2334 case EF_ARM_MAPSYMSFIRST:
2335 strcat (buf, ", mapping symbols precede others");
2345 case EF_ARM_EABI_VER3:
2346 strcat (buf, ", Version3 EABI");
2349 case EF_ARM_EABI_VER4:
2350 strcat (buf, ", Version4 EABI");
2355 /* Process flags one bit at a time. */
2356 flag = e_flags & - e_flags;
2362 strcat (buf, ", BE8");
2366 strcat (buf, ", LE8");
2377 case EF_ARM_EABI_VER5:
2378 strcat (buf, ", Version5 EABI");
2383 /* Process flags one bit at a time. */
2384 flag = e_flags & - e_flags;
2390 strcat (buf, ", BE8");
2394 strcat (buf, ", LE8");
2397 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2398 strcat (buf, ", soft-float ABI");
2401 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2402 strcat (buf, ", hard-float ABI");
2412 case EF_ARM_EABI_UNKNOWN:
2413 strcat (buf, ", GNU EABI");
2418 /* Process flags one bit at a time. */
2419 flag = e_flags & - e_flags;
2424 case EF_ARM_INTERWORK:
2425 strcat (buf, ", interworking enabled");
2428 case EF_ARM_APCS_26:
2429 strcat (buf, ", uses APCS/26");
2432 case EF_ARM_APCS_FLOAT:
2433 strcat (buf, ", uses APCS/float");
2437 strcat (buf, ", position independent");
2441 strcat (buf, ", 8 bit structure alignment");
2444 case EF_ARM_NEW_ABI:
2445 strcat (buf, ", uses new ABI");
2448 case EF_ARM_OLD_ABI:
2449 strcat (buf, ", uses old ABI");
2452 case EF_ARM_SOFT_FLOAT:
2453 strcat (buf, ", software FP");
2456 case EF_ARM_VFP_FLOAT:
2457 strcat (buf, ", VFP");
2460 case EF_ARM_MAVERICK_FLOAT:
2461 strcat (buf, ", Maverick FP");
2472 strcat (buf,_(", <unknown>"));
2476 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2478 --size; /* Leave space for null terminator. */
2480 switch (e_flags & EF_AVR_MACH)
2482 case E_AVR_MACH_AVR1:
2483 strncat (buf, ", avr:1", size);
2485 case E_AVR_MACH_AVR2:
2486 strncat (buf, ", avr:2", size);
2488 case E_AVR_MACH_AVR25:
2489 strncat (buf, ", avr:25", size);
2491 case E_AVR_MACH_AVR3:
2492 strncat (buf, ", avr:3", size);
2494 case E_AVR_MACH_AVR31:
2495 strncat (buf, ", avr:31", size);
2497 case E_AVR_MACH_AVR35:
2498 strncat (buf, ", avr:35", size);
2500 case E_AVR_MACH_AVR4:
2501 strncat (buf, ", avr:4", size);
2503 case E_AVR_MACH_AVR5:
2504 strncat (buf, ", avr:5", size);
2506 case E_AVR_MACH_AVR51:
2507 strncat (buf, ", avr:51", size);
2509 case E_AVR_MACH_AVR6:
2510 strncat (buf, ", avr:6", size);
2512 case E_AVR_MACH_AVRTINY:
2513 strncat (buf, ", avr:100", size);
2515 case E_AVR_MACH_XMEGA1:
2516 strncat (buf, ", avr:101", size);
2518 case E_AVR_MACH_XMEGA2:
2519 strncat (buf, ", avr:102", size);
2521 case E_AVR_MACH_XMEGA3:
2522 strncat (buf, ", avr:103", size);
2524 case E_AVR_MACH_XMEGA4:
2525 strncat (buf, ", avr:104", size);
2527 case E_AVR_MACH_XMEGA5:
2528 strncat (buf, ", avr:105", size);
2530 case E_AVR_MACH_XMEGA6:
2531 strncat (buf, ", avr:106", size);
2533 case E_AVR_MACH_XMEGA7:
2534 strncat (buf, ", avr:107", size);
2537 strncat (buf, ", avr:<unknown>", size);
2541 size -= strlen (buf);
2542 if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2543 strncat (buf, ", link-relax", size);
2547 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2556 static const char *ABI_STRINGS[] =
2558 "ABI v0", /* use r5 as return register; only used in N1213HC */
2559 "ABI v1", /* use r0 as return register */
2560 "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2561 "ABI v2fp", /* for FPU */
2565 static const char *VER_STRINGS[] =
2567 "Andes ELF V1.3 or older",
2571 static const char *ARCH_STRINGS[] =
2580 abi = EF_NDS_ABI & e_flags;
2581 arch = EF_NDS_ARCH & e_flags;
2582 config = EF_NDS_INST & e_flags;
2583 version = EF_NDS32_ELF_VERSION & e_flags;
2585 memset (buf, 0, size);
2592 case E_NDS_ABI_V2FP:
2593 case E_NDS_ABI_AABI:
2594 case E_NDS_ABI_V2FP_PLUS:
2595 /* In case there are holes in the array. */
2596 r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2600 r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2606 case E_NDS32_ELF_VER_1_2:
2607 case E_NDS32_ELF_VER_1_3:
2608 case E_NDS32_ELF_VER_1_4:
2609 r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2613 r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2617 if (E_NDS_ABI_V0 == abi)
2619 /* OLD ABI; only used in N1213HC, has performance extension 1. */
2620 r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2621 if (arch == E_NDS_ARCH_STAR_V1_0)
2622 r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2628 case E_NDS_ARCH_STAR_V1_0:
2629 case E_NDS_ARCH_STAR_V2_0:
2630 case E_NDS_ARCH_STAR_V3_0:
2631 case E_NDS_ARCH_STAR_V3_M:
2632 r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2636 r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2637 /* ARCH version determines how the e_flags are interpreted.
2638 If it is unknown, we cannot proceed. */
2642 /* Newer ABI; Now handle architecture specific flags. */
2643 if (arch == E_NDS_ARCH_STAR_V1_0)
2645 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2646 r += snprintf (buf + r, size -r, ", MFUSR_PC");
2648 if (!(config & E_NDS32_HAS_NO_MAC_INST))
2649 r += snprintf (buf + r, size -r, ", MAC");
2651 if (config & E_NDS32_HAS_DIV_INST)
2652 r += snprintf (buf + r, size -r, ", DIV");
2654 if (config & E_NDS32_HAS_16BIT_INST)
2655 r += snprintf (buf + r, size -r, ", 16b");
2659 if (config & E_NDS32_HAS_MFUSR_PC_INST)
2661 if (version <= E_NDS32_ELF_VER_1_3)
2662 r += snprintf (buf + r, size -r, ", [B8]");
2664 r += snprintf (buf + r, size -r, ", EX9");
2667 if (config & E_NDS32_HAS_MAC_DX_INST)
2668 r += snprintf (buf + r, size -r, ", MAC_DX");
2670 if (config & E_NDS32_HAS_DIV_DX_INST)
2671 r += snprintf (buf + r, size -r, ", DIV_DX");
2673 if (config & E_NDS32_HAS_16BIT_INST)
2675 if (version <= E_NDS32_ELF_VER_1_3)
2676 r += snprintf (buf + r, size -r, ", 16b");
2678 r += snprintf (buf + r, size -r, ", IFC");
2682 if (config & E_NDS32_HAS_EXT_INST)
2683 r += snprintf (buf + r, size -r, ", PERF1");
2685 if (config & E_NDS32_HAS_EXT2_INST)
2686 r += snprintf (buf + r, size -r, ", PERF2");
2688 if (config & E_NDS32_HAS_FPU_INST)
2691 r += snprintf (buf + r, size -r, ", FPU_SP");
2694 if (config & E_NDS32_HAS_FPU_DP_INST)
2697 r += snprintf (buf + r, size -r, ", FPU_DP");
2700 if (config & E_NDS32_HAS_FPU_MAC_INST)
2703 r += snprintf (buf + r, size -r, ", FPU_MAC");
2708 switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2710 case E_NDS32_FPU_REG_8SP_4DP:
2711 r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2713 case E_NDS32_FPU_REG_16SP_8DP:
2714 r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2716 case E_NDS32_FPU_REG_32SP_16DP:
2717 r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2719 case E_NDS32_FPU_REG_32SP_32DP:
2720 r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2725 if (config & E_NDS32_HAS_AUDIO_INST)
2726 r += snprintf (buf + r, size -r, ", AUDIO");
2728 if (config & E_NDS32_HAS_STRING_INST)
2729 r += snprintf (buf + r, size -r, ", STR");
2731 if (config & E_NDS32_HAS_REDUCED_REGS)
2732 r += snprintf (buf + r, size -r, ", 16REG");
2734 if (config & E_NDS32_HAS_VIDEO_INST)
2736 if (version <= E_NDS32_ELF_VER_1_3)
2737 r += snprintf (buf + r, size -r, ", VIDEO");
2739 r += snprintf (buf + r, size -r, ", SATURATION");
2742 if (config & E_NDS32_HAS_ENCRIPT_INST)
2743 r += snprintf (buf + r, size -r, ", ENCRP");
2745 if (config & E_NDS32_HAS_L2C_INST)
2746 r += snprintf (buf + r, size -r, ", L2C");
2750 get_machine_flags (unsigned e_flags, unsigned e_machine)
2752 static char buf[1024];
2764 decode_ARM_machine_flags (e_flags, buf);
2768 decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2772 if (e_flags & EF_BFIN_PIC)
2773 strcat (buf, ", PIC");
2775 if (e_flags & EF_BFIN_FDPIC)
2776 strcat (buf, ", FDPIC");
2778 if (e_flags & EF_BFIN_CODE_IN_L1)
2779 strcat (buf, ", code in L1");
2781 if (e_flags & EF_BFIN_DATA_IN_L1)
2782 strcat (buf, ", data in L1");
2787 switch (e_flags & EF_FRV_CPU_MASK)
2789 case EF_FRV_CPU_GENERIC:
2793 strcat (buf, ", fr???");
2796 case EF_FRV_CPU_FR300:
2797 strcat (buf, ", fr300");
2800 case EF_FRV_CPU_FR400:
2801 strcat (buf, ", fr400");
2803 case EF_FRV_CPU_FR405:
2804 strcat (buf, ", fr405");
2807 case EF_FRV_CPU_FR450:
2808 strcat (buf, ", fr450");
2811 case EF_FRV_CPU_FR500:
2812 strcat (buf, ", fr500");
2814 case EF_FRV_CPU_FR550:
2815 strcat (buf, ", fr550");
2818 case EF_FRV_CPU_SIMPLE:
2819 strcat (buf, ", simple");
2821 case EF_FRV_CPU_TOMCAT:
2822 strcat (buf, ", tomcat");
2828 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2829 strcat (buf, ", m68000");
2830 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2831 strcat (buf, ", cpu32");
2832 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2833 strcat (buf, ", fido_a");
2836 char const * isa = _("unknown");
2837 char const * mac = _("unknown mac");
2838 char const * additional = NULL;
2840 switch (e_flags & EF_M68K_CF_ISA_MASK)
2842 case EF_M68K_CF_ISA_A_NODIV:
2844 additional = ", nodiv";
2846 case EF_M68K_CF_ISA_A:
2849 case EF_M68K_CF_ISA_A_PLUS:
2852 case EF_M68K_CF_ISA_B_NOUSP:
2854 additional = ", nousp";
2856 case EF_M68K_CF_ISA_B:
2859 case EF_M68K_CF_ISA_C:
2862 case EF_M68K_CF_ISA_C_NODIV:
2864 additional = ", nodiv";
2867 strcat (buf, ", cf, isa ");
2870 strcat (buf, additional);
2871 if (e_flags & EF_M68K_CF_FLOAT)
2872 strcat (buf, ", float");
2873 switch (e_flags & EF_M68K_CF_MAC_MASK)
2878 case EF_M68K_CF_MAC:
2881 case EF_M68K_CF_EMAC:
2884 case EF_M68K_CF_EMAC_B:
2897 switch (e_flags & EF_MEP_CPU_MASK)
2899 case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
2900 case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
2901 case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
2902 case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
2903 case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
2904 case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
2905 default: strcat (buf, _(", <unknown MeP cpu type>")); break;
2908 switch (e_flags & EF_MEP_COP_MASK)
2910 case EF_MEP_COP_NONE: break;
2911 case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
2912 case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
2913 case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
2914 case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
2915 default: strcat (buf, _("<unknown MeP copro type>")); break;
2918 if (e_flags & EF_MEP_LIBRARY)
2919 strcat (buf, ", Built for Library");
2921 if (e_flags & EF_MEP_INDEX_MASK)
2922 sprintf (buf + strlen (buf), ", Configuration Index: %#x",
2923 e_flags & EF_MEP_INDEX_MASK);
2925 if (e_flags & ~ EF_MEP_ALL_FLAGS)
2926 sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
2927 e_flags & ~ EF_MEP_ALL_FLAGS);
2931 if (e_flags & EF_PPC_EMB)
2932 strcat (buf, ", emb");
2934 if (e_flags & EF_PPC_RELOCATABLE)
2935 strcat (buf, _(", relocatable"));
2937 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2938 strcat (buf, _(", relocatable-lib"));
2942 if (e_flags & EF_PPC64_ABI)
2944 char abi[] = ", abiv0";
2946 abi[6] += e_flags & EF_PPC64_ABI;
2952 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2953 strcat (buf, ", RH850 ABI");
2955 if (e_flags & EF_V800_850E3)
2956 strcat (buf, ", V3 architecture");
2958 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2959 strcat (buf, ", FPU not used");
2961 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2962 strcat (buf, ", regmode: COMMON");
2964 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2965 strcat (buf, ", r4 not used");
2967 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2968 strcat (buf, ", r30 not used");
2970 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2971 strcat (buf, ", r5 not used");
2973 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2974 strcat (buf, ", r2 not used");
2976 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2978 switch (e_flags & - e_flags)
2980 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2981 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2982 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2983 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2984 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2985 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2986 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2987 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2988 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2989 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2990 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2991 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2998 case EM_CYGNUS_V850:
2999 switch (e_flags & EF_V850_ARCH)
3001 case E_V850E3V5_ARCH:
3002 strcat (buf, ", v850e3v5");
3004 case E_V850E2V3_ARCH:
3005 strcat (buf, ", v850e2v3");
3008 strcat (buf, ", v850e2");
3011 strcat (buf, ", v850e1");
3014 strcat (buf, ", v850e");
3017 strcat (buf, ", v850");
3020 strcat (buf, _(", unknown v850 architecture variant"));
3026 case EM_CYGNUS_M32R:
3027 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3028 strcat (buf, ", m32r");
3032 case EM_MIPS_RS3_LE:
3033 if (e_flags & EF_MIPS_NOREORDER)
3034 strcat (buf, ", noreorder");
3036 if (e_flags & EF_MIPS_PIC)
3037 strcat (buf, ", pic");
3039 if (e_flags & EF_MIPS_CPIC)
3040 strcat (buf, ", cpic");
3042 if (e_flags & EF_MIPS_UCODE)
3043 strcat (buf, ", ugen_reserved");
3045 if (e_flags & EF_MIPS_ABI2)
3046 strcat (buf, ", abi2");
3048 if (e_flags & EF_MIPS_OPTIONS_FIRST)
3049 strcat (buf, ", odk first");
3051 if (e_flags & EF_MIPS_32BITMODE)
3052 strcat (buf, ", 32bitmode");
3054 if (e_flags & EF_MIPS_NAN2008)
3055 strcat (buf, ", nan2008");
3057 if (e_flags & EF_MIPS_FP64)
3058 strcat (buf, ", fp64");
3060 switch ((e_flags & EF_MIPS_MACH))
3062 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3063 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3064 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3065 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3066 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3067 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3068 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3069 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3070 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
3071 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3072 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3073 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3074 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3075 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3076 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3077 case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3078 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
3080 /* We simply ignore the field in this case to avoid confusion:
3081 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3084 default: strcat (buf, _(", unknown CPU")); break;
3087 switch ((e_flags & EF_MIPS_ABI))
3089 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3090 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3091 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3092 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3094 /* We simply ignore the field in this case to avoid confusion:
3095 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3096 This means it is likely to be an o32 file, but not for
3099 default: strcat (buf, _(", unknown ABI")); break;
3102 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3103 strcat (buf, ", mdmx");
3105 if (e_flags & EF_MIPS_ARCH_ASE_M16)
3106 strcat (buf, ", mips16");
3108 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3109 strcat (buf, ", micromips");
3111 switch ((e_flags & EF_MIPS_ARCH))
3113 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3114 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3115 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3116 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3117 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3118 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3119 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3120 case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3121 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3122 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3123 case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3124 default: strcat (buf, _(", unknown ISA")); break;
3129 decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3133 switch ((e_flags & EF_SH_MACH_MASK))
3135 case EF_SH1: strcat (buf, ", sh1"); break;
3136 case EF_SH2: strcat (buf, ", sh2"); break;
3137 case EF_SH3: strcat (buf, ", sh3"); break;
3138 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3139 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3140 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3141 case EF_SH3E: strcat (buf, ", sh3e"); break;
3142 case EF_SH4: strcat (buf, ", sh4"); break;
3143 case EF_SH5: strcat (buf, ", sh5"); break;
3144 case EF_SH2E: strcat (buf, ", sh2e"); break;
3145 case EF_SH4A: strcat (buf, ", sh4a"); break;
3146 case EF_SH2A: strcat (buf, ", sh2a"); break;
3147 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3148 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3149 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3150 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3151 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3152 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3153 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3154 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3155 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3156 default: strcat (buf, _(", unknown ISA")); break;
3159 if (e_flags & EF_SH_PIC)
3160 strcat (buf, ", pic");
3162 if (e_flags & EF_SH_FDPIC)
3163 strcat (buf, ", fdpic");
3167 if (e_flags & EF_OR1K_NODELAY)
3168 strcat (buf, ", no delay");
3172 if (e_flags & EF_SPARC_32PLUS)
3173 strcat (buf, ", v8+");
3175 if (e_flags & EF_SPARC_SUN_US1)
3176 strcat (buf, ", ultrasparcI");
3178 if (e_flags & EF_SPARC_SUN_US3)
3179 strcat (buf, ", ultrasparcIII");
3181 if (e_flags & EF_SPARC_HAL_R1)
3182 strcat (buf, ", halr1");
3184 if (e_flags & EF_SPARC_LEDATA)
3185 strcat (buf, ", ledata");
3187 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3188 strcat (buf, ", tso");
3190 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3191 strcat (buf, ", pso");
3193 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3194 strcat (buf, ", rmo");
3198 switch (e_flags & EF_PARISC_ARCH)
3200 case EFA_PARISC_1_0:
3201 strcpy (buf, ", PA-RISC 1.0");
3203 case EFA_PARISC_1_1:
3204 strcpy (buf, ", PA-RISC 1.1");
3206 case EFA_PARISC_2_0:
3207 strcpy (buf, ", PA-RISC 2.0");
3212 if (e_flags & EF_PARISC_TRAPNIL)
3213 strcat (buf, ", trapnil");
3214 if (e_flags & EF_PARISC_EXT)
3215 strcat (buf, ", ext");
3216 if (e_flags & EF_PARISC_LSB)
3217 strcat (buf, ", lsb");
3218 if (e_flags & EF_PARISC_WIDE)
3219 strcat (buf, ", wide");
3220 if (e_flags & EF_PARISC_NO_KABP)
3221 strcat (buf, ", no kabp");
3222 if (e_flags & EF_PARISC_LAZYSWAP)
3223 strcat (buf, ", lazyswap");
3228 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3229 strcat (buf, ", new calling convention");
3231 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3232 strcat (buf, ", gnu calling convention");
3236 if ((e_flags & EF_IA_64_ABI64))
3237 strcat (buf, ", 64-bit");
3239 strcat (buf, ", 32-bit");
3240 if ((e_flags & EF_IA_64_REDUCEDFP))
3241 strcat (buf, ", reduced fp model");
3242 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3243 strcat (buf, ", no function descriptors, constant gp");
3244 else if ((e_flags & EF_IA_64_CONS_GP))
3245 strcat (buf, ", constant gp");
3246 if ((e_flags & EF_IA_64_ABSOLUTE))
3247 strcat (buf, ", absolute");
3248 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3250 if ((e_flags & EF_IA_64_VMS_LINKAGES))
3251 strcat (buf, ", vms_linkages");
3252 switch ((e_flags & EF_IA_64_VMS_COMCOD))
3254 case EF_IA_64_VMS_COMCOD_SUCCESS:
3256 case EF_IA_64_VMS_COMCOD_WARNING:
3257 strcat (buf, ", warning");
3259 case EF_IA_64_VMS_COMCOD_ERROR:
3260 strcat (buf, ", error");
3262 case EF_IA_64_VMS_COMCOD_ABORT:
3263 strcat (buf, ", abort");
3266 warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3267 e_flags & EF_IA_64_VMS_COMCOD);
3268 strcat (buf, ", <unknown>");
3274 if ((e_flags & EF_VAX_NONPIC))
3275 strcat (buf, ", non-PIC");
3276 if ((e_flags & EF_VAX_DFLOAT))
3277 strcat (buf, ", D-Float");
3278 if ((e_flags & EF_VAX_GFLOAT))
3279 strcat (buf, ", G-Float");
3283 if (e_flags & EF_VISIUM_ARCH_MCM)
3284 strcat (buf, ", mcm");
3285 else if (e_flags & EF_VISIUM_ARCH_MCM24)
3286 strcat (buf, ", mcm24");
3287 if (e_flags & EF_VISIUM_ARCH_GR6)
3288 strcat (buf, ", gr6");
3292 switch (e_flags & E_FLAG_RL78_CPU_MASK)
3294 case E_FLAG_RL78_ANY_CPU: break;
3295 case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3296 case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3297 case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3299 if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3300 strcat (buf, ", 64-bit doubles");
3304 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3305 strcat (buf, ", 64-bit doubles");
3306 if (e_flags & E_FLAG_RX_DSP)
3307 strcat (buf, ", dsp");
3308 if (e_flags & E_FLAG_RX_PID)
3309 strcat (buf, ", pid");
3310 if (e_flags & E_FLAG_RX_ABI)
3311 strcat (buf, ", RX ABI");
3312 if (e_flags & E_FLAG_RX_SINSNS_SET)
3313 strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3314 ? ", uses String instructions" : ", bans String instructions");
3318 if (e_flags & EF_S390_HIGH_GPRS)
3319 strcat (buf, ", highgprs");
3323 if ((e_flags & EF_C6000_REL))
3324 strcat (buf, ", relocatable module");
3328 strcat (buf, _(": architecture variant: "));
3329 switch (e_flags & EF_MSP430_MACH)
3331 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3332 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3333 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3334 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3335 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3336 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3337 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3338 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3339 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3340 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3341 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3342 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3343 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3344 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3345 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
3347 strcat (buf, _(": unknown")); break;
3350 if (e_flags & ~ EF_MSP430_MACH)
3351 strcat (buf, _(": unknown extra flag bits also present"));
3359 get_osabi_name (unsigned int osabi)
3361 static char buff[32];
3365 case ELFOSABI_NONE: return "UNIX - System V";
3366 case ELFOSABI_HPUX: return "UNIX - HP-UX";
3367 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
3368 case ELFOSABI_GNU: return "UNIX - GNU";
3369 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
3370 case ELFOSABI_AIX: return "UNIX - AIX";
3371 case ELFOSABI_IRIX: return "UNIX - IRIX";
3372 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
3373 case ELFOSABI_TRU64: return "UNIX - TRU64";
3374 case ELFOSABI_MODESTO: return "Novell - Modesto";
3375 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
3376 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
3377 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
3378 case ELFOSABI_AROS: return "AROS";
3379 case ELFOSABI_FENIXOS: return "FenixOS";
3382 switch (elf_header.e_machine)
3387 case ELFOSABI_ARM: return "ARM";
3398 case ELFOSABI_STANDALONE: return _("Standalone App");
3407 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
3408 case ELFOSABI_C6000_LINUX: return "Linux C6000";
3417 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3423 get_aarch64_segment_type (unsigned long type)
3427 case PT_AARCH64_ARCHEXT:
3428 return "AARCH64_ARCHEXT";
3437 get_arm_segment_type (unsigned long type)
3451 get_mips_segment_type (unsigned long type)
3455 case PT_MIPS_REGINFO:
3457 case PT_MIPS_RTPROC:
3459 case PT_MIPS_OPTIONS:
3461 case PT_MIPS_ABIFLAGS:
3471 get_parisc_segment_type (unsigned long type)
3475 case PT_HP_TLS: return "HP_TLS";
3476 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
3477 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
3478 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
3479 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
3480 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
3481 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3482 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
3483 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
3484 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
3485 case PT_HP_PARALLEL: return "HP_PARALLEL";
3486 case PT_HP_FASTBIND: return "HP_FASTBIND";
3487 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
3488 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
3489 case PT_HP_STACK: return "HP_STACK";
3490 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
3491 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
3492 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
3493 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
3502 get_ia64_segment_type (unsigned long type)
3506 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
3507 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
3508 case PT_HP_TLS: return "HP_TLS";
3509 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3510 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3511 case PT_IA_64_HP_STACK: return "HP_STACK";
3520 get_tic6x_segment_type (unsigned long type)
3524 case PT_C6000_PHATTR: return "C6000_PHATTR";
3533 get_segment_type (unsigned long p_type)
3535 static char buff[32];
3539 case PT_NULL: return "NULL";
3540 case PT_LOAD: return "LOAD";
3541 case PT_DYNAMIC: return "DYNAMIC";
3542 case PT_INTERP: return "INTERP";
3543 case PT_NOTE: return "NOTE";
3544 case PT_SHLIB: return "SHLIB";
3545 case PT_PHDR: return "PHDR";
3546 case PT_TLS: return "TLS";
3548 case PT_GNU_EH_FRAME:
3549 return "GNU_EH_FRAME";
3550 case PT_GNU_STACK: return "GNU_STACK";
3551 case PT_GNU_RELRO: return "GNU_RELRO";
3554 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3556 const char * result;
3558 switch (elf_header.e_machine)
3561 result = get_aarch64_segment_type (p_type);
3564 result = get_arm_segment_type (p_type);
3567 case EM_MIPS_RS3_LE:
3568 result = get_mips_segment_type (p_type);
3571 result = get_parisc_segment_type (p_type);
3574 result = get_ia64_segment_type (p_type);
3577 result = get_tic6x_segment_type (p_type);
3587 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3589 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3591 const char * result;
3593 switch (elf_header.e_machine)
3596 result = get_parisc_segment_type (p_type);
3599 result = get_ia64_segment_type (p_type);
3609 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3612 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3619 get_mips_section_type_name (unsigned int sh_type)
3623 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3624 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3625 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3626 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3627 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3628 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3629 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3630 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3631 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3632 case SHT_MIPS_RELD: return "MIPS_RELD";
3633 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3634 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3635 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3636 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3637 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3638 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3639 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3640 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3641 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3642 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3643 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3644 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3645 case SHT_MIPS_LINE: return "MIPS_LINE";
3646 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3647 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3648 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3649 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3650 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3651 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3652 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3653 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3654 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3655 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3656 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3657 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3658 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3659 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3660 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3661 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3662 case SHT_MIPS_ABIFLAGS: return "MIPS_ABIFLAGS";
3670 get_parisc_section_type_name (unsigned int sh_type)
3674 case SHT_PARISC_EXT: return "PARISC_EXT";
3675 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3676 case SHT_PARISC_DOC: return "PARISC_DOC";
3677 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3678 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3679 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3680 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3688 get_ia64_section_type_name (unsigned int sh_type)
3690 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3691 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3692 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3696 case SHT_IA_64_EXT: return "IA_64_EXT";
3697 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3698 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3699 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3700 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3701 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3702 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3703 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3704 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3705 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3713 get_x86_64_section_type_name (unsigned int sh_type)
3717 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3725 get_aarch64_section_type_name (unsigned int sh_type)
3729 case SHT_AARCH64_ATTRIBUTES:
3730 return "AARCH64_ATTRIBUTES";
3738 get_arm_section_type_name (unsigned int sh_type)
3742 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3743 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3744 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3745 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3746 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3754 get_tic6x_section_type_name (unsigned int sh_type)
3758 case SHT_C6000_UNWIND:
3759 return "C6000_UNWIND";
3760 case SHT_C6000_PREEMPTMAP:
3761 return "C6000_PREEMPTMAP";
3762 case SHT_C6000_ATTRIBUTES:
3763 return "C6000_ATTRIBUTES";
3768 case SHT_TI_HANDLER:
3769 return "TI_HANDLER";
3770 case SHT_TI_INITINFO:
3771 return "TI_INITINFO";
3772 case SHT_TI_PHATTRS:
3773 return "TI_PHATTRS";
3781 get_msp430x_section_type_name (unsigned int sh_type)
3785 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3786 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3787 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3788 default: return NULL;
3793 get_v850_section_type_name (unsigned int sh_type)
3797 case SHT_V850_SCOMMON: return "V850 Small Common";
3798 case SHT_V850_TCOMMON: return "V850 Tiny Common";
3799 case SHT_V850_ZCOMMON: return "V850 Zero Common";
3800 case SHT_RENESAS_IOP: return "RENESAS IOP";
3801 case SHT_RENESAS_INFO: return "RENESAS INFO";
3802 default: return NULL;
3807 get_section_type_name (unsigned int sh_type)
3809 static char buff[32];
3813 case SHT_NULL: return "NULL";
3814 case SHT_PROGBITS: return "PROGBITS";
3815 case SHT_SYMTAB: return "SYMTAB";
3816 case SHT_STRTAB: return "STRTAB";
3817 case SHT_RELA: return "RELA";
3818 case SHT_HASH: return "HASH";
3819 case SHT_DYNAMIC: return "DYNAMIC";
3820 case SHT_NOTE: return "NOTE";
3821 case SHT_NOBITS: return "NOBITS";
3822 case SHT_REL: return "REL";
3823 case SHT_SHLIB: return "SHLIB";
3824 case SHT_DYNSYM: return "DYNSYM";
3825 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3826 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3827 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3828 case SHT_GNU_HASH: return "GNU_HASH";
3829 case SHT_GROUP: return "GROUP";
3830 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3831 case SHT_GNU_verdef: return "VERDEF";
3832 case SHT_GNU_verneed: return "VERNEED";
3833 case SHT_GNU_versym: return "VERSYM";
3834 case 0x6ffffff0: return "VERSYM";
3835 case 0x6ffffffc: return "VERDEF";
3836 case 0x7ffffffd: return "AUXILIARY";
3837 case 0x7fffffff: return "FILTER";
3838 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3841 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3843 const char * result;
3845 switch (elf_header.e_machine)
3848 case EM_MIPS_RS3_LE:
3849 result = get_mips_section_type_name (sh_type);
3852 result = get_parisc_section_type_name (sh_type);
3855 result = get_ia64_section_type_name (sh_type);
3860 result = get_x86_64_section_type_name (sh_type);
3863 result = get_aarch64_section_type_name (sh_type);
3866 result = get_arm_section_type_name (sh_type);
3869 result = get_tic6x_section_type_name (sh_type);
3872 result = get_msp430x_section_type_name (sh_type);
3876 case EM_CYGNUS_V850:
3877 result = get_v850_section_type_name (sh_type);
3887 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3889 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3891 const char * result;
3893 switch (elf_header.e_machine)
3896 result = get_ia64_section_type_name (sh_type);
3906 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3908 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3910 switch (elf_header.e_machine)
3914 case EM_CYGNUS_V850:
3915 return get_v850_section_type_name (sh_type);
3920 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3923 /* This message is probably going to be displayed in a 15
3924 character wide field, so put the hex value first. */
3925 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3931 #define OPTION_DEBUG_DUMP 512
3932 #define OPTION_DYN_SYMS 513
3933 #define OPTION_DWARF_DEPTH 514
3934 #define OPTION_DWARF_START 515
3935 #define OPTION_DWARF_CHECK 516
3937 static struct option options[] =
3939 {"all", no_argument, 0, 'a'},
3940 {"file-header", no_argument, 0, 'h'},
3941 {"program-headers", no_argument, 0, 'l'},
3942 {"headers", no_argument, 0, 'e'},
3943 {"histogram", no_argument, 0, 'I'},
3944 {"segments", no_argument, 0, 'l'},
3945 {"sections", no_argument, 0, 'S'},
3946 {"section-headers", no_argument, 0, 'S'},
3947 {"section-groups", no_argument, 0, 'g'},
3948 {"section-details", no_argument, 0, 't'},
3949 {"full-section-name",no_argument, 0, 'N'},
3950 {"symbols", no_argument, 0, 's'},
3951 {"syms", no_argument, 0, 's'},
3952 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3953 {"relocs", no_argument, 0, 'r'},
3954 {"notes", no_argument, 0, 'n'},
3955 {"dynamic", no_argument, 0, 'd'},
3956 {"arch-specific", no_argument, 0, 'A'},
3957 {"version-info", no_argument, 0, 'V'},
3958 {"use-dynamic", no_argument, 0, 'D'},
3959 {"unwind", no_argument, 0, 'u'},
3960 {"archive-index", no_argument, 0, 'c'},
3961 {"hex-dump", required_argument, 0, 'x'},
3962 {"relocated-dump", required_argument, 0, 'R'},
3963 {"string-dump", required_argument, 0, 'p'},
3964 {"decompress", no_argument, 0, 'z'},
3965 #ifdef SUPPORT_DISASSEMBLY
3966 {"instruction-dump", required_argument, 0, 'i'},
3968 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3970 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3971 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3972 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3974 {"version", no_argument, 0, 'v'},
3975 {"wide", no_argument, 0, 'W'},
3976 {"help", no_argument, 0, 'H'},
3977 {0, no_argument, 0, 0}
3981 usage (FILE * stream)
3983 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3984 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3985 fprintf (stream, _(" Options are:\n\
3986 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3987 -h --file-header Display the ELF file header\n\
3988 -l --program-headers Display the program headers\n\
3989 --segments An alias for --program-headers\n\
3990 -S --section-headers Display the sections' header\n\
3991 --sections An alias for --section-headers\n\
3992 -g --section-groups Display the section groups\n\
3993 -t --section-details Display the section details\n\
3994 -e --headers Equivalent to: -h -l -S\n\
3995 -s --syms Display the symbol table\n\
3996 --symbols An alias for --syms\n\
3997 --dyn-syms Display the dynamic symbol table\n\
3998 -n --notes Display the core notes (if present)\n\
3999 -r --relocs Display the relocations (if present)\n\
4000 -u --unwind Display the unwind info (if present)\n\
4001 -d --dynamic Display the dynamic section (if present)\n\
4002 -V --version-info Display the version sections (if present)\n\
4003 -A --arch-specific Display architecture specific information (if any)\n\
4004 -c --archive-index Display the symbol/file index in an archive\n\
4005 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
4006 -x --hex-dump=<number|name>\n\
4007 Dump the contents of section <number|name> as bytes\n\
4008 -p --string-dump=<number|name>\n\
4009 Dump the contents of section <number|name> as strings\n\
4010 -R --relocated-dump=<number|name>\n\
4011 Dump the contents of section <number|name> as relocated bytes\n\
4012 -z --decompress Decompress section before dumping it\n\
4013 -w[lLiaprmfFsoRt] or\n\
4014 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4015 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4016 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4018 Display the contents of DWARF2 debug sections\n"));
4019 fprintf (stream, _("\
4020 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
4021 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
4023 #ifdef SUPPORT_DISASSEMBLY
4024 fprintf (stream, _("\
4025 -i --instruction-dump=<number|name>\n\
4026 Disassemble the contents of section <number|name>\n"));
4028 fprintf (stream, _("\
4029 -I --histogram Display histogram of bucket list lengths\n\
4030 -W --wide Allow output width to exceed 80 characters\n\
4031 @<file> Read options from <file>\n\
4032 -H --help Display this information\n\
4033 -v --version Display the version number of readelf\n"));
4035 if (REPORT_BUGS_TO[0] && stream == stdout)
4036 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4038 exit (stream == stdout ? 0 : 1);
4041 /* Record the fact that the user wants the contents of section number
4042 SECTION to be displayed using the method(s) encoded as flags bits
4043 in TYPE. Note, TYPE can be zero if we are creating the array for
4047 request_dump_bynumber (unsigned int section, dump_type type)
4049 if (section >= num_dump_sects)
4051 dump_type * new_dump_sects;
4053 new_dump_sects = (dump_type *) calloc (section + 1,
4054 sizeof (* dump_sects));
4056 if (new_dump_sects == NULL)
4057 error (_("Out of memory allocating dump request table.\n"));
4060 /* Copy current flag settings. */
4061 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4065 dump_sects = new_dump_sects;
4066 num_dump_sects = section + 1;
4071 dump_sects[section] |= type;
4076 /* Request a dump by section name. */
4079 request_dump_byname (const char * section, dump_type type)
4081 struct dump_list_entry * new_request;
4083 new_request = (struct dump_list_entry *)
4084 malloc (sizeof (struct dump_list_entry));
4086 error (_("Out of memory allocating dump request table.\n"));
4088 new_request->name = strdup (section);
4089 if (!new_request->name)
4090 error (_("Out of memory allocating dump request table.\n"));
4092 new_request->type = type;
4094 new_request->next = dump_sects_byname;
4095 dump_sects_byname = new_request;
4099 request_dump (dump_type type)
4105 section = strtoul (optarg, & cp, 0);
4107 if (! *cp && section >= 0)
4108 request_dump_bynumber (section, type);
4110 request_dump_byname (optarg, type);
4115 parse_args (int argc, char ** argv)
4122 while ((c = getopt_long
4123 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4141 do_section_groups++;
4149 do_section_groups++;
4154 do_section_details++;
4198 request_dump (HEX_DUMP);
4201 request_dump (STRING_DUMP);
4204 request_dump (RELOC_DUMP);
4214 dwarf_select_sections_all ();
4219 dwarf_select_sections_by_letters (optarg);
4222 case OPTION_DEBUG_DUMP:
4229 dwarf_select_sections_by_names (optarg);
4232 case OPTION_DWARF_DEPTH:
4236 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4239 case OPTION_DWARF_START:
4243 dwarf_start_die = strtoul (optarg, & cp, 0);
4246 case OPTION_DWARF_CHECK:
4249 case OPTION_DYN_SYMS:
4252 #ifdef SUPPORT_DISASSEMBLY
4254 request_dump (DISASS_DUMP);
4258 print_version (program_name);
4267 /* xgettext:c-format */
4268 error (_("Invalid option '-%c'\n"), c);
4275 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4276 && !do_segments && !do_header && !do_dump && !do_version
4277 && !do_histogram && !do_debugging && !do_arch && !do_notes
4278 && !do_section_groups && !do_archive_index
4284 get_elf_class (unsigned int elf_class)
4286 static char buff[32];
4290 case ELFCLASSNONE: return _("none");
4291 case ELFCLASS32: return "ELF32";
4292 case ELFCLASS64: return "ELF64";
4294 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4300 get_data_encoding (unsigned int encoding)
4302 static char buff[32];
4306 case ELFDATANONE: return _("none");
4307 case ELFDATA2LSB: return _("2's complement, little endian");
4308 case ELFDATA2MSB: return _("2's complement, big endian");
4310 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4315 /* Decode the data held in 'elf_header'. */
4318 process_file_header (void)
4320 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
4321 || elf_header.e_ident[EI_MAG1] != ELFMAG1
4322 || elf_header.e_ident[EI_MAG2] != ELFMAG2
4323 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4326 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4330 init_dwarf_regnames (elf_header.e_machine);
4336 printf (_("ELF Header:\n"));
4337 printf (_(" Magic: "));
4338 for (i = 0; i < EI_NIDENT; i++)
4339 printf ("%2.2x ", elf_header.e_ident[i]);
4341 printf (_(" Class: %s\n"),
4342 get_elf_class (elf_header.e_ident[EI_CLASS]));
4343 printf (_(" Data: %s\n"),
4344 get_data_encoding (elf_header.e_ident[EI_DATA]));
4345 printf (_(" Version: %d %s\n"),
4346 elf_header.e_ident[EI_VERSION],
4347 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4349 : (elf_header.e_ident[EI_VERSION] != EV_NONE
4350 ? _("<unknown: %lx>")
4352 printf (_(" OS/ABI: %s\n"),
4353 get_osabi_name (elf_header.e_ident[EI_OSABI]));
4354 printf (_(" ABI Version: %d\n"),
4355 elf_header.e_ident[EI_ABIVERSION]);
4356 printf (_(" Type: %s\n"),
4357 get_file_type (elf_header.e_type));
4358 printf (_(" Machine: %s\n"),
4359 get_machine_name (elf_header.e_machine));
4360 printf (_(" Version: 0x%lx\n"),
4361 (unsigned long) elf_header.e_version);
4363 printf (_(" Entry point address: "));
4364 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4365 printf (_("\n Start of program headers: "));
4366 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4367 printf (_(" (bytes into file)\n Start of section headers: "));
4368 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4369 printf (_(" (bytes into file)\n"));
4371 printf (_(" Flags: 0x%lx%s\n"),
4372 (unsigned long) elf_header.e_flags,
4373 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4374 printf (_(" Size of this header: %ld (bytes)\n"),
4375 (long) elf_header.e_ehsize);
4376 printf (_(" Size of program headers: %ld (bytes)\n"),
4377 (long) elf_header.e_phentsize);
4378 printf (_(" Number of program headers: %ld"),
4379 (long) elf_header.e_phnum);
4380 if (section_headers != NULL
4381 && elf_header.e_phnum == PN_XNUM
4382 && section_headers[0].sh_info != 0)
4383 printf (" (%ld)", (long) section_headers[0].sh_info);
4384 putc ('\n', stdout);
4385 printf (_(" Size of section headers: %ld (bytes)\n"),
4386 (long) elf_header.e_shentsize);
4387 printf (_(" Number of section headers: %ld"),
4388 (long) elf_header.e_shnum);
4389 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4390 printf (" (%ld)", (long) section_headers[0].sh_size);
4391 putc ('\n', stdout);
4392 printf (_(" Section header string table index: %ld"),
4393 (long) elf_header.e_shstrndx);
4394 if (section_headers != NULL
4395 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4396 printf (" (%u)", section_headers[0].sh_link);
4397 else if (elf_header.e_shstrndx != SHN_UNDEF
4398 && elf_header.e_shstrndx >= elf_header.e_shnum)
4399 printf (_(" <corrupt: out of range>"));
4400 putc ('\n', stdout);
4403 if (section_headers != NULL)
4405 if (elf_header.e_phnum == PN_XNUM
4406 && section_headers[0].sh_info != 0)
4407 elf_header.e_phnum = section_headers[0].sh_info;
4408 if (elf_header.e_shnum == SHN_UNDEF)
4409 elf_header.e_shnum = section_headers[0].sh_size;
4410 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4411 elf_header.e_shstrndx = section_headers[0].sh_link;
4412 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4413 elf_header.e_shstrndx = SHN_UNDEF;
4414 free (section_headers);
4415 section_headers = NULL;
4422 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4424 Elf32_External_Phdr * phdrs;
4425 Elf32_External_Phdr * external;
4426 Elf_Internal_Phdr * internal;
4428 unsigned int size = elf_header.e_phentsize;
4429 unsigned int num = elf_header.e_phnum;
4431 /* PR binutils/17531: Cope with unexpected section header sizes. */
4432 if (size == 0 || num == 0)
4434 if (size < sizeof * phdrs)
4436 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4439 if (size > sizeof * phdrs)
4440 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4442 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4443 size, num, _("program headers"));
4447 for (i = 0, internal = pheaders, external = phdrs;
4448 i < elf_header.e_phnum;
4449 i++, internal++, external++)
4451 internal->p_type = BYTE_GET (external->p_type);
4452 internal->p_offset = BYTE_GET (external->p_offset);
4453 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4454 internal->p_paddr = BYTE_GET (external->p_paddr);
4455 internal->p_filesz = BYTE_GET (external->p_filesz);
4456 internal->p_memsz = BYTE_GET (external->p_memsz);
4457 internal->p_flags = BYTE_GET (external->p_flags);
4458 internal->p_align = BYTE_GET (external->p_align);
4466 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4468 Elf64_External_Phdr * phdrs;
4469 Elf64_External_Phdr * external;
4470 Elf_Internal_Phdr * internal;
4472 unsigned int size = elf_header.e_phentsize;
4473 unsigned int num = elf_header.e_phnum;
4475 /* PR binutils/17531: Cope with unexpected section header sizes. */
4476 if (size == 0 || num == 0)
4478 if (size < sizeof * phdrs)
4480 error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4483 if (size > sizeof * phdrs)
4484 warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4486 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4487 size, num, _("program headers"));
4491 for (i = 0, internal = pheaders, external = phdrs;
4492 i < elf_header.e_phnum;
4493 i++, internal++, external++)
4495 internal->p_type = BYTE_GET (external->p_type);
4496 internal->p_flags = BYTE_GET (external->p_flags);
4497 internal->p_offset = BYTE_GET (external->p_offset);
4498 internal->p_vaddr = BYTE_GET (external->p_vaddr);
4499 internal->p_paddr = BYTE_GET (external->p_paddr);
4500 internal->p_filesz = BYTE_GET (external->p_filesz);
4501 internal->p_memsz = BYTE_GET (external->p_memsz);
4502 internal->p_align = BYTE_GET (external->p_align);
4509 /* Returns 1 if the program headers were read into `program_headers'. */
4512 get_program_headers (FILE * file)
4514 Elf_Internal_Phdr * phdrs;
4516 /* Check cache of prior read. */
4517 if (program_headers != NULL)
4520 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4521 sizeof (Elf_Internal_Phdr));
4525 error (_("Out of memory reading %u program headers\n"),
4526 elf_header.e_phnum);
4531 ? get_32bit_program_headers (file, phdrs)
4532 : get_64bit_program_headers (file, phdrs))
4534 program_headers = phdrs;
4542 /* Returns 1 if the program headers were loaded. */
4545 process_program_headers (FILE * file)
4547 Elf_Internal_Phdr * segment;
4550 if (elf_header.e_phnum == 0)
4552 /* PR binutils/12467. */
4553 if (elf_header.e_phoff != 0)
4554 warn (_("possibly corrupt ELF header - it has a non-zero program"
4555 " header offset, but no program headers\n"));
4556 else if (do_segments)
4557 printf (_("\nThere are no program headers in this file.\n"));
4561 if (do_segments && !do_header)
4563 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4564 printf (_("Entry point "));
4565 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4566 printf (_("\nThere are %d program headers, starting at offset "),
4567 elf_header.e_phnum);
4568 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4572 if (! get_program_headers (file))
4577 if (elf_header.e_phnum > 1)
4578 printf (_("\nProgram Headers:\n"));
4580 printf (_("\nProgram Headers:\n"));
4584 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4587 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4591 (_(" Type Offset VirtAddr PhysAddr\n"));
4593 (_(" FileSiz MemSiz Flags Align\n"));
4600 for (i = 0, segment = program_headers;
4601 i < elf_header.e_phnum;
4606 printf (" %-14.14s ", get_segment_type (segment->p_type));
4610 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4611 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4612 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4613 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4614 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4616 (segment->p_flags & PF_R ? 'R' : ' '),
4617 (segment->p_flags & PF_W ? 'W' : ' '),
4618 (segment->p_flags & PF_X ? 'E' : ' '));
4619 printf ("%#lx", (unsigned long) segment->p_align);
4623 if ((unsigned long) segment->p_offset == segment->p_offset)
4624 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4627 print_vma (segment->p_offset, FULL_HEX);
4631 print_vma (segment->p_vaddr, FULL_HEX);
4633 print_vma (segment->p_paddr, FULL_HEX);
4636 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4637 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4640 print_vma (segment->p_filesz, FULL_HEX);
4644 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4645 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4648 print_vma (segment->p_memsz, FULL_HEX);
4652 (segment->p_flags & PF_R ? 'R' : ' '),
4653 (segment->p_flags & PF_W ? 'W' : ' '),
4654 (segment->p_flags & PF_X ? 'E' : ' '));
4656 if ((unsigned long) segment->p_align == segment->p_align)
4657 printf ("%#lx", (unsigned long) segment->p_align);
4660 print_vma (segment->p_align, PREFIX_HEX);
4665 print_vma (segment->p_offset, FULL_HEX);
4667 print_vma (segment->p_vaddr, FULL_HEX);
4669 print_vma (segment->p_paddr, FULL_HEX);
4671 print_vma (segment->p_filesz, FULL_HEX);
4673 print_vma (segment->p_memsz, FULL_HEX);
4675 (segment->p_flags & PF_R ? 'R' : ' '),
4676 (segment->p_flags & PF_W ? 'W' : ' '),
4677 (segment->p_flags & PF_X ? 'E' : ' '));
4678 print_vma (segment->p_align, HEX);
4683 putc ('\n', stdout);
4685 switch (segment->p_type)
4689 error (_("more than one dynamic segment\n"));
4691 /* By default, assume that the .dynamic section is the first
4692 section in the DYNAMIC segment. */
4693 dynamic_addr = segment->p_offset;
4694 dynamic_size = segment->p_filesz;
4695 /* PR binutils/17512: Avoid corrupt dynamic section info in the segment. */
4696 if (dynamic_addr + dynamic_size >= current_file_size)
4698 error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4699 dynamic_addr = dynamic_size = 0;
4702 /* Try to locate the .dynamic section. If there is
4703 a section header table, we can easily locate it. */
4704 if (section_headers != NULL)
4706 Elf_Internal_Shdr * sec;
4708 sec = find_section (".dynamic");
4709 if (sec == NULL || sec->sh_size == 0)
4711 /* A corresponding .dynamic section is expected, but on
4712 IA-64/OpenVMS it is OK for it to be missing. */
4713 if (!is_ia64_vms ())
4714 error (_("no .dynamic section in the dynamic segment\n"));
4718 if (sec->sh_type == SHT_NOBITS)
4724 dynamic_addr = sec->sh_offset;
4725 dynamic_size = sec->sh_size;
4727 if (dynamic_addr < segment->p_offset
4728 || dynamic_addr > segment->p_offset + segment->p_filesz)
4729 warn (_("the .dynamic section is not contained"
4730 " within the dynamic segment\n"));
4731 else if (dynamic_addr > segment->p_offset)
4732 warn (_("the .dynamic section is not the first section"
4733 " in the dynamic segment.\n"));
4738 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4740 error (_("Unable to find program interpreter name\n"));
4744 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4746 if (ret >= (int) sizeof (fmt) || ret < 0)
4747 error (_("Internal error: failed to create format string to display program interpreter\n"));
4749 program_interpreter[0] = 0;
4750 if (fscanf (file, fmt, program_interpreter) <= 0)
4751 error (_("Unable to read program interpreter name\n"));
4754 printf (_(" [Requesting program interpreter: %s]\n"),
4755 program_interpreter);
4761 if (do_segments && section_headers != NULL && string_table != NULL)
4763 printf (_("\n Section to Segment mapping:\n"));
4764 printf (_(" Segment Sections...\n"));
4766 for (i = 0; i < elf_header.e_phnum; i++)
4769 Elf_Internal_Shdr * section;
4771 segment = program_headers + i;
4772 section = section_headers + 1;
4774 printf (" %2.2d ", i);
4776 for (j = 1; j < elf_header.e_shnum; j++, section++)
4778 if (!ELF_TBSS_SPECIAL (section, segment)
4779 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4780 printf ("%s ", printable_section_name (section));
4791 /* Find the file offset corresponding to VMA by using the program headers. */
4794 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4796 Elf_Internal_Phdr * seg;
4798 if (! get_program_headers (file))
4800 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4804 for (seg = program_headers;
4805 seg < program_headers + elf_header.e_phnum;
4808 if (seg->p_type != PT_LOAD)
4811 if (vma >= (seg->p_vaddr & -seg->p_align)
4812 && vma + size <= seg->p_vaddr + seg->p_filesz)
4813 return vma - seg->p_vaddr + seg->p_offset;
4816 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4817 (unsigned long) vma);
4822 /* Allocate memory and load the sections headers into the global pointer
4823 SECTION_HEADERS. If PROBE is true, this is just a probe and we do not
4824 generate any error messages if the load fails. */
4827 get_32bit_section_headers (FILE * file, bfd_boolean probe)
4829 Elf32_External_Shdr * shdrs;
4830 Elf_Internal_Shdr * internal;
4832 unsigned int size = elf_header.e_shentsize;
4833 unsigned int num = probe ? 1 : elf_header.e_shnum;
4835 /* PR binutils/17531: Cope with unexpected section header sizes. */
4836 if (size == 0 || num == 0)
4838 if (size < sizeof * shdrs)
4841 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4844 if (!probe && size > sizeof * shdrs)
4845 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4847 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4849 probe ? NULL : _("section headers"));
4853 if (section_headers != NULL)
4854 free (section_headers);
4855 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4856 sizeof (Elf_Internal_Shdr));
4857 if (section_headers == NULL)
4860 error (_("Out of memory reading %u section headers\n"), num);
4864 for (i = 0, internal = section_headers;
4868 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4869 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4870 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4871 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4872 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4873 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4874 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4875 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4876 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4877 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4885 get_64bit_section_headers (FILE * file, bfd_boolean probe)
4887 Elf64_External_Shdr * shdrs;
4888 Elf_Internal_Shdr * internal;
4890 unsigned int size = elf_header.e_shentsize;
4891 unsigned int num = probe ? 1 : elf_header.e_shnum;
4893 /* PR binutils/17531: Cope with unexpected section header sizes. */
4894 if (size == 0 || num == 0)
4896 if (size < sizeof * shdrs)
4899 error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
4902 if (! probe && size > sizeof * shdrs)
4903 warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
4905 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4907 probe ? NULL : _("section headers"));
4911 if (section_headers != NULL)
4912 free (section_headers);
4913 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4914 sizeof (Elf_Internal_Shdr));
4915 if (section_headers == NULL)
4918 error (_("Out of memory reading %u section headers\n"), num);
4922 for (i = 0, internal = section_headers;
4926 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4927 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4928 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4929 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4930 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4931 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4932 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4933 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4934 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4935 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4942 static Elf_Internal_Sym *
4943 get_32bit_elf_symbols (FILE * file,
4944 Elf_Internal_Shdr * section,
4945 unsigned long * num_syms_return)
4947 unsigned long number = 0;
4948 Elf32_External_Sym * esyms = NULL;
4949 Elf_External_Sym_Shndx * shndx = NULL;
4950 Elf_Internal_Sym * isyms = NULL;
4951 Elf_Internal_Sym * psym;
4954 if (section->sh_size == 0)
4956 if (num_syms_return != NULL)
4957 * num_syms_return = 0;
4961 /* Run some sanity checks first. */
4962 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
4964 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
4965 printable_section_name (section), (unsigned long) section->sh_entsize);
4969 if (section->sh_size > current_file_size)
4971 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
4972 printable_section_name (section), (unsigned long) section->sh_size);
4976 number = section->sh_size / section->sh_entsize;
4978 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4980 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
4981 (unsigned long) section->sh_size,
4982 printable_section_name (section),
4983 (unsigned long) section->sh_entsize);
4987 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4988 section->sh_size, _("symbols"));
4993 if (symtab_shndx_hdr != NULL
4994 && (symtab_shndx_hdr->sh_link
4995 == (unsigned long) (section - section_headers)))
4997 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4998 symtab_shndx_hdr->sh_offset,
4999 1, symtab_shndx_hdr->sh_size,
5000 _("symbol table section indicies"));
5003 /* PR17531: file: heap-buffer-overflow */
5004 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5006 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5007 printable_section_name (symtab_shndx_hdr),
5008 (unsigned long) symtab_shndx_hdr->sh_size,
5009 (unsigned long) section->sh_size);
5014 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5018 error (_("Out of memory reading %lu symbols\n"),
5019 (unsigned long) number);
5023 for (j = 0, psym = isyms; j < number; j++, psym++)
5025 psym->st_name = BYTE_GET (esyms[j].st_name);
5026 psym->st_value = BYTE_GET (esyms[j].st_value);
5027 psym->st_size = BYTE_GET (esyms[j].st_size);
5028 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5029 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5031 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5032 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5033 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5034 psym->st_info = BYTE_GET (esyms[j].st_info);
5035 psym->st_other = BYTE_GET (esyms[j].st_other);
5044 if (num_syms_return != NULL)
5045 * num_syms_return = isyms == NULL ? 0 : number;
5050 static Elf_Internal_Sym *
5051 get_64bit_elf_symbols (FILE * file,
5052 Elf_Internal_Shdr * section,
5053 unsigned long * num_syms_return)
5055 unsigned long number = 0;
5056 Elf64_External_Sym * esyms = NULL;
5057 Elf_External_Sym_Shndx * shndx = NULL;
5058 Elf_Internal_Sym * isyms = NULL;
5059 Elf_Internal_Sym * psym;
5062 if (section->sh_size == 0)
5064 if (num_syms_return != NULL)
5065 * num_syms_return = 0;
5069 /* Run some sanity checks first. */
5070 if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5072 error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5073 printable_section_name (section),
5074 (unsigned long) section->sh_entsize);
5078 if (section->sh_size > current_file_size)
5080 error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5081 printable_section_name (section),
5082 (unsigned long) section->sh_size);
5086 number = section->sh_size / section->sh_entsize;
5088 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5090 error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5091 (unsigned long) section->sh_size,
5092 printable_section_name (section),
5093 (unsigned long) section->sh_entsize);
5097 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5098 section->sh_size, _("symbols"));
5102 if (symtab_shndx_hdr != NULL
5103 && (symtab_shndx_hdr->sh_link
5104 == (unsigned long) (section - section_headers)))
5106 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5107 symtab_shndx_hdr->sh_offset,
5108 1, symtab_shndx_hdr->sh_size,
5109 _("symbol table section indicies"));
5112 else if (symtab_shndx_hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5114 error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5115 printable_section_name (symtab_shndx_hdr),
5116 (unsigned long) symtab_shndx_hdr->sh_size,
5117 (unsigned long) section->sh_size);
5122 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5126 error (_("Out of memory reading %lu symbols\n"),
5127 (unsigned long) number);
5131 for (j = 0, psym = isyms; j < number; j++, psym++)
5133 psym->st_name = BYTE_GET (esyms[j].st_name);
5134 psym->st_info = BYTE_GET (esyms[j].st_info);
5135 psym->st_other = BYTE_GET (esyms[j].st_other);
5136 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5138 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5140 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5141 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5142 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5144 psym->st_value = BYTE_GET (esyms[j].st_value);
5145 psym->st_size = BYTE_GET (esyms[j].st_size);
5154 if (num_syms_return != NULL)
5155 * num_syms_return = isyms == NULL ? 0 : number;
5161 get_elf_section_flags (bfd_vma sh_flags)
5163 static char buff[1024];
5165 int field_size = is_32bit_elf ? 8 : 16;
5167 int size = sizeof (buff) - (field_size + 4 + 1);
5168 bfd_vma os_flags = 0;
5169 bfd_vma proc_flags = 0;
5170 bfd_vma unknown_flags = 0;
5178 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
5179 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
5180 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
5181 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
5182 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
5183 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
5184 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5185 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5186 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
5187 /* 9 */ { STRING_COMMA_LEN ("TLS") },
5188 /* IA-64 specific. */
5189 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5190 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5191 /* IA-64 OpenVMS specific. */
5192 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5193 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5194 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5195 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5196 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5197 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5199 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5200 /* SPARC specific. */
5201 /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5202 /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") }
5205 if (do_section_details)
5207 sprintf (buff, "[%*.*lx]: ",
5208 field_size, field_size, (unsigned long) sh_flags);
5209 p += field_size + 4;
5216 flag = sh_flags & - sh_flags;
5219 if (do_section_details)
5223 case SHF_WRITE: sindex = 0; break;
5224 case SHF_ALLOC: sindex = 1; break;
5225 case SHF_EXECINSTR: sindex = 2; break;
5226 case SHF_MERGE: sindex = 3; break;
5227 case SHF_STRINGS: sindex = 4; break;
5228 case SHF_INFO_LINK: sindex = 5; break;
5229 case SHF_LINK_ORDER: sindex = 6; break;
5230 case SHF_OS_NONCONFORMING: sindex = 7; break;
5231 case SHF_GROUP: sindex = 8; break;
5232 case SHF_TLS: sindex = 9; break;
5233 case SHF_EXCLUDE: sindex = 18; break;
5234 case SHF_COMPRESSED: sindex = 20; break;
5238 switch (elf_header.e_machine)
5241 if (flag == SHF_IA_64_SHORT)
5243 else if (flag == SHF_IA_64_NORECOV)
5246 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5249 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
5250 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
5251 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
5252 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
5253 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5254 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
5265 case EM_OLD_SPARCV9:
5266 case EM_SPARC32PLUS:
5269 if (flag == SHF_ORDERED)
5279 if (p != buff + field_size + 4)
5281 if (size < (10 + 2))
5283 warn (_("Internal error: not enough buffer room for section flag info"));
5284 return _("<unknown>");
5291 size -= flags [sindex].len;
5292 p = stpcpy (p, flags [sindex].str);
5294 else if (flag & SHF_MASKOS)
5296 else if (flag & SHF_MASKPROC)
5299 unknown_flags |= flag;
5305 case SHF_WRITE: *p = 'W'; break;
5306 case SHF_ALLOC: *p = 'A'; break;
5307 case SHF_EXECINSTR: *p = 'X'; break;
5308 case SHF_MERGE: *p = 'M'; break;
5309 case SHF_STRINGS: *p = 'S'; break;
5310 case SHF_INFO_LINK: *p = 'I'; break;
5311 case SHF_LINK_ORDER: *p = 'L'; break;
5312 case SHF_OS_NONCONFORMING: *p = 'O'; break;
5313 case SHF_GROUP: *p = 'G'; break;
5314 case SHF_TLS: *p = 'T'; break;
5315 case SHF_EXCLUDE: *p = 'E'; break;
5316 case SHF_COMPRESSED: *p = 'C'; break;
5319 if ((elf_header.e_machine == EM_X86_64
5320 || elf_header.e_machine == EM_L1OM
5321 || elf_header.e_machine == EM_K1OM)
5322 && flag == SHF_X86_64_LARGE)
5324 else if (flag & SHF_MASKOS)
5327 sh_flags &= ~ SHF_MASKOS;
5329 else if (flag & SHF_MASKPROC)
5332 sh_flags &= ~ SHF_MASKPROC;
5342 if (do_section_details)
5346 size -= 5 + field_size;
5347 if (p != buff + field_size + 4)
5351 warn (_("Internal error: not enough buffer room for section flag info"));
5352 return _("<unknown>");
5358 sprintf (p, "OS (%*.*lx)", field_size, field_size,
5359 (unsigned long) os_flags);
5360 p += 5 + field_size;
5364 size -= 7 + field_size;
5365 if (p != buff + field_size + 4)
5369 warn (_("Internal error: not enough buffer room for section flag info"));
5370 return _("<unknown>");
5376 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5377 (unsigned long) proc_flags);
5378 p += 7 + field_size;
5382 size -= 10 + field_size;
5383 if (p != buff + field_size + 4)
5387 warn (_("Internal error: not enough buffer room for section flag info"));
5388 return _("<unknown>");
5394 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5395 (unsigned long) unknown_flags);
5396 p += 10 + field_size;
5405 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5409 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5410 chdr->ch_type = BYTE_GET (echdr->ch_type);
5411 chdr->ch_size = BYTE_GET (echdr->ch_size);
5412 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5413 return sizeof (*echdr);
5417 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5418 chdr->ch_type = BYTE_GET (echdr->ch_type);
5419 chdr->ch_size = BYTE_GET (echdr->ch_size);
5420 chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5421 return sizeof (*echdr);
5426 process_section_headers (FILE * file)
5428 Elf_Internal_Shdr * section;
5431 section_headers = NULL;
5433 if (elf_header.e_shnum == 0)
5435 /* PR binutils/12467. */
5436 if (elf_header.e_shoff != 0)
5437 warn (_("possibly corrupt ELF file header - it has a non-zero"
5438 " section header offset, but no section headers\n"));
5439 else if (do_sections)
5440 printf (_("\nThere are no sections in this file.\n"));
5445 if (do_sections && !do_header)
5446 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5447 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5451 if (! get_32bit_section_headers (file, FALSE))
5454 else if (! get_64bit_section_headers (file, FALSE))
5457 /* Read in the string table, so that we have names to display. */
5458 if (elf_header.e_shstrndx != SHN_UNDEF
5459 && elf_header.e_shstrndx < elf_header.e_shnum)
5461 section = section_headers + elf_header.e_shstrndx;
5463 if (section->sh_size != 0)
5465 string_table = (char *) get_data (NULL, file, section->sh_offset,
5466 1, section->sh_size,
5469 string_table_length = string_table != NULL ? section->sh_size : 0;
5473 /* Scan the sections for the dynamic symbol table
5474 and dynamic string table and debug sections. */
5475 dynamic_symbols = NULL;
5476 dynamic_strings = NULL;
5477 dynamic_syminfo = NULL;
5478 symtab_shndx_hdr = NULL;
5480 eh_addr_size = is_32bit_elf ? 4 : 8;
5481 switch (elf_header.e_machine)
5484 case EM_MIPS_RS3_LE:
5485 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5486 FDE addresses. However, the ABI also has a semi-official ILP32
5487 variant for which the normal FDE address size rules apply.
5489 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5490 section, where XX is the size of longs in bits. Unfortunately,
5491 earlier compilers provided no way of distinguishing ILP32 objects
5492 from LP64 objects, so if there's any doubt, we should assume that
5493 the official LP64 form is being used. */
5494 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5495 && find_section (".gcc_compiled_long32") == NULL)
5501 switch (elf_header.e_flags & EF_H8_MACH)
5503 case E_H8_MACH_H8300:
5504 case E_H8_MACH_H8300HN:
5505 case E_H8_MACH_H8300SN:
5506 case E_H8_MACH_H8300SXN:
5509 case E_H8_MACH_H8300H:
5510 case E_H8_MACH_H8300S:
5511 case E_H8_MACH_H8300SX:
5519 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5521 case EF_M32C_CPU_M16C:
5528 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
5531 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
5532 if (section->sh_entsize != expected_entsize) \
5535 sprintf_vma (buf, section->sh_entsize); \
5536 /* Note: coded this way so that there is a single string for \
5538 error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5539 error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5540 (unsigned) expected_entsize); \
5541 section->sh_entsize = expected_entsize; \
5546 #define CHECK_ENTSIZE(section, i, type) \
5547 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
5548 sizeof (Elf64_External_##type))
5550 for (i = 0, section = section_headers;
5551 i < elf_header.e_shnum;
5554 char * name = SECTION_NAME (section);
5556 if (section->sh_type == SHT_DYNSYM)
5558 if (dynamic_symbols != NULL)
5560 error (_("File contains multiple dynamic symbol tables\n"));
5564 CHECK_ENTSIZE (section, i, Sym);
5565 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5567 else if (section->sh_type == SHT_STRTAB
5568 && streq (name, ".dynstr"))
5570 if (dynamic_strings != NULL)
5572 error (_("File contains multiple dynamic string tables\n"));
5576 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5577 1, section->sh_size,
5578 _("dynamic strings"));
5579 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5581 else if (section->sh_type == SHT_SYMTAB_SHNDX)
5583 if (symtab_shndx_hdr != NULL)
5585 error (_("File contains multiple symtab shndx tables\n"));
5588 symtab_shndx_hdr = section;
5590 else if (section->sh_type == SHT_SYMTAB)
5591 CHECK_ENTSIZE (section, i, Sym);
5592 else if (section->sh_type == SHT_GROUP)
5593 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5594 else if (section->sh_type == SHT_REL)
5595 CHECK_ENTSIZE (section, i, Rel);
5596 else if (section->sh_type == SHT_RELA)
5597 CHECK_ENTSIZE (section, i, Rela);
5598 else if ((do_debugging || do_debug_info || do_debug_abbrevs
5599 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5600 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5601 || do_debug_str || do_debug_loc || do_debug_ranges
5602 || do_debug_addr || do_debug_cu_index)
5603 && (const_strneq (name, ".debug_")
5604 || const_strneq (name, ".zdebug_")))
5607 name += sizeof (".zdebug_") - 1;
5609 name += sizeof (".debug_") - 1;
5612 || (do_debug_info && const_strneq (name, "info"))
5613 || (do_debug_info && const_strneq (name, "types"))
5614 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
5615 || (do_debug_lines && strcmp (name, "line") == 0)
5616 || (do_debug_lines && const_strneq (name, "line."))
5617 || (do_debug_pubnames && const_strneq (name, "pubnames"))
5618 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5619 || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5620 || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5621 || (do_debug_aranges && const_strneq (name, "aranges"))
5622 || (do_debug_ranges && const_strneq (name, "ranges"))
5623 || (do_debug_frames && const_strneq (name, "frame"))
5624 || (do_debug_macinfo && const_strneq (name, "macinfo"))
5625 || (do_debug_macinfo && const_strneq (name, "macro"))
5626 || (do_debug_str && const_strneq (name, "str"))
5627 || (do_debug_loc && const_strneq (name, "loc"))
5628 || (do_debug_addr && const_strneq (name, "addr"))
5629 || (do_debug_cu_index && const_strneq (name, "cu_index"))
5630 || (do_debug_cu_index && const_strneq (name, "tu_index"))
5632 request_dump_bynumber (i, DEBUG_DUMP);
5634 /* Linkonce section to be combined with .debug_info at link time. */
5635 else if ((do_debugging || do_debug_info)
5636 && const_strneq (name, ".gnu.linkonce.wi."))
5637 request_dump_bynumber (i, DEBUG_DUMP);
5638 else if (do_debug_frames && streq (name, ".eh_frame"))
5639 request_dump_bynumber (i, DEBUG_DUMP);
5640 else if (do_gdb_index && streq (name, ".gdb_index"))
5641 request_dump_bynumber (i, DEBUG_DUMP);
5642 /* Trace sections for Itanium VMS. */
5643 else if ((do_debugging || do_trace_info || do_trace_abbrevs
5644 || do_trace_aranges)
5645 && const_strneq (name, ".trace_"))
5647 name += sizeof (".trace_") - 1;
5650 || (do_trace_info && streq (name, "info"))
5651 || (do_trace_abbrevs && streq (name, "abbrev"))
5652 || (do_trace_aranges && streq (name, "aranges"))
5654 request_dump_bynumber (i, DEBUG_DUMP);
5661 if (elf_header.e_shnum > 1)
5662 printf (_("\nSection Headers:\n"));
5664 printf (_("\nSection Header:\n"));
5668 if (do_section_details)
5670 printf (_(" [Nr] Name\n"));
5671 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
5675 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
5679 if (do_section_details)
5681 printf (_(" [Nr] Name\n"));
5682 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
5686 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
5690 if (do_section_details)
5692 printf (_(" [Nr] Name\n"));
5693 printf (_(" Type Address Offset Link\n"));
5694 printf (_(" Size EntSize Info Align\n"));
5698 printf (_(" [Nr] Name Type Address Offset\n"));
5699 printf (_(" Size EntSize Flags Link Info Align\n"));
5703 if (do_section_details)
5704 printf (_(" Flags\n"));
5706 for (i = 0, section = section_headers;
5707 i < elf_header.e_shnum;
5710 printf (" [%2u] ", i);
5711 if (do_section_details)
5712 printf ("%s\n ", printable_section_name (section));
5714 print_symbol (-17, SECTION_NAME (section));
5716 printf (do_wide ? " %-15s " : " %-15.15s ",
5717 get_section_type_name (section->sh_type));
5721 const char * link_too_big = NULL;
5723 print_vma (section->sh_addr, LONG_HEX);
5725 printf ( " %6.6lx %6.6lx %2.2lx",
5726 (unsigned long) section->sh_offset,
5727 (unsigned long) section->sh_size,
5728 (unsigned long) section->sh_entsize);
5730 if (do_section_details)
5731 fputs (" ", stdout);
5733 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5735 if (section->sh_link >= elf_header.e_shnum)
5738 /* The sh_link value is out of range. Normally this indicates
5739 an error but it can have special values in Solaris binaries. */
5740 switch (elf_header.e_machine)
5747 case EM_OLD_SPARCV9:
5748 case EM_SPARC32PLUS:
5751 if (section->sh_link == (SHN_BEFORE & 0xffff))
5752 link_too_big = "BEFORE";
5753 else if (section->sh_link == (SHN_AFTER & 0xffff))
5754 link_too_big = "AFTER";
5761 if (do_section_details)
5763 if (link_too_big != NULL && * link_too_big)
5764 printf ("<%s> ", link_too_big);
5766 printf ("%2u ", section->sh_link);
5767 printf ("%3u %2lu\n", section->sh_info,
5768 (unsigned long) section->sh_addralign);
5771 printf ("%2u %3u %2lu\n",
5774 (unsigned long) section->sh_addralign);
5776 if (link_too_big && ! * link_too_big)
5777 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5778 i, section->sh_link);
5782 print_vma (section->sh_addr, LONG_HEX);
5784 if ((long) section->sh_offset == section->sh_offset)
5785 printf (" %6.6lx", (unsigned long) section->sh_offset);
5789 print_vma (section->sh_offset, LONG_HEX);
5792 if ((unsigned long) section->sh_size == section->sh_size)
5793 printf (" %6.6lx", (unsigned long) section->sh_size);
5797 print_vma (section->sh_size, LONG_HEX);
5800 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5801 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5805 print_vma (section->sh_entsize, LONG_HEX);
5808 if (do_section_details)
5809 fputs (" ", stdout);
5811 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5813 printf ("%2u %3u ", section->sh_link, section->sh_info);
5815 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5816 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5819 print_vma (section->sh_addralign, DEC);
5823 else if (do_section_details)
5825 printf (" %-15.15s ",
5826 get_section_type_name (section->sh_type));
5827 print_vma (section->sh_addr, LONG_HEX);
5828 if ((long) section->sh_offset == section->sh_offset)
5829 printf (" %16.16lx", (unsigned long) section->sh_offset);
5833 print_vma (section->sh_offset, LONG_HEX);
5835 printf (" %u\n ", section->sh_link);
5836 print_vma (section->sh_size, LONG_HEX);
5838 print_vma (section->sh_entsize, LONG_HEX);
5840 printf (" %-16u %lu\n",
5842 (unsigned long) section->sh_addralign);
5847 print_vma (section->sh_addr, LONG_HEX);
5848 if ((long) section->sh_offset == section->sh_offset)
5849 printf (" %8.8lx", (unsigned long) section->sh_offset);
5853 print_vma (section->sh_offset, LONG_HEX);
5856 print_vma (section->sh_size, LONG_HEX);
5858 print_vma (section->sh_entsize, LONG_HEX);
5860 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5862 printf (" %2u %3u %lu\n",
5865 (unsigned long) section->sh_addralign);
5868 if (do_section_details)
5870 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5871 if ((section->sh_flags & SHF_COMPRESSED) != 0)
5873 /* Minimum section size is 12 bytes for 32-bit compression
5874 header + 12 bytes for compressed data header. */
5875 unsigned char buf[24];
5876 assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
5877 if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
5878 sizeof (buf), _("compression header")))
5880 Elf_Internal_Chdr chdr;
5881 get_compression_header (&chdr, buf);
5882 if (chdr.ch_type == ELFCOMPRESS_ZLIB)
5885 printf (_(" [<unknown>: 0x%x], "),
5887 print_vma (chdr.ch_size, LONG_HEX);
5888 printf (", %lu\n", (unsigned long) chdr.ch_addralign);
5894 if (!do_section_details)
5896 if (elf_header.e_machine == EM_X86_64
5897 || elf_header.e_machine == EM_L1OM
5898 || elf_header.e_machine == EM_K1OM)
5899 printf (_("Key to Flags:\n\
5900 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5901 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5902 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5904 printf (_("Key to Flags:\n\
5905 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5906 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5907 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5914 get_group_flags (unsigned int flags)
5916 static char buff[32];
5926 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5933 process_section_groups (FILE * file)
5935 Elf_Internal_Shdr * section;
5937 struct group * group;
5938 Elf_Internal_Shdr * symtab_sec;
5939 Elf_Internal_Shdr * strtab_sec;
5940 Elf_Internal_Sym * symtab;
5941 unsigned long num_syms;
5945 /* Don't process section groups unless needed. */
5946 if (!do_unwind && !do_section_groups)
5949 if (elf_header.e_shnum == 0)
5951 if (do_section_groups)
5952 printf (_("\nThere are no sections to group in this file.\n"));
5957 if (section_headers == NULL)
5959 error (_("Section headers are not available!\n"));
5960 /* PR 13622: This can happen with a corrupt ELF header. */
5964 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5965 sizeof (struct group *));
5967 if (section_headers_groups == NULL)
5969 error (_("Out of memory reading %u section group headers\n"),
5970 elf_header.e_shnum);
5974 /* Scan the sections for the group section. */
5976 for (i = 0, section = section_headers;
5977 i < elf_header.e_shnum;
5979 if (section->sh_type == SHT_GROUP)
5982 if (group_count == 0)
5984 if (do_section_groups)
5985 printf (_("\nThere are no section groups in this file.\n"));
5990 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5992 if (section_groups == NULL)
5994 error (_("Out of memory reading %lu groups\n"),
5995 (unsigned long) group_count);
6005 for (i = 0, section = section_headers, group = section_groups;
6006 i < elf_header.e_shnum;
6009 if (section->sh_type == SHT_GROUP)
6011 const char * name = printable_section_name (section);
6012 const char * group_name;
6013 unsigned char * start;
6014 unsigned char * indices;
6015 unsigned int entry, j, size;
6016 Elf_Internal_Shdr * sec;
6017 Elf_Internal_Sym * sym;
6019 /* Get the symbol table. */
6020 if (section->sh_link >= elf_header.e_shnum
6021 || ((sec = section_headers + section->sh_link)->sh_type
6024 error (_("Bad sh_link in group section `%s'\n"), name);
6028 if (symtab_sec != sec)
6033 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6038 error (_("Corrupt header in group section `%s'\n"), name);
6042 if (section->sh_info >= num_syms)
6044 error (_("Bad sh_info in group section `%s'\n"), name);
6048 sym = symtab + section->sh_info;
6050 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6052 if (sym->st_shndx == 0
6053 || sym->st_shndx >= elf_header.e_shnum)
6055 error (_("Bad sh_info in group section `%s'\n"), name);
6059 group_name = SECTION_NAME (section_headers + sym->st_shndx);
6068 /* Get the string table. */
6069 if (symtab_sec->sh_link >= elf_header.e_shnum)
6078 != (sec = section_headers + symtab_sec->sh_link))
6084 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6085 1, strtab_sec->sh_size,
6087 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6089 group_name = sym->st_name < strtab_size
6090 ? strtab + sym->st_name : _("<corrupt>");
6093 /* PR 17531: file: loop. */
6094 if (section->sh_entsize > section->sh_size)
6096 error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6097 printable_section_name (section),
6098 (unsigned long) section->sh_entsize,
6099 (unsigned long) section->sh_size);
6103 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6104 1, section->sh_size,
6110 size = (section->sh_size / section->sh_entsize) - 1;
6111 entry = byte_get (indices, 4);
6114 if (do_section_groups)
6116 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6117 get_group_flags (entry), i, name, group_name, size);
6119 printf (_(" [Index] Name\n"));
6122 group->group_index = i;
6124 for (j = 0; j < size; j++)
6126 struct group_list * g;
6128 entry = byte_get (indices, 4);
6131 if (entry >= elf_header.e_shnum)
6133 static unsigned num_group_errors = 0;
6135 if (num_group_errors ++ < 10)
6137 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6138 entry, i, elf_header.e_shnum - 1);
6139 if (num_group_errors == 10)
6140 warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6145 if (section_headers_groups [entry] != NULL)
6149 static unsigned num_errs = 0;
6151 if (num_errs ++ < 10)
6153 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6155 section_headers_groups [entry]->group_index);
6157 warn (_("Further error messages about already contained group sections suppressed\n"));
6163 /* Intel C/C++ compiler may put section 0 in a
6164 section group. We just warn it the first time
6165 and ignore it afterwards. */
6166 static int warned = 0;
6169 error (_("section 0 in group section [%5u]\n"),
6170 section_headers_groups [entry]->group_index);
6176 section_headers_groups [entry] = group;
6178 if (do_section_groups)
6180 sec = section_headers + entry;
6181 printf (" [%5u] %s\n", entry, printable_section_name (sec));
6184 g = (struct group_list *) xmalloc (sizeof (struct group_list));
6185 g->section_index = entry;
6186 g->next = group->root;
6204 /* Data used to display dynamic fixups. */
6206 struct ia64_vms_dynfixup
6208 bfd_vma needed_ident; /* Library ident number. */
6209 bfd_vma needed; /* Index in the dstrtab of the library name. */
6210 bfd_vma fixup_needed; /* Index of the library. */
6211 bfd_vma fixup_rela_cnt; /* Number of fixups. */
6212 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
6215 /* Data used to display dynamic relocations. */
6217 struct ia64_vms_dynimgrela
6219 bfd_vma img_rela_cnt; /* Number of relocations. */
6220 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
6223 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6227 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6228 const char *strtab, unsigned int strtab_sz)
6230 Elf64_External_VMS_IMAGE_FIXUP *imfs;
6232 const char *lib_name;
6234 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6235 1, fixup->fixup_rela_cnt * sizeof (*imfs),
6236 _("dynamic section image fixups"));
6240 if (fixup->needed < strtab_sz)
6241 lib_name = strtab + fixup->needed;
6244 warn ("corrupt library name index of 0x%lx found in dynamic entry",
6245 (unsigned long) fixup->needed);
6248 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6249 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6251 (_("Seg Offset Type SymVec DataType\n"));
6253 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6258 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6259 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6260 type = BYTE_GET (imfs [i].type);
6261 rtype = elf_ia64_reloc_type (type);
6263 printf (" 0x%08x ", type);
6265 printf (" %-32s ", rtype);
6266 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6267 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6273 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
6276 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6278 Elf64_External_VMS_IMAGE_RELA *imrs;
6281 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6282 1, imgrela->img_rela_cnt * sizeof (*imrs),
6283 _("dynamic section image relocations"));
6287 printf (_("\nImage relocs\n"));
6289 (_("Seg Offset Type Addend Seg Sym Off\n"));
6291 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6296 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6297 printf ("%08" BFD_VMA_FMT "x ",
6298 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6299 type = BYTE_GET (imrs [i].type);
6300 rtype = elf_ia64_reloc_type (type);
6302 printf ("0x%08x ", type);
6304 printf ("%-31s ", rtype);
6305 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6306 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6307 printf ("%08" BFD_VMA_FMT "x\n",
6308 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6314 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
6317 process_ia64_vms_dynamic_relocs (FILE *file)
6319 struct ia64_vms_dynfixup fixup;
6320 struct ia64_vms_dynimgrela imgrela;
6321 Elf_Internal_Dyn *entry;
6323 bfd_vma strtab_off = 0;
6324 bfd_vma strtab_sz = 0;
6325 char *strtab = NULL;
6327 memset (&fixup, 0, sizeof (fixup));
6328 memset (&imgrela, 0, sizeof (imgrela));
6330 /* Note: the order of the entries is specified by the OpenVMS specs. */
6331 for (entry = dynamic_section;
6332 entry < dynamic_section + dynamic_nent;
6335 switch (entry->d_tag)
6337 case DT_IA_64_VMS_STRTAB_OFFSET:
6338 strtab_off = entry->d_un.d_val;
6341 strtab_sz = entry->d_un.d_val;
6343 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6344 1, strtab_sz, _("dynamic string section"));
6347 case DT_IA_64_VMS_NEEDED_IDENT:
6348 fixup.needed_ident = entry->d_un.d_val;
6351 fixup.needed = entry->d_un.d_val;
6353 case DT_IA_64_VMS_FIXUP_NEEDED:
6354 fixup.fixup_needed = entry->d_un.d_val;
6356 case DT_IA_64_VMS_FIXUP_RELA_CNT:
6357 fixup.fixup_rela_cnt = entry->d_un.d_val;
6359 case DT_IA_64_VMS_FIXUP_RELA_OFF:
6360 fixup.fixup_rela_off = entry->d_un.d_val;
6362 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6365 case DT_IA_64_VMS_IMG_RELA_CNT:
6366 imgrela.img_rela_cnt = entry->d_un.d_val;
6368 case DT_IA_64_VMS_IMG_RELA_OFF:
6369 imgrela.img_rela_off = entry->d_un.d_val;
6371 dump_ia64_vms_dynamic_relocs (file, &imgrela);
6391 } dynamic_relocations [] =
6393 { "REL", DT_REL, DT_RELSZ, FALSE },
6394 { "RELA", DT_RELA, DT_RELASZ, TRUE },
6395 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6398 /* Process the reloc section. */
6401 process_relocs (FILE * file)
6403 unsigned long rel_size;
6404 unsigned long rel_offset;
6410 if (do_using_dynamic)
6414 int has_dynamic_reloc;
6417 has_dynamic_reloc = 0;
6419 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6421 is_rela = dynamic_relocations [i].rela;
6422 name = dynamic_relocations [i].name;
6423 rel_size = dynamic_info [dynamic_relocations [i].size];
6424 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6426 has_dynamic_reloc |= rel_size;
6428 if (is_rela == UNKNOWN)
6430 if (dynamic_relocations [i].reloc == DT_JMPREL)
6431 switch (dynamic_info[DT_PLTREL])
6445 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6446 name, rel_offset, rel_size);
6448 dump_relocations (file,
6449 offset_from_vma (file, rel_offset, rel_size),
6451 dynamic_symbols, num_dynamic_syms,
6452 dynamic_strings, dynamic_strings_length,
6458 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6460 if (! has_dynamic_reloc)
6461 printf (_("\nThere are no dynamic relocations in this file.\n"));
6465 Elf_Internal_Shdr * section;
6469 for (i = 0, section = section_headers;
6470 i < elf_header.e_shnum;
6473 if ( section->sh_type != SHT_RELA
6474 && section->sh_type != SHT_REL)
6477 rel_offset = section->sh_offset;
6478 rel_size = section->sh_size;
6482 Elf_Internal_Shdr * strsec;
6485 printf (_("\nRelocation section "));
6487 if (string_table == NULL)
6488 printf ("%d", section->sh_name);
6490 printf ("'%s'", printable_section_name (section));
6492 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6493 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6495 is_rela = section->sh_type == SHT_RELA;
6497 if (section->sh_link != 0
6498 && section->sh_link < elf_header.e_shnum)
6500 Elf_Internal_Shdr * symsec;
6501 Elf_Internal_Sym * symtab;
6502 unsigned long nsyms;
6503 unsigned long strtablen = 0;
6504 char * strtab = NULL;
6506 symsec = section_headers + section->sh_link;
6507 if (symsec->sh_type != SHT_SYMTAB
6508 && symsec->sh_type != SHT_DYNSYM)
6511 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6516 if (symsec->sh_link != 0
6517 && symsec->sh_link < elf_header.e_shnum)
6519 strsec = section_headers + symsec->sh_link;
6521 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6524 strtablen = strtab == NULL ? 0 : strsec->sh_size;
6527 dump_relocations (file, rel_offset, rel_size,
6528 symtab, nsyms, strtab, strtablen,
6530 symsec->sh_type == SHT_DYNSYM);
6536 dump_relocations (file, rel_offset, rel_size,
6537 NULL, 0, NULL, 0, is_rela, 0);
6544 printf (_("\nThere are no relocations in this file.\n"));
6550 /* An absolute address consists of a section and an offset. If the
6551 section is NULL, the offset itself is the address, otherwise, the
6552 address equals to LOAD_ADDRESS(section) + offset. */
6556 unsigned short section;
6560 #define ABSADDR(a) \
6562 ? section_headers [(a).section].sh_addr + (a).offset \
6565 /* Find the nearest symbol at or below ADDR. Returns the symbol
6566 name, if found, and the offset from the symbol to ADDR. */
6569 find_symbol_for_address (Elf_Internal_Sym * symtab,
6570 unsigned long nsyms,
6571 const char * strtab,
6572 unsigned long strtab_size,
6573 struct absaddr addr,
6574 const char ** symname,
6577 bfd_vma dist = 0x100000;
6578 Elf_Internal_Sym * sym;
6579 Elf_Internal_Sym * beg;
6580 Elf_Internal_Sym * end;
6581 Elf_Internal_Sym * best = NULL;
6583 REMOVE_ARCH_BITS (addr.offset);
6585 end = symtab + nsyms;
6591 sym = beg + (end - beg) / 2;
6593 value = sym->st_value;
6594 REMOVE_ARCH_BITS (value);
6596 if (sym->st_name != 0
6597 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6598 && addr.offset >= value
6599 && addr.offset - value < dist)
6602 dist = addr.offset - value;
6607 if (addr.offset < value)
6615 *symname = (best->st_name >= strtab_size
6616 ? _("<corrupt>") : strtab + best->st_name);
6622 *offset = addr.offset;
6626 symcmp (const void *p, const void *q)
6628 Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6629 Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6631 return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6634 /* Process the unwind section. */
6636 #include "unwind-ia64.h"
6638 struct ia64_unw_table_entry
6640 struct absaddr start;
6642 struct absaddr info;
6645 struct ia64_unw_aux_info
6647 struct ia64_unw_table_entry *table; /* Unwind table. */
6648 unsigned long table_len; /* Length of unwind table. */
6649 unsigned char * info; /* Unwind info. */
6650 unsigned long info_size; /* Size of unwind info. */
6651 bfd_vma info_addr; /* Starting address of unwind info. */
6652 bfd_vma seg_base; /* Starting address of segment. */
6653 Elf_Internal_Sym * symtab; /* The symbol table. */
6654 unsigned long nsyms; /* Number of symbols. */
6655 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
6656 unsigned long nfuns; /* Number of entries in funtab. */
6657 char * strtab; /* The string table. */
6658 unsigned long strtab_size; /* Size of string table. */
6662 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6664 struct ia64_unw_table_entry * tp;
6665 unsigned long j, nfuns;
6668 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6669 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6670 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6671 aux->funtab[nfuns++] = aux->symtab[j];
6673 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6675 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6679 const unsigned char * dp;
6680 const unsigned char * head;
6681 const unsigned char * end;
6682 const char * procname;
6684 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6685 aux->strtab_size, tp->start, &procname, &offset);
6687 fputs ("\n<", stdout);
6691 fputs (procname, stdout);
6694 printf ("+%lx", (unsigned long) offset);
6697 fputs (">: [", stdout);
6698 print_vma (tp->start.offset, PREFIX_HEX);
6699 fputc ('-', stdout);
6700 print_vma (tp->end.offset, PREFIX_HEX);
6701 printf ("], info at +0x%lx\n",
6702 (unsigned long) (tp->info.offset - aux->seg_base));
6704 /* PR 17531: file: 86232b32. */
6705 if (aux->info == NULL)
6708 /* PR 17531: file: 0997b4d1. */
6709 if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6711 warn (_("Invalid offset %lx in table entry %ld\n"),
6712 (long) tp->info.offset, (long) (tp - aux->table));
6716 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6717 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6719 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6720 (unsigned) UNW_VER (stamp),
6721 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6722 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6723 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6724 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6726 if (UNW_VER (stamp) != 1)
6728 printf (_("\tUnknown version.\n"));
6733 end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6734 /* PR 17531: file: 16ceda89. */
6735 if (end > aux->info + aux->info_size)
6736 end = aux->info + aux->info_size;
6737 for (dp = head + 8; dp < end;)
6738 dp = unw_decode (dp, in_body, & in_body);
6745 slurp_ia64_unwind_table (FILE * file,
6746 struct ia64_unw_aux_info * aux,
6747 Elf_Internal_Shdr * sec)
6749 unsigned long size, nrelas, i;
6750 Elf_Internal_Phdr * seg;
6751 struct ia64_unw_table_entry * tep;
6752 Elf_Internal_Shdr * relsec;
6753 Elf_Internal_Rela * rela;
6754 Elf_Internal_Rela * rp;
6755 unsigned char * table;
6757 Elf_Internal_Sym * sym;
6758 const char * relname;
6762 /* First, find the starting address of the segment that includes
6765 if (elf_header.e_phnum)
6767 if (! get_program_headers (file))
6770 for (seg = program_headers;
6771 seg < program_headers + elf_header.e_phnum;
6774 if (seg->p_type != PT_LOAD)
6777 if (sec->sh_addr >= seg->p_vaddr
6778 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6780 aux->seg_base = seg->p_vaddr;
6786 /* Second, build the unwind table from the contents of the unwind section: */
6787 size = sec->sh_size;
6788 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6793 aux->table_len = size / (3 * eh_addr_size);
6794 aux->table = (struct ia64_unw_table_entry *)
6795 xcmalloc (aux->table_len, sizeof (aux->table[0]));
6798 for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
6800 tep->start.section = SHN_UNDEF;
6801 tep->end.section = SHN_UNDEF;
6802 tep->info.section = SHN_UNDEF;
6803 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6804 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6805 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
6806 tep->start.offset += aux->seg_base;
6807 tep->end.offset += aux->seg_base;
6808 tep->info.offset += aux->seg_base;
6812 /* Third, apply any relocations to the unwind table: */
6813 for (relsec = section_headers;
6814 relsec < section_headers + elf_header.e_shnum;
6817 if (relsec->sh_type != SHT_RELA
6818 || relsec->sh_info >= elf_header.e_shnum
6819 || section_headers + relsec->sh_info != sec)
6822 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6831 for (rp = rela; rp < rela + nrelas; ++rp)
6833 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6834 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6836 /* PR 17531: file: 9fa67536. */
6837 if (relname == NULL)
6839 warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
6843 if (! const_strneq (relname, "R_IA64_SEGREL"))
6845 warn (_("Skipping unexpected relocation type: %s\n"), relname);
6849 i = rp->r_offset / (3 * eh_addr_size);
6851 /* PR 17531: file: 5bc8d9bf. */
6852 if (i >= aux->table_len)
6854 warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
6858 switch (rp->r_offset / eh_addr_size % 3)
6861 aux->table[i].start.section = sym->st_shndx;
6862 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6865 aux->table[i].end.section = sym->st_shndx;
6866 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6869 aux->table[i].info.section = sym->st_shndx;
6870 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6884 ia64_process_unwind (FILE * file)
6886 Elf_Internal_Shdr * sec;
6887 Elf_Internal_Shdr * unwsec = NULL;
6888 Elf_Internal_Shdr * strsec;
6889 unsigned long i, unwcount = 0, unwstart = 0;
6890 struct ia64_unw_aux_info aux;
6892 memset (& aux, 0, sizeof (aux));
6894 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6896 if (sec->sh_type == SHT_SYMTAB
6897 && sec->sh_link < elf_header.e_shnum)
6899 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6901 strsec = section_headers + sec->sh_link;
6902 if (aux.strtab != NULL)
6904 error (_("Multiple auxillary string tables encountered\n"));
6907 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6910 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6912 else if (sec->sh_type == SHT_IA_64_UNWIND)
6917 printf (_("\nThere are no unwind sections in this file.\n"));
6919 while (unwcount-- > 0)
6924 for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
6925 i < elf_header.e_shnum; ++i, ++sec)
6926 if (sec->sh_type == SHT_IA_64_UNWIND)
6931 /* We have already counted the number of SHT_IA64_UNWIND
6932 sections so the loop above should never fail. */
6933 assert (unwsec != NULL);
6936 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6938 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6940 /* We need to find which section group it is in. */
6941 struct group_list * g;
6943 if (section_headers_groups == NULL
6944 || section_headers_groups [i] == NULL)
6945 i = elf_header.e_shnum;
6948 g = section_headers_groups [i]->root;
6950 for (; g != NULL; g = g->next)
6952 sec = section_headers + g->section_index;
6954 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6959 i = elf_header.e_shnum;
6962 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6964 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6965 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6966 suffix = SECTION_NAME (unwsec) + len;
6967 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6969 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6970 && streq (SECTION_NAME (sec) + len2, suffix))
6975 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6976 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6977 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6978 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6980 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6981 suffix = SECTION_NAME (unwsec) + len;
6982 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6984 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6985 && streq (SECTION_NAME (sec) + len2, suffix))
6989 if (i == elf_header.e_shnum)
6991 printf (_("\nCould not find unwind info section for "));
6993 if (string_table == NULL)
6994 printf ("%d", unwsec->sh_name);
6996 printf ("'%s'", printable_section_name (unwsec));
7000 aux.info_addr = sec->sh_addr;
7001 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7004 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7006 printf (_("\nUnwind section "));
7008 if (string_table == NULL)
7009 printf ("%d", unwsec->sh_name);
7011 printf ("'%s'", printable_section_name (unwsec));
7013 printf (_(" at offset 0x%lx contains %lu entries:\n"),
7014 (unsigned long) unwsec->sh_offset,
7015 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7017 if (slurp_ia64_unwind_table (file, & aux, unwsec)
7018 && aux.table_len > 0)
7019 dump_ia64_unwind (& aux);
7022 free ((char *) aux.table);
7024 free ((char *) aux.info);
7033 free ((char *) aux.strtab);
7036 struct hppa_unw_table_entry
7038 struct absaddr start;
7040 unsigned int Cannot_unwind:1; /* 0 */
7041 unsigned int Millicode:1; /* 1 */
7042 unsigned int Millicode_save_sr0:1; /* 2 */
7043 unsigned int Region_description:2; /* 3..4 */
7044 unsigned int reserved1:1; /* 5 */
7045 unsigned int Entry_SR:1; /* 6 */
7046 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
7047 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
7048 unsigned int Args_stored:1; /* 16 */
7049 unsigned int Variable_Frame:1; /* 17 */
7050 unsigned int Separate_Package_Body:1; /* 18 */
7051 unsigned int Frame_Extension_Millicode:1; /* 19 */
7052 unsigned int Stack_Overflow_Check:1; /* 20 */
7053 unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7054 unsigned int Ada_Region:1; /* 22 */
7055 unsigned int cxx_info:1; /* 23 */
7056 unsigned int cxx_try_catch:1; /* 24 */
7057 unsigned int sched_entry_seq:1; /* 25 */
7058 unsigned int reserved2:1; /* 26 */
7059 unsigned int Save_SP:1; /* 27 */
7060 unsigned int Save_RP:1; /* 28 */
7061 unsigned int Save_MRP_in_frame:1; /* 29 */
7062 unsigned int extn_ptr_defined:1; /* 30 */
7063 unsigned int Cleanup_defined:1; /* 31 */
7065 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
7066 unsigned int HP_UX_interrupt_marker:1; /* 1 */
7067 unsigned int Large_frame:1; /* 2 */
7068 unsigned int Pseudo_SP_Set:1; /* 3 */
7069 unsigned int reserved4:1; /* 4 */
7070 unsigned int Total_frame_size:27; /* 5..31 */
7073 struct hppa_unw_aux_info
7075 struct hppa_unw_table_entry * table; /* Unwind table. */
7076 unsigned long table_len; /* Length of unwind table. */
7077 bfd_vma seg_base; /* Starting address of segment. */
7078 Elf_Internal_Sym * symtab; /* The symbol table. */
7079 unsigned long nsyms; /* Number of symbols. */
7080 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7081 unsigned long nfuns; /* Number of entries in funtab. */
7082 char * strtab; /* The string table. */
7083 unsigned long strtab_size; /* Size of string table. */
7087 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7089 struct hppa_unw_table_entry * tp;
7090 unsigned long j, nfuns;
7092 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7093 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7094 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7095 aux->funtab[nfuns++] = aux->symtab[j];
7097 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7099 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7102 const char * procname;
7104 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7105 aux->strtab_size, tp->start, &procname,
7108 fputs ("\n<", stdout);
7112 fputs (procname, stdout);
7115 printf ("+%lx", (unsigned long) offset);
7118 fputs (">: [", stdout);
7119 print_vma (tp->start.offset, PREFIX_HEX);
7120 fputc ('-', stdout);
7121 print_vma (tp->end.offset, PREFIX_HEX);
7124 #define PF(_m) if (tp->_m) printf (#_m " ");
7125 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7128 PF(Millicode_save_sr0);
7129 /* PV(Region_description); */
7135 PF(Separate_Package_Body);
7136 PF(Frame_Extension_Millicode);
7137 PF(Stack_Overflow_Check);
7138 PF(Two_Instruction_SP_Increment);
7142 PF(sched_entry_seq);
7145 PF(Save_MRP_in_frame);
7146 PF(extn_ptr_defined);
7147 PF(Cleanup_defined);
7148 PF(MPE_XL_interrupt_marker);
7149 PF(HP_UX_interrupt_marker);
7152 PV(Total_frame_size);
7163 slurp_hppa_unwind_table (FILE * file,
7164 struct hppa_unw_aux_info * aux,
7165 Elf_Internal_Shdr * sec)
7167 unsigned long size, unw_ent_size, nentries, nrelas, i;
7168 Elf_Internal_Phdr * seg;
7169 struct hppa_unw_table_entry * tep;
7170 Elf_Internal_Shdr * relsec;
7171 Elf_Internal_Rela * rela;
7172 Elf_Internal_Rela * rp;
7173 unsigned char * table;
7175 Elf_Internal_Sym * sym;
7176 const char * relname;
7178 /* First, find the starting address of the segment that includes
7181 if (elf_header.e_phnum)
7183 if (! get_program_headers (file))
7186 for (seg = program_headers;
7187 seg < program_headers + elf_header.e_phnum;
7190 if (seg->p_type != PT_LOAD)
7193 if (sec->sh_addr >= seg->p_vaddr
7194 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7196 aux->seg_base = seg->p_vaddr;
7202 /* Second, build the unwind table from the contents of the unwind
7204 size = sec->sh_size;
7205 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7211 nentries = size / unw_ent_size;
7212 size = unw_ent_size * nentries;
7214 tep = aux->table = (struct hppa_unw_table_entry *)
7215 xcmalloc (nentries, sizeof (aux->table[0]));
7217 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7219 unsigned int tmp1, tmp2;
7221 tep->start.section = SHN_UNDEF;
7222 tep->end.section = SHN_UNDEF;
7224 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7225 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7226 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7227 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7229 tep->start.offset += aux->seg_base;
7230 tep->end.offset += aux->seg_base;
7232 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7233 tep->Millicode = (tmp1 >> 30) & 0x1;
7234 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7235 tep->Region_description = (tmp1 >> 27) & 0x3;
7236 tep->reserved1 = (tmp1 >> 26) & 0x1;
7237 tep->Entry_SR = (tmp1 >> 25) & 0x1;
7238 tep->Entry_FR = (tmp1 >> 21) & 0xf;
7239 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7240 tep->Args_stored = (tmp1 >> 15) & 0x1;
7241 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7242 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7243 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7244 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7245 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7246 tep->Ada_Region = (tmp1 >> 9) & 0x1;
7247 tep->cxx_info = (tmp1 >> 8) & 0x1;
7248 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7249 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7250 tep->reserved2 = (tmp1 >> 5) & 0x1;
7251 tep->Save_SP = (tmp1 >> 4) & 0x1;
7252 tep->Save_RP = (tmp1 >> 3) & 0x1;
7253 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7254 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7255 tep->Cleanup_defined = tmp1 & 0x1;
7257 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7258 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7259 tep->Large_frame = (tmp2 >> 29) & 0x1;
7260 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7261 tep->reserved4 = (tmp2 >> 27) & 0x1;
7262 tep->Total_frame_size = tmp2 & 0x7ffffff;
7266 /* Third, apply any relocations to the unwind table. */
7267 for (relsec = section_headers;
7268 relsec < section_headers + elf_header.e_shnum;
7271 if (relsec->sh_type != SHT_RELA
7272 || relsec->sh_info >= elf_header.e_shnum
7273 || section_headers + relsec->sh_info != sec)
7276 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7280 for (rp = rela; rp < rela + nrelas; ++rp)
7282 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7283 sym = aux->symtab + get_reloc_symindex (rp->r_info);
7285 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
7286 if (! const_strneq (relname, "R_PARISC_SEGREL"))
7288 warn (_("Skipping unexpected relocation type %s\n"), relname);
7292 i = rp->r_offset / unw_ent_size;
7294 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7297 aux->table[i].start.section = sym->st_shndx;
7298 aux->table[i].start.offset = sym->st_value + rp->r_addend;
7301 aux->table[i].end.section = sym->st_shndx;
7302 aux->table[i].end.offset = sym->st_value + rp->r_addend;
7312 aux->table_len = nentries;
7318 hppa_process_unwind (FILE * file)
7320 struct hppa_unw_aux_info aux;
7321 Elf_Internal_Shdr * unwsec = NULL;
7322 Elf_Internal_Shdr * strsec;
7323 Elf_Internal_Shdr * sec;
7326 if (string_table == NULL)
7329 memset (& aux, 0, sizeof (aux));
7331 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7333 if (sec->sh_type == SHT_SYMTAB
7334 && sec->sh_link < elf_header.e_shnum)
7336 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7338 strsec = section_headers + sec->sh_link;
7339 if (aux.strtab != NULL)
7341 error (_("Multiple auxillary string tables encountered\n"));
7344 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7347 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7349 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7354 printf (_("\nThere are no unwind sections in this file.\n"));
7356 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7358 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7360 printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7361 printable_section_name (sec),
7362 (unsigned long) sec->sh_offset,
7363 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7365 slurp_hppa_unwind_table (file, &aux, sec);
7366 if (aux.table_len > 0)
7367 dump_hppa_unwind (&aux);
7370 free ((char *) aux.table);
7378 free ((char *) aux.strtab);
7383 unsigned char * data; /* The unwind data. */
7384 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
7385 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
7386 unsigned long nrelas; /* The number of relocations. */
7387 unsigned int rel_type; /* REL or RELA ? */
7388 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
7391 struct arm_unw_aux_info
7393 FILE * file; /* The file containing the unwind sections. */
7394 Elf_Internal_Sym * symtab; /* The file's symbol table. */
7395 unsigned long nsyms; /* Number of symbols. */
7396 Elf_Internal_Sym * funtab; /* Sorted table of STT_FUNC symbols. */
7397 unsigned long nfuns; /* Number of these symbols. */
7398 char * strtab; /* The file's string table. */
7399 unsigned long strtab_size; /* Size of string table. */
7403 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7404 bfd_vma fn, struct absaddr addr)
7406 const char *procname;
7409 if (addr.section == SHN_UNDEF)
7412 find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7413 aux->strtab_size, addr, &procname,
7416 print_vma (fn, PREFIX_HEX);
7420 fputs (" <", stdout);
7421 fputs (procname, stdout);
7424 printf ("+0x%lx", (unsigned long) sym_offset);
7425 fputc ('>', stdout);
7432 arm_free_section (struct arm_section *arm_sec)
7434 if (arm_sec->data != NULL)
7435 free (arm_sec->data);
7437 if (arm_sec->rela != NULL)
7438 free (arm_sec->rela);
7441 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7442 cached section and install SEC instead.
7443 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7444 and return its valued in * WORDP, relocating if necessary.
7445 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7446 relocation's offset in ADDR.
7447 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7448 into the string table of the symbol associated with the reloc. If no
7449 reloc was applied store -1 there.
7450 5) Return TRUE upon success, FALSE otherwise. */
7453 get_unwind_section_word (struct arm_unw_aux_info * aux,
7454 struct arm_section * arm_sec,
7455 Elf_Internal_Shdr * sec,
7456 bfd_vma word_offset,
7457 unsigned int * wordp,
7458 struct absaddr * addr,
7461 Elf_Internal_Rela *rp;
7462 Elf_Internal_Sym *sym;
7463 const char * relname;
7465 bfd_boolean wrapped;
7467 if (sec == NULL || arm_sec == NULL)
7470 addr->section = SHN_UNDEF;
7473 if (sym_name != NULL)
7474 *sym_name = (bfd_vma) -1;
7476 /* If necessary, update the section cache. */
7477 if (sec != arm_sec->sec)
7479 Elf_Internal_Shdr *relsec;
7481 arm_free_section (arm_sec);
7484 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7485 sec->sh_size, _("unwind data"));
7486 arm_sec->rela = NULL;
7487 arm_sec->nrelas = 0;
7489 for (relsec = section_headers;
7490 relsec < section_headers + elf_header.e_shnum;
7493 if (relsec->sh_info >= elf_header.e_shnum
7494 || section_headers + relsec->sh_info != sec
7495 /* PR 15745: Check the section type as well. */
7496 || (relsec->sh_type != SHT_REL
7497 && relsec->sh_type != SHT_RELA))
7500 arm_sec->rel_type = relsec->sh_type;
7501 if (relsec->sh_type == SHT_REL)
7503 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7505 & arm_sec->rela, & arm_sec->nrelas))
7508 else /* relsec->sh_type == SHT_RELA */
7510 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7512 & arm_sec->rela, & arm_sec->nrelas))
7518 arm_sec->next_rela = arm_sec->rela;
7521 /* If there is no unwind data we can do nothing. */
7522 if (arm_sec->data == NULL)
7525 /* If the offset is invalid then fail. */
7526 if (word_offset > sec->sh_size - 4)
7529 /* Get the word at the required offset. */
7530 word = byte_get (arm_sec->data + word_offset, 4);
7532 /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128. */
7533 if (arm_sec->rela == NULL)
7539 /* Look through the relocs to find the one that applies to the provided offset. */
7541 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7543 bfd_vma prelval, offset;
7545 if (rp->r_offset > word_offset && !wrapped)
7550 if (rp->r_offset > word_offset)
7553 if (rp->r_offset & 3)
7555 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7556 (unsigned long) rp->r_offset);
7560 if (rp->r_offset < word_offset)
7563 /* PR 17531: file: 027-161405-0.004 */
7564 if (aux->symtab == NULL)
7567 if (arm_sec->rel_type == SHT_REL)
7569 offset = word & 0x7fffffff;
7570 if (offset & 0x40000000)
7571 offset |= ~ (bfd_vma) 0x7fffffff;
7573 else if (arm_sec->rel_type == SHT_RELA)
7574 offset = rp->r_addend;
7577 error (_("Unknown section relocation type %d encountered\n"),
7582 /* PR 17531 file: 027-1241568-0.004. */
7583 if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7585 error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7586 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7590 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7591 offset += sym->st_value;
7592 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7594 /* Check that we are processing the expected reloc type. */
7595 if (elf_header.e_machine == EM_ARM)
7597 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7598 if (relname == NULL)
7600 warn (_("Skipping unknown ARM relocation type: %d\n"),
7601 (int) ELF32_R_TYPE (rp->r_info));
7605 if (streq (relname, "R_ARM_NONE"))
7608 if (! streq (relname, "R_ARM_PREL31"))
7610 warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7614 else if (elf_header.e_machine == EM_TI_C6000)
7616 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7617 if (relname == NULL)
7619 warn (_("Skipping unknown C6000 relocation type: %d\n"),
7620 (int) ELF32_R_TYPE (rp->r_info));
7624 if (streq (relname, "R_C6000_NONE"))
7627 if (! streq (relname, "R_C6000_PREL31"))
7629 warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7637 /* This function currently only supports ARM and TI unwinders. */
7638 warn (_("Only TI and ARM unwinders are currently supported\n"));
7642 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7643 addr->section = sym->st_shndx;
7644 addr->offset = offset;
7647 * sym_name = sym->st_name;
7652 arm_sec->next_rela = rp;
7657 static const char *tic6x_unwind_regnames[16] =
7659 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7660 "A14", "A13", "A12", "A11", "A10",
7661 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7665 decode_tic6x_unwind_regmask (unsigned int mask)
7669 for (i = 12; mask; mask >>= 1, i--)
7673 fputs (tic6x_unwind_regnames[i], stdout);
7675 fputs (", ", stdout);
7681 if (remaining == 0 && more_words) \
7684 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
7685 data_offset, & word, & addr, NULL)) \
7691 #define GET_OP(OP) \
7696 (OP) = word >> 24; \
7701 printf (_("[Truncated opcode]\n")); \
7704 printf ("0x%02x ", OP)
7707 decode_arm_unwind_bytecode (struct arm_unw_aux_info * aux,
7709 unsigned int remaining,
7710 unsigned int more_words,
7711 bfd_vma data_offset,
7712 Elf_Internal_Shdr * data_sec,
7713 struct arm_section * data_arm_sec)
7715 struct absaddr addr;
7717 /* Decode the unwinding instructions. */
7720 unsigned int op, op2;
7729 printf (" 0x%02x ", op);
7731 if ((op & 0xc0) == 0x00)
7733 int offset = ((op & 0x3f) << 2) + 4;
7735 printf (" vsp = vsp + %d", offset);
7737 else if ((op & 0xc0) == 0x40)
7739 int offset = ((op & 0x3f) << 2) + 4;
7741 printf (" vsp = vsp - %d", offset);
7743 else if ((op & 0xf0) == 0x80)
7746 if (op == 0x80 && op2 == 0)
7747 printf (_("Refuse to unwind"));
7750 unsigned int mask = ((op & 0x0f) << 8) | op2;
7755 for (i = 0; i < 12; i++)
7756 if (mask & (1 << i))
7762 printf ("r%d", 4 + i);
7767 else if ((op & 0xf0) == 0x90)
7769 if (op == 0x9d || op == 0x9f)
7770 printf (_(" [Reserved]"));
7772 printf (" vsp = r%d", op & 0x0f);
7774 else if ((op & 0xf0) == 0xa0)
7776 int end = 4 + (op & 0x07);
7781 for (i = 4; i <= end; i++)
7797 else if (op == 0xb0)
7798 printf (_(" finish"));
7799 else if (op == 0xb1)
7802 if (op2 == 0 || (op2 & 0xf0) != 0)
7803 printf (_("[Spare]"));
7806 unsigned int mask = op2 & 0x0f;
7811 for (i = 0; i < 12; i++)
7812 if (mask & (1 << i))
7823 else if (op == 0xb2)
7825 unsigned char buf[9];
7826 unsigned int i, len;
7827 unsigned long offset;
7829 for (i = 0; i < sizeof (buf); i++)
7832 if ((buf[i] & 0x80) == 0)
7835 if (i == sizeof (buf))
7836 printf (_("corrupt change to vsp"));
7839 offset = read_uleb128 (buf, &len, buf + i + 1);
7840 assert (len == i + 1);
7841 offset = offset * 4 + 0x204;
7842 printf ("vsp = vsp + %ld", offset);
7845 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
7847 unsigned int first, last;
7854 printf ("pop {D%d", first);
7856 printf ("-D%d", first + last);
7859 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
7861 unsigned int count = op & 0x07;
7865 printf ("-D%d", 8 + count);
7868 else if (op >= 0xc0 && op <= 0xc5)
7870 unsigned int count = op & 0x07;
7872 printf (" pop {wR10");
7874 printf ("-wR%d", 10 + count);
7877 else if (op == 0xc6)
7879 unsigned int first, last;
7884 printf ("pop {wR%d", first);
7886 printf ("-wR%d", first + last);
7889 else if (op == 0xc7)
7892 if (op2 == 0 || (op2 & 0xf0) != 0)
7893 printf (_("[Spare]"));
7896 unsigned int mask = op2 & 0x0f;
7901 for (i = 0; i < 4; i++)
7902 if (mask & (1 << i))
7908 printf ("wCGR%d", i);
7914 printf (_(" [unsupported opcode]"));
7920 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info * aux,
7922 unsigned int remaining,
7923 unsigned int more_words,
7924 bfd_vma data_offset,
7925 Elf_Internal_Shdr * data_sec,
7926 struct arm_section * data_arm_sec)
7928 struct absaddr addr;
7930 /* Decode the unwinding instructions. */
7933 unsigned int op, op2;
7942 printf (" 0x%02x ", op);
7944 if ((op & 0xc0) == 0x00)
7946 int offset = ((op & 0x3f) << 3) + 8;
7947 printf (" sp = sp + %d", offset);
7949 else if ((op & 0xc0) == 0x80)
7952 if (op == 0x80 && op2 == 0)
7953 printf (_("Refuse to unwind"));
7956 unsigned int mask = ((op & 0x1f) << 8) | op2;
7958 printf ("pop compact {");
7962 decode_tic6x_unwind_regmask (mask);
7966 else if ((op & 0xf0) == 0xc0)
7974 unsigned int offset;
7978 /* Scan entire instruction first so that GET_OP output is not
7979 interleaved with disassembly. */
7981 for (i = 0; nregs < (op & 0xf); i++)
7987 regpos[nregs].offset = i * 2;
7988 regpos[nregs].reg = reg;
7995 regpos[nregs].offset = i * 2 + 1;
7996 regpos[nregs].reg = reg;
8001 printf (_("pop frame {"));
8003 for (i = i * 2; i > 0; i--)
8005 if (regpos[reg].offset == i - 1)
8007 name = tic6x_unwind_regnames[regpos[reg].reg];
8014 fputs (name, stdout);
8021 else if (op == 0xd0)
8022 printf (" MOV FP, SP");
8023 else if (op == 0xd1)
8024 printf (" __c6xabi_pop_rts");
8025 else if (op == 0xd2)
8027 unsigned char buf[9];
8028 unsigned int i, len;
8029 unsigned long offset;
8031 for (i = 0; i < sizeof (buf); i++)
8034 if ((buf[i] & 0x80) == 0)
8037 /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2. */
8038 if (i == sizeof (buf))
8040 printf ("<corrupt sp adjust>\n");
8041 warn (_("Corrupt stack pointer adjustment detected\n"));
8045 offset = read_uleb128 (buf, &len, buf + i + 1);
8046 assert (len == i + 1);
8047 offset = offset * 8 + 0x408;
8048 printf (_("sp = sp + %ld"), offset);
8050 else if ((op & 0xf0) == 0xe0)
8052 if ((op & 0x0f) == 7)
8055 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8059 printf (_(" [unsupported opcode]"));
8066 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8070 offset = word & 0x7fffffff;
8071 if (offset & 0x40000000)
8072 offset |= ~ (bfd_vma) 0x7fffffff;
8074 if (elf_header.e_machine == EM_TI_C6000)
8077 return offset + where;
8081 decode_arm_unwind (struct arm_unw_aux_info * aux,
8083 unsigned int remaining,
8084 bfd_vma data_offset,
8085 Elf_Internal_Shdr * data_sec,
8086 struct arm_section * data_arm_sec)
8089 unsigned int more_words = 0;
8090 struct absaddr addr;
8091 bfd_vma sym_name = (bfd_vma) -1;
8095 /* Fetch the first word.
8096 Note - when decoding an object file the address extracted
8097 here will always be 0. So we also pass in the sym_name
8098 parameter so that we can find the symbol associated with
8099 the personality routine. */
8100 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8101 & word, & addr, & sym_name))
8107 if ((word & 0x80000000) == 0)
8109 /* Expand prel31 for personality routine. */
8111 const char *procname;
8113 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8114 printf (_(" Personality routine: "));
8116 && addr.section == SHN_UNDEF && addr.offset == 0
8117 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8119 procname = aux->strtab + sym_name;
8120 print_vma (fn, PREFIX_HEX);
8123 fputs (" <", stdout);
8124 fputs (procname, stdout);
8125 fputc ('>', stdout);
8129 procname = arm_print_vma_and_name (aux, fn, addr);
8130 fputc ('\n', stdout);
8132 /* The GCC personality routines use the standard compact
8133 encoding, starting with one byte giving the number of
8135 if (procname != NULL
8136 && (const_strneq (procname, "__gcc_personality_v0")
8137 || const_strneq (procname, "__gxx_personality_v0")
8138 || const_strneq (procname, "__gcj_personality_v0")
8139 || const_strneq (procname, "__gnu_objc_personality_v0")))
8146 printf (_(" [Truncated data]\n"));
8149 more_words = word >> 24;
8159 /* ARM EHABI Section 6.3:
8161 An exception-handling table entry for the compact model looks like:
8165 1 0 index Data for personalityRoutine[index] */
8167 if (elf_header.e_machine == EM_ARM
8168 && (word & 0x70000000))
8169 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8171 per_index = (word >> 24) & 0x7f;
8172 printf (_(" Compact model index: %d\n"), per_index);
8179 else if (per_index < 3)
8181 more_words = (word >> 16) & 0xff;
8187 switch (elf_header.e_machine)
8192 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8193 data_offset, data_sec, data_arm_sec);
8197 warn (_("Unknown ARM compact model index encountered\n"));
8198 printf (_(" [reserved]\n"));
8205 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8206 data_offset, data_sec, data_arm_sec);
8208 else if (per_index < 5)
8210 if (((word >> 17) & 0x7f) == 0x7f)
8211 printf (_(" Restore stack from frame pointer\n"));
8213 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
8214 printf (_(" Registers restored: "));
8216 printf (" (compact) ");
8217 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8219 printf (_(" Return register: %s\n"),
8220 tic6x_unwind_regnames[word & 0xf]);
8223 printf (_(" [reserved (%d)]\n"), per_index);
8227 error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8228 elf_header.e_machine);
8231 /* Decode the descriptors. Not implemented. */
8235 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8237 struct arm_section exidx_arm_sec, extab_arm_sec;
8238 unsigned int i, exidx_len;
8239 unsigned long j, nfuns;
8241 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8242 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8243 exidx_len = exidx_sec->sh_size / 8;
8245 aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8246 for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8247 if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8248 aux->funtab[nfuns++] = aux->symtab[j];
8250 qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8252 for (i = 0; i < exidx_len; i++)
8254 unsigned int exidx_fn, exidx_entry;
8255 struct absaddr fn_addr, entry_addr;
8258 fputc ('\n', stdout);
8260 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8261 8 * i, & exidx_fn, & fn_addr, NULL)
8262 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8263 8 * i + 4, & exidx_entry, & entry_addr, NULL))
8266 arm_free_section (& exidx_arm_sec);
8267 arm_free_section (& extab_arm_sec);
8271 /* ARM EHABI, Section 5:
8272 An index table entry consists of 2 words.
8273 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
8274 if (exidx_fn & 0x80000000)
8275 warn (_("corrupt index table entry: %x\n"), exidx_fn);
8277 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8279 arm_print_vma_and_name (aux, fn, fn_addr);
8280 fputs (": ", stdout);
8282 if (exidx_entry == 1)
8284 print_vma (exidx_entry, PREFIX_HEX);
8285 fputs (" [cantunwind]\n", stdout);
8287 else if (exidx_entry & 0x80000000)
8289 print_vma (exidx_entry, PREFIX_HEX);
8290 fputc ('\n', stdout);
8291 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8295 bfd_vma table, table_offset = 0;
8296 Elf_Internal_Shdr *table_sec;
8298 fputs ("@", stdout);
8299 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8300 print_vma (table, PREFIX_HEX);
8303 /* Locate the matching .ARM.extab. */
8304 if (entry_addr.section != SHN_UNDEF
8305 && entry_addr.section < elf_header.e_shnum)
8307 table_sec = section_headers + entry_addr.section;
8308 table_offset = entry_addr.offset;
8312 table_sec = find_section_by_address (table);
8313 if (table_sec != NULL)
8314 table_offset = table - table_sec->sh_addr;
8316 if (table_sec == NULL)
8318 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8319 (unsigned long) table);
8322 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8330 arm_free_section (&exidx_arm_sec);
8331 arm_free_section (&extab_arm_sec);
8334 /* Used for both ARM and C6X unwinding tables. */
8337 arm_process_unwind (FILE *file)
8339 struct arm_unw_aux_info aux;
8340 Elf_Internal_Shdr *unwsec = NULL;
8341 Elf_Internal_Shdr *strsec;
8342 Elf_Internal_Shdr *sec;
8344 unsigned int sec_type;
8346 switch (elf_header.e_machine)
8349 sec_type = SHT_ARM_EXIDX;
8353 sec_type = SHT_C6000_UNWIND;
8357 error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8358 elf_header.e_machine);
8362 if (string_table == NULL)
8365 memset (& aux, 0, sizeof (aux));
8368 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8370 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8372 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8374 strsec = section_headers + sec->sh_link;
8376 /* PR binutils/17531 file: 011-12666-0.004. */
8377 if (aux.strtab != NULL)
8379 error (_("Multiple string tables found in file.\n"));
8382 aux.strtab = get_data (NULL, file, strsec->sh_offset,
8383 1, strsec->sh_size, _("string table"));
8384 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8386 else if (sec->sh_type == sec_type)
8391 printf (_("\nThere are no unwind sections in this file.\n"));
8393 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8395 if (sec->sh_type == sec_type)
8397 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8398 printable_section_name (sec),
8399 (unsigned long) sec->sh_offset,
8400 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8402 dump_arm_unwind (&aux, sec);
8409 free ((char *) aux.strtab);
8413 process_unwind (FILE * file)
8415 struct unwind_handler
8418 void (* handler)(FILE *);
8421 { EM_ARM, arm_process_unwind },
8422 { EM_IA_64, ia64_process_unwind },
8423 { EM_PARISC, hppa_process_unwind },
8424 { EM_TI_C6000, arm_process_unwind },
8432 for (i = 0; handlers[i].handler != NULL; i++)
8433 if (elf_header.e_machine == handlers[i].machtype)
8435 handlers[i].handler (file);
8439 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8440 get_machine_name (elf_header.e_machine));
8444 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8446 switch (entry->d_tag)
8449 if (entry->d_un.d_val == 0)
8453 static const char * opts[] =
8455 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8456 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8457 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8458 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8464 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8465 if (entry->d_un.d_val & (1 << cnt))
8467 printf ("%s%s", first ? "" : " ", opts[cnt]);
8473 case DT_MIPS_IVERSION:
8474 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8475 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8479 sprintf_vma (buf, entry->d_un.d_ptr);
8480 /* Note: coded this way so that there is a single string for translation. */
8481 printf (_("<corrupt: %s>"), buf);
8485 case DT_MIPS_TIME_STAMP:
8489 time_t atime = entry->d_un.d_val;
8491 tmp = gmtime (&atime);
8492 /* PR 17531: file: 6accc532. */
8494 snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8496 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8497 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8498 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8499 printf (_("Time Stamp: %s"), timebuf);
8503 case DT_MIPS_RLD_VERSION:
8504 case DT_MIPS_LOCAL_GOTNO:
8505 case DT_MIPS_CONFLICTNO:
8506 case DT_MIPS_LIBLISTNO:
8507 case DT_MIPS_SYMTABNO:
8508 case DT_MIPS_UNREFEXTNO:
8509 case DT_MIPS_HIPAGENO:
8510 case DT_MIPS_DELTA_CLASS_NO:
8511 case DT_MIPS_DELTA_INSTANCE_NO:
8512 case DT_MIPS_DELTA_RELOC_NO:
8513 case DT_MIPS_DELTA_SYM_NO:
8514 case DT_MIPS_DELTA_CLASSSYM_NO:
8515 case DT_MIPS_COMPACT_SIZE:
8516 print_vma (entry->d_un.d_ptr, DEC);
8520 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8526 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8528 switch (entry->d_tag)
8530 case DT_HP_DLD_FLAGS:
8539 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8540 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8541 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8542 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8543 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8544 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8545 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8546 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8547 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8548 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8549 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8550 { DT_HP_GST, "HP_GST" },
8551 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8552 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8553 { DT_HP_NODELETE, "HP_NODELETE" },
8554 { DT_HP_GROUP, "HP_GROUP" },
8555 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8559 bfd_vma val = entry->d_un.d_val;
8561 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8562 if (val & flags[cnt].bit)
8566 fputs (flags[cnt].str, stdout);
8568 val ^= flags[cnt].bit;
8571 if (val != 0 || first)
8575 print_vma (val, HEX);
8581 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8589 /* VMS vs Unix time offset and factor. */
8591 #define VMS_EPOCH_OFFSET 35067168000000000LL
8592 #define VMS_GRANULARITY_FACTOR 10000000
8594 /* Display a VMS time in a human readable format. */
8597 print_vms_time (bfd_int64_t vmstime)
8602 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8603 tm = gmtime (&unxtime);
8604 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8605 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8606 tm->tm_hour, tm->tm_min, tm->tm_sec);
8611 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8613 switch (entry->d_tag)
8615 case DT_IA_64_PLT_RESERVE:
8616 /* First 3 slots reserved. */
8617 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8619 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8622 case DT_IA_64_VMS_LINKTIME:
8624 print_vms_time (entry->d_un.d_val);
8628 case DT_IA_64_VMS_LNKFLAGS:
8629 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8630 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8631 printf (" CALL_DEBUG");
8632 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8633 printf (" NOP0BUFS");
8634 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8635 printf (" P0IMAGE");
8636 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8637 printf (" MKTHREADS");
8638 if (entry->d_un.d_val & VMS_LF_UPCALLS)
8639 printf (" UPCALLS");
8640 if (entry->d_un.d_val & VMS_LF_IMGSTA)
8642 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8643 printf (" INITIALIZE");
8644 if (entry->d_un.d_val & VMS_LF_MAIN)
8646 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8647 printf (" EXE_INIT");
8648 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8649 printf (" TBK_IN_IMG");
8650 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8651 printf (" DBG_IN_IMG");
8652 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8653 printf (" TBK_IN_DSF");
8654 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8655 printf (" DBG_IN_DSF");
8656 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8657 printf (" SIGNATURES");
8658 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8659 printf (" REL_SEG_OFF");
8663 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8670 get_32bit_dynamic_section (FILE * file)
8672 Elf32_External_Dyn * edyn;
8673 Elf32_External_Dyn * ext;
8674 Elf_Internal_Dyn * entry;
8676 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8677 dynamic_size, _("dynamic section"));
8681 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8682 might not have the luxury of section headers. Look for the DT_NULL
8683 terminator to determine the number of entries. */
8684 for (ext = edyn, dynamic_nent = 0;
8685 (char *) ext < (char *) edyn + dynamic_size - sizeof (* entry);
8689 if (BYTE_GET (ext->d_tag) == DT_NULL)
8693 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8695 if (dynamic_section == NULL)
8697 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8698 (unsigned long) dynamic_nent);
8703 for (ext = edyn, entry = dynamic_section;
8704 entry < dynamic_section + dynamic_nent;
8707 entry->d_tag = BYTE_GET (ext->d_tag);
8708 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8717 get_64bit_dynamic_section (FILE * file)
8719 Elf64_External_Dyn * edyn;
8720 Elf64_External_Dyn * ext;
8721 Elf_Internal_Dyn * entry;
8723 /* Read in the data. */
8724 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8725 dynamic_size, _("dynamic section"));
8729 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8730 might not have the luxury of section headers. Look for the DT_NULL
8731 terminator to determine the number of entries. */
8732 for (ext = edyn, dynamic_nent = 0;
8733 /* PR 17533 file: 033-67080-0.004 - do not read off the end of the buffer. */
8734 (char *) ext < ((char *) edyn) + dynamic_size - sizeof (* ext);
8738 if (BYTE_GET (ext->d_tag) == DT_NULL)
8742 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8744 if (dynamic_section == NULL)
8746 error (_("Out of memory allocating space for %lu dynamic entries\n"),
8747 (unsigned long) dynamic_nent);
8752 /* Convert from external to internal formats. */
8753 for (ext = edyn, entry = dynamic_section;
8754 entry < dynamic_section + dynamic_nent;
8757 entry->d_tag = BYTE_GET (ext->d_tag);
8758 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8767 print_dynamic_flags (bfd_vma flags)
8775 flag = flags & - flags;
8785 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
8786 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
8787 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
8788 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
8789 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
8790 default: fputs (_("unknown"), stdout); break;
8796 /* Parse and display the contents of the dynamic section. */
8799 process_dynamic_section (FILE * file)
8801 Elf_Internal_Dyn * entry;
8803 if (dynamic_size == 0)
8806 printf (_("\nThere is no dynamic section in this file.\n"));
8813 if (! get_32bit_dynamic_section (file))
8816 else if (! get_64bit_dynamic_section (file))
8819 /* Find the appropriate symbol table. */
8820 if (dynamic_symbols == NULL)
8822 for (entry = dynamic_section;
8823 entry < dynamic_section + dynamic_nent;
8826 Elf_Internal_Shdr section;
8828 if (entry->d_tag != DT_SYMTAB)
8831 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
8833 /* Since we do not know how big the symbol table is,
8834 we default to reading in the entire file (!) and
8835 processing that. This is overkill, I know, but it
8837 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8839 if (archive_file_offset != 0)
8840 section.sh_size = archive_file_size - section.sh_offset;
8843 if (fseek (file, 0, SEEK_END))
8844 error (_("Unable to seek to end of file!\n"));
8846 section.sh_size = ftell (file) - section.sh_offset;
8850 section.sh_entsize = sizeof (Elf32_External_Sym);
8852 section.sh_entsize = sizeof (Elf64_External_Sym);
8853 section.sh_name = string_table_length;
8855 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion, & num_dynamic_syms);
8856 if (num_dynamic_syms < 1)
8858 error (_("Unable to determine the number of symbols to load\n"));
8864 /* Similarly find a string table. */
8865 if (dynamic_strings == NULL)
8867 for (entry = dynamic_section;
8868 entry < dynamic_section + dynamic_nent;
8871 unsigned long offset;
8874 if (entry->d_tag != DT_STRTAB)
8877 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
8879 /* Since we do not know how big the string table is,
8880 we default to reading in the entire file (!) and
8881 processing that. This is overkill, I know, but it
8884 offset = offset_from_vma (file, entry->d_un.d_val, 0);
8886 if (archive_file_offset != 0)
8887 str_tab_len = archive_file_size - offset;
8890 if (fseek (file, 0, SEEK_END))
8891 error (_("Unable to seek to end of file\n"));
8892 str_tab_len = ftell (file) - offset;
8895 if (str_tab_len < 1)
8898 (_("Unable to determine the length of the dynamic string table\n"));
8902 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
8904 _("dynamic string table"));
8905 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
8910 /* And find the syminfo section if available. */
8911 if (dynamic_syminfo == NULL)
8913 unsigned long syminsz = 0;
8915 for (entry = dynamic_section;
8916 entry < dynamic_section + dynamic_nent;
8919 if (entry->d_tag == DT_SYMINENT)
8921 /* Note: these braces are necessary to avoid a syntax
8922 error from the SunOS4 C compiler. */
8923 /* PR binutils/17531: A corrupt file can trigger this test.
8924 So do not use an assert, instead generate an error message. */
8925 if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
8926 error (_("Bad value (%d) for SYMINENT entry\n"),
8927 (int) entry->d_un.d_val);
8929 else if (entry->d_tag == DT_SYMINSZ)
8930 syminsz = entry->d_un.d_val;
8931 else if (entry->d_tag == DT_SYMINFO)
8932 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
8936 if (dynamic_syminfo_offset != 0 && syminsz != 0)
8938 Elf_External_Syminfo * extsyminfo;
8939 Elf_External_Syminfo * extsym;
8940 Elf_Internal_Syminfo * syminfo;
8942 /* There is a syminfo section. Read the data. */
8943 extsyminfo = (Elf_External_Syminfo *)
8944 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
8945 _("symbol information"));
8949 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
8950 if (dynamic_syminfo == NULL)
8952 error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
8953 (unsigned long) syminsz);
8957 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8958 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8959 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8960 ++syminfo, ++extsym)
8962 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8963 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8970 if (do_dynamic && dynamic_addr)
8971 printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
8972 dynamic_addr, (unsigned long) dynamic_nent);
8974 printf (_(" Tag Type Name/Value\n"));
8976 for (entry = dynamic_section;
8977 entry < dynamic_section + dynamic_nent;
8985 print_vma (entry->d_tag, FULL_HEX);
8986 dtype = get_dynamic_type (entry->d_tag);
8987 printf (" (%s)%*s", dtype,
8988 ((is_32bit_elf ? 27 : 19)
8989 - (int) strlen (dtype)),
8993 switch (entry->d_tag)
8997 print_dynamic_flags (entry->d_un.d_val);
9007 switch (entry->d_tag)
9010 printf (_("Auxiliary library"));
9014 printf (_("Filter library"));
9018 printf (_("Configuration file"));
9022 printf (_("Dependency audit library"));
9026 printf (_("Audit library"));
9030 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9031 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9035 print_vma (entry->d_un.d_val, PREFIX_HEX);
9044 printf (_("Flags:"));
9046 if (entry->d_un.d_val == 0)
9047 printf (_(" None\n"));
9050 unsigned long int val = entry->d_un.d_val;
9052 if (val & DTF_1_PARINIT)
9054 printf (" PARINIT");
9055 val ^= DTF_1_PARINIT;
9057 if (val & DTF_1_CONFEXP)
9059 printf (" CONFEXP");
9060 val ^= DTF_1_CONFEXP;
9063 printf (" %lx", val);
9072 printf (_("Flags:"));
9074 if (entry->d_un.d_val == 0)
9075 printf (_(" None\n"));
9078 unsigned long int val = entry->d_un.d_val;
9080 if (val & DF_P1_LAZYLOAD)
9082 printf (" LAZYLOAD");
9083 val ^= DF_P1_LAZYLOAD;
9085 if (val & DF_P1_GROUPPERM)
9087 printf (" GROUPPERM");
9088 val ^= DF_P1_GROUPPERM;
9091 printf (" %lx", val);
9100 printf (_("Flags:"));
9101 if (entry->d_un.d_val == 0)
9102 printf (_(" None\n"));
9105 unsigned long int val = entry->d_un.d_val;
9112 if (val & DF_1_GLOBAL)
9117 if (val & DF_1_GROUP)
9122 if (val & DF_1_NODELETE)
9124 printf (" NODELETE");
9125 val ^= DF_1_NODELETE;
9127 if (val & DF_1_LOADFLTR)
9129 printf (" LOADFLTR");
9130 val ^= DF_1_LOADFLTR;
9132 if (val & DF_1_INITFIRST)
9134 printf (" INITFIRST");
9135 val ^= DF_1_INITFIRST;
9137 if (val & DF_1_NOOPEN)
9142 if (val & DF_1_ORIGIN)
9147 if (val & DF_1_DIRECT)
9152 if (val & DF_1_TRANS)
9157 if (val & DF_1_INTERPOSE)
9159 printf (" INTERPOSE");
9160 val ^= DF_1_INTERPOSE;
9162 if (val & DF_1_NODEFLIB)
9164 printf (" NODEFLIB");
9165 val ^= DF_1_NODEFLIB;
9167 if (val & DF_1_NODUMP)
9172 if (val & DF_1_CONFALT)
9174 printf (" CONFALT");
9175 val ^= DF_1_CONFALT;
9177 if (val & DF_1_ENDFILTEE)
9179 printf (" ENDFILTEE");
9180 val ^= DF_1_ENDFILTEE;
9182 if (val & DF_1_DISPRELDNE)
9184 printf (" DISPRELDNE");
9185 val ^= DF_1_DISPRELDNE;
9187 if (val & DF_1_DISPRELPND)
9189 printf (" DISPRELPND");
9190 val ^= DF_1_DISPRELPND;
9192 if (val & DF_1_NODIRECT)
9194 printf (" NODIRECT");
9195 val ^= DF_1_NODIRECT;
9197 if (val & DF_1_IGNMULDEF)
9199 printf (" IGNMULDEF");
9200 val ^= DF_1_IGNMULDEF;
9202 if (val & DF_1_NOKSYMS)
9204 printf (" NOKSYMS");
9205 val ^= DF_1_NOKSYMS;
9207 if (val & DF_1_NOHDR)
9212 if (val & DF_1_EDITED)
9217 if (val & DF_1_NORELOC)
9219 printf (" NORELOC");
9220 val ^= DF_1_NORELOC;
9222 if (val & DF_1_SYMINTPOSE)
9224 printf (" SYMINTPOSE");
9225 val ^= DF_1_SYMINTPOSE;
9227 if (val & DF_1_GLOBAUDIT)
9229 printf (" GLOBAUDIT");
9230 val ^= DF_1_GLOBAUDIT;
9232 if (val & DF_1_SINGLETON)
9234 printf (" SINGLETON");
9235 val ^= DF_1_SINGLETON;
9238 printf (" %lx", val);
9245 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9247 puts (get_dynamic_type (entry->d_un.d_val));
9267 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9273 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9274 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9280 switch (entry->d_tag)
9283 printf (_("Shared library: [%s]"), name);
9285 if (streq (name, program_interpreter))
9286 printf (_(" program interpreter"));
9290 printf (_("Library soname: [%s]"), name);
9294 printf (_("Library rpath: [%s]"), name);
9298 printf (_("Library runpath: [%s]"), name);
9302 print_vma (entry->d_un.d_val, PREFIX_HEX);
9307 print_vma (entry->d_un.d_val, PREFIX_HEX);
9320 dynamic_info[entry->d_tag] = entry->d_un.d_val;
9324 case DT_INIT_ARRAYSZ:
9325 case DT_FINI_ARRAYSZ:
9326 case DT_GNU_CONFLICTSZ:
9327 case DT_GNU_LIBLISTSZ:
9330 print_vma (entry->d_un.d_val, UNSIGNED);
9331 printf (_(" (bytes)\n"));
9341 print_vma (entry->d_un.d_val, UNSIGNED);
9354 if (entry->d_tag == DT_USED
9355 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9357 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9361 printf (_("Not needed object: [%s]\n"), name);
9366 print_vma (entry->d_un.d_val, PREFIX_HEX);
9372 /* The value of this entry is ignored. */
9377 case DT_GNU_PRELINKED:
9381 time_t atime = entry->d_un.d_val;
9383 tmp = gmtime (&atime);
9384 /* PR 17533 file: 041-1244816-0.004. */
9386 printf (_("<corrupt time val: %lx"),
9387 (unsigned long) atime);
9389 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9390 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9391 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9397 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9400 print_vma (entry->d_un.d_val, PREFIX_HEX);
9406 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9407 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9412 switch (elf_header.e_machine)
9415 case EM_MIPS_RS3_LE:
9416 dynamic_section_mips_val (entry);
9419 dynamic_section_parisc_val (entry);
9422 dynamic_section_ia64_val (entry);
9425 print_vma (entry->d_un.d_val, PREFIX_HEX);
9437 get_ver_flags (unsigned int flags)
9439 static char buff[32];
9446 if (flags & VER_FLG_BASE)
9447 strcat (buff, "BASE ");
9449 if (flags & VER_FLG_WEAK)
9451 if (flags & VER_FLG_BASE)
9452 strcat (buff, "| ");
9454 strcat (buff, "WEAK ");
9457 if (flags & VER_FLG_INFO)
9459 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9460 strcat (buff, "| ");
9462 strcat (buff, "INFO ");
9465 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9466 strcat (buff, _("| <unknown>"));
9471 /* Display the contents of the version sections. */
9474 process_version_sections (FILE * file)
9476 Elf_Internal_Shdr * section;
9483 for (i = 0, section = section_headers;
9484 i < elf_header.e_shnum;
9487 switch (section->sh_type)
9489 case SHT_GNU_verdef:
9491 Elf_External_Verdef * edefs;
9498 printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9499 printable_section_name (section),
9502 printf (_(" Addr: 0x"));
9503 printf_vma (section->sh_addr);
9504 printf (_(" Offset: %#08lx Link: %u (%s)"),
9505 (unsigned long) section->sh_offset, section->sh_link,
9506 printable_section_name_from_index (section->sh_link));
9508 edefs = (Elf_External_Verdef *)
9509 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9510 _("version definition section"));
9513 endbuf = (char *) edefs + section->sh_size;
9515 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9518 Elf_External_Verdef * edef;
9519 Elf_Internal_Verdef ent;
9520 Elf_External_Verdaux * eaux;
9521 Elf_Internal_Verdaux aux;
9525 /* Check for very large indicies. */
9526 if (idx > (size_t) (endbuf - (char *) edefs))
9529 vstart = ((char *) edefs) + idx;
9530 if (vstart + sizeof (*edef) > endbuf)
9533 edef = (Elf_External_Verdef *) vstart;
9535 ent.vd_version = BYTE_GET (edef->vd_version);
9536 ent.vd_flags = BYTE_GET (edef->vd_flags);
9537 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
9538 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
9539 ent.vd_hash = BYTE_GET (edef->vd_hash);
9540 ent.vd_aux = BYTE_GET (edef->vd_aux);
9541 ent.vd_next = BYTE_GET (edef->vd_next);
9543 printf (_(" %#06x: Rev: %d Flags: %s"),
9544 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9546 printf (_(" Index: %d Cnt: %d "),
9547 ent.vd_ndx, ent.vd_cnt);
9549 /* Check for overflow. */
9550 if (ent.vd_aux > (size_t) (endbuf - vstart))
9553 vstart += ent.vd_aux;
9555 eaux = (Elf_External_Verdaux *) vstart;
9557 aux.vda_name = BYTE_GET (eaux->vda_name);
9558 aux.vda_next = BYTE_GET (eaux->vda_next);
9560 if (VALID_DYNAMIC_NAME (aux.vda_name))
9561 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9563 printf (_("Name index: %ld\n"), aux.vda_name);
9565 isum = idx + ent.vd_aux;
9567 for (j = 1; j < ent.vd_cnt; j++)
9569 /* Check for overflow. */
9570 if (aux.vda_next > (size_t) (endbuf - vstart))
9573 isum += aux.vda_next;
9574 vstart += aux.vda_next;
9576 eaux = (Elf_External_Verdaux *) vstart;
9577 if (vstart + sizeof (*eaux) > endbuf)
9580 aux.vda_name = BYTE_GET (eaux->vda_name);
9581 aux.vda_next = BYTE_GET (eaux->vda_next);
9583 if (VALID_DYNAMIC_NAME (aux.vda_name))
9584 printf (_(" %#06x: Parent %d: %s\n"),
9585 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9587 printf (_(" %#06x: Parent %d, name index: %ld\n"),
9588 isum, j, aux.vda_name);
9592 printf (_(" Version def aux past end of section\n"));
9594 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2. */
9595 if (idx + ent.vd_next <= idx)
9601 if (cnt < section->sh_info)
9602 printf (_(" Version definition past end of section\n"));
9608 case SHT_GNU_verneed:
9610 Elf_External_Verneed * eneed;
9617 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9618 printable_section_name (section), section->sh_info);
9620 printf (_(" Addr: 0x"));
9621 printf_vma (section->sh_addr);
9622 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9623 (unsigned long) section->sh_offset, section->sh_link,
9624 printable_section_name_from_index (section->sh_link));
9626 eneed = (Elf_External_Verneed *) get_data (NULL, file,
9627 section->sh_offset, 1,
9629 _("Version Needs section"));
9632 endbuf = (char *) eneed + section->sh_size;
9634 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9636 Elf_External_Verneed * entry;
9637 Elf_Internal_Verneed ent;
9642 if (idx > (size_t) (endbuf - (char *) eneed))
9645 vstart = ((char *) eneed) + idx;
9646 if (vstart + sizeof (*entry) > endbuf)
9649 entry = (Elf_External_Verneed *) vstart;
9651 ent.vn_version = BYTE_GET (entry->vn_version);
9652 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
9653 ent.vn_file = BYTE_GET (entry->vn_file);
9654 ent.vn_aux = BYTE_GET (entry->vn_aux);
9655 ent.vn_next = BYTE_GET (entry->vn_next);
9657 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
9659 if (VALID_DYNAMIC_NAME (ent.vn_file))
9660 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9662 printf (_(" File: %lx"), ent.vn_file);
9664 printf (_(" Cnt: %d\n"), ent.vn_cnt);
9666 /* Check for overflow. */
9667 if (ent.vn_aux > (size_t) (endbuf - vstart))
9669 vstart += ent.vn_aux;
9671 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9673 Elf_External_Vernaux * eaux;
9674 Elf_Internal_Vernaux aux;
9676 if (vstart + sizeof (*eaux) > endbuf)
9678 eaux = (Elf_External_Vernaux *) vstart;
9680 aux.vna_hash = BYTE_GET (eaux->vna_hash);
9681 aux.vna_flags = BYTE_GET (eaux->vna_flags);
9682 aux.vna_other = BYTE_GET (eaux->vna_other);
9683 aux.vna_name = BYTE_GET (eaux->vna_name);
9684 aux.vna_next = BYTE_GET (eaux->vna_next);
9686 if (VALID_DYNAMIC_NAME (aux.vna_name))
9687 printf (_(" %#06x: Name: %s"),
9688 isum, GET_DYNAMIC_NAME (aux.vna_name));
9690 printf (_(" %#06x: Name index: %lx"),
9691 isum, aux.vna_name);
9693 printf (_(" Flags: %s Version: %d\n"),
9694 get_ver_flags (aux.vna_flags), aux.vna_other);
9696 /* Check for overflow. */
9697 if (aux.vna_next > (size_t) (endbuf - vstart)
9698 || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9700 warn (_("Invalid vna_next field of %lx\n"),
9705 isum += aux.vna_next;
9706 vstart += aux.vna_next;
9710 warn (_("Missing Version Needs auxillary information\n"));
9712 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9714 warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9715 cnt = section->sh_info;
9721 if (cnt < section->sh_info)
9722 warn (_("Missing Version Needs information\n"));
9728 case SHT_GNU_versym:
9730 Elf_Internal_Shdr * link_section;
9733 unsigned char * edata;
9734 unsigned short * data;
9736 Elf_Internal_Sym * symbols;
9737 Elf_Internal_Shdr * string_sec;
9738 unsigned long num_syms;
9741 if (section->sh_link >= elf_header.e_shnum)
9744 link_section = section_headers + section->sh_link;
9745 total = section->sh_size / sizeof (Elf_External_Versym);
9747 if (link_section->sh_link >= elf_header.e_shnum)
9752 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9753 if (symbols == NULL)
9756 string_sec = section_headers + link_section->sh_link;
9758 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9759 string_sec->sh_size,
9760 _("version string table"));
9767 printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
9768 printable_section_name (section), (unsigned long) total);
9770 printf (_(" Addr: "));
9771 printf_vma (section->sh_addr);
9772 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
9773 (unsigned long) section->sh_offset, section->sh_link,
9774 printable_section_name (link_section));
9776 off = offset_from_vma (file,
9777 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9778 total * sizeof (short));
9779 edata = (unsigned char *) get_data (NULL, file, off, total,
9781 _("version symbol data"));
9789 data = (short unsigned int *) cmalloc (total, sizeof (short));
9791 for (cnt = total; cnt --;)
9792 data[cnt] = byte_get (edata + cnt * sizeof (short),
9797 for (cnt = 0; cnt < total; cnt += 4)
9800 int check_def, check_need;
9803 printf (" %03x:", cnt);
9805 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
9806 switch (data[cnt + j])
9809 fputs (_(" 0 (*local*) "), stdout);
9813 fputs (_(" 1 (*global*) "), stdout);
9817 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
9818 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
9820 /* If this index value is greater than the size of the symbols
9821 array, break to avoid an out-of-bounds read. */
9822 if ((unsigned long)(cnt + j) >= num_syms)
9824 warn (_("invalid index into symbol array\n"));
9830 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
9831 || section_headers[symbols[cnt + j].st_shndx].sh_type
9834 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
9841 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
9843 Elf_Internal_Verneed ivn;
9844 unsigned long offset;
9846 offset = offset_from_vma
9847 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9848 sizeof (Elf_External_Verneed));
9852 Elf_Internal_Vernaux ivna;
9853 Elf_External_Verneed evn;
9854 Elf_External_Vernaux evna;
9855 unsigned long a_off;
9857 if (get_data (&evn, file, offset, sizeof (evn), 1,
9858 _("version need")) == NULL)
9861 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9862 ivn.vn_next = BYTE_GET (evn.vn_next);
9864 a_off = offset + ivn.vn_aux;
9868 if (get_data (&evna, file, a_off, sizeof (evna),
9869 1, _("version need aux (2)")) == NULL)
9876 ivna.vna_next = BYTE_GET (evna.vna_next);
9877 ivna.vna_other = BYTE_GET (evna.vna_other);
9880 a_off += ivna.vna_next;
9882 while (ivna.vna_other != data[cnt + j]
9883 && ivna.vna_next != 0);
9885 if (ivna.vna_other == data[cnt + j])
9887 ivna.vna_name = BYTE_GET (evna.vna_name);
9889 if (ivna.vna_name >= string_sec->sh_size)
9890 name = _("*invalid*");
9892 name = strtab + ivna.vna_name;
9893 nn += printf ("(%s%-*s",
9895 12 - (int) strlen (name),
9901 offset += ivn.vn_next;
9903 while (ivn.vn_next);
9906 if (check_def && data[cnt + j] != 0x8001
9907 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9909 Elf_Internal_Verdef ivd;
9910 Elf_External_Verdef evd;
9911 unsigned long offset;
9913 offset = offset_from_vma
9914 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9919 if (get_data (&evd, file, offset, sizeof (evd), 1,
9920 _("version def")) == NULL)
9923 /* PR 17531: file: 046-1082287-0.004. */
9924 ivd.vd_ndx = (data[cnt + j] & VERSYM_VERSION) + 1;
9929 ivd.vd_next = BYTE_GET (evd.vd_next);
9930 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9933 offset += ivd.vd_next;
9935 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
9936 && ivd.vd_next != 0);
9938 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
9940 Elf_External_Verdaux evda;
9941 Elf_Internal_Verdaux ivda;
9943 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9945 if (get_data (&evda, file,
9946 offset - ivd.vd_next + ivd.vd_aux,
9948 _("version def aux")) == NULL)
9951 ivda.vda_name = BYTE_GET (evda.vda_name);
9953 if (ivda.vda_name >= string_sec->sh_size)
9954 name = _("*invalid*");
9956 name = strtab + ivda.vda_name;
9957 nn += printf ("(%s%-*s",
9959 12 - (int) strlen (name),
9965 printf ("%*c", 18 - nn, ' ');
9983 printf (_("\nNo version information found in this file.\n"));
9989 get_symbol_binding (unsigned int binding)
9991 static char buff[32];
9995 case STB_LOCAL: return "LOCAL";
9996 case STB_GLOBAL: return "GLOBAL";
9997 case STB_WEAK: return "WEAK";
9999 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10000 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10002 else if (binding >= STB_LOOS && binding <= STB_HIOS)
10004 if (binding == STB_GNU_UNIQUE
10005 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10006 /* GNU is still using the default value 0. */
10007 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10009 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10012 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10017 static const char *
10018 get_symbol_type (unsigned int type)
10020 static char buff[32];
10024 case STT_NOTYPE: return "NOTYPE";
10025 case STT_OBJECT: return "OBJECT";
10026 case STT_FUNC: return "FUNC";
10027 case STT_SECTION: return "SECTION";
10028 case STT_FILE: return "FILE";
10029 case STT_COMMON: return "COMMON";
10030 case STT_TLS: return "TLS";
10031 case STT_RELC: return "RELC";
10032 case STT_SRELC: return "SRELC";
10034 if (type >= STT_LOPROC && type <= STT_HIPROC)
10036 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10037 return "THUMB_FUNC";
10039 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10042 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10043 return "PARISC_MILLI";
10045 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10047 else if (type >= STT_LOOS && type <= STT_HIOS)
10049 if (elf_header.e_machine == EM_PARISC)
10051 if (type == STT_HP_OPAQUE)
10052 return "HP_OPAQUE";
10053 if (type == STT_HP_STUB)
10057 if (type == STT_GNU_IFUNC
10058 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10059 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10060 /* GNU is still using the default value 0. */
10061 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10064 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10067 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10072 static const char *
10073 get_symbol_visibility (unsigned int visibility)
10075 switch (visibility)
10077 case STV_DEFAULT: return "DEFAULT";
10078 case STV_INTERNAL: return "INTERNAL";
10079 case STV_HIDDEN: return "HIDDEN";
10080 case STV_PROTECTED: return "PROTECTED";
10082 error (_("Unrecognized visibility value: %u"), visibility);
10083 return _("<unknown>");
10087 static const char *
10088 get_mips_symbol_other (unsigned int other)
10098 case STO_MICROMIPS:
10099 return "MICROMIPS";
10100 case STO_MICROMIPS | STO_MIPS_PIC:
10101 return "MICROMIPS, MIPS PIC";
10109 static const char *
10110 get_ia64_symbol_other (unsigned int other)
10112 if (is_ia64_vms ())
10114 static char res[32];
10118 /* Function types is for images and .STB files only. */
10119 switch (elf_header.e_type)
10123 switch (VMS_ST_FUNC_TYPE (other))
10125 case VMS_SFT_CODE_ADDR:
10126 strcat (res, " CA");
10128 case VMS_SFT_SYMV_IDX:
10129 strcat (res, " VEC");
10132 strcat (res, " FD");
10134 case VMS_SFT_RESERVE:
10135 strcat (res, " RSV");
10138 warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10139 VMS_ST_FUNC_TYPE (other));
10140 strcat (res, " <unknown>");
10147 switch (VMS_ST_LINKAGE (other))
10149 case VMS_STL_IGNORE:
10150 strcat (res, " IGN");
10152 case VMS_STL_RESERVE:
10153 strcat (res, " RSV");
10156 strcat (res, " STD");
10159 strcat (res, " LNK");
10162 warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10163 VMS_ST_LINKAGE (other));
10164 strcat (res, " <unknown>");
10176 static const char *
10177 get_ppc64_symbol_other (unsigned int other)
10179 if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10181 static char buf[32];
10182 snprintf (buf, sizeof buf, _("<localentry>: %d"),
10183 PPC64_LOCAL_ENTRY_OFFSET (other));
10189 static const char *
10190 get_symbol_other (unsigned int other)
10192 const char * result = NULL;
10193 static char buff [32];
10198 switch (elf_header.e_machine)
10201 result = get_mips_symbol_other (other);
10204 result = get_ia64_symbol_other (other);
10207 result = get_ppc64_symbol_other (other);
10216 snprintf (buff, sizeof buff, _("<other>: %x"), other);
10220 static const char *
10221 get_symbol_index_type (unsigned int type)
10223 static char buff[32];
10227 case SHN_UNDEF: return "UND";
10228 case SHN_ABS: return "ABS";
10229 case SHN_COMMON: return "COM";
10231 if (type == SHN_IA_64_ANSI_COMMON
10232 && elf_header.e_machine == EM_IA_64
10233 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10235 else if ((elf_header.e_machine == EM_X86_64
10236 || elf_header.e_machine == EM_L1OM
10237 || elf_header.e_machine == EM_K1OM)
10238 && type == SHN_X86_64_LCOMMON)
10239 return "LARGE_COM";
10240 else if ((type == SHN_MIPS_SCOMMON
10241 && elf_header.e_machine == EM_MIPS)
10242 || (type == SHN_TIC6X_SCOMMON
10243 && elf_header.e_machine == EM_TI_C6000))
10245 else if (type == SHN_MIPS_SUNDEFINED
10246 && elf_header.e_machine == EM_MIPS)
10248 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10249 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10250 else if (type >= SHN_LOOS && type <= SHN_HIOS)
10251 sprintf (buff, "OS [0x%04x]", type & 0xffff);
10252 else if (type >= SHN_LORESERVE)
10253 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10254 else if (type >= elf_header.e_shnum)
10255 sprintf (buff, _("bad section index[%3d]"), type);
10257 sprintf (buff, "%3d", type);
10265 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10267 unsigned char * e_data;
10270 /* If the size_t type is smaller than the bfd_size_type, eg because
10271 you are building a 32-bit tool on a 64-bit host, then make sure
10272 that when (number) is cast to (size_t) no information is lost. */
10273 if (sizeof (size_t) < sizeof (bfd_size_type)
10274 && (bfd_size_type) ((size_t) number) != number)
10276 error (_("Size truncation prevents reading %llu elements of size %u\n"),
10277 (unsigned long long) number, ent_size);
10281 /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10282 attempting to allocate memory when the read is bound to fail. */
10283 if (ent_size * number > current_file_size)
10285 error (_("Invalid number of dynamic entries: %llu\n"),
10286 (unsigned long long) number);
10290 e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10291 if (e_data == NULL)
10293 error (_("Out of memory reading %llu dynamic entries\n"),
10294 (unsigned long long) number);
10298 if (fread (e_data, ent_size, (size_t) number, file) != number)
10300 error (_("Unable to read in %llu bytes of dynamic data\n"),
10301 (unsigned long long) (number * ent_size));
10306 i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10307 if (i_data == NULL)
10309 error (_("Out of memory allocating space for %llu dynamic entries\n"),
10310 (unsigned long long) number);
10316 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10324 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10326 Elf_Internal_Sym * psym;
10329 n = print_vma (si, DEC_5);
10331 fputs (&" "[n], stdout);
10332 printf (" %3lu: ", hn);
10334 if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10336 printf (_("<No info available for dynamic symbol number %lu>\n"),
10337 (unsigned long) si);
10341 psym = dynamic_symbols + si;
10342 print_vma (psym->st_value, LONG_HEX);
10344 print_vma (psym->st_size, DEC_5);
10346 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10347 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10348 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10349 /* Check to see if any other bits in the st_other field are set.
10350 Note - displaying this information disrupts the layout of the
10351 table being generated, but for the moment this case is very
10353 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10354 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10355 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10356 if (VALID_DYNAMIC_NAME (psym->st_name))
10357 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10359 printf (_(" <corrupt: %14ld>"), psym->st_name);
10363 static const char *
10364 get_symbol_version_string (FILE *file, int is_dynsym,
10365 const char *strtab,
10366 unsigned long int strtab_size,
10367 unsigned int si, Elf_Internal_Sym *psym,
10368 enum versioned_symbol_info *sym_info,
10369 unsigned short *vna_other)
10371 const char *version_string = NULL;
10374 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
10376 unsigned char data[2];
10377 unsigned short vers_data;
10378 unsigned long offset;
10382 offset = offset_from_vma
10383 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10384 sizeof data + si * sizeof (vers_data));
10386 if (get_data (&data, file, offset + si * sizeof (vers_data),
10387 sizeof (data), 1, _("version data")) == NULL)
10390 vers_data = byte_get (data, 2);
10392 is_nobits = (section_headers != NULL
10393 && psym->st_shndx < elf_header.e_shnum
10394 && section_headers[psym->st_shndx].sh_type
10397 check_def = (psym->st_shndx != SHN_UNDEF);
10399 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
10401 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
10402 && (is_nobits || ! check_def))
10404 Elf_External_Verneed evn;
10405 Elf_Internal_Verneed ivn;
10406 Elf_Internal_Vernaux ivna;
10408 /* We must test both. */
10409 offset = offset_from_vma
10410 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10415 unsigned long vna_off;
10417 if (get_data (&evn, file, offset, sizeof (evn), 1,
10418 _("version need")) == NULL)
10421 ivna.vna_other = 0;
10426 ivn.vn_aux = BYTE_GET (evn.vn_aux);
10427 ivn.vn_next = BYTE_GET (evn.vn_next);
10429 vna_off = offset + ivn.vn_aux;
10433 Elf_External_Vernaux evna;
10435 if (get_data (&evna, file, vna_off,
10437 _("version need aux (3)")) == NULL)
10440 ivna.vna_other = 0;
10445 ivna.vna_other = BYTE_GET (evna.vna_other);
10446 ivna.vna_next = BYTE_GET (evna.vna_next);
10447 ivna.vna_name = BYTE_GET (evna.vna_name);
10450 vna_off += ivna.vna_next;
10452 while (ivna.vna_other != vers_data
10453 && ivna.vna_next != 0);
10455 if (ivna.vna_other == vers_data)
10458 offset += ivn.vn_next;
10460 while (ivn.vn_next != 0);
10462 if (ivna.vna_other == vers_data)
10464 *sym_info = symbol_undefined;
10465 *vna_other = ivna.vna_other;
10466 version_string = (ivna.vna_name < strtab_size
10467 ? strtab + ivna.vna_name
10471 else if (! is_nobits)
10472 error (_("bad dynamic symbol\n"));
10479 if (vers_data != 0x8001
10480 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10482 Elf_Internal_Verdef ivd;
10483 Elf_Internal_Verdaux ivda;
10484 Elf_External_Verdaux evda;
10487 off = offset_from_vma
10489 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10490 sizeof (Elf_External_Verdef));
10494 Elf_External_Verdef evd;
10496 if (get_data (&evd, file, off, sizeof (evd),
10497 1, _("version def")) == NULL)
10505 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10506 ivd.vd_aux = BYTE_GET (evd.vd_aux);
10507 ivd.vd_next = BYTE_GET (evd.vd_next);
10510 off += ivd.vd_next;
10512 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
10513 && ivd.vd_next != 0);
10515 off -= ivd.vd_next;
10518 if (get_data (&evda, file, off, sizeof (evda),
10519 1, _("version def aux")) == NULL)
10520 return version_string;
10522 ivda.vda_name = BYTE_GET (evda.vda_name);
10524 if (psym->st_name != ivda.vda_name)
10526 *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10527 ? symbol_hidden : symbol_public);
10528 version_string = (ivda.vda_name < strtab_size
10529 ? strtab + ivda.vda_name
10536 return version_string;
10539 /* Dump the symbol table. */
10541 process_symbol_table (FILE * file)
10543 Elf_Internal_Shdr * section;
10544 bfd_size_type nbuckets = 0;
10545 bfd_size_type nchains = 0;
10546 bfd_vma * buckets = NULL;
10547 bfd_vma * chains = NULL;
10548 bfd_vma ngnubuckets = 0;
10549 bfd_vma * gnubuckets = NULL;
10550 bfd_vma * gnuchains = NULL;
10551 bfd_vma gnusymidx = 0;
10552 bfd_size_type ngnuchains = 0;
10554 if (!do_syms && !do_dyn_syms && !do_histogram)
10557 if (dynamic_info[DT_HASH]
10559 || (do_using_dynamic
10561 && dynamic_strings != NULL)))
10563 unsigned char nb[8];
10564 unsigned char nc[8];
10565 unsigned int hash_ent_size = 4;
10567 if ((elf_header.e_machine == EM_ALPHA
10568 || elf_header.e_machine == EM_S390
10569 || elf_header.e_machine == EM_S390_OLD)
10570 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10574 (archive_file_offset
10575 + offset_from_vma (file, dynamic_info[DT_HASH],
10576 sizeof nb + sizeof nc)),
10579 error (_("Unable to seek to start of dynamic information\n"));
10583 if (fread (nb, hash_ent_size, 1, file) != 1)
10585 error (_("Failed to read in number of buckets\n"));
10589 if (fread (nc, hash_ent_size, 1, file) != 1)
10591 error (_("Failed to read in number of chains\n"));
10595 nbuckets = byte_get (nb, hash_ent_size);
10596 nchains = byte_get (nc, hash_ent_size);
10598 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10599 chains = get_dynamic_data (file, nchains, hash_ent_size);
10602 if (buckets == NULL || chains == NULL)
10604 if (do_using_dynamic)
10615 if (dynamic_info_DT_GNU_HASH
10617 || (do_using_dynamic
10619 && dynamic_strings != NULL)))
10621 unsigned char nb[16];
10622 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10623 bfd_vma buckets_vma;
10626 (archive_file_offset
10627 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10631 error (_("Unable to seek to start of dynamic information\n"));
10635 if (fread (nb, 16, 1, file) != 1)
10637 error (_("Failed to read in number of buckets\n"));
10641 ngnubuckets = byte_get (nb, 4);
10642 gnusymidx = byte_get (nb + 4, 4);
10643 bitmaskwords = byte_get (nb + 8, 4);
10644 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10646 buckets_vma += bitmaskwords * 4;
10648 buckets_vma += bitmaskwords * 8;
10651 (archive_file_offset
10652 + offset_from_vma (file, buckets_vma, 4)),
10655 error (_("Unable to seek to start of dynamic information\n"));
10659 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10661 if (gnubuckets == NULL)
10664 for (i = 0; i < ngnubuckets; i++)
10665 if (gnubuckets[i] != 0)
10667 if (gnubuckets[i] < gnusymidx)
10670 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10671 maxchain = gnubuckets[i];
10674 if (maxchain == 0xffffffff)
10677 maxchain -= gnusymidx;
10680 (archive_file_offset
10681 + offset_from_vma (file, buckets_vma
10682 + 4 * (ngnubuckets + maxchain), 4)),
10685 error (_("Unable to seek to start of dynamic information\n"));
10691 if (fread (nb, 4, 1, file) != 1)
10693 error (_("Failed to determine last chain length\n"));
10697 if (maxchain + 1 == 0)
10702 while ((byte_get (nb, 4) & 1) == 0);
10705 (archive_file_offset
10706 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10709 error (_("Unable to seek to start of dynamic information\n"));
10713 gnuchains = get_dynamic_data (file, maxchain, 4);
10714 ngnuchains = maxchain;
10717 if (gnuchains == NULL)
10722 if (do_using_dynamic)
10727 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10729 && do_using_dynamic
10730 && dynamic_strings != NULL
10731 && dynamic_symbols != NULL)
10735 if (dynamic_info[DT_HASH])
10739 printf (_("\nSymbol table for image:\n"));
10741 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10743 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10745 for (hn = 0; hn < nbuckets; hn++)
10750 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10751 print_dynamic_symbol (si, hn);
10755 if (dynamic_info_DT_GNU_HASH)
10757 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10759 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10761 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
10763 for (hn = 0; hn < ngnubuckets; ++hn)
10764 if (gnubuckets[hn] != 0)
10766 bfd_vma si = gnubuckets[hn];
10767 bfd_vma off = si - gnusymidx;
10771 print_dynamic_symbol (si, hn);
10774 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
10778 else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
10779 && section_headers != NULL)
10783 for (i = 0, section = section_headers;
10784 i < elf_header.e_shnum;
10788 char * strtab = NULL;
10789 unsigned long int strtab_size = 0;
10790 Elf_Internal_Sym * symtab;
10791 Elf_Internal_Sym * psym;
10792 unsigned long num_syms;
10794 if ((section->sh_type != SHT_SYMTAB
10795 && section->sh_type != SHT_DYNSYM)
10797 && section->sh_type == SHT_SYMTAB))
10800 if (section->sh_entsize == 0)
10802 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
10803 printable_section_name (section));
10807 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
10808 printable_section_name (section),
10809 (unsigned long) (section->sh_size / section->sh_entsize));
10812 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10814 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
10816 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
10817 if (symtab == NULL)
10820 if (section->sh_link == elf_header.e_shstrndx)
10822 strtab = string_table;
10823 strtab_size = string_table_length;
10825 else if (section->sh_link < elf_header.e_shnum)
10827 Elf_Internal_Shdr * string_sec;
10829 string_sec = section_headers + section->sh_link;
10831 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
10832 1, string_sec->sh_size,
10833 _("string table"));
10834 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
10837 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
10839 const char *version_string;
10840 enum versioned_symbol_info sym_info;
10841 unsigned short vna_other;
10843 printf ("%6d: ", si);
10844 print_vma (psym->st_value, LONG_HEX);
10846 print_vma (psym->st_size, DEC_5);
10847 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10848 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10849 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
10850 /* Check to see if any other bits in the st_other field are set.
10851 Note - displaying this information disrupts the layout of the
10852 table being generated, but for the moment this case is very rare. */
10853 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
10854 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
10855 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
10856 print_symbol (25, psym->st_name < strtab_size
10857 ? strtab + psym->st_name : _("<corrupt>"));
10860 = get_symbol_version_string (file,
10861 section->sh_type == SHT_DYNSYM,
10862 strtab, strtab_size, si,
10863 psym, &sym_info, &vna_other);
10864 if (version_string)
10866 if (sym_info == symbol_undefined)
10867 printf ("@%s (%d)", version_string, vna_other);
10869 printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
10877 if (strtab != string_table)
10883 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
10885 if (do_histogram && buckets != NULL)
10887 unsigned long * lengths;
10888 unsigned long * counts;
10891 unsigned long maxlength = 0;
10892 unsigned long nzero_counts = 0;
10893 unsigned long nsyms = 0;
10894 unsigned long chained;
10896 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
10897 (unsigned long) nbuckets);
10899 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
10900 if (lengths == NULL)
10902 error (_("Out of memory allocating space for histogram buckets\n"));
10906 printf (_(" Length Number %% of total Coverage\n"));
10907 for (hn = 0; hn < nbuckets; ++hn)
10909 for (si = buckets[hn], chained = 0;
10910 si > 0 && si < nchains && si < nbuckets && chained <= nchains;
10911 si = chains[si], ++chained)
10914 if (maxlength < ++lengths[hn])
10918 /* PR binutils/17531: A corrupt binary could contain broken
10919 histogram data. Do not go into an infinite loop trying
10921 if (chained > nchains)
10923 error (_("histogram chain is corrupt\n"));
10928 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
10929 if (counts == NULL)
10932 error (_("Out of memory allocating space for histogram counts\n"));
10936 for (hn = 0; hn < nbuckets; ++hn)
10937 ++counts[lengths[hn]];
10942 printf (" 0 %-10lu (%5.1f%%)\n",
10943 counts[0], (counts[0] * 100.0) / nbuckets);
10944 for (i = 1; i <= maxlength; ++i)
10946 nzero_counts += counts[i] * i;
10947 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
10948 i, counts[i], (counts[i] * 100.0) / nbuckets,
10949 (nzero_counts * 100.0) / nsyms);
10957 if (buckets != NULL)
10963 if (do_histogram && gnubuckets != NULL)
10965 unsigned long * lengths;
10966 unsigned long * counts;
10968 unsigned long maxlength = 0;
10969 unsigned long nzero_counts = 0;
10970 unsigned long nsyms = 0;
10972 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
10973 (unsigned long) ngnubuckets);
10975 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
10976 if (lengths == NULL)
10978 error (_("Out of memory allocating space for gnu histogram buckets\n"));
10982 printf (_(" Length Number %% of total Coverage\n"));
10984 for (hn = 0; hn < ngnubuckets; ++hn)
10985 if (gnubuckets[hn] != 0)
10987 bfd_vma off, length = 1;
10989 for (off = gnubuckets[hn] - gnusymidx;
10990 /* PR 17531 file: 010-77222-0.004. */
10991 off < ngnuchains && (gnuchains[off] & 1) == 0;
10994 lengths[hn] = length;
10995 if (length > maxlength)
10996 maxlength = length;
11000 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11001 if (counts == NULL)
11004 error (_("Out of memory allocating space for gnu histogram counts\n"));
11008 for (hn = 0; hn < ngnubuckets; ++hn)
11009 ++counts[lengths[hn]];
11011 if (ngnubuckets > 0)
11014 printf (" 0 %-10lu (%5.1f%%)\n",
11015 counts[0], (counts[0] * 100.0) / ngnubuckets);
11016 for (j = 1; j <= maxlength; ++j)
11018 nzero_counts += counts[j] * j;
11019 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
11020 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11021 (nzero_counts * 100.0) / nsyms);
11035 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11039 if (dynamic_syminfo == NULL
11041 /* No syminfo, this is ok. */
11044 /* There better should be a dynamic symbol section. */
11045 if (dynamic_symbols == NULL || dynamic_strings == NULL)
11049 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11050 dynamic_syminfo_offset, dynamic_syminfo_nent);
11052 printf (_(" Num: Name BoundTo Flags\n"));
11053 for (i = 0; i < dynamic_syminfo_nent; ++i)
11055 unsigned short int flags = dynamic_syminfo[i].si_flags;
11057 printf ("%4d: ", i);
11058 if (i >= num_dynamic_syms)
11059 printf (_("<corrupt index>"));
11060 else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11061 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11063 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11066 switch (dynamic_syminfo[i].si_boundto)
11068 case SYMINFO_BT_SELF:
11069 fputs ("SELF ", stdout);
11071 case SYMINFO_BT_PARENT:
11072 fputs ("PARENT ", stdout);
11075 if (dynamic_syminfo[i].si_boundto > 0
11076 && dynamic_syminfo[i].si_boundto < dynamic_nent
11077 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11079 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11083 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11087 if (flags & SYMINFO_FLG_DIRECT)
11088 printf (" DIRECT");
11089 if (flags & SYMINFO_FLG_PASSTHRU)
11090 printf (" PASSTHRU");
11091 if (flags & SYMINFO_FLG_COPY)
11093 if (flags & SYMINFO_FLG_LAZYLOAD)
11094 printf (" LAZYLOAD");
11102 /* Check to see if the given reloc needs to be handled in a target specific
11103 manner. If so then process the reloc and return TRUE otherwise return
11107 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11108 unsigned char * start,
11109 Elf_Internal_Sym * symtab)
11111 unsigned int reloc_type = get_reloc_type (reloc->r_info);
11113 switch (elf_header.e_machine)
11116 case EM_MSP430_OLD:
11118 static Elf_Internal_Sym * saved_sym = NULL;
11120 switch (reloc_type)
11122 case 10: /* R_MSP430_SYM_DIFF */
11123 if (uses_msp430x_relocs ())
11125 case 21: /* R_MSP430X_SYM_DIFF */
11126 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11129 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11130 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11131 goto handle_sym_diff;
11133 case 5: /* R_MSP430_16_BYTE */
11134 case 9: /* R_MSP430_8 */
11135 if (uses_msp430x_relocs ())
11137 goto handle_sym_diff;
11139 case 2: /* R_MSP430_ABS16 */
11140 case 15: /* R_MSP430X_ABS16 */
11141 if (! uses_msp430x_relocs ())
11143 goto handle_sym_diff;
11146 if (saved_sym != NULL)
11150 value = reloc->r_addend
11151 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11152 - saved_sym->st_value);
11154 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11162 if (saved_sym != NULL)
11163 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11170 case EM_CYGNUS_MN10300:
11172 static Elf_Internal_Sym * saved_sym = NULL;
11174 switch (reloc_type)
11176 case 34: /* R_MN10300_ALIGN */
11178 case 33: /* R_MN10300_SYM_DIFF */
11179 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11181 case 1: /* R_MN10300_32 */
11182 case 2: /* R_MN10300_16 */
11183 if (saved_sym != NULL)
11187 value = reloc->r_addend
11188 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11189 - saved_sym->st_value);
11191 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11198 if (saved_sym != NULL)
11199 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11207 static bfd_vma saved_sym1 = 0;
11208 static bfd_vma saved_sym2 = 0;
11209 static bfd_vma value;
11211 switch (reloc_type)
11213 case 0x80: /* R_RL78_SYM. */
11214 saved_sym1 = saved_sym2;
11215 saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11216 saved_sym2 += reloc->r_addend;
11219 case 0x83: /* R_RL78_OPsub. */
11220 value = saved_sym1 - saved_sym2;
11221 saved_sym2 = saved_sym1 = 0;
11225 case 0x41: /* R_RL78_ABS32. */
11226 byte_put (start + reloc->r_offset, value, 4);
11230 case 0x43: /* R_RL78_ABS16. */
11231 byte_put (start + reloc->r_offset, value, 2);
11245 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11246 DWARF debug sections. This is a target specific test. Note - we do not
11247 go through the whole including-target-headers-multiple-times route, (as
11248 we have already done with <elf/h8.h>) because this would become very
11249 messy and even then this function would have to contain target specific
11250 information (the names of the relocs instead of their numeric values).
11251 FIXME: This is not the correct way to solve this problem. The proper way
11252 is to have target specific reloc sizing and typing functions created by
11253 the reloc-macros.h header, in the same way that it already creates the
11254 reloc naming functions. */
11257 is_32bit_abs_reloc (unsigned int reloc_type)
11259 switch (elf_header.e_machine)
11263 return reloc_type == 1; /* R_386_32. */
11265 return reloc_type == 1; /* R_68K_32. */
11267 return reloc_type == 1; /* R_860_32. */
11269 return reloc_type == 2; /* R_960_32. */
11271 return reloc_type == 258; /* R_AARCH64_ABS32 */
11273 return reloc_type == 1; /* R_ALPHA_REFLONG. */
11275 return reloc_type == 1; /* R_ARC_32. */
11277 return reloc_type == 2; /* R_ARM_ABS32 */
11280 return reloc_type == 1;
11281 case EM_ADAPTEVA_EPIPHANY:
11282 return reloc_type == 3;
11284 return reloc_type == 0x12; /* R_byte4_data. */
11286 return reloc_type == 3; /* R_CRIS_32. */
11288 return reloc_type == 3; /* R_CR16_NUM32. */
11290 return reloc_type == 15; /* R_CRX_NUM32. */
11291 case EM_CYGNUS_FRV:
11292 return reloc_type == 1;
11293 case EM_CYGNUS_D10V:
11295 return reloc_type == 6; /* R_D10V_32. */
11296 case EM_CYGNUS_D30V:
11298 return reloc_type == 12; /* R_D30V_32_NORMAL. */
11300 return reloc_type == 3; /* R_DLX_RELOC_32. */
11301 case EM_CYGNUS_FR30:
11303 return reloc_type == 3; /* R_FR30_32. */
11305 return reloc_type == 1; /* R_FT32_32. */
11309 return reloc_type == 1; /* R_H8_DIR32. */
11311 return reloc_type == 0x65 /* R_IA64_SECREL32LSB. */
11312 || reloc_type == 0x25; /* R_IA64_DIR32LSB. */
11315 return reloc_type == 2; /* R_IP2K_32. */
11317 return reloc_type == 2; /* R_IQ2000_32. */
11318 case EM_LATTICEMICO32:
11319 return reloc_type == 3; /* R_LM32_32. */
11322 return reloc_type == 3; /* R_M32C_32. */
11324 return reloc_type == 34; /* R_M32R_32_RELA. */
11326 return reloc_type == 1; /* R_MCORE_ADDR32. */
11327 case EM_CYGNUS_MEP:
11328 return reloc_type == 4; /* R_MEP_32. */
11330 return reloc_type == 2; /* R_METAG_ADDR32. */
11331 case EM_MICROBLAZE:
11332 return reloc_type == 1; /* R_MICROBLAZE_32. */
11334 return reloc_type == 2; /* R_MIPS_32. */
11336 return reloc_type == 4; /* R_MMIX_32. */
11337 case EM_CYGNUS_MN10200:
11339 return reloc_type == 1; /* R_MN10200_32. */
11340 case EM_CYGNUS_MN10300:
11342 return reloc_type == 1; /* R_MN10300_32. */
11344 return reloc_type == 1; /* R_MOXIE_32. */
11345 case EM_MSP430_OLD:
11347 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
11349 return reloc_type == 2; /* R_MT_32. */
11351 return reloc_type == 20; /* R_NDS32_RELA. */
11352 case EM_ALTERA_NIOS2:
11353 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
11355 return reloc_type == 1; /* R_NIOS_32. */
11357 return reloc_type == 1; /* R_OR1K_32. */
11359 return (reloc_type == 1 /* R_PARISC_DIR32. */
11360 || reloc_type == 41); /* R_PARISC_SECREL32. */
11363 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
11365 return reloc_type == 1; /* R_PPC64_ADDR32. */
11367 return reloc_type == 1; /* R_PPC_ADDR32. */
11369 return reloc_type == 1; /* R_RL78_DIR32. */
11371 return reloc_type == 1; /* R_RX_DIR32. */
11373 return reloc_type == 1; /* R_I370_ADDR31. */
11376 return reloc_type == 4; /* R_S390_32. */
11378 return reloc_type == 8; /* R_SCORE_ABS32. */
11380 return reloc_type == 1; /* R_SH_DIR32. */
11381 case EM_SPARC32PLUS:
11384 return reloc_type == 3 /* R_SPARC_32. */
11385 || reloc_type == 23; /* R_SPARC_UA32. */
11387 return reloc_type == 6; /* R_SPU_ADDR32 */
11389 return reloc_type == 1; /* R_C6000_ABS32. */
11391 return reloc_type == 2; /* R_TILEGX_32. */
11393 return reloc_type == 1; /* R_TILEPRO_32. */
11394 case EM_CYGNUS_V850:
11396 return reloc_type == 6; /* R_V850_ABS32. */
11398 return reloc_type == 0x33; /* R_V810_WORD. */
11400 return reloc_type == 1; /* R_VAX_32. */
11402 return reloc_type == 3; /* R_VISIUM_32. */
11406 return reloc_type == 10; /* R_X86_64_32. */
11409 return reloc_type == 3; /* R_XC16C_ABS_32. */
11411 return reloc_type == 4; /* R_XGATE_32. */
11413 return reloc_type == 1; /* R_XSTROMY16_32. */
11414 case EM_XTENSA_OLD:
11416 return reloc_type == 1; /* R_XTENSA_32. */
11419 static unsigned int prev_warn = 0;
11421 /* Avoid repeating the same warning multiple times. */
11422 if (prev_warn != elf_header.e_machine)
11423 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11424 elf_header.e_machine);
11425 prev_warn = elf_header.e_machine;
11431 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11432 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
11435 is_32bit_pcrel_reloc (unsigned int reloc_type)
11437 switch (elf_header.e_machine)
11441 return reloc_type == 2; /* R_386_PC32. */
11443 return reloc_type == 4; /* R_68K_PC32. */
11445 return reloc_type == 261; /* R_AARCH64_PREL32 */
11446 case EM_ADAPTEVA_EPIPHANY:
11447 return reloc_type == 6;
11449 return reloc_type == 10; /* R_ALPHA_SREL32. */
11451 return reloc_type == 3; /* R_ARM_REL32 */
11452 case EM_MICROBLAZE:
11453 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
11455 return reloc_type == 9; /* R_OR1K_32_PCREL. */
11457 return reloc_type == 9; /* R_PARISC_PCREL32. */
11459 return reloc_type == 26; /* R_PPC_REL32. */
11461 return reloc_type == 26; /* R_PPC64_REL32. */
11464 return reloc_type == 5; /* R_390_PC32. */
11466 return reloc_type == 2; /* R_SH_REL32. */
11467 case EM_SPARC32PLUS:
11470 return reloc_type == 6; /* R_SPARC_DISP32. */
11472 return reloc_type == 13; /* R_SPU_REL32. */
11474 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
11476 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
11478 return reloc_type == 6; /* R_VISIUM_32_PCREL */
11482 return reloc_type == 2; /* R_X86_64_PC32. */
11483 case EM_XTENSA_OLD:
11485 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
11487 /* Do not abort or issue an error message here. Not all targets use
11488 pc-relative 32-bit relocs in their DWARF debug information and we
11489 have already tested for target coverage in is_32bit_abs_reloc. A
11490 more helpful warning message will be generated by apply_relocations
11491 anyway, so just return. */
11496 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11497 a 64-bit absolute RELA relocation used in DWARF debug sections. */
11500 is_64bit_abs_reloc (unsigned int reloc_type)
11502 switch (elf_header.e_machine)
11505 return reloc_type == 257; /* R_AARCH64_ABS64. */
11507 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
11509 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
11511 return reloc_type == 80; /* R_PARISC_DIR64. */
11513 return reloc_type == 38; /* R_PPC64_ADDR64. */
11514 case EM_SPARC32PLUS:
11517 return reloc_type == 54; /* R_SPARC_UA64. */
11521 return reloc_type == 1; /* R_X86_64_64. */
11524 return reloc_type == 22; /* R_S390_64. */
11526 return reloc_type == 1; /* R_TILEGX_64. */
11528 return reloc_type == 18; /* R_MIPS_64. */
11534 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11535 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
11538 is_64bit_pcrel_reloc (unsigned int reloc_type)
11540 switch (elf_header.e_machine)
11543 return reloc_type == 260; /* R_AARCH64_PREL64. */
11545 return reloc_type == 11; /* R_ALPHA_SREL64. */
11547 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
11549 return reloc_type == 72; /* R_PARISC_PCREL64. */
11551 return reloc_type == 44; /* R_PPC64_REL64. */
11552 case EM_SPARC32PLUS:
11555 return reloc_type == 46; /* R_SPARC_DISP64. */
11559 return reloc_type == 24; /* R_X86_64_PC64. */
11562 return reloc_type == 23; /* R_S390_PC64. */
11564 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
11570 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11571 a 24-bit absolute RELA relocation used in DWARF debug sections. */
11574 is_24bit_abs_reloc (unsigned int reloc_type)
11576 switch (elf_header.e_machine)
11578 case EM_CYGNUS_MN10200:
11580 return reloc_type == 4; /* R_MN10200_24. */
11586 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11587 a 16-bit absolute RELA relocation used in DWARF debug sections. */
11590 is_16bit_abs_reloc (unsigned int reloc_type)
11592 switch (elf_header.e_machine)
11596 return reloc_type == 4; /* R_AVR_16. */
11597 case EM_ADAPTEVA_EPIPHANY:
11598 return reloc_type == 5;
11599 case EM_CYGNUS_D10V:
11601 return reloc_type == 3; /* R_D10V_16. */
11605 return reloc_type == R_H8_DIR16;
11608 return reloc_type == 1; /* R_IP2K_16. */
11611 return reloc_type == 1; /* R_M32C_16 */
11613 if (uses_msp430x_relocs ())
11614 return reloc_type == 2; /* R_MSP430_ABS16. */
11615 case EM_MSP430_OLD:
11616 return reloc_type == 5; /* R_MSP430_16_BYTE. */
11618 return reloc_type == 19; /* R_NDS32_RELA. */
11619 case EM_ALTERA_NIOS2:
11620 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
11622 return reloc_type == 9; /* R_NIOS_16. */
11624 return reloc_type == 2; /* R_OR1K_16. */
11626 return reloc_type == 2; /* R_C6000_ABS16. */
11629 return reloc_type == 2; /* R_XC16C_ABS_16. */
11630 case EM_CYGNUS_MN10200:
11632 return reloc_type == 2; /* R_MN10200_16. */
11633 case EM_CYGNUS_MN10300:
11635 return reloc_type == 2; /* R_MN10300_16. */
11637 return reloc_type == 2; /* R_VISIUM_16. */
11639 return reloc_type == 3; /* R_XGATE_16. */
11645 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11646 relocation entries (possibly formerly used for SHT_GROUP sections). */
11649 is_none_reloc (unsigned int reloc_type)
11651 switch (elf_header.e_machine)
11653 case EM_68K: /* R_68K_NONE. */
11654 case EM_386: /* R_386_NONE. */
11655 case EM_SPARC32PLUS:
11657 case EM_SPARC: /* R_SPARC_NONE. */
11658 case EM_MIPS: /* R_MIPS_NONE. */
11659 case EM_PARISC: /* R_PARISC_NONE. */
11660 case EM_ALPHA: /* R_ALPHA_NONE. */
11661 case EM_ADAPTEVA_EPIPHANY:
11662 case EM_PPC: /* R_PPC_NONE. */
11663 case EM_PPC64: /* R_PPC64_NONE. */
11664 case EM_ARM: /* R_ARM_NONE. */
11665 case EM_IA_64: /* R_IA64_NONE. */
11666 case EM_SH: /* R_SH_NONE. */
11668 case EM_S390: /* R_390_NONE. */
11669 case EM_CRIS: /* R_CRIS_NONE. */
11670 case EM_X86_64: /* R_X86_64_NONE. */
11671 case EM_L1OM: /* R_X86_64_NONE. */
11672 case EM_K1OM: /* R_X86_64_NONE. */
11673 case EM_MN10300: /* R_MN10300_NONE. */
11674 case EM_FT32: /* R_FT32_NONE. */
11675 case EM_MOXIE: /* R_MOXIE_NONE. */
11676 case EM_M32R: /* R_M32R_NONE. */
11677 case EM_TI_C6000:/* R_C6000_NONE. */
11678 case EM_TILEGX: /* R_TILEGX_NONE. */
11679 case EM_TILEPRO: /* R_TILEPRO_NONE. */
11681 case EM_C166: /* R_XC16X_NONE. */
11682 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
11683 case EM_NIOS32: /* R_NIOS_NONE. */
11684 case EM_OR1K: /* R_OR1K_NONE. */
11685 return reloc_type == 0;
11687 return reloc_type == 0 || reloc_type == 256;
11689 return (reloc_type == 0 /* R_XTENSA_NONE. */
11690 || reloc_type == 204 /* R_NDS32_DIFF8. */
11691 || reloc_type == 205 /* R_NDS32_DIFF16. */
11692 || reloc_type == 206 /* R_NDS32_DIFF32. */
11693 || reloc_type == 207 /* R_NDS32_ULEB128. */);
11694 case EM_XTENSA_OLD:
11696 return (reloc_type == 0 /* R_XTENSA_NONE. */
11697 || reloc_type == 17 /* R_XTENSA_DIFF8. */
11698 || reloc_type == 18 /* R_XTENSA_DIFF16. */
11699 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
11701 return reloc_type == 3; /* R_METAG_NONE. */
11706 /* Returns TRUE if there is a relocation against
11707 section NAME at OFFSET bytes. */
11710 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11712 Elf_Internal_Rela * relocs;
11713 Elf_Internal_Rela * rp;
11715 if (dsec == NULL || dsec->reloc_info == NULL)
11718 relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11720 for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11721 if (rp->r_offset == offset)
11727 /* Apply relocations to a section.
11728 Note: So far support has been added only for those relocations
11729 which can be found in debug sections.
11730 If RELOCS_RETURN is non-NULL then returns in it a pointer to the
11731 loaded relocs. It is then the caller's responsibility to free them.
11732 FIXME: Add support for more relocations ? */
11735 apply_relocations (void * file,
11736 const Elf_Internal_Shdr * section,
11737 unsigned char * start,
11738 bfd_size_type size,
11739 void ** relocs_return,
11740 unsigned long * num_relocs_return)
11742 Elf_Internal_Shdr * relsec;
11743 unsigned char * end = start + size;
11745 if (relocs_return != NULL)
11747 * (Elf_Internal_Rela **) relocs_return = NULL;
11748 * num_relocs_return = 0;
11751 if (elf_header.e_type != ET_REL)
11754 /* Find the reloc section associated with the section. */
11755 for (relsec = section_headers;
11756 relsec < section_headers + elf_header.e_shnum;
11759 bfd_boolean is_rela;
11760 unsigned long num_relocs;
11761 Elf_Internal_Rela * relocs;
11762 Elf_Internal_Rela * rp;
11763 Elf_Internal_Shdr * symsec;
11764 Elf_Internal_Sym * symtab;
11765 unsigned long num_syms;
11766 Elf_Internal_Sym * sym;
11768 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
11769 || relsec->sh_info >= elf_header.e_shnum
11770 || section_headers + relsec->sh_info != section
11771 || relsec->sh_size == 0
11772 || relsec->sh_link >= elf_header.e_shnum)
11775 is_rela = relsec->sh_type == SHT_RELA;
11779 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
11780 relsec->sh_size, & relocs, & num_relocs))
11785 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
11786 relsec->sh_size, & relocs, & num_relocs))
11790 /* SH uses RELA but uses in place value instead of the addend field. */
11791 if (elf_header.e_machine == EM_SH)
11794 symsec = section_headers + relsec->sh_link;
11795 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
11797 for (rp = relocs; rp < relocs + num_relocs; ++rp)
11800 unsigned int reloc_type;
11801 unsigned int reloc_size;
11802 unsigned char * rloc;
11803 unsigned long sym_index;
11805 reloc_type = get_reloc_type (rp->r_info);
11807 if (target_specific_reloc_handling (rp, start, symtab))
11809 else if (is_none_reloc (reloc_type))
11811 else if (is_32bit_abs_reloc (reloc_type)
11812 || is_32bit_pcrel_reloc (reloc_type))
11814 else if (is_64bit_abs_reloc (reloc_type)
11815 || is_64bit_pcrel_reloc (reloc_type))
11817 else if (is_24bit_abs_reloc (reloc_type))
11819 else if (is_16bit_abs_reloc (reloc_type))
11823 static unsigned int prev_reloc = 0;
11824 if (reloc_type != prev_reloc)
11825 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
11826 reloc_type, printable_section_name (section));
11827 prev_reloc = reloc_type;
11831 rloc = start + rp->r_offset;
11832 if ((rloc + reloc_size) > end || (rloc < start))
11834 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
11835 (unsigned long) rp->r_offset,
11836 printable_section_name (section));
11840 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
11841 if (sym_index >= num_syms)
11843 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
11844 sym_index, printable_section_name (section));
11847 sym = symtab + sym_index;
11849 /* If the reloc has a symbol associated with it,
11850 make sure that it is of an appropriate type.
11852 Relocations against symbols without type can happen.
11853 Gcc -feliminate-dwarf2-dups may generate symbols
11854 without type for debug info.
11856 Icc generates relocations against function symbols
11857 instead of local labels.
11859 Relocations against object symbols can happen, eg when
11860 referencing a global array. For an example of this see
11861 the _clz.o binary in libgcc.a. */
11863 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
11865 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
11866 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
11867 (long int)(rp - relocs),
11868 printable_section_name (relsec));
11874 addend += rp->r_addend;
11875 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
11876 partial_inplace. */
11878 || (elf_header.e_machine == EM_XTENSA
11879 && reloc_type == 1)
11880 || ((elf_header.e_machine == EM_PJ
11881 || elf_header.e_machine == EM_PJ_OLD)
11882 && reloc_type == 1)
11883 || ((elf_header.e_machine == EM_D30V
11884 || elf_header.e_machine == EM_CYGNUS_D30V)
11885 && reloc_type == 12))
11886 addend += byte_get (rloc, reloc_size);
11888 if (is_32bit_pcrel_reloc (reloc_type)
11889 || is_64bit_pcrel_reloc (reloc_type))
11891 /* On HPPA, all pc-relative relocations are biased by 8. */
11892 if (elf_header.e_machine == EM_PARISC)
11894 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
11898 byte_put (rloc, addend + sym->st_value, reloc_size);
11905 * (Elf_Internal_Rela **) relocs_return = relocs;
11906 * num_relocs_return = num_relocs;
11915 #ifdef SUPPORT_DISASSEMBLY
11917 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
11919 printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
11921 /* FIXME: XXX -- to be done --- XXX */
11927 /* Reads in the contents of SECTION from FILE, returning a pointer
11928 to a malloc'ed buffer or NULL if something went wrong. */
11931 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
11933 bfd_size_type num_bytes;
11935 num_bytes = section->sh_size;
11937 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
11939 printf (_("\nSection '%s' has no data to dump.\n"),
11940 printable_section_name (section));
11944 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
11945 _("section contents"));
11948 /* Uncompresses a section that was compressed using zlib, in place. */
11951 uncompress_section_contents (unsigned char **buffer,
11952 dwarf_size_type uncompressed_size,
11953 dwarf_size_type *size)
11955 dwarf_size_type compressed_size = *size;
11956 unsigned char * compressed_buffer = *buffer;
11957 unsigned char * uncompressed_buffer;
11961 /* It is possible the section consists of several compressed
11962 buffers concatenated together, so we uncompress in a loop. */
11963 /* PR 18313: The state field in the z_stream structure is supposed
11964 to be invisible to the user (ie us), but some compilers will
11965 still complain about it being used without initialisation. So
11966 we first zero the entire z_stream structure and then set the fields
11968 memset (& strm, 0, sizeof strm);
11969 strm.avail_in = compressed_size;
11970 strm.next_in = (Bytef *) compressed_buffer;
11971 strm.avail_out = uncompressed_size;
11972 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
11974 rc = inflateInit (& strm);
11975 while (strm.avail_in > 0)
11979 strm.next_out = ((Bytef *) uncompressed_buffer
11980 + (uncompressed_size - strm.avail_out));
11981 rc = inflate (&strm, Z_FINISH);
11982 if (rc != Z_STREAM_END)
11984 rc = inflateReset (& strm);
11986 rc = inflateEnd (& strm);
11988 || strm.avail_out != 0)
11991 *buffer = uncompressed_buffer;
11992 *size = uncompressed_size;
11996 free (uncompressed_buffer);
11997 /* Indicate decompression failure. */
12003 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12005 Elf_Internal_Shdr * relsec;
12006 bfd_size_type num_bytes;
12011 bfd_boolean some_strings_shown;
12013 real_start = start = get_section_contents (section, file);
12016 num_bytes = section->sh_size;
12018 printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12020 if (decompress_dumps)
12022 dwarf_size_type new_size = num_bytes;
12023 dwarf_size_type uncompressed_size = 0;
12025 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12027 Elf_Internal_Chdr chdr;
12028 unsigned int compression_header_size
12029 = get_compression_header (& chdr, (unsigned char *) start);
12031 if (chdr.ch_type == ELFCOMPRESS_ZLIB
12032 && chdr.ch_addralign == section->sh_addralign)
12034 uncompressed_size = chdr.ch_size;
12035 start += compression_header_size;
12036 new_size -= compression_header_size;
12039 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12041 /* Read the zlib header. In this case, it should be "ZLIB"
12042 followed by the uncompressed section size, 8 bytes in
12043 big-endian order. */
12044 uncompressed_size = start[4]; uncompressed_size <<= 8;
12045 uncompressed_size += start[5]; uncompressed_size <<= 8;
12046 uncompressed_size += start[6]; uncompressed_size <<= 8;
12047 uncompressed_size += start[7]; uncompressed_size <<= 8;
12048 uncompressed_size += start[8]; uncompressed_size <<= 8;
12049 uncompressed_size += start[9]; uncompressed_size <<= 8;
12050 uncompressed_size += start[10]; uncompressed_size <<= 8;
12051 uncompressed_size += start[11];
12056 if (uncompressed_size
12057 && uncompress_section_contents ((unsigned char **) & start,
12058 uncompressed_size, & new_size))
12059 num_bytes = new_size;
12062 /* If the section being dumped has relocations against it the user might
12063 be expecting these relocations to have been applied. Check for this
12064 case and issue a warning message in order to avoid confusion.
12065 FIXME: Maybe we ought to have an option that dumps a section with
12066 relocs applied ? */
12067 for (relsec = section_headers;
12068 relsec < section_headers + elf_header.e_shnum;
12071 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12072 || relsec->sh_info >= elf_header.e_shnum
12073 || section_headers + relsec->sh_info != section
12074 || relsec->sh_size == 0
12075 || relsec->sh_link >= elf_header.e_shnum)
12078 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12083 end = start + num_bytes;
12084 some_strings_shown = FALSE;
12088 while (!ISPRINT (* data))
12089 if (++ data >= end)
12094 size_t maxlen = end - data;
12097 /* PR 11128: Use two separate invocations in order to work
12098 around bugs in the Solaris 8 implementation of printf. */
12099 printf (" [%6tx] ", data - start);
12101 printf (" [%6Ix] ", (size_t) (data - start));
12105 print_symbol ((int) maxlen, data);
12107 data += strnlen (data, maxlen);
12111 printf (_("<corrupt>\n"));
12114 some_strings_shown = TRUE;
12118 if (! some_strings_shown)
12119 printf (_(" No strings found in this section."));
12127 dump_section_as_bytes (Elf_Internal_Shdr * section,
12129 bfd_boolean relocate)
12131 Elf_Internal_Shdr * relsec;
12132 bfd_size_type bytes;
12133 bfd_size_type section_size;
12135 unsigned char * data;
12136 unsigned char * real_start;
12137 unsigned char * start;
12139 real_start = start = (unsigned char *) get_section_contents (section, file);
12142 section_size = section->sh_size;
12144 printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12146 if (decompress_dumps)
12148 dwarf_size_type new_size = section_size;
12149 dwarf_size_type uncompressed_size = 0;
12151 if ((section->sh_flags & SHF_COMPRESSED) != 0)
12153 Elf_Internal_Chdr chdr;
12154 unsigned int compression_header_size
12155 = get_compression_header (& chdr, start);
12157 if (chdr.ch_type == ELFCOMPRESS_ZLIB
12158 && chdr.ch_addralign == section->sh_addralign)
12160 uncompressed_size = chdr.ch_size;
12161 start += compression_header_size;
12162 new_size -= compression_header_size;
12165 else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12167 /* Read the zlib header. In this case, it should be "ZLIB"
12168 followed by the uncompressed section size, 8 bytes in
12169 big-endian order. */
12170 uncompressed_size = start[4]; uncompressed_size <<= 8;
12171 uncompressed_size += start[5]; uncompressed_size <<= 8;
12172 uncompressed_size += start[6]; uncompressed_size <<= 8;
12173 uncompressed_size += start[7]; uncompressed_size <<= 8;
12174 uncompressed_size += start[8]; uncompressed_size <<= 8;
12175 uncompressed_size += start[9]; uncompressed_size <<= 8;
12176 uncompressed_size += start[10]; uncompressed_size <<= 8;
12177 uncompressed_size += start[11];
12182 if (uncompressed_size
12183 && uncompress_section_contents (& start, uncompressed_size,
12185 section_size = new_size;
12190 apply_relocations (file, section, start, section_size, NULL, NULL);
12194 /* If the section being dumped has relocations against it the user might
12195 be expecting these relocations to have been applied. Check for this
12196 case and issue a warning message in order to avoid confusion.
12197 FIXME: Maybe we ought to have an option that dumps a section with
12198 relocs applied ? */
12199 for (relsec = section_headers;
12200 relsec < section_headers + elf_header.e_shnum;
12203 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12204 || relsec->sh_info >= elf_header.e_shnum
12205 || section_headers + relsec->sh_info != section
12206 || relsec->sh_size == 0
12207 || relsec->sh_link >= elf_header.e_shnum)
12210 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12215 addr = section->sh_addr;
12216 bytes = section_size;
12225 lbytes = (bytes > 16 ? 16 : bytes);
12227 printf (" 0x%8.8lx ", (unsigned long) addr);
12229 for (j = 0; j < 16; j++)
12232 printf ("%2.2x", data[j]);
12240 for (j = 0; j < lbytes; j++)
12243 if (k >= ' ' && k < 0x7f)
12262 load_specific_debug_section (enum dwarf_section_display_enum debug,
12263 const Elf_Internal_Shdr * sec, void * file)
12265 struct dwarf_section * section = &debug_displays [debug].section;
12268 /* If it is already loaded, do nothing. */
12269 if (section->start != NULL)
12272 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12273 section->address = sec->sh_addr;
12274 section->user_data = NULL;
12275 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12277 sec->sh_size, buf);
12278 if (section->start == NULL)
12282 unsigned char *start = section->start;
12283 dwarf_size_type size = sec->sh_size;
12284 dwarf_size_type uncompressed_size = 0;
12286 if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12288 Elf_Internal_Chdr chdr;
12289 unsigned int compression_header_size
12290 = get_compression_header (&chdr, start);
12291 if (chdr.ch_type != ELFCOMPRESS_ZLIB
12292 || chdr.ch_addralign != sec->sh_addralign)
12294 uncompressed_size = chdr.ch_size;
12295 start += compression_header_size;
12296 size -= compression_header_size;
12298 else if (size > 12 && streq ((char *) start, "ZLIB"))
12300 /* Read the zlib header. In this case, it should be "ZLIB"
12301 followed by the uncompressed section size, 8 bytes in
12302 big-endian order. */
12303 uncompressed_size = start[4]; uncompressed_size <<= 8;
12304 uncompressed_size += start[5]; uncompressed_size <<= 8;
12305 uncompressed_size += start[6]; uncompressed_size <<= 8;
12306 uncompressed_size += start[7]; uncompressed_size <<= 8;
12307 uncompressed_size += start[8]; uncompressed_size <<= 8;
12308 uncompressed_size += start[9]; uncompressed_size <<= 8;
12309 uncompressed_size += start[10]; uncompressed_size <<= 8;
12310 uncompressed_size += start[11];
12315 if (uncompressed_size
12316 && uncompress_section_contents (&start, uncompressed_size,
12319 /* Free the compressed buffer, update the section buffer
12320 and the section size if uncompress is successful. */
12321 free (section->start);
12322 section->start = start;
12324 section->size = size;
12327 if (section->start == NULL)
12330 if (debug_displays [debug].relocate)
12331 apply_relocations ((FILE *) file, sec, section->start, section->size,
12332 & section->reloc_info, & section->num_relocs);
12335 section->reloc_info = NULL;
12336 section->num_relocs = 0;
12342 /* If this is not NULL, load_debug_section will only look for sections
12343 within the list of sections given here. */
12344 unsigned int *section_subset = NULL;
12347 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12349 struct dwarf_section * section = &debug_displays [debug].section;
12350 Elf_Internal_Shdr * sec;
12352 /* Locate the debug section. */
12353 sec = find_section_in_set (section->uncompressed_name, section_subset);
12355 section->name = section->uncompressed_name;
12358 sec = find_section_in_set (section->compressed_name, section_subset);
12360 section->name = section->compressed_name;
12365 /* If we're loading from a subset of sections, and we've loaded
12366 a section matching this name before, it's likely that it's a
12368 if (section_subset != NULL)
12369 free_debug_section (debug);
12371 return load_specific_debug_section (debug, sec, (FILE *) file);
12375 free_debug_section (enum dwarf_section_display_enum debug)
12377 struct dwarf_section * section = &debug_displays [debug].section;
12379 if (section->start == NULL)
12382 free ((char *) section->start);
12383 section->start = NULL;
12384 section->address = 0;
12389 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12391 char * name = SECTION_NAME (section);
12392 const char * print_name = printable_section_name (section);
12393 bfd_size_type length;
12397 length = section->sh_size;
12400 printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12403 if (section->sh_type == SHT_NOBITS)
12405 /* There is no point in dumping the contents of a debugging section
12406 which has the NOBITS type - the bits in the file will be random.
12407 This can happen when a file containing a .eh_frame section is
12408 stripped with the --only-keep-debug command line option. */
12409 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12414 if (const_strneq (name, ".gnu.linkonce.wi."))
12415 name = ".debug_info";
12417 /* See if we know how to display the contents of this section. */
12418 for (i = 0; i < max; i++)
12419 if (streq (debug_displays[i].section.uncompressed_name, name)
12420 || (i == line && const_strneq (name, ".debug_line."))
12421 || streq (debug_displays[i].section.compressed_name, name))
12423 struct dwarf_section * sec = &debug_displays [i].section;
12424 int secondary = (section != find_section (name));
12427 free_debug_section ((enum dwarf_section_display_enum) i);
12429 if (i == line && const_strneq (name, ".debug_line."))
12431 else if (streq (sec->uncompressed_name, name))
12432 sec->name = sec->uncompressed_name;
12434 sec->name = sec->compressed_name;
12435 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12438 /* If this debug section is part of a CU/TU set in a .dwp file,
12439 restrict load_debug_section to the sections in that set. */
12440 section_subset = find_cu_tu_set (file, shndx);
12442 result &= debug_displays[i].display (sec, file);
12444 section_subset = NULL;
12446 if (secondary || (i != info && i != abbrev))
12447 free_debug_section ((enum dwarf_section_display_enum) i);
12455 printf (_("Unrecognized debug section: %s\n"), print_name);
12462 /* Set DUMP_SECTS for all sections where dumps were requested
12463 based on section name. */
12466 initialise_dumps_byname (void)
12468 struct dump_list_entry * cur;
12470 for (cur = dump_sects_byname; cur; cur = cur->next)
12475 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12476 if (streq (SECTION_NAME (section_headers + i), cur->name))
12478 request_dump_bynumber (i, cur->type);
12483 warn (_("Section '%s' was not dumped because it does not exist!\n"),
12489 process_section_contents (FILE * file)
12491 Elf_Internal_Shdr * section;
12497 initialise_dumps_byname ();
12499 for (i = 0, section = section_headers;
12500 i < elf_header.e_shnum && i < num_dump_sects;
12503 #ifdef SUPPORT_DISASSEMBLY
12504 if (dump_sects[i] & DISASS_DUMP)
12505 disassemble_section (section, file);
12507 if (dump_sects[i] & HEX_DUMP)
12508 dump_section_as_bytes (section, file, FALSE);
12510 if (dump_sects[i] & RELOC_DUMP)
12511 dump_section_as_bytes (section, file, TRUE);
12513 if (dump_sects[i] & STRING_DUMP)
12514 dump_section_as_strings (section, file);
12516 if (dump_sects[i] & DEBUG_DUMP)
12517 display_debug_section (i, section, file);
12520 /* Check to see if the user requested a
12521 dump of a section that does not exist. */
12522 while (i++ < num_dump_sects)
12524 warn (_("Section %d was not dumped because it does not exist!\n"), i);
12528 process_mips_fpe_exception (int mask)
12533 if (mask & OEX_FPU_INEX)
12534 fputs ("INEX", stdout), first = 0;
12535 if (mask & OEX_FPU_UFLO)
12536 printf ("%sUFLO", first ? "" : "|"), first = 0;
12537 if (mask & OEX_FPU_OFLO)
12538 printf ("%sOFLO", first ? "" : "|"), first = 0;
12539 if (mask & OEX_FPU_DIV0)
12540 printf ("%sDIV0", first ? "" : "|"), first = 0;
12541 if (mask & OEX_FPU_INVAL)
12542 printf ("%sINVAL", first ? "" : "|");
12545 fputs ("0", stdout);
12548 /* Display's the value of TAG at location P. If TAG is
12549 greater than 0 it is assumed to be an unknown tag, and
12550 a message is printed to this effect. Otherwise it is
12551 assumed that a message has already been printed.
12553 If the bottom bit of TAG is set it assumed to have a
12554 string value, otherwise it is assumed to have an integer
12557 Returns an updated P pointing to the first unread byte
12558 beyond the end of TAG's value.
12560 Reads at or beyond END will not be made. */
12562 static unsigned char *
12563 display_tag_value (int tag,
12565 const unsigned char * const end)
12570 printf (" Tag_unknown_%d: ", tag);
12574 warn (_("<corrupt tag>\n"));
12578 /* PR 17531 file: 027-19978-0.004. */
12579 size_t maxlen = (end - p) - 1;
12584 print_symbol ((int) maxlen, (const char *) p);
12585 p += strnlen ((char *) p, maxlen) + 1;
12589 printf (_("<corrupt string tag>"));
12590 p = (unsigned char *) end;
12598 val = read_uleb128 (p, &len, end);
12600 printf ("%ld (0x%lx)\n", val, val);
12607 /* ARM EABI attributes section. */
12612 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
12614 const char ** table;
12615 } arm_attr_public_tag;
12617 static const char * arm_attr_tag_CPU_arch[] =
12618 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12619 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
12620 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12621 static const char * arm_attr_tag_THUMB_ISA_use[] =
12622 {"No", "Thumb-1", "Thumb-2"};
12623 static const char * arm_attr_tag_FP_arch[] =
12624 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12625 "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12626 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12627 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12628 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
12629 static const char * arm_attr_tag_PCS_config[] =
12630 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12631 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12632 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12633 {"V6", "SB", "TLS", "Unused"};
12634 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12635 {"Absolute", "PC-relative", "SB-relative", "None"};
12636 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12637 {"Absolute", "PC-relative", "None"};
12638 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12639 {"None", "direct", "GOT-indirect"};
12640 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12641 {"None", "??? 1", "2", "??? 3", "4"};
12642 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12643 static const char * arm_attr_tag_ABI_FP_denormal[] =
12644 {"Unused", "Needed", "Sign only"};
12645 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12646 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12647 static const char * arm_attr_tag_ABI_FP_number_model[] =
12648 {"Unused", "Finite", "RTABI", "IEEE 754"};
12649 static const char * arm_attr_tag_ABI_enum_size[] =
12650 {"Unused", "small", "int", "forced to int"};
12651 static const char * arm_attr_tag_ABI_HardFP_use[] =
12652 {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12653 static const char * arm_attr_tag_ABI_VFP_args[] =
12654 {"AAPCS", "VFP registers", "custom", "compatible"};
12655 static const char * arm_attr_tag_ABI_WMMX_args[] =
12656 {"AAPCS", "WMMX registers", "custom"};
12657 static const char * arm_attr_tag_ABI_optimization_goals[] =
12658 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12659 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12660 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12661 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12662 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12663 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12664 static const char * arm_attr_tag_FP_HP_extension[] =
12665 {"Not Allowed", "Allowed"};
12666 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12667 {"None", "IEEE 754", "Alternative Format"};
12668 static const char * arm_attr_tag_MPextension_use[] =
12669 {"Not Allowed", "Allowed"};
12670 static const char * arm_attr_tag_DIV_use[] =
12671 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12672 "Allowed in v7-A with integer division extension"};
12673 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12674 static const char * arm_attr_tag_Virtualization_use[] =
12675 {"Not Allowed", "TrustZone", "Virtualization Extensions",
12676 "TrustZone and Virtualization Extensions"};
12677 static const char * arm_attr_tag_MPextension_use_legacy[] =
12678 {"Not Allowed", "Allowed"};
12680 #define LOOKUP(id, name) \
12681 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12682 static arm_attr_public_tag arm_attr_public_tags[] =
12684 {4, "CPU_raw_name", 1, NULL},
12685 {5, "CPU_name", 1, NULL},
12686 LOOKUP(6, CPU_arch),
12687 {7, "CPU_arch_profile", 0, NULL},
12688 LOOKUP(8, ARM_ISA_use),
12689 LOOKUP(9, THUMB_ISA_use),
12690 LOOKUP(10, FP_arch),
12691 LOOKUP(11, WMMX_arch),
12692 LOOKUP(12, Advanced_SIMD_arch),
12693 LOOKUP(13, PCS_config),
12694 LOOKUP(14, ABI_PCS_R9_use),
12695 LOOKUP(15, ABI_PCS_RW_data),
12696 LOOKUP(16, ABI_PCS_RO_data),
12697 LOOKUP(17, ABI_PCS_GOT_use),
12698 LOOKUP(18, ABI_PCS_wchar_t),
12699 LOOKUP(19, ABI_FP_rounding),
12700 LOOKUP(20, ABI_FP_denormal),
12701 LOOKUP(21, ABI_FP_exceptions),
12702 LOOKUP(22, ABI_FP_user_exceptions),
12703 LOOKUP(23, ABI_FP_number_model),
12704 {24, "ABI_align_needed", 0, NULL},
12705 {25, "ABI_align_preserved", 0, NULL},
12706 LOOKUP(26, ABI_enum_size),
12707 LOOKUP(27, ABI_HardFP_use),
12708 LOOKUP(28, ABI_VFP_args),
12709 LOOKUP(29, ABI_WMMX_args),
12710 LOOKUP(30, ABI_optimization_goals),
12711 LOOKUP(31, ABI_FP_optimization_goals),
12712 {32, "compatibility", 0, NULL},
12713 LOOKUP(34, CPU_unaligned_access),
12714 LOOKUP(36, FP_HP_extension),
12715 LOOKUP(38, ABI_FP_16bit_format),
12716 LOOKUP(42, MPextension_use),
12717 LOOKUP(44, DIV_use),
12718 {64, "nodefaults", 0, NULL},
12719 {65, "also_compatible_with", 0, NULL},
12720 LOOKUP(66, T2EE_use),
12721 {67, "conformance", 1, NULL},
12722 LOOKUP(68, Virtualization_use),
12723 LOOKUP(70, MPextension_use_legacy)
12727 static unsigned char *
12728 display_arm_attribute (unsigned char * p,
12729 const unsigned char * const end)
12734 arm_attr_public_tag * attr;
12738 tag = read_uleb128 (p, &len, end);
12741 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
12743 if (arm_attr_public_tags[i].tag == tag)
12745 attr = &arm_attr_public_tags[i];
12752 printf (" Tag_%s: ", attr->name);
12753 switch (attr->type)
12758 case 7: /* Tag_CPU_arch_profile. */
12759 val = read_uleb128 (p, &len, end);
12763 case 0: printf (_("None\n")); break;
12764 case 'A': printf (_("Application\n")); break;
12765 case 'R': printf (_("Realtime\n")); break;
12766 case 'M': printf (_("Microcontroller\n")); break;
12767 case 'S': printf (_("Application or Realtime\n")); break;
12768 default: printf ("??? (%d)\n", val); break;
12772 case 24: /* Tag_align_needed. */
12773 val = read_uleb128 (p, &len, end);
12777 case 0: printf (_("None\n")); break;
12778 case 1: printf (_("8-byte\n")); break;
12779 case 2: printf (_("4-byte\n")); break;
12780 case 3: printf ("??? 3\n"); break;
12783 printf (_("8-byte and up to %d-byte extended\n"),
12786 printf ("??? (%d)\n", val);
12791 case 25: /* Tag_align_preserved. */
12792 val = read_uleb128 (p, &len, end);
12796 case 0: printf (_("None\n")); break;
12797 case 1: printf (_("8-byte, except leaf SP\n")); break;
12798 case 2: printf (_("8-byte\n")); break;
12799 case 3: printf ("??? 3\n"); break;
12802 printf (_("8-byte and up to %d-byte extended\n"),
12805 printf ("??? (%d)\n", val);
12810 case 32: /* Tag_compatibility. */
12812 val = read_uleb128 (p, &len, end);
12814 printf (_("flag = %d, vendor = "), val);
12817 size_t maxlen = (end - p) - 1;
12819 print_symbol ((int) maxlen, (const char *) p);
12820 p += strnlen ((char *) p, maxlen) + 1;
12824 printf (_("<corrupt>"));
12825 p = (unsigned char *) end;
12831 case 64: /* Tag_nodefaults. */
12832 /* PR 17531: file: 001-505008-0.01. */
12835 printf (_("True\n"));
12838 case 65: /* Tag_also_compatible_with. */
12839 val = read_uleb128 (p, &len, end);
12841 if (val == 6 /* Tag_CPU_arch. */)
12843 val = read_uleb128 (p, &len, end);
12845 if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
12846 printf ("??? (%d)\n", val);
12848 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
12852 while (p < end && *(p++) != '\0' /* NUL terminator. */)
12857 printf (_("<unknown: %d>\n"), tag);
12863 return display_tag_value (-1, p, end);
12865 return display_tag_value (0, p, end);
12868 assert (attr->type & 0x80);
12869 val = read_uleb128 (p, &len, end);
12871 type = attr->type & 0x7f;
12873 printf ("??? (%d)\n", val);
12875 printf ("%s\n", attr->table[val]);
12880 return display_tag_value (tag, p, end);
12883 static unsigned char *
12884 display_gnu_attribute (unsigned char * p,
12885 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
12886 const unsigned char * const end)
12892 tag = read_uleb128 (p, &len, end);
12895 /* Tag_compatibility is the only generic GNU attribute defined at
12899 val = read_uleb128 (p, &len, end);
12902 printf (_("flag = %d, vendor = "), val);
12905 printf (_("<corrupt>\n"));
12906 warn (_("corrupt vendor attribute\n"));
12912 size_t maxlen = (end - p) - 1;
12914 print_symbol ((int) maxlen, (const char *) p);
12915 p += strnlen ((char *) p, maxlen) + 1;
12919 printf (_("<corrupt>"));
12920 p = (unsigned char *) end;
12927 if ((tag & 2) == 0 && display_proc_gnu_attribute)
12928 return display_proc_gnu_attribute (p, tag, end);
12930 return display_tag_value (tag, p, end);
12933 static unsigned char *
12934 display_power_gnu_attribute (unsigned char * p,
12936 const unsigned char * const end)
12941 if (tag == Tag_GNU_Power_ABI_FP)
12943 val = read_uleb128 (p, &len, end);
12945 printf (" Tag_GNU_Power_ABI_FP: ");
12950 printf (_("Hard or soft float\n"));
12953 printf (_("Hard float\n"));
12956 printf (_("Soft float\n"));
12959 printf (_("Single-precision hard float\n"));
12962 printf ("??? (%d)\n", val);
12968 if (tag == Tag_GNU_Power_ABI_Vector)
12970 val = read_uleb128 (p, &len, end);
12972 printf (" Tag_GNU_Power_ABI_Vector: ");
12976 printf (_("Any\n"));
12979 printf (_("Generic\n"));
12982 printf ("AltiVec\n");
12988 printf ("??? (%d)\n", val);
12994 if (tag == Tag_GNU_Power_ABI_Struct_Return)
12998 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13002 val = read_uleb128 (p, &len, end);
13004 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
13008 printf (_("Any\n"));
13011 printf ("r3/r4\n");
13014 printf (_("Memory\n"));
13017 printf ("??? (%d)\n", val);
13023 return display_tag_value (tag & 1, p, end);
13026 static unsigned char *
13027 display_s390_gnu_attribute (unsigned char * p,
13029 const unsigned char * const end)
13034 if (tag == Tag_GNU_S390_ABI_Vector)
13036 val = read_uleb128 (p, &len, end);
13038 printf (" Tag_GNU_S390_ABI_Vector: ");
13043 printf (_("any\n"));
13046 printf (_("software\n"));
13049 printf (_("hardware\n"));
13052 printf ("??? (%d)\n", val);
13058 return display_tag_value (tag & 1, p, end);
13062 display_sparc_hwcaps (int mask)
13068 if (mask & ELF_SPARC_HWCAP_MUL32)
13069 fputs ("mul32", stdout), first = 0;
13070 if (mask & ELF_SPARC_HWCAP_DIV32)
13071 printf ("%sdiv32", first ? "" : "|"), first = 0;
13072 if (mask & ELF_SPARC_HWCAP_FSMULD)
13073 printf ("%sfsmuld", first ? "" : "|"), first = 0;
13074 if (mask & ELF_SPARC_HWCAP_V8PLUS)
13075 printf ("%sv8plus", first ? "" : "|"), first = 0;
13076 if (mask & ELF_SPARC_HWCAP_POPC)
13077 printf ("%spopc", first ? "" : "|"), first = 0;
13078 if (mask & ELF_SPARC_HWCAP_VIS)
13079 printf ("%svis", first ? "" : "|"), first = 0;
13080 if (mask & ELF_SPARC_HWCAP_VIS2)
13081 printf ("%svis2", first ? "" : "|"), first = 0;
13082 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13083 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13084 if (mask & ELF_SPARC_HWCAP_FMAF)
13085 printf ("%sfmaf", first ? "" : "|"), first = 0;
13086 if (mask & ELF_SPARC_HWCAP_VIS3)
13087 printf ("%svis3", first ? "" : "|"), first = 0;
13088 if (mask & ELF_SPARC_HWCAP_HPC)
13089 printf ("%shpc", first ? "" : "|"), first = 0;
13090 if (mask & ELF_SPARC_HWCAP_RANDOM)
13091 printf ("%srandom", first ? "" : "|"), first = 0;
13092 if (mask & ELF_SPARC_HWCAP_TRANS)
13093 printf ("%strans", first ? "" : "|"), first = 0;
13094 if (mask & ELF_SPARC_HWCAP_FJFMAU)
13095 printf ("%sfjfmau", first ? "" : "|"), first = 0;
13096 if (mask & ELF_SPARC_HWCAP_IMA)
13097 printf ("%sima", first ? "" : "|"), first = 0;
13098 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13099 printf ("%scspare", first ? "" : "|"), first = 0;
13102 fputc ('0', stdout);
13103 fputc ('\n', stdout);
13107 display_sparc_hwcaps2 (int mask)
13113 if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13114 fputs ("fjathplus", stdout), first = 0;
13115 if (mask & ELF_SPARC_HWCAP2_VIS3B)
13116 printf ("%svis3b", first ? "" : "|"), first = 0;
13117 if (mask & ELF_SPARC_HWCAP2_ADP)
13118 printf ("%sadp", first ? "" : "|"), first = 0;
13119 if (mask & ELF_SPARC_HWCAP2_SPARC5)
13120 printf ("%ssparc5", first ? "" : "|"), first = 0;
13121 if (mask & ELF_SPARC_HWCAP2_MWAIT)
13122 printf ("%smwait", first ? "" : "|"), first = 0;
13123 if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13124 printf ("%sxmpmul", first ? "" : "|"), first = 0;
13125 if (mask & ELF_SPARC_HWCAP2_XMONT)
13126 printf ("%sxmont2", first ? "" : "|"), first = 0;
13127 if (mask & ELF_SPARC_HWCAP2_NSEC)
13128 printf ("%snsec", first ? "" : "|"), first = 0;
13129 if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13130 printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13131 if (mask & ELF_SPARC_HWCAP2_FJDES)
13132 printf ("%sfjdes", first ? "" : "|"), first = 0;
13133 if (mask & ELF_SPARC_HWCAP2_FJAES)
13134 printf ("%sfjaes", first ? "" : "|"), first = 0;
13137 fputc ('0', stdout);
13138 fputc ('\n', stdout);
13141 static unsigned char *
13142 display_sparc_gnu_attribute (unsigned char * p,
13144 const unsigned char * const end)
13149 if (tag == Tag_GNU_Sparc_HWCAPS)
13151 val = read_uleb128 (p, &len, end);
13153 printf (" Tag_GNU_Sparc_HWCAPS: ");
13154 display_sparc_hwcaps (val);
13157 if (tag == Tag_GNU_Sparc_HWCAPS2)
13159 val = read_uleb128 (p, &len, end);
13161 printf (" Tag_GNU_Sparc_HWCAPS2: ");
13162 display_sparc_hwcaps2 (val);
13166 return display_tag_value (tag, p, end);
13170 print_mips_fp_abi_value (int val)
13174 case Val_GNU_MIPS_ABI_FP_ANY:
13175 printf (_("Hard or soft float\n"));
13177 case Val_GNU_MIPS_ABI_FP_DOUBLE:
13178 printf (_("Hard float (double precision)\n"));
13180 case Val_GNU_MIPS_ABI_FP_SINGLE:
13181 printf (_("Hard float (single precision)\n"));
13183 case Val_GNU_MIPS_ABI_FP_SOFT:
13184 printf (_("Soft float\n"));
13186 case Val_GNU_MIPS_ABI_FP_OLD_64:
13187 printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13189 case Val_GNU_MIPS_ABI_FP_XX:
13190 printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13192 case Val_GNU_MIPS_ABI_FP_64:
13193 printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13195 case Val_GNU_MIPS_ABI_FP_64A:
13196 printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13199 printf ("??? (%d)\n", val);
13204 static unsigned char *
13205 display_mips_gnu_attribute (unsigned char * p,
13207 const unsigned char * const end)
13209 if (tag == Tag_GNU_MIPS_ABI_FP)
13214 val = read_uleb128 (p, &len, end);
13216 printf (" Tag_GNU_MIPS_ABI_FP: ");
13218 print_mips_fp_abi_value (val);
13223 if (tag == Tag_GNU_MIPS_ABI_MSA)
13228 val = read_uleb128 (p, &len, end);
13230 printf (" Tag_GNU_MIPS_ABI_MSA: ");
13234 case Val_GNU_MIPS_ABI_MSA_ANY:
13235 printf (_("Any MSA or not\n"));
13237 case Val_GNU_MIPS_ABI_MSA_128:
13238 printf (_("128-bit MSA\n"));
13241 printf ("??? (%d)\n", val);
13247 return display_tag_value (tag & 1, p, end);
13250 static unsigned char *
13251 display_tic6x_attribute (unsigned char * p,
13252 const unsigned char * const end)
13258 tag = read_uleb128 (p, &len, end);
13264 val = read_uleb128 (p, &len, end);
13266 printf (" Tag_ISA: ");
13270 case C6XABI_Tag_ISA_none:
13271 printf (_("None\n"));
13273 case C6XABI_Tag_ISA_C62X:
13276 case C6XABI_Tag_ISA_C67X:
13279 case C6XABI_Tag_ISA_C67XP:
13280 printf ("C67x+\n");
13282 case C6XABI_Tag_ISA_C64X:
13285 case C6XABI_Tag_ISA_C64XP:
13286 printf ("C64x+\n");
13288 case C6XABI_Tag_ISA_C674X:
13289 printf ("C674x\n");
13292 printf ("??? (%d)\n", val);
13297 case Tag_ABI_wchar_t:
13298 val = read_uleb128 (p, &len, end);
13300 printf (" Tag_ABI_wchar_t: ");
13304 printf (_("Not used\n"));
13307 printf (_("2 bytes\n"));
13310 printf (_("4 bytes\n"));
13313 printf ("??? (%d)\n", val);
13318 case Tag_ABI_stack_align_needed:
13319 val = read_uleb128 (p, &len, end);
13321 printf (" Tag_ABI_stack_align_needed: ");
13325 printf (_("8-byte\n"));
13328 printf (_("16-byte\n"));
13331 printf ("??? (%d)\n", val);
13336 case Tag_ABI_stack_align_preserved:
13337 val = read_uleb128 (p, &len, end);
13339 printf (" Tag_ABI_stack_align_preserved: ");
13343 printf (_("8-byte\n"));
13346 printf (_("16-byte\n"));
13349 printf ("??? (%d)\n", val);
13355 val = read_uleb128 (p, &len, end);
13357 printf (" Tag_ABI_DSBT: ");
13361 printf (_("DSBT addressing not used\n"));
13364 printf (_("DSBT addressing used\n"));
13367 printf ("??? (%d)\n", val);
13373 val = read_uleb128 (p, &len, end);
13375 printf (" Tag_ABI_PID: ");
13379 printf (_("Data addressing position-dependent\n"));
13382 printf (_("Data addressing position-independent, GOT near DP\n"));
13385 printf (_("Data addressing position-independent, GOT far from DP\n"));
13388 printf ("??? (%d)\n", val);
13394 val = read_uleb128 (p, &len, end);
13396 printf (" Tag_ABI_PIC: ");
13400 printf (_("Code addressing position-dependent\n"));
13403 printf (_("Code addressing position-independent\n"));
13406 printf ("??? (%d)\n", val);
13411 case Tag_ABI_array_object_alignment:
13412 val = read_uleb128 (p, &len, end);
13414 printf (" Tag_ABI_array_object_alignment: ");
13418 printf (_("8-byte\n"));
13421 printf (_("4-byte\n"));
13424 printf (_("16-byte\n"));
13427 printf ("??? (%d)\n", val);
13432 case Tag_ABI_array_object_align_expected:
13433 val = read_uleb128 (p, &len, end);
13435 printf (" Tag_ABI_array_object_align_expected: ");
13439 printf (_("8-byte\n"));
13442 printf (_("4-byte\n"));
13445 printf (_("16-byte\n"));
13448 printf ("??? (%d)\n", val);
13453 case Tag_ABI_compatibility:
13455 val = read_uleb128 (p, &len, end);
13457 printf (" Tag_ABI_compatibility: ");
13458 printf (_("flag = %d, vendor = "), val);
13461 size_t maxlen = (end - p) - 1;
13463 print_symbol ((int) maxlen, (const char *) p);
13464 p += strnlen ((char *) p, maxlen) + 1;
13468 printf (_("<corrupt>"));
13469 p = (unsigned char *) end;
13475 case Tag_ABI_conformance:
13477 printf (" Tag_ABI_conformance: \"");
13480 size_t maxlen = (end - p) - 1;
13482 print_symbol ((int) maxlen, (const char *) p);
13483 p += strnlen ((char *) p, maxlen) + 1;
13487 printf (_("<corrupt>"));
13488 p = (unsigned char *) end;
13495 return display_tag_value (tag, p, end);
13499 display_raw_attribute (unsigned char * p, unsigned char * end)
13501 unsigned long addr = 0;
13502 size_t bytes = end - p;
13509 int lbytes = (bytes > 16 ? 16 : bytes);
13511 printf (" 0x%8.8lx ", addr);
13513 for (j = 0; j < 16; j++)
13516 printf ("%2.2x", p[j]);
13524 for (j = 0; j < lbytes; j++)
13527 if (k >= ' ' && k < 0x7f)
13543 static unsigned char *
13544 display_msp430x_attribute (unsigned char * p,
13545 const unsigned char * const end)
13551 tag = read_uleb128 (p, & len, end);
13556 case OFBA_MSPABI_Tag_ISA:
13557 val = read_uleb128 (p, &len, end);
13559 printf (" Tag_ISA: ");
13562 case 0: printf (_("None\n")); break;
13563 case 1: printf (_("MSP430\n")); break;
13564 case 2: printf (_("MSP430X\n")); break;
13565 default: printf ("??? (%d)\n", val); break;
13569 case OFBA_MSPABI_Tag_Code_Model:
13570 val = read_uleb128 (p, &len, end);
13572 printf (" Tag_Code_Model: ");
13575 case 0: printf (_("None\n")); break;
13576 case 1: printf (_("Small\n")); break;
13577 case 2: printf (_("Large\n")); break;
13578 default: printf ("??? (%d)\n", val); break;
13582 case OFBA_MSPABI_Tag_Data_Model:
13583 val = read_uleb128 (p, &len, end);
13585 printf (" Tag_Data_Model: ");
13588 case 0: printf (_("None\n")); break;
13589 case 1: printf (_("Small\n")); break;
13590 case 2: printf (_("Large\n")); break;
13591 case 3: printf (_("Restricted Large\n")); break;
13592 default: printf ("??? (%d)\n", val); break;
13597 printf (_(" <unknown tag %d>: "), tag);
13604 size_t maxlen = (end - p) - 1;
13606 print_symbol ((int) maxlen, (const char *) p);
13607 p += strnlen ((char *) p, maxlen) + 1;
13611 printf (_("<corrupt>"));
13612 p = (unsigned char *) end;
13618 val = read_uleb128 (p, &len, end);
13620 printf ("%d (0x%x)\n", val, val);
13630 process_attributes (FILE * file,
13631 const char * public_name,
13632 unsigned int proc_type,
13633 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13634 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13636 Elf_Internal_Shdr * sect;
13639 /* Find the section header so that we get the size. */
13640 for (i = 0, sect = section_headers;
13641 i < elf_header.e_shnum;
13644 unsigned char * contents;
13647 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13650 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13651 sect->sh_size, _("attributes"));
13652 if (contents == NULL)
13658 bfd_vma section_len;
13660 section_len = sect->sh_size - 1;
13663 while (section_len > 0)
13666 unsigned int namelen;
13667 bfd_boolean public_section;
13668 bfd_boolean gnu_section;
13670 if (section_len <= 4)
13672 error (_("Tag section ends prematurely\n"));
13675 attr_len = byte_get (p, 4);
13678 if (attr_len > section_len)
13680 error (_("Bad attribute length (%u > %u)\n"),
13681 (unsigned) attr_len, (unsigned) section_len);
13682 attr_len = section_len;
13684 /* PR 17531: file: 001-101425-0.004 */
13685 else if (attr_len < 5)
13687 error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13691 section_len -= attr_len;
13694 namelen = strnlen ((char *) p, attr_len) + 1;
13695 if (namelen == 0 || namelen >= attr_len)
13697 error (_("Corrupt attribute section name\n"));
13701 printf (_("Attribute Section: "));
13702 print_symbol (INT_MAX, (const char *) p);
13705 if (public_name && streq ((char *) p, public_name))
13706 public_section = TRUE;
13708 public_section = FALSE;
13710 if (streq ((char *) p, "gnu"))
13711 gnu_section = TRUE;
13713 gnu_section = FALSE;
13716 attr_len -= namelen;
13718 while (attr_len > 0 && p < contents + sect->sh_size)
13723 unsigned char * end;
13725 /* PR binutils/17531: Safe handling of corrupt files. */
13728 error (_("Unused bytes at end of section\n"));
13734 size = byte_get (p, 4);
13735 if (size > attr_len)
13737 error (_("Bad subsection length (%u > %u)\n"),
13738 (unsigned) size, (unsigned) attr_len);
13741 /* PR binutils/17531: Safe handling of corrupt files. */
13744 error (_("Bad subsection length (%u < 6)\n"),
13751 end = p + size - 1;
13752 assert (end <= contents + sect->sh_size);
13758 printf (_("File Attributes\n"));
13761 printf (_("Section Attributes:"));
13764 printf (_("Symbol Attributes:"));
13770 val = read_uleb128 (p, &j, end);
13774 printf (" %d", val);
13779 printf (_("Unknown tag: %d\n"), tag);
13780 public_section = FALSE;
13784 if (public_section && display_pub_attribute != NULL)
13787 p = display_pub_attribute (p, end);
13790 else if (gnu_section && display_proc_gnu_attribute != NULL)
13793 p = display_gnu_attribute (p,
13794 display_proc_gnu_attribute,
13800 printf (_(" Unknown attribute:\n"));
13801 display_raw_attribute (p, end);
13810 printf (_("Unknown format '%c' (%d)\n"), *p, *p);
13818 process_arm_specific (FILE * file)
13820 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
13821 display_arm_attribute, NULL);
13825 process_power_specific (FILE * file)
13827 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13828 display_power_gnu_attribute);
13832 process_s390_specific (FILE * file)
13834 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13835 display_s390_gnu_attribute);
13839 process_sparc_specific (FILE * file)
13841 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
13842 display_sparc_gnu_attribute);
13846 process_tic6x_specific (FILE * file)
13848 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
13849 display_tic6x_attribute, NULL);
13853 process_msp430x_specific (FILE * file)
13855 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
13856 display_msp430x_attribute, NULL);
13859 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
13860 Print the Address, Access and Initial fields of an entry at VMA ADDR
13861 and return the VMA of the next entry, or -1 if there was a problem.
13862 Does not read from DATA_END or beyond. */
13865 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
13866 unsigned char * data_end)
13869 print_vma (addr, LONG_HEX);
13871 if (addr < pltgot + 0xfff0)
13872 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
13874 printf ("%10s", "");
13877 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13881 unsigned char * from = data + addr - pltgot;
13883 if (from + (is_32bit_elf ? 4 : 8) > data_end)
13885 warn (_("MIPS GOT entry extends beyond the end of available data\n"));
13886 printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
13887 return (bfd_vma) -1;
13891 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13892 print_vma (entry, LONG_HEX);
13895 return addr + (is_32bit_elf ? 4 : 8);
13898 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
13899 PLTGOT. Print the Address and Initial fields of an entry at VMA
13900 ADDR and return the VMA of the next entry. */
13903 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
13906 print_vma (addr, LONG_HEX);
13909 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
13914 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
13915 print_vma (entry, LONG_HEX);
13917 return addr + (is_32bit_elf ? 4 : 8);
13921 print_mips_ases (unsigned int mask)
13923 if (mask & AFL_ASE_DSP)
13924 fputs ("\n\tDSP ASE", stdout);
13925 if (mask & AFL_ASE_DSPR2)
13926 fputs ("\n\tDSP R2 ASE", stdout);
13927 if (mask & AFL_ASE_EVA)
13928 fputs ("\n\tEnhanced VA Scheme", stdout);
13929 if (mask & AFL_ASE_MCU)
13930 fputs ("\n\tMCU (MicroController) ASE", stdout);
13931 if (mask & AFL_ASE_MDMX)
13932 fputs ("\n\tMDMX ASE", stdout);
13933 if (mask & AFL_ASE_MIPS3D)
13934 fputs ("\n\tMIPS-3D ASE", stdout);
13935 if (mask & AFL_ASE_MT)
13936 fputs ("\n\tMT ASE", stdout);
13937 if (mask & AFL_ASE_SMARTMIPS)
13938 fputs ("\n\tSmartMIPS ASE", stdout);
13939 if (mask & AFL_ASE_VIRT)
13940 fputs ("\n\tVZ ASE", stdout);
13941 if (mask & AFL_ASE_MSA)
13942 fputs ("\n\tMSA ASE", stdout);
13943 if (mask & AFL_ASE_MIPS16)
13944 fputs ("\n\tMIPS16 ASE", stdout);
13945 if (mask & AFL_ASE_MICROMIPS)
13946 fputs ("\n\tMICROMIPS ASE", stdout);
13947 if (mask & AFL_ASE_XPA)
13948 fputs ("\n\tXPA ASE", stdout);
13950 fprintf (stdout, "\n\t%s", _("None"));
13951 else if ((mask & ~AFL_ASE_MASK) != 0)
13952 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
13956 print_mips_isa_ext (unsigned int isa_ext)
13961 fputs (_("None"), stdout);
13964 fputs ("RMI XLR", stdout);
13966 case AFL_EXT_OCTEON3:
13967 fputs ("Cavium Networks Octeon3", stdout);
13969 case AFL_EXT_OCTEON2:
13970 fputs ("Cavium Networks Octeon2", stdout);
13972 case AFL_EXT_OCTEONP:
13973 fputs ("Cavium Networks OcteonP", stdout);
13975 case AFL_EXT_LOONGSON_3A:
13976 fputs ("Loongson 3A", stdout);
13978 case AFL_EXT_OCTEON:
13979 fputs ("Cavium Networks Octeon", stdout);
13982 fputs ("Toshiba R5900", stdout);
13985 fputs ("MIPS R4650", stdout);
13988 fputs ("LSI R4010", stdout);
13991 fputs ("NEC VR4100", stdout);
13994 fputs ("Toshiba R3900", stdout);
13996 case AFL_EXT_10000:
13997 fputs ("MIPS R10000", stdout);
14000 fputs ("Broadcom SB-1", stdout);
14003 fputs ("NEC VR4111/VR4181", stdout);
14006 fputs ("NEC VR4120", stdout);
14009 fputs ("NEC VR5400", stdout);
14012 fputs ("NEC VR5500", stdout);
14014 case AFL_EXT_LOONGSON_2E:
14015 fputs ("ST Microelectronics Loongson 2E", stdout);
14017 case AFL_EXT_LOONGSON_2F:
14018 fputs ("ST Microelectronics Loongson 2F", stdout);
14021 fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14026 get_mips_reg_size (int reg_size)
14028 return (reg_size == AFL_REG_NONE) ? 0
14029 : (reg_size == AFL_REG_32) ? 32
14030 : (reg_size == AFL_REG_64) ? 64
14031 : (reg_size == AFL_REG_128) ? 128
14036 process_mips_specific (FILE * file)
14038 Elf_Internal_Dyn * entry;
14039 Elf_Internal_Shdr *sect = NULL;
14040 size_t liblist_offset = 0;
14041 size_t liblistno = 0;
14042 size_t conflictsno = 0;
14043 size_t options_offset = 0;
14044 size_t conflicts_offset = 0;
14045 size_t pltrelsz = 0;
14047 bfd_vma pltgot = 0;
14048 bfd_vma mips_pltgot = 0;
14049 bfd_vma jmprel = 0;
14050 bfd_vma local_gotno = 0;
14051 bfd_vma gotsym = 0;
14052 bfd_vma symtabno = 0;
14054 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14055 display_mips_gnu_attribute);
14057 sect = find_section (".MIPS.abiflags");
14061 Elf_External_ABIFlags_v0 *abiflags_ext;
14062 Elf_Internal_ABIFlags_v0 abiflags_in;
14064 if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14065 fputs ("\nCorrupt ABI Flags section.\n", stdout);
14068 abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14069 sect->sh_size, _("MIPS ABI Flags section"));
14072 abiflags_in.version = BYTE_GET (abiflags_ext->version);
14073 abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14074 abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14075 abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14076 abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14077 abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14078 abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14079 abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14080 abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14081 abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14082 abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14084 printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14085 printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14086 if (abiflags_in.isa_rev > 1)
14087 printf ("r%d", abiflags_in.isa_rev);
14088 printf ("\nGPR size: %d",
14089 get_mips_reg_size (abiflags_in.gpr_size));
14090 printf ("\nCPR1 size: %d",
14091 get_mips_reg_size (abiflags_in.cpr1_size));
14092 printf ("\nCPR2 size: %d",
14093 get_mips_reg_size (abiflags_in.cpr2_size));
14094 fputs ("\nFP ABI: ", stdout);
14095 print_mips_fp_abi_value (abiflags_in.fp_abi);
14096 fputs ("ISA Extension: ", stdout);
14097 print_mips_isa_ext (abiflags_in.isa_ext);
14098 fputs ("\nASEs:", stdout);
14099 print_mips_ases (abiflags_in.ases);
14100 printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14101 printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14102 fputc ('\n', stdout);
14103 free (abiflags_ext);
14108 /* We have a lot of special sections. Thanks SGI! */
14109 if (dynamic_section == NULL)
14110 /* No information available. */
14113 for (entry = dynamic_section;
14114 /* PR 17531 file: 012-50589-0.004. */
14115 entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14117 switch (entry->d_tag)
14119 case DT_MIPS_LIBLIST:
14121 = offset_from_vma (file, entry->d_un.d_val,
14122 liblistno * sizeof (Elf32_External_Lib));
14124 case DT_MIPS_LIBLISTNO:
14125 liblistno = entry->d_un.d_val;
14127 case DT_MIPS_OPTIONS:
14128 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14130 case DT_MIPS_CONFLICT:
14132 = offset_from_vma (file, entry->d_un.d_val,
14133 conflictsno * sizeof (Elf32_External_Conflict));
14135 case DT_MIPS_CONFLICTNO:
14136 conflictsno = entry->d_un.d_val;
14139 pltgot = entry->d_un.d_ptr;
14141 case DT_MIPS_LOCAL_GOTNO:
14142 local_gotno = entry->d_un.d_val;
14144 case DT_MIPS_GOTSYM:
14145 gotsym = entry->d_un.d_val;
14147 case DT_MIPS_SYMTABNO:
14148 symtabno = entry->d_un.d_val;
14150 case DT_MIPS_PLTGOT:
14151 mips_pltgot = entry->d_un.d_ptr;
14154 pltrel = entry->d_un.d_val;
14157 pltrelsz = entry->d_un.d_val;
14160 jmprel = entry->d_un.d_ptr;
14166 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14168 Elf32_External_Lib * elib;
14171 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14173 sizeof (Elf32_External_Lib),
14174 _("liblist section data"));
14177 printf (_("\nSection '.liblist' contains %lu entries:\n"),
14178 (unsigned long) liblistno);
14179 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
14182 for (cnt = 0; cnt < liblistno; ++cnt)
14189 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14190 atime = BYTE_GET (elib[cnt].l_time_stamp);
14191 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14192 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14193 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14195 tmp = gmtime (&atime);
14196 snprintf (timebuf, sizeof (timebuf),
14197 "%04u-%02u-%02uT%02u:%02u:%02u",
14198 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14199 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14201 printf ("%3lu: ", (unsigned long) cnt);
14202 if (VALID_DYNAMIC_NAME (liblist.l_name))
14203 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14205 printf (_("<corrupt: %9ld>"), liblist.l_name);
14206 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14207 liblist.l_version);
14209 if (liblist.l_flags == 0)
14213 static const struct
14220 { " EXACT_MATCH", LL_EXACT_MATCH },
14221 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14222 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14223 { " EXPORTS", LL_EXPORTS },
14224 { " DELAY_LOAD", LL_DELAY_LOAD },
14225 { " DELTA", LL_DELTA }
14227 int flags = liblist.l_flags;
14230 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14231 if ((flags & l_flags_vals[fcnt].bit) != 0)
14233 fputs (l_flags_vals[fcnt].name, stdout);
14234 flags ^= l_flags_vals[fcnt].bit;
14237 printf (" %#x", (unsigned int) flags);
14247 if (options_offset != 0)
14249 Elf_External_Options * eopt;
14250 Elf_Internal_Options * iopt;
14251 Elf_Internal_Options * option;
14254 sect = section_headers;
14256 /* Find the section header so that we get the size. */
14257 sect = find_section_by_type (SHT_MIPS_OPTIONS);
14258 /* PR 17533 file: 012-277276-0.004. */
14261 error (_("No MIPS_OPTIONS header found\n"));
14265 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14266 sect->sh_size, _("options"));
14269 iopt = (Elf_Internal_Options *)
14270 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14273 error (_("Out of memory allocatinf space for MIPS options\n"));
14280 while (offset <= sect->sh_size - sizeof (* eopt))
14282 Elf_External_Options * eoption;
14284 eoption = (Elf_External_Options *) ((char *) eopt + offset);
14286 option->kind = BYTE_GET (eoption->kind);
14287 option->size = BYTE_GET (eoption->size);
14288 option->section = BYTE_GET (eoption->section);
14289 option->info = BYTE_GET (eoption->info);
14291 /* PR 17531: file: ffa0fa3b. */
14292 if (option->size < sizeof (* eopt)
14293 || offset + option->size > sect->sh_size)
14295 error (_("Invalid size (%u) for MIPS option\n"), option->size);
14298 offset += option->size;
14304 printf (_("\nSection '%s' contains %d entries:\n"),
14305 printable_section_name (sect), cnt);
14314 switch (option->kind)
14317 /* This shouldn't happen. */
14318 printf (" NULL %d %lx", option->section, option->info);
14321 printf (" REGINFO ");
14322 if (elf_header.e_machine == EM_MIPS)
14325 Elf32_External_RegInfo * ereg;
14326 Elf32_RegInfo reginfo;
14328 ereg = (Elf32_External_RegInfo *) (option + 1);
14329 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14330 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14331 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14332 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14333 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14334 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14336 printf ("GPR %08lx GP 0x%lx\n",
14337 reginfo.ri_gprmask,
14338 (unsigned long) reginfo.ri_gp_value);
14339 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14340 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14341 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14346 Elf64_External_RegInfo * ereg;
14347 Elf64_Internal_RegInfo reginfo;
14349 ereg = (Elf64_External_RegInfo *) (option + 1);
14350 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14351 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14352 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14353 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14354 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14355 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14357 printf ("GPR %08lx GP 0x",
14358 reginfo.ri_gprmask);
14359 printf_vma (reginfo.ri_gp_value);
14362 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
14363 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14364 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14368 case ODK_EXCEPTIONS:
14369 fputs (" EXCEPTIONS fpe_min(", stdout);
14370 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14371 fputs (") fpe_max(", stdout);
14372 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14373 fputs (")", stdout);
14375 if (option->info & OEX_PAGE0)
14376 fputs (" PAGE0", stdout);
14377 if (option->info & OEX_SMM)
14378 fputs (" SMM", stdout);
14379 if (option->info & OEX_FPDBUG)
14380 fputs (" FPDBUG", stdout);
14381 if (option->info & OEX_DISMISS)
14382 fputs (" DISMISS", stdout);
14385 fputs (" PAD ", stdout);
14386 if (option->info & OPAD_PREFIX)
14387 fputs (" PREFIX", stdout);
14388 if (option->info & OPAD_POSTFIX)
14389 fputs (" POSTFIX", stdout);
14390 if (option->info & OPAD_SYMBOL)
14391 fputs (" SYMBOL", stdout);
14394 fputs (" HWPATCH ", stdout);
14395 if (option->info & OHW_R4KEOP)
14396 fputs (" R4KEOP", stdout);
14397 if (option->info & OHW_R8KPFETCH)
14398 fputs (" R8KPFETCH", stdout);
14399 if (option->info & OHW_R5KEOP)
14400 fputs (" R5KEOP", stdout);
14401 if (option->info & OHW_R5KCVTL)
14402 fputs (" R5KCVTL", stdout);
14405 fputs (" FILL ", stdout);
14406 /* XXX Print content of info word? */
14409 fputs (" TAGS ", stdout);
14410 /* XXX Print content of info word? */
14413 fputs (" HWAND ", stdout);
14414 if (option->info & OHWA0_R4KEOP_CHECKED)
14415 fputs (" R4KEOP_CHECKED", stdout);
14416 if (option->info & OHWA0_R4KEOP_CLEAN)
14417 fputs (" R4KEOP_CLEAN", stdout);
14420 fputs (" HWOR ", stdout);
14421 if (option->info & OHWA0_R4KEOP_CHECKED)
14422 fputs (" R4KEOP_CHECKED", stdout);
14423 if (option->info & OHWA0_R4KEOP_CLEAN)
14424 fputs (" R4KEOP_CLEAN", stdout);
14427 printf (" GP_GROUP %#06lx self-contained %#06lx",
14428 option->info & OGP_GROUP,
14429 (option->info & OGP_SELF) >> 16);
14432 printf (" IDENT %#06lx self-contained %#06lx",
14433 option->info & OGP_GROUP,
14434 (option->info & OGP_SELF) >> 16);
14437 /* This shouldn't happen. */
14438 printf (" %3d ??? %d %lx",
14439 option->kind, option->section, option->info);
14443 len = sizeof (* eopt);
14444 while (len < option->size)
14446 char datum = * ((char *) eopt + offset + len);
14448 if (ISPRINT (datum))
14449 printf ("%c", datum);
14451 printf ("\\%03o", datum);
14454 fputs ("\n", stdout);
14456 offset += option->size;
14464 if (conflicts_offset != 0 && conflictsno != 0)
14466 Elf32_Conflict * iconf;
14469 if (dynamic_symbols == NULL)
14471 error (_("conflict list found without a dynamic symbol table\n"));
14475 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14478 error (_("Out of memory allocating space for dynamic conflicts\n"));
14484 Elf32_External_Conflict * econf32;
14486 econf32 = (Elf32_External_Conflict *)
14487 get_data (NULL, file, conflicts_offset, conflictsno,
14488 sizeof (* econf32), _("conflict"));
14492 for (cnt = 0; cnt < conflictsno; ++cnt)
14493 iconf[cnt] = BYTE_GET (econf32[cnt]);
14499 Elf64_External_Conflict * econf64;
14501 econf64 = (Elf64_External_Conflict *)
14502 get_data (NULL, file, conflicts_offset, conflictsno,
14503 sizeof (* econf64), _("conflict"));
14507 for (cnt = 0; cnt < conflictsno; ++cnt)
14508 iconf[cnt] = BYTE_GET (econf64[cnt]);
14513 printf (_("\nSection '.conflict' contains %lu entries:\n"),
14514 (unsigned long) conflictsno);
14515 puts (_(" Num: Index Value Name"));
14517 for (cnt = 0; cnt < conflictsno; ++cnt)
14519 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
14521 if (iconf[cnt] >= num_dynamic_syms)
14522 printf (_("<corrupt symbol index>"));
14525 Elf_Internal_Sym * psym;
14527 psym = & dynamic_symbols[iconf[cnt]];
14528 print_vma (psym->st_value, FULL_HEX);
14530 if (VALID_DYNAMIC_NAME (psym->st_name))
14531 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14533 printf (_("<corrupt: %14ld>"), psym->st_name);
14541 if (pltgot != 0 && local_gotno != 0)
14543 bfd_vma ent, local_end, global_end;
14545 unsigned char * data;
14546 unsigned char * data_end;
14550 addr_size = (is_32bit_elf ? 4 : 8);
14551 local_end = pltgot + local_gotno * addr_size;
14553 /* PR binutils/17533 file: 012-111227-0.004 */
14554 if (symtabno < gotsym)
14556 error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14557 (unsigned long) gotsym, (unsigned long) symtabno);
14561 global_end = local_end + (symtabno - gotsym) * addr_size;
14562 /* PR 17531: file: 54c91a34. */
14563 if (global_end < local_end)
14565 error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14569 offset = offset_from_vma (file, pltgot, global_end - pltgot);
14570 data = (unsigned char *) get_data (NULL, file, offset,
14571 global_end - pltgot, 1,
14572 _("Global Offset Table data"));
14575 data_end = data + (global_end - pltgot);
14577 printf (_("\nPrimary GOT:\n"));
14578 printf (_(" Canonical gp value: "));
14579 print_vma (pltgot + 0x7ff0, LONG_HEX);
14582 printf (_(" Reserved entries:\n"));
14583 printf (_(" %*s %10s %*s Purpose\n"),
14584 addr_size * 2, _("Address"), _("Access"),
14585 addr_size * 2, _("Initial"));
14586 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14587 printf (_(" Lazy resolver\n"));
14588 if (ent == (bfd_vma) -1)
14589 goto got_print_fail;
14591 && (byte_get (data + ent - pltgot, addr_size)
14592 >> (addr_size * 8 - 1)) != 0)
14594 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14595 printf (_(" Module pointer (GNU extension)\n"));
14596 if (ent == (bfd_vma) -1)
14597 goto got_print_fail;
14601 if (ent < local_end)
14603 printf (_(" Local entries:\n"));
14604 printf (" %*s %10s %*s\n",
14605 addr_size * 2, _("Address"), _("Access"),
14606 addr_size * 2, _("Initial"));
14607 while (ent < local_end)
14609 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14611 if (ent == (bfd_vma) -1)
14612 goto got_print_fail;
14617 if (gotsym < symtabno)
14621 printf (_(" Global entries:\n"));
14622 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
14623 addr_size * 2, _("Address"),
14625 addr_size * 2, _("Initial"),
14626 addr_size * 2, _("Sym.Val."),
14628 /* Note for translators: "Ndx" = abbreviated form of "Index". */
14629 _("Ndx"), _("Name"));
14631 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14633 for (i = gotsym; i < symtabno; i++)
14635 ent = print_mips_got_entry (data, pltgot, ent, data_end);
14638 if (dynamic_symbols == NULL)
14639 printf (_("<no dynamic symbols>"));
14640 else if (i < num_dynamic_syms)
14642 Elf_Internal_Sym * psym = dynamic_symbols + i;
14644 print_vma (psym->st_value, LONG_HEX);
14645 printf (" %-7s %3s ",
14646 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14647 get_symbol_index_type (psym->st_shndx));
14649 if (VALID_DYNAMIC_NAME (psym->st_name))
14650 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14652 printf (_("<corrupt: %14ld>"), psym->st_name);
14655 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14656 (unsigned long) i);
14659 if (ent == (bfd_vma) -1)
14670 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14673 size_t offset, rel_offset;
14674 unsigned long count, i;
14675 unsigned char * data;
14676 int addr_size, sym_width;
14677 Elf_Internal_Rela * rels;
14679 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14680 if (pltrel == DT_RELA)
14682 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14687 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14692 addr_size = (is_32bit_elf ? 4 : 8);
14693 end = mips_pltgot + (2 + count) * addr_size;
14695 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
14696 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
14697 1, _("Procedure Linkage Table data"));
14701 printf ("\nPLT GOT:\n\n");
14702 printf (_(" Reserved entries:\n"));
14703 printf (_(" %*s %*s Purpose\n"),
14704 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
14705 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14706 printf (_(" PLT lazy resolver\n"));
14707 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14708 printf (_(" Module pointer\n"));
14711 printf (_(" Entries:\n"));
14712 printf (" %*s %*s %*s %-7s %3s %s\n",
14713 addr_size * 2, _("Address"),
14714 addr_size * 2, _("Initial"),
14715 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
14716 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
14717 for (i = 0; i < count; i++)
14719 unsigned long idx = get_reloc_symindex (rels[i].r_info);
14721 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
14724 if (idx >= num_dynamic_syms)
14725 printf (_("<corrupt symbol index: %lu>"), idx);
14728 Elf_Internal_Sym * psym = dynamic_symbols + idx;
14730 print_vma (psym->st_value, LONG_HEX);
14731 printf (" %-7s %3s ",
14732 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14733 get_symbol_index_type (psym->st_shndx));
14734 if (VALID_DYNAMIC_NAME (psym->st_name))
14735 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14737 printf (_("<corrupt: %14ld>"), psym->st_name);
14752 process_nds32_specific (FILE * file)
14754 Elf_Internal_Shdr *sect = NULL;
14756 sect = find_section (".nds32_e_flags");
14759 unsigned int *flag;
14761 printf ("\nNDS32 elf flags section:\n");
14762 flag = get_data (NULL, file, sect->sh_offset, 1,
14763 sect->sh_size, _("NDS32 elf flags section"));
14765 switch ((*flag) & 0x3)
14768 printf ("(VEC_SIZE):\tNo entry.\n");
14771 printf ("(VEC_SIZE):\t4 bytes\n");
14774 printf ("(VEC_SIZE):\t16 bytes\n");
14777 printf ("(VEC_SIZE):\treserved\n");
14786 process_gnu_liblist (FILE * file)
14788 Elf_Internal_Shdr * section;
14789 Elf_Internal_Shdr * string_sec;
14790 Elf32_External_Lib * elib;
14792 size_t strtab_size;
14799 for (i = 0, section = section_headers;
14800 i < elf_header.e_shnum;
14803 switch (section->sh_type)
14805 case SHT_GNU_LIBLIST:
14806 if (section->sh_link >= elf_header.e_shnum)
14809 elib = (Elf32_External_Lib *)
14810 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
14811 _("liblist section data"));
14815 string_sec = section_headers + section->sh_link;
14817 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
14818 string_sec->sh_size,
14819 _("liblist string table"));
14821 || section->sh_entsize != sizeof (Elf32_External_Lib))
14827 strtab_size = string_sec->sh_size;
14829 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
14830 printable_section_name (section),
14831 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
14833 puts (_(" Library Time Stamp Checksum Version Flags"));
14835 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
14843 liblist.l_name = BYTE_GET (elib[cnt].l_name);
14844 atime = BYTE_GET (elib[cnt].l_time_stamp);
14845 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14846 liblist.l_version = BYTE_GET (elib[cnt].l_version);
14847 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14849 tmp = gmtime (&atime);
14850 snprintf (timebuf, sizeof (timebuf),
14851 "%04u-%02u-%02uT%02u:%02u:%02u",
14852 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14853 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14855 printf ("%3lu: ", (unsigned long) cnt);
14857 printf ("%-20s", liblist.l_name < strtab_size
14858 ? strtab + liblist.l_name : _("<corrupt>"));
14860 printf ("%-20.20s", liblist.l_name < strtab_size
14861 ? strtab + liblist.l_name : _("<corrupt>"));
14862 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
14863 liblist.l_version, liblist.l_flags);
14874 static const char *
14875 get_note_type (unsigned e_type)
14877 static char buff[64];
14879 if (elf_header.e_type == ET_CORE)
14883 return _("NT_AUXV (auxiliary vector)");
14885 return _("NT_PRSTATUS (prstatus structure)");
14887 return _("NT_FPREGSET (floating point registers)");
14889 return _("NT_PRPSINFO (prpsinfo structure)");
14890 case NT_TASKSTRUCT:
14891 return _("NT_TASKSTRUCT (task structure)");
14893 return _("NT_PRXFPREG (user_xfpregs structure)");
14895 return _("NT_PPC_VMX (ppc Altivec registers)");
14897 return _("NT_PPC_VSX (ppc VSX registers)");
14899 return _("NT_386_TLS (x86 TLS information)");
14900 case NT_386_IOPERM:
14901 return _("NT_386_IOPERM (x86 I/O permissions)");
14902 case NT_X86_XSTATE:
14903 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
14904 case NT_S390_HIGH_GPRS:
14905 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
14906 case NT_S390_TIMER:
14907 return _("NT_S390_TIMER (s390 timer register)");
14908 case NT_S390_TODCMP:
14909 return _("NT_S390_TODCMP (s390 TOD comparator register)");
14910 case NT_S390_TODPREG:
14911 return _("NT_S390_TODPREG (s390 TOD programmable register)");
14913 return _("NT_S390_CTRS (s390 control registers)");
14914 case NT_S390_PREFIX:
14915 return _("NT_S390_PREFIX (s390 prefix register)");
14916 case NT_S390_LAST_BREAK:
14917 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
14918 case NT_S390_SYSTEM_CALL:
14919 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
14921 return _("NT_S390_TDB (s390 transaction diagnostic block)");
14922 case NT_S390_VXRS_LOW:
14923 return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
14924 case NT_S390_VXRS_HIGH:
14925 return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
14927 return _("NT_ARM_VFP (arm VFP registers)");
14929 return _("NT_ARM_TLS (AArch TLS registers)");
14930 case NT_ARM_HW_BREAK:
14931 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
14932 case NT_ARM_HW_WATCH:
14933 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
14935 return _("NT_PSTATUS (pstatus structure)");
14937 return _("NT_FPREGS (floating point registers)");
14939 return _("NT_PSINFO (psinfo structure)");
14941 return _("NT_LWPSTATUS (lwpstatus_t structure)");
14943 return _("NT_LWPSINFO (lwpsinfo_t structure)");
14944 case NT_WIN32PSTATUS:
14945 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
14947 return _("NT_SIGINFO (siginfo_t data)");
14949 return _("NT_FILE (mapped files)");
14957 return _("NT_VERSION (version)");
14959 return _("NT_ARCH (architecture)");
14964 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
14969 print_core_note (Elf_Internal_Note *pnote)
14971 unsigned int addr_size = is_32bit_elf ? 4 : 8;
14972 bfd_vma count, page_size;
14973 unsigned char *descdata, *filenames, *descend;
14975 if (pnote->type != NT_FILE)
14981 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
14982 /* Still "successful". */
14987 if (pnote->descsz < 2 * addr_size)
14989 printf (_(" Malformed note - too short for header\n"));
14993 descdata = (unsigned char *) pnote->descdata;
14994 descend = descdata + pnote->descsz;
14996 if (descdata[pnote->descsz - 1] != '\0')
14998 printf (_(" Malformed note - does not end with \\0\n"));
15002 count = byte_get (descdata, addr_size);
15003 descdata += addr_size;
15005 page_size = byte_get (descdata, addr_size);
15006 descdata += addr_size;
15008 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15010 printf (_(" Malformed note - too short for supplied file count\n"));
15014 printf (_(" Page size: "));
15015 print_vma (page_size, DEC);
15018 printf (_(" %*s%*s%*s\n"),
15019 (int) (2 + 2 * addr_size), _("Start"),
15020 (int) (4 + 2 * addr_size), _("End"),
15021 (int) (4 + 2 * addr_size), _("Page Offset"));
15022 filenames = descdata + count * 3 * addr_size;
15023 while (--count > 0)
15025 bfd_vma start, end, file_ofs;
15027 if (filenames == descend)
15029 printf (_(" Malformed note - filenames end too early\n"));
15033 start = byte_get (descdata, addr_size);
15034 descdata += addr_size;
15035 end = byte_get (descdata, addr_size);
15036 descdata += addr_size;
15037 file_ofs = byte_get (descdata, addr_size);
15038 descdata += addr_size;
15041 print_vma (start, FULL_HEX);
15043 print_vma (end, FULL_HEX);
15045 print_vma (file_ofs, FULL_HEX);
15046 printf ("\n %s\n", filenames);
15048 filenames += 1 + strlen ((char *) filenames);
15054 static const char *
15055 get_gnu_elf_note_type (unsigned e_type)
15057 static char buff[64];
15061 case NT_GNU_ABI_TAG:
15062 return _("NT_GNU_ABI_TAG (ABI version tag)");
15064 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15065 case NT_GNU_BUILD_ID:
15066 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15067 case NT_GNU_GOLD_VERSION:
15068 return _("NT_GNU_GOLD_VERSION (gold version)");
15073 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15078 print_gnu_note (Elf_Internal_Note *pnote)
15080 switch (pnote->type)
15082 case NT_GNU_BUILD_ID:
15086 printf (_(" Build ID: "));
15087 for (i = 0; i < pnote->descsz; ++i)
15088 printf ("%02x", pnote->descdata[i] & 0xff);
15093 case NT_GNU_ABI_TAG:
15095 unsigned long os, major, minor, subminor;
15096 const char *osname;
15098 /* PR 17531: file: 030-599401-0.004. */
15099 if (pnote->descsz < 16)
15101 printf (_(" <corrupt GNU_ABI_TAG>\n"));
15105 os = byte_get ((unsigned char *) pnote->descdata, 4);
15106 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15107 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15108 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15112 case GNU_ABI_TAG_LINUX:
15115 case GNU_ABI_TAG_HURD:
15118 case GNU_ABI_TAG_SOLARIS:
15119 osname = "Solaris";
15121 case GNU_ABI_TAG_FREEBSD:
15122 osname = "FreeBSD";
15124 case GNU_ABI_TAG_NETBSD:
15128 osname = "Unknown";
15132 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15133 major, minor, subminor);
15137 case NT_GNU_GOLD_VERSION:
15141 printf (_(" Version: "));
15142 for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15143 printf ("%c", pnote->descdata[i]);
15152 static const char *
15153 get_v850_elf_note_type (enum v850_notes n_type)
15155 static char buff[64];
15159 case V850_NOTE_ALIGNMENT: return _("Alignment of 8-byte objects");
15160 case V850_NOTE_DATA_SIZE: return _("Sizeof double and long double");
15161 case V850_NOTE_FPU_INFO: return _("Type of FPU support needed");
15162 case V850_NOTE_SIMD_INFO: return _("Use of SIMD instructions");
15163 case V850_NOTE_CACHE_INFO: return _("Use of cache");
15164 case V850_NOTE_MMU_INFO: return _("Use of MMU");
15166 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15172 print_v850_note (Elf_Internal_Note * pnote)
15176 if (pnote->descsz != 4)
15178 val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15182 printf (_("not set\n"));
15186 switch (pnote->type)
15188 case V850_NOTE_ALIGNMENT:
15191 case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15192 case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15196 case V850_NOTE_DATA_SIZE:
15199 case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15200 case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15204 case V850_NOTE_FPU_INFO:
15207 case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15208 case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15212 case V850_NOTE_MMU_INFO:
15213 case V850_NOTE_CACHE_INFO:
15214 case V850_NOTE_SIMD_INFO:
15215 if (val == EF_RH850_SIMD)
15217 printf (_("yes\n"));
15223 /* An 'unknown note type' message will already have been displayed. */
15227 printf (_("unknown value: %x\n"), val);
15231 static const char *
15232 get_netbsd_elfcore_note_type (unsigned e_type)
15234 static char buff[64];
15236 if (e_type == NT_NETBSDCORE_PROCINFO)
15238 /* NetBSD core "procinfo" structure. */
15239 return _("NetBSD procinfo structure");
15242 /* As of Jan 2002 there are no other machine-independent notes
15243 defined for NetBSD core files. If the note type is less
15244 than the start of the machine-dependent note types, we don't
15247 if (e_type < NT_NETBSDCORE_FIRSTMACH)
15249 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15253 switch (elf_header.e_machine)
15255 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15256 and PT_GETFPREGS == mach+2. */
15261 case EM_SPARC32PLUS:
15265 case NT_NETBSDCORE_FIRSTMACH + 0:
15266 return _("PT_GETREGS (reg structure)");
15267 case NT_NETBSDCORE_FIRSTMACH + 2:
15268 return _("PT_GETFPREGS (fpreg structure)");
15274 /* On all other arch's, PT_GETREGS == mach+1 and
15275 PT_GETFPREGS == mach+3. */
15279 case NT_NETBSDCORE_FIRSTMACH + 1:
15280 return _("PT_GETREGS (reg structure)");
15281 case NT_NETBSDCORE_FIRSTMACH + 3:
15282 return _("PT_GETFPREGS (fpreg structure)");
15288 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15289 e_type - NT_NETBSDCORE_FIRSTMACH);
15293 static const char *
15294 get_stapsdt_note_type (unsigned e_type)
15296 static char buff[64];
15301 return _("NT_STAPSDT (SystemTap probe descriptors)");
15307 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15312 print_stapsdt_note (Elf_Internal_Note *pnote)
15314 int addr_size = is_32bit_elf ? 4 : 8;
15315 char *data = pnote->descdata;
15316 char *data_end = pnote->descdata + pnote->descsz;
15317 bfd_vma pc, base_addr, semaphore;
15318 char *provider, *probe, *arg_fmt;
15320 pc = byte_get ((unsigned char *) data, addr_size);
15322 base_addr = byte_get ((unsigned char *) data, addr_size);
15324 semaphore = byte_get ((unsigned char *) data, addr_size);
15328 data += strlen (data) + 1;
15330 data += strlen (data) + 1;
15332 data += strlen (data) + 1;
15334 printf (_(" Provider: %s\n"), provider);
15335 printf (_(" Name: %s\n"), probe);
15336 printf (_(" Location: "));
15337 print_vma (pc, FULL_HEX);
15338 printf (_(", Base: "));
15339 print_vma (base_addr, FULL_HEX);
15340 printf (_(", Semaphore: "));
15341 print_vma (semaphore, FULL_HEX);
15343 printf (_(" Arguments: %s\n"), arg_fmt);
15345 return data == data_end;
15348 static const char *
15349 get_ia64_vms_note_type (unsigned e_type)
15351 static char buff[64];
15356 return _("NT_VMS_MHD (module header)");
15358 return _("NT_VMS_LNM (language name)");
15360 return _("NT_VMS_SRC (source files)");
15362 return "NT_VMS_TITLE";
15364 return _("NT_VMS_EIDC (consistency check)");
15365 case NT_VMS_FPMODE:
15366 return _("NT_VMS_FPMODE (FP mode)");
15367 case NT_VMS_LINKTIME:
15368 return "NT_VMS_LINKTIME";
15369 case NT_VMS_IMGNAM:
15370 return _("NT_VMS_IMGNAM (image name)");
15372 return _("NT_VMS_IMGID (image id)");
15373 case NT_VMS_LINKID:
15374 return _("NT_VMS_LINKID (link id)");
15375 case NT_VMS_IMGBID:
15376 return _("NT_VMS_IMGBID (build id)");
15377 case NT_VMS_GSTNAM:
15378 return _("NT_VMS_GSTNAM (sym table name)");
15379 case NT_VMS_ORIG_DYN:
15380 return "NT_VMS_ORIG_DYN";
15381 case NT_VMS_PATCHTIME:
15382 return "NT_VMS_PATCHTIME";
15384 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15390 print_ia64_vms_note (Elf_Internal_Note * pnote)
15392 switch (pnote->type)
15395 if (pnote->descsz > 36)
15397 size_t l = strlen (pnote->descdata + 34);
15398 printf (_(" Creation date : %.17s\n"), pnote->descdata);
15399 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
15400 printf (_(" Module name : %s\n"), pnote->descdata + 34);
15401 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
15404 printf (_(" Invalid size\n"));
15407 printf (_(" Language: %s\n"), pnote->descdata);
15410 case NT_VMS_FPMODE:
15411 printf (_(" Floating Point mode: "));
15412 printf ("0x%016" BFD_VMA_FMT "x\n",
15413 (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15415 case NT_VMS_LINKTIME:
15416 printf (_(" Link time: "));
15418 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15421 case NT_VMS_PATCHTIME:
15422 printf (_(" Patch time: "));
15424 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15427 case NT_VMS_ORIG_DYN:
15428 printf (_(" Major id: %u, minor id: %u\n"),
15429 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15430 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15431 printf (_(" Last modified : "));
15433 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15434 printf (_("\n Link flags : "));
15435 printf ("0x%016" BFD_VMA_FMT "x\n",
15436 (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15437 printf (_(" Header flags: 0x%08x\n"),
15438 (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15439 printf (_(" Image id : %s\n"), pnote->descdata + 32);
15442 case NT_VMS_IMGNAM:
15443 printf (_(" Image name: %s\n"), pnote->descdata);
15445 case NT_VMS_GSTNAM:
15446 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
15449 printf (_(" Image id: %s\n"), pnote->descdata);
15451 case NT_VMS_LINKID:
15452 printf (_(" Linker id: %s\n"), pnote->descdata);
15460 /* Note that by the ELF standard, the name field is already null byte
15461 terminated, and namesz includes the terminating null byte.
15462 I.E. the value of namesz for the name "FSF" is 4.
15464 If the value of namesz is zero, there is no name present. */
15466 process_note (Elf_Internal_Note * pnote)
15468 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15471 if (pnote->namesz == 0)
15472 /* If there is no note name, then use the default set of
15473 note type strings. */
15474 nt = get_note_type (pnote->type);
15476 else if (const_strneq (pnote->namedata, "GNU"))
15477 /* GNU-specific object file notes. */
15478 nt = get_gnu_elf_note_type (pnote->type);
15480 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15481 /* NetBSD-specific core file notes. */
15482 nt = get_netbsd_elfcore_note_type (pnote->type);
15484 else if (strneq (pnote->namedata, "SPU/", 4))
15486 /* SPU-specific core file notes. */
15487 nt = pnote->namedata + 4;
15491 else if (const_strneq (pnote->namedata, "IPF/VMS"))
15492 /* VMS/ia64-specific file notes. */
15493 nt = get_ia64_vms_note_type (pnote->type);
15495 else if (const_strneq (pnote->namedata, "stapsdt"))
15496 nt = get_stapsdt_note_type (pnote->type);
15499 /* Don't recognize this note name; just use the default set of
15500 note type strings. */
15501 nt = get_note_type (pnote->type);
15503 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15505 if (const_strneq (pnote->namedata, "IPF/VMS"))
15506 return print_ia64_vms_note (pnote);
15507 else if (const_strneq (pnote->namedata, "GNU"))
15508 return print_gnu_note (pnote);
15509 else if (const_strneq (pnote->namedata, "stapsdt"))
15510 return print_stapsdt_note (pnote);
15511 else if (const_strneq (pnote->namedata, "CORE"))
15512 return print_core_note (pnote);
15519 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15521 Elf_External_Note * pnotes;
15522 Elf_External_Note * external;
15529 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15531 if (pnotes == NULL)
15536 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15537 (unsigned long) offset, (unsigned long) length);
15538 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15540 end = (char *) pnotes + length;
15541 while ((char *) external < end)
15543 Elf_Internal_Note inote;
15546 char * temp = NULL;
15547 size_t data_remaining = end - (char *) external;
15549 if (!is_ia64_vms ())
15551 /* PR binutils/15191
15552 Make sure that there is enough data to read. */
15553 min_notesz = offsetof (Elf_External_Note, name);
15554 if (data_remaining < min_notesz)
15556 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15557 (int) data_remaining);
15560 inote.type = BYTE_GET (external->type);
15561 inote.namesz = BYTE_GET (external->namesz);
15562 inote.namedata = external->name;
15563 inote.descsz = BYTE_GET (external->descsz);
15564 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15565 /* PR 17531: file: 3443835e. */
15566 if (inote.descdata < (char *) pnotes || inote.descdata > end)
15568 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15569 inote.descdata = inote.namedata;
15573 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15574 next = inote.descdata + align_power (inote.descsz, 2);
15578 Elf64_External_VMS_Note *vms_external;
15580 /* PR binutils/15191
15581 Make sure that there is enough data to read. */
15582 min_notesz = offsetof (Elf64_External_VMS_Note, name);
15583 if (data_remaining < min_notesz)
15585 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15586 (int) data_remaining);
15590 vms_external = (Elf64_External_VMS_Note *) external;
15591 inote.type = BYTE_GET (vms_external->type);
15592 inote.namesz = BYTE_GET (vms_external->namesz);
15593 inote.namedata = vms_external->name;
15594 inote.descsz = BYTE_GET (vms_external->descsz);
15595 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15596 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15597 next = inote.descdata + align_power (inote.descsz, 3);
15600 if (inote.descdata < (char *) external + min_notesz
15601 || next < (char *) external + min_notesz
15602 /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4. */
15603 || inote.namedata + inote.namesz < inote.namedata
15604 || inote.descdata + inote.descsz < inote.descdata
15605 || data_remaining < (size_t)(next - (char *) external))
15607 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15608 (unsigned long) ((char *) external - (char *) pnotes));
15609 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15610 inote.type, inote.namesz, inote.descsz);
15614 external = (Elf_External_Note *) next;
15616 /* Verify that name is null terminated. It appears that at least
15617 one version of Linux (RedHat 6.0) generates corefiles that don't
15618 comply with the ELF spec by failing to include the null byte in
15620 if (inote.namedata[inote.namesz - 1] != '\0')
15622 temp = (char *) malloc (inote.namesz + 1);
15625 error (_("Out of memory allocating space for inote name\n"));
15630 strncpy (temp, inote.namedata, inote.namesz);
15631 temp[inote.namesz] = 0;
15633 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
15634 inote.namedata = temp;
15637 res &= process_note (& inote);
15652 process_corefile_note_segments (FILE * file)
15654 Elf_Internal_Phdr * segment;
15658 if (! get_program_headers (file))
15661 for (i = 0, segment = program_headers;
15662 i < elf_header.e_phnum;
15665 if (segment->p_type == PT_NOTE)
15666 res &= process_corefile_note_segment (file,
15667 (bfd_vma) segment->p_offset,
15668 (bfd_vma) segment->p_filesz);
15675 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
15677 Elf_External_Note * pnotes;
15678 Elf_External_Note * external;
15685 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15687 if (pnotes == NULL)
15691 end = (char*) pnotes + length;
15693 printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
15694 (unsigned long) offset, (unsigned long) length);
15696 while ((char *) external + sizeof (Elf_External_Note) < end)
15698 Elf_External_Note * next;
15699 Elf_Internal_Note inote;
15701 inote.type = BYTE_GET (external->type);
15702 inote.namesz = BYTE_GET (external->namesz);
15703 inote.namedata = external->name;
15704 inote.descsz = BYTE_GET (external->descsz);
15705 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15706 inote.descpos = offset + (inote.descdata - (char *) pnotes);
15708 if (inote.descdata < (char *) pnotes || inote.descdata >= end)
15710 warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15711 inote.descdata = inote.namedata;
15715 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
15717 if ( ((char *) next > end)
15718 || ((char *) next < (char *) pnotes))
15720 warn (_("corrupt descsz found in note at offset 0x%lx\n"),
15721 (unsigned long) ((char *) external - (char *) pnotes));
15722 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15723 inote.type, inote.namesz, inote.descsz);
15729 /* Prevent out-of-bounds indexing. */
15730 if ( inote.namedata + inote.namesz > end
15731 || inote.namedata + inote.namesz < inote.namedata)
15733 warn (_("corrupt namesz found in note at offset 0x%lx\n"),
15734 (unsigned long) ((char *) external - (char *) pnotes));
15735 warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
15736 inote.type, inote.namesz, inote.descsz);
15740 printf (" %s: ", get_v850_elf_note_type (inote.type));
15742 if (! print_v850_note (& inote))
15745 printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
15746 inote.namesz, inote.descsz);
15756 process_note_sections (FILE * file)
15758 Elf_Internal_Shdr * section;
15763 for (i = 0, section = section_headers;
15764 i < elf_header.e_shnum && section != NULL;
15767 if (section->sh_type == SHT_NOTE)
15769 res &= process_corefile_note_segment (file,
15770 (bfd_vma) section->sh_offset,
15771 (bfd_vma) section->sh_size);
15775 if (( elf_header.e_machine == EM_V800
15776 || elf_header.e_machine == EM_V850
15777 || elf_header.e_machine == EM_CYGNUS_V850)
15778 && section->sh_type == SHT_RENESAS_INFO)
15780 res &= process_v850_notes (file,
15781 (bfd_vma) section->sh_offset,
15782 (bfd_vma) section->sh_size);
15788 /* Try processing NOTE segments instead. */
15789 return process_corefile_note_segments (file);
15795 process_notes (FILE * file)
15797 /* If we have not been asked to display the notes then do nothing. */
15801 if (elf_header.e_type != ET_CORE)
15802 return process_note_sections (file);
15804 /* No program headers means no NOTE segment. */
15805 if (elf_header.e_phnum > 0)
15806 return process_corefile_note_segments (file);
15808 printf (_("No note segments present in the core file.\n"));
15813 process_arch_specific (FILE * file)
15818 switch (elf_header.e_machine)
15821 return process_arm_specific (file);
15823 case EM_MIPS_RS3_LE:
15824 return process_mips_specific (file);
15827 return process_nds32_specific (file);
15830 return process_power_specific (file);
15834 return process_s390_specific (file);
15837 case EM_SPARC32PLUS:
15839 return process_sparc_specific (file);
15842 return process_tic6x_specific (file);
15845 return process_msp430x_specific (file);
15853 get_file_header (FILE * file)
15855 /* Read in the identity array. */
15856 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
15859 /* Determine how to read the rest of the header. */
15860 switch (elf_header.e_ident[EI_DATA])
15862 default: /* fall through */
15863 case ELFDATANONE: /* fall through */
15865 byte_get = byte_get_little_endian;
15866 byte_put = byte_put_little_endian;
15869 byte_get = byte_get_big_endian;
15870 byte_put = byte_put_big_endian;
15874 /* For now we only support 32 bit and 64 bit ELF files. */
15875 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
15877 /* Read in the rest of the header. */
15880 Elf32_External_Ehdr ehdr32;
15882 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
15885 elf_header.e_type = BYTE_GET (ehdr32.e_type);
15886 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
15887 elf_header.e_version = BYTE_GET (ehdr32.e_version);
15888 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
15889 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
15890 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
15891 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
15892 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
15893 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
15894 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
15895 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
15896 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
15897 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
15901 Elf64_External_Ehdr ehdr64;
15903 /* If we have been compiled with sizeof (bfd_vma) == 4, then
15904 we will not be able to cope with the 64bit data found in
15905 64 ELF files. Detect this now and abort before we start
15906 overwriting things. */
15907 if (sizeof (bfd_vma) < 8)
15909 error (_("This instance of readelf has been built without support for a\n\
15910 64 bit data type and so it cannot read 64 bit ELF files.\n"));
15914 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
15917 elf_header.e_type = BYTE_GET (ehdr64.e_type);
15918 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
15919 elf_header.e_version = BYTE_GET (ehdr64.e_version);
15920 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
15921 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
15922 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
15923 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
15924 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
15925 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
15926 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
15927 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
15928 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
15929 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
15932 if (elf_header.e_shoff)
15934 /* There may be some extensions in the first section header. Don't
15935 bomb if we can't read it. */
15937 get_32bit_section_headers (file, TRUE);
15939 get_64bit_section_headers (file, TRUE);
15945 /* Process one ELF object file according to the command line options.
15946 This file may actually be stored in an archive. The file is
15947 positioned at the start of the ELF object. */
15950 process_object (char * file_name, FILE * file)
15954 if (! get_file_header (file))
15956 error (_("%s: Failed to read file header\n"), file_name);
15960 /* Initialise per file variables. */
15961 for (i = ARRAY_SIZE (version_info); i--;)
15962 version_info[i] = 0;
15964 for (i = ARRAY_SIZE (dynamic_info); i--;)
15965 dynamic_info[i] = 0;
15966 dynamic_info_DT_GNU_HASH = 0;
15968 /* Process the file. */
15970 printf (_("\nFile: %s\n"), file_name);
15972 /* Initialise the dump_sects array from the cmdline_dump_sects array.
15973 Note we do this even if cmdline_dump_sects is empty because we
15974 must make sure that the dump_sets array is zeroed out before each
15975 object file is processed. */
15976 if (num_dump_sects > num_cmdline_dump_sects)
15977 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
15979 if (num_cmdline_dump_sects > 0)
15981 if (num_dump_sects == 0)
15982 /* A sneaky way of allocating the dump_sects array. */
15983 request_dump_bynumber (num_cmdline_dump_sects, 0);
15985 assert (num_dump_sects >= num_cmdline_dump_sects);
15986 memcpy (dump_sects, cmdline_dump_sects,
15987 num_cmdline_dump_sects * sizeof (* dump_sects));
15990 if (! process_file_header ())
15993 if (! process_section_headers (file))
15995 /* Without loaded section headers we cannot process lots of
15997 do_unwind = do_version = do_dump = do_arch = 0;
15999 if (! do_using_dynamic)
16000 do_syms = do_dyn_syms = do_reloc = 0;
16003 if (! process_section_groups (file))
16005 /* Without loaded section groups we cannot process unwind. */
16009 if (process_program_headers (file))
16010 process_dynamic_section (file);
16012 process_relocs (file);
16014 process_unwind (file);
16016 process_symbol_table (file);
16018 process_syminfo (file);
16020 process_version_sections (file);
16022 process_section_contents (file);
16024 process_notes (file);
16026 process_gnu_liblist (file);
16028 process_arch_specific (file);
16030 if (program_headers)
16032 free (program_headers);
16033 program_headers = NULL;
16036 if (section_headers)
16038 free (section_headers);
16039 section_headers = NULL;
16044 free (string_table);
16045 string_table = NULL;
16046 string_table_length = 0;
16049 if (dynamic_strings)
16051 free (dynamic_strings);
16052 dynamic_strings = NULL;
16053 dynamic_strings_length = 0;
16056 if (dynamic_symbols)
16058 free (dynamic_symbols);
16059 dynamic_symbols = NULL;
16060 num_dynamic_syms = 0;
16063 if (dynamic_syminfo)
16065 free (dynamic_syminfo);
16066 dynamic_syminfo = NULL;
16069 if (dynamic_section)
16071 free (dynamic_section);
16072 dynamic_section = NULL;
16075 if (section_headers_groups)
16077 free (section_headers_groups);
16078 section_headers_groups = NULL;
16081 if (section_groups)
16083 struct group_list * g;
16084 struct group_list * next;
16086 for (i = 0; i < group_count; i++)
16088 for (g = section_groups [i].root; g != NULL; g = next)
16095 free (section_groups);
16096 section_groups = NULL;
16099 free_debug_memory ();
16104 /* Process an ELF archive.
16105 On entry the file is positioned just after the ARMAG string. */
16108 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16110 struct archive_info arch;
16111 struct archive_info nested_arch;
16117 /* The ARCH structure is used to hold information about this archive. */
16118 arch.file_name = NULL;
16120 arch.index_array = NULL;
16121 arch.sym_table = NULL;
16122 arch.longnames = NULL;
16124 /* The NESTED_ARCH structure is used as a single-item cache of information
16125 about a nested archive (when members of a thin archive reside within
16126 another regular archive file). */
16127 nested_arch.file_name = NULL;
16128 nested_arch.file = NULL;
16129 nested_arch.index_array = NULL;
16130 nested_arch.sym_table = NULL;
16131 nested_arch.longnames = NULL;
16133 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16139 if (do_archive_index)
16141 if (arch.sym_table == NULL)
16142 error (_("%s: unable to dump the index as none was found\n"), file_name);
16145 unsigned long i, l;
16146 unsigned long current_pos;
16148 printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16149 file_name, (unsigned long) arch.index_num, arch.sym_size);
16150 current_pos = ftell (file);
16152 for (i = l = 0; i < arch.index_num; i++)
16154 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16156 char * member_name;
16158 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16160 if (member_name != NULL)
16162 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16164 if (qualified_name != NULL)
16166 printf (_("Contents of binary %s at offset "), qualified_name);
16167 (void) print_vma (arch.index_array[i], PREFIX_HEX);
16169 free (qualified_name);
16174 if (l >= arch.sym_size)
16176 error (_("%s: end of the symbol table reached before the end of the index\n"),
16180 /* PR 17531: file: 0b6630b2. */
16181 printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16182 l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16185 if (arch.uses_64bit_indicies)
16190 if (l < arch.sym_size)
16191 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16192 file_name, arch.sym_size - l);
16194 if (fseek (file, current_pos, SEEK_SET) != 0)
16196 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16202 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16203 && !do_segments && !do_header && !do_dump && !do_version
16204 && !do_histogram && !do_debugging && !do_arch && !do_notes
16205 && !do_section_groups && !do_dyn_syms)
16207 ret = 0; /* Archive index only. */
16218 char * qualified_name;
16220 /* Read the next archive header. */
16221 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16223 error (_("%s: failed to seek to next archive header\n"), file_name);
16226 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16227 if (got != sizeof arch.arhdr)
16231 error (_("%s: failed to read archive header\n"), file_name);
16235 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16237 error (_("%s: did not find a valid archive header\n"), arch.file_name);
16242 arch.next_arhdr_offset += sizeof arch.arhdr;
16244 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16245 if (archive_file_size & 01)
16246 ++archive_file_size;
16248 name = get_archive_member_name (&arch, &nested_arch);
16251 error (_("%s: bad archive file name\n"), file_name);
16255 namelen = strlen (name);
16257 qualified_name = make_qualified_name (&arch, &nested_arch, name);
16258 if (qualified_name == NULL)
16260 error (_("%s: bad archive file name\n"), file_name);
16265 if (is_thin_archive && arch.nested_member_origin == 0)
16267 /* This is a proxy for an external member of a thin archive. */
16268 FILE * member_file;
16269 char * member_file_name = adjust_relative_path (file_name, name, namelen);
16270 if (member_file_name == NULL)
16276 member_file = fopen (member_file_name, "rb");
16277 if (member_file == NULL)
16279 error (_("Input file '%s' is not readable.\n"), member_file_name);
16280 free (member_file_name);
16285 archive_file_offset = arch.nested_member_origin;
16287 ret |= process_object (qualified_name, member_file);
16289 fclose (member_file);
16290 free (member_file_name);
16292 else if (is_thin_archive)
16294 /* PR 15140: Allow for corrupt thin archives. */
16295 if (nested_arch.file == NULL)
16297 error (_("%s: contains corrupt thin archive: %s\n"),
16303 /* This is a proxy for a member of a nested archive. */
16304 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16306 /* The nested archive file will have been opened and setup by
16307 get_archive_member_name. */
16308 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16310 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16315 ret |= process_object (qualified_name, nested_arch.file);
16319 archive_file_offset = arch.next_arhdr_offset;
16320 arch.next_arhdr_offset += archive_file_size;
16322 ret |= process_object (qualified_name, file);
16325 if (dump_sects != NULL)
16329 num_dump_sects = 0;
16332 free (qualified_name);
16336 if (nested_arch.file != NULL)
16337 fclose (nested_arch.file);
16338 release_archive (&nested_arch);
16339 release_archive (&arch);
16345 process_file (char * file_name)
16348 struct stat statbuf;
16349 char armag[SARMAG];
16352 if (stat (file_name, &statbuf) < 0)
16354 if (errno == ENOENT)
16355 error (_("'%s': No such file\n"), file_name);
16357 error (_("Could not locate '%s'. System error message: %s\n"),
16358 file_name, strerror (errno));
16362 if (! S_ISREG (statbuf.st_mode))
16364 error (_("'%s' is not an ordinary file\n"), file_name);
16368 file = fopen (file_name, "rb");
16371 error (_("Input file '%s' is not readable.\n"), file_name);
16375 if (fread (armag, SARMAG, 1, file) != 1)
16377 error (_("%s: Failed to read file's magic number\n"), file_name);
16382 current_file_size = (bfd_size_type) statbuf.st_size;
16384 if (memcmp (armag, ARMAG, SARMAG) == 0)
16385 ret = process_archive (file_name, file, FALSE);
16386 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16387 ret = process_archive (file_name, file, TRUE);
16390 if (do_archive_index)
16391 error (_("File %s is not an archive so its index cannot be displayed.\n"),
16395 archive_file_size = archive_file_offset = 0;
16396 ret = process_object (file_name, file);
16401 current_file_size = 0;
16405 #ifdef SUPPORT_DISASSEMBLY
16406 /* Needed by the i386 disassembler. For extra credit, someone could
16407 fix this so that we insert symbolic addresses here, esp for GOT/PLT
16411 print_address (unsigned int addr, FILE * outfile)
16413 fprintf (outfile,"0x%8.8x", addr);
16416 /* Needed by the i386 disassembler. */
16418 db_task_printsym (unsigned int addr)
16420 print_address (addr, stderr);
16425 main (int argc, char ** argv)
16429 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16430 setlocale (LC_MESSAGES, "");
16432 #if defined (HAVE_SETLOCALE)
16433 setlocale (LC_CTYPE, "");
16435 bindtextdomain (PACKAGE, LOCALEDIR);
16436 textdomain (PACKAGE);
16438 expandargv (&argc, &argv);
16440 parse_args (argc, argv);
16442 if (num_dump_sects > 0)
16444 /* Make a copy of the dump_sects array. */
16445 cmdline_dump_sects = (dump_type *)
16446 malloc (num_dump_sects * sizeof (* dump_sects));
16447 if (cmdline_dump_sects == NULL)
16448 error (_("Out of memory allocating dump request table.\n"));
16451 memcpy (cmdline_dump_sects, dump_sects,
16452 num_dump_sects * sizeof (* dump_sects));
16453 num_cmdline_dump_sects = num_dump_sects;
16457 if (optind < (argc - 1))
16459 else if (optind >= argc)
16461 warn (_("Nothing to do.\n"));
16466 while (optind < argc)
16467 err |= process_file (argv[optind++]);
16469 if (dump_sects != NULL)
16471 if (cmdline_dump_sects != NULL)
16472 free (cmdline_dump_sects);