1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998-2013 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. */
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72 we can obtain the H8 reloc numbers. We need these for the
73 get_reloc_size() function. We include h8.h again after defining
74 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
79 /* Undo the effects of #including reloc-macros.h. */
81 #undef START_RELOC_NUMBERS
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
88 /* The following headers use the elf/reloc-macros.h file to
89 automatically generate relocation recognition functions
90 such as elf_mips_reloc_type() */
92 #define RELOC_MACROS_GEN_FUNC
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
133 #include "elf/msp430.h"
134 #include "elf/nios2.h"
135 #include "elf/or32.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/x86-64.h"
152 #include "elf/xc16x.h"
153 #include "elf/xgate.h"
154 #include "elf/xstormy16.h"
155 #include "elf/xtensa.h"
158 #include "libiberty.h"
159 #include "safe-ctype.h"
160 #include "filenames.h"
163 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
166 char * program_name = "readelf";
167 static long archive_file_offset;
168 static unsigned long archive_file_size;
169 static unsigned long dynamic_addr;
170 static bfd_size_type dynamic_size;
171 static unsigned int dynamic_nent;
172 static char * dynamic_strings;
173 static unsigned long dynamic_strings_length;
174 static char * string_table;
175 static unsigned long string_table_length;
176 static unsigned long num_dynamic_syms;
177 static Elf_Internal_Sym * dynamic_symbols;
178 static Elf_Internal_Syminfo * dynamic_syminfo;
179 static unsigned long dynamic_syminfo_offset;
180 static unsigned int dynamic_syminfo_nent;
181 static char program_interpreter[PATH_MAX];
182 static bfd_vma dynamic_info[DT_ENCODING];
183 static bfd_vma dynamic_info_DT_GNU_HASH;
184 static bfd_vma version_info[16];
185 static Elf_Internal_Ehdr elf_header;
186 static Elf_Internal_Shdr * section_headers;
187 static Elf_Internal_Phdr * program_headers;
188 static Elf_Internal_Dyn * dynamic_section;
189 static Elf_Internal_Shdr * symtab_shndx_hdr;
190 static int show_name;
191 static int do_dynamic;
193 static int do_dyn_syms;
195 static int do_sections;
196 static int do_section_groups;
197 static int do_section_details;
198 static int do_segments;
199 static int do_unwind;
200 static int do_using_dynamic;
201 static int do_header;
203 static int do_version;
204 static int do_histogram;
205 static int do_debugging;
208 static int do_archive_index;
209 static int is_32bit_elf;
213 struct group_list * next;
214 unsigned int section_index;
219 struct group_list * root;
220 unsigned int group_index;
223 static size_t group_count;
224 static struct group * section_groups;
225 static struct group ** section_headers_groups;
228 /* Flag bits indicating particular types of dump. */
229 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
230 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
231 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
232 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
233 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
235 typedef unsigned char dump_type;
237 /* A linked list of the section names for which dumps were requested. */
238 struct dump_list_entry
242 struct dump_list_entry * next;
244 static struct dump_list_entry * dump_sects_byname;
246 /* A dynamic array of flags indicating for which sections a dump
247 has been requested via command line switches. */
248 static dump_type * cmdline_dump_sects = NULL;
249 static unsigned int num_cmdline_dump_sects = 0;
251 /* A dynamic array of flags indicating for which sections a dump of
252 some kind has been requested. It is reset on a per-object file
253 basis and then initialised from the cmdline_dump_sects array,
254 the results of interpreting the -w switch, and the
255 dump_sects_byname list. */
256 static dump_type * dump_sects = NULL;
257 static unsigned int num_dump_sects = 0;
260 /* How to print a vma value. */
261 typedef enum print_mode
275 #define SECTION_NAME(X) \
276 ((X) == NULL ? _("<none>") \
277 : string_table == NULL ? _("<no-name>") \
278 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
279 : string_table + (X)->sh_name))
281 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
283 #define GET_ELF_SYMBOLS(file, section, sym_count) \
284 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
285 : get_64bit_elf_symbols (file, section, sym_count))
287 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
288 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
289 already been called and verified that the string exists. */
290 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
292 #define REMOVE_ARCH_BITS(ADDR) \
295 if (elf_header.e_machine == EM_ARM) \
300 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
301 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
302 using malloc and fill that. In either case return the pointer to the start of
303 the retrieved data or NULL if something went wrong. If something does go wrong
304 emit an error message using REASON as part of the context. */
307 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
312 if (size == 0 || nmemb == 0)
315 if (fseek (file, archive_file_offset + offset, SEEK_SET))
317 error (_("Unable to seek to 0x%lx for %s\n"),
318 (unsigned long) archive_file_offset + offset, reason);
325 /* Check for overflow. */
326 if (nmemb < (~(size_t) 0 - 1) / size)
327 /* + 1 so that we can '\0' terminate invalid string table sections. */
328 mvar = malloc (size * nmemb + 1);
332 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
333 (unsigned long)(size * nmemb), reason);
337 ((char *) mvar)[size * nmemb] = '\0';
340 if (fread (mvar, size, nmemb, file) != nmemb)
342 error (_("Unable to read in 0x%lx bytes of %s\n"),
343 (unsigned long)(size * nmemb), reason);
352 /* Print a VMA value. */
355 print_vma (bfd_vma vma, print_mode mode)
368 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
375 return printf ("%5" BFD_VMA_FMT "d", vma);
383 return nc + printf ("%" BFD_VMA_FMT "x", vma);
386 return printf ("%" BFD_VMA_FMT "d", vma);
389 return printf ("%" BFD_VMA_FMT "u", vma);
394 /* Display a symbol on stdout. Handles the display of control characters and
395 multibye characters (assuming the host environment supports them).
397 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
399 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
400 padding as necessary.
402 Returns the number of emitted characters. */
405 print_symbol (int width, const char *symbol)
407 bfd_boolean extra_padding = FALSE;
409 #ifdef HAVE_MBSTATE_T
416 /* Keep the width positive. This also helps. */
418 extra_padding = TRUE;
422 /* Set the remaining width to a very large value.
423 This simplifies the code below. */
424 width_remaining = INT_MAX;
426 width_remaining = width;
428 #ifdef HAVE_MBSTATE_T
429 /* Initialise the multibyte conversion state. */
430 memset (& state, 0, sizeof (state));
433 while (width_remaining)
436 const char c = *symbol++;
441 /* Do not print control characters directly as they can affect terminal
442 settings. Such characters usually appear in the names generated
443 by the assembler for local labels. */
446 if (width_remaining < 2)
449 printf ("^%c", c + 0x40);
450 width_remaining -= 2;
453 else if (ISPRINT (c))
461 #ifdef HAVE_MBSTATE_T
464 /* Let printf do the hard work of displaying multibyte characters. */
465 printf ("%.1s", symbol - 1);
469 #ifdef HAVE_MBSTATE_T
470 /* Try to find out how many bytes made up the character that was
471 just printed. Advance the symbol pointer past the bytes that
473 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
477 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
482 if (extra_padding && num_printed < width)
484 /* Fill in the remaining spaces. */
485 printf ("%-*s", width - num_printed, " ");
492 /* Return a pointer to section NAME, or NULL if no such section exists. */
494 static Elf_Internal_Shdr *
495 find_section (const char * name)
499 for (i = 0; i < elf_header.e_shnum; i++)
500 if (streq (SECTION_NAME (section_headers + i), name))
501 return section_headers + i;
506 /* Return a pointer to a section containing ADDR, or NULL if no such
509 static Elf_Internal_Shdr *
510 find_section_by_address (bfd_vma addr)
514 for (i = 0; i < elf_header.e_shnum; i++)
516 Elf_Internal_Shdr *sec = section_headers + i;
517 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
524 /* Return a pointer to section NAME, or NULL if no such section exists,
525 restricted to the list of sections given in SET. */
527 static Elf_Internal_Shdr *
528 find_section_in_set (const char * name, unsigned int * set)
534 while ((i = *set++) > 0)
535 if (streq (SECTION_NAME (section_headers + i), name))
536 return section_headers + i;
539 return find_section (name);
542 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
545 static inline unsigned long
546 read_uleb128 (unsigned char *data,
547 unsigned int *length_return,
548 const unsigned char * const end)
550 return read_leb128 (data, length_return, FALSE, end);
553 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
554 This OS has so many departures from the ELF standard that we test it at
560 return elf_header.e_machine == EM_IA_64
561 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
564 /* Guess the relocation size commonly used by the specific machines. */
567 guess_is_rela (unsigned int e_machine)
571 /* Targets that use REL relocations. */
588 /* Targets that use RELA relocations. */
592 case EM_ADAPTEVA_EPIPHANY:
594 case EM_ALTERA_NIOS2:
613 case EM_LATTICEMICO32:
622 case EM_CYGNUS_MN10200:
624 case EM_CYGNUS_MN10300:
655 case EM_MICROBLAZE_OLD:
676 warn (_("Don't know about relocations on this machine architecture\n"));
682 slurp_rela_relocs (FILE * file,
683 unsigned long rel_offset,
684 unsigned long rel_size,
685 Elf_Internal_Rela ** relasp,
686 unsigned long * nrelasp)
688 Elf_Internal_Rela * relas;
689 unsigned long nrelas;
694 Elf32_External_Rela * erelas;
696 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
697 rel_size, _("32-bit relocation data"));
701 nrelas = rel_size / sizeof (Elf32_External_Rela);
703 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
704 sizeof (Elf_Internal_Rela));
709 error (_("out of memory parsing relocs\n"));
713 for (i = 0; i < nrelas; i++)
715 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
716 relas[i].r_info = BYTE_GET (erelas[i].r_info);
717 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
724 Elf64_External_Rela * erelas;
726 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
727 rel_size, _("64-bit relocation data"));
731 nrelas = rel_size / sizeof (Elf64_External_Rela);
733 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
734 sizeof (Elf_Internal_Rela));
739 error (_("out of memory parsing relocs\n"));
743 for (i = 0; i < nrelas; i++)
745 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
746 relas[i].r_info = BYTE_GET (erelas[i].r_info);
747 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
749 /* The #ifdef BFD64 below is to prevent a compile time
750 warning. We know that if we do not have a 64 bit data
751 type that we will never execute this code anyway. */
753 if (elf_header.e_machine == EM_MIPS
754 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
756 /* In little-endian objects, r_info isn't really a
757 64-bit little-endian value: it has a 32-bit
758 little-endian symbol index followed by four
759 individual byte fields. Reorder INFO
761 bfd_vma inf = relas[i].r_info;
762 inf = (((inf & 0xffffffff) << 32)
763 | ((inf >> 56) & 0xff)
764 | ((inf >> 40) & 0xff00)
765 | ((inf >> 24) & 0xff0000)
766 | ((inf >> 8) & 0xff000000));
767 relas[i].r_info = inf;
780 slurp_rel_relocs (FILE * file,
781 unsigned long rel_offset,
782 unsigned long rel_size,
783 Elf_Internal_Rela ** relsp,
784 unsigned long * nrelsp)
786 Elf_Internal_Rela * rels;
792 Elf32_External_Rel * erels;
794 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
795 rel_size, _("32-bit relocation data"));
799 nrels = rel_size / sizeof (Elf32_External_Rel);
801 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
806 error (_("out of memory parsing relocs\n"));
810 for (i = 0; i < nrels; i++)
812 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
813 rels[i].r_info = BYTE_GET (erels[i].r_info);
814 rels[i].r_addend = 0;
821 Elf64_External_Rel * erels;
823 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
824 rel_size, _("64-bit relocation data"));
828 nrels = rel_size / sizeof (Elf64_External_Rel);
830 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
835 error (_("out of memory parsing relocs\n"));
839 for (i = 0; i < nrels; i++)
841 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
842 rels[i].r_info = BYTE_GET (erels[i].r_info);
843 rels[i].r_addend = 0;
845 /* The #ifdef BFD64 below is to prevent a compile time
846 warning. We know that if we do not have a 64 bit data
847 type that we will never execute this code anyway. */
849 if (elf_header.e_machine == EM_MIPS
850 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
852 /* In little-endian objects, r_info isn't really a
853 64-bit little-endian value: it has a 32-bit
854 little-endian symbol index followed by four
855 individual byte fields. Reorder INFO
857 bfd_vma inf = rels[i].r_info;
858 inf = (((inf & 0xffffffff) << 32)
859 | ((inf >> 56) & 0xff)
860 | ((inf >> 40) & 0xff00)
861 | ((inf >> 24) & 0xff0000)
862 | ((inf >> 8) & 0xff000000));
863 rels[i].r_info = inf;
875 /* Returns the reloc type extracted from the reloc info field. */
878 get_reloc_type (bfd_vma reloc_info)
881 return ELF32_R_TYPE (reloc_info);
883 switch (elf_header.e_machine)
886 /* Note: We assume that reloc_info has already been adjusted for us. */
887 return ELF64_MIPS_R_TYPE (reloc_info);
890 return ELF64_R_TYPE_ID (reloc_info);
893 return ELF64_R_TYPE (reloc_info);
897 /* Return the symbol index extracted from the reloc info field. */
900 get_reloc_symindex (bfd_vma reloc_info)
902 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
905 static inline bfd_boolean
906 uses_msp430x_relocs (void)
909 elf_header.e_machine == EM_MSP430 /* Paranoia. */
910 /* GCC uses osabi == ELFOSBI_STANDALONE. */
911 && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
912 /* TI compiler uses ELFOSABI_NONE. */
913 || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
916 /* Display the contents of the relocation data found at the specified
920 dump_relocations (FILE * file,
921 unsigned long rel_offset,
922 unsigned long rel_size,
923 Elf_Internal_Sym * symtab,
926 unsigned long strtablen,
930 Elf_Internal_Rela * rels;
932 if (is_rela == UNKNOWN)
933 is_rela = guess_is_rela (elf_header.e_machine);
937 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
942 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
951 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
953 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
958 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
960 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
968 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
970 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
975 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
977 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
981 for (i = 0; i < rel_size; i++)
986 bfd_vma symtab_index;
989 offset = rels[i].r_offset;
990 inf = rels[i].r_info;
992 type = get_reloc_type (inf);
993 symtab_index = get_reloc_symindex (inf);
997 printf ("%8.8lx %8.8lx ",
998 (unsigned long) offset & 0xffffffff,
999 (unsigned long) inf & 0xffffffff);
1003 #if BFD_HOST_64BIT_LONG
1005 ? "%16.16lx %16.16lx "
1006 : "%12.12lx %12.12lx ",
1008 #elif BFD_HOST_64BIT_LONG_LONG
1011 ? "%16.16llx %16.16llx "
1012 : "%12.12llx %12.12llx ",
1016 ? "%16.16I64x %16.16I64x "
1017 : "%12.12I64x %12.12I64x ",
1022 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1023 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1024 _bfd_int64_high (offset),
1025 _bfd_int64_low (offset),
1026 _bfd_int64_high (inf),
1027 _bfd_int64_low (inf));
1031 switch (elf_header.e_machine)
1038 rtype = elf_aarch64_reloc_type (type);
1042 case EM_CYGNUS_M32R:
1043 rtype = elf_m32r_reloc_type (type);
1048 rtype = elf_i386_reloc_type (type);
1053 rtype = elf_m68hc11_reloc_type (type);
1057 rtype = elf_m68k_reloc_type (type);
1061 rtype = elf_i960_reloc_type (type);
1066 rtype = elf_avr_reloc_type (type);
1069 case EM_OLD_SPARCV9:
1070 case EM_SPARC32PLUS:
1073 rtype = elf_sparc_reloc_type (type);
1077 rtype = elf_spu_reloc_type (type);
1081 rtype = v800_reloc_type (type);
1084 case EM_CYGNUS_V850:
1085 rtype = v850_reloc_type (type);
1089 case EM_CYGNUS_D10V:
1090 rtype = elf_d10v_reloc_type (type);
1094 case EM_CYGNUS_D30V:
1095 rtype = elf_d30v_reloc_type (type);
1099 rtype = elf_dlx_reloc_type (type);
1103 rtype = elf_sh_reloc_type (type);
1107 case EM_CYGNUS_MN10300:
1108 rtype = elf_mn10300_reloc_type (type);
1112 case EM_CYGNUS_MN10200:
1113 rtype = elf_mn10200_reloc_type (type);
1117 case EM_CYGNUS_FR30:
1118 rtype = elf_fr30_reloc_type (type);
1122 rtype = elf_frv_reloc_type (type);
1126 rtype = elf_mcore_reloc_type (type);
1130 rtype = elf_mmix_reloc_type (type);
1134 rtype = elf_moxie_reloc_type (type);
1138 if (uses_msp430x_relocs ())
1140 rtype = elf_msp430x_reloc_type (type);
1144 rtype = elf_msp430_reloc_type (type);
1148 rtype = elf_ppc_reloc_type (type);
1152 rtype = elf_ppc64_reloc_type (type);
1156 case EM_MIPS_RS3_LE:
1157 rtype = elf_mips_reloc_type (type);
1161 rtype = elf_alpha_reloc_type (type);
1165 rtype = elf_arm_reloc_type (type);
1169 rtype = elf_arc_reloc_type (type);
1173 rtype = elf_hppa_reloc_type (type);
1179 rtype = elf_h8_reloc_type (type);
1184 rtype = elf_or32_reloc_type (type);
1189 rtype = elf_pj_reloc_type (type);
1192 rtype = elf_ia64_reloc_type (type);
1196 rtype = elf_cris_reloc_type (type);
1200 rtype = elf_i860_reloc_type (type);
1206 rtype = elf_x86_64_reloc_type (type);
1210 rtype = i370_reloc_type (type);
1215 rtype = elf_s390_reloc_type (type);
1219 rtype = elf_score_reloc_type (type);
1223 rtype = elf_xstormy16_reloc_type (type);
1227 rtype = elf_crx_reloc_type (type);
1231 rtype = elf_vax_reloc_type (type);
1234 case EM_ADAPTEVA_EPIPHANY:
1235 rtype = elf_epiphany_reloc_type (type);
1240 rtype = elf_ip2k_reloc_type (type);
1244 rtype = elf_iq2000_reloc_type (type);
1249 rtype = elf_xtensa_reloc_type (type);
1252 case EM_LATTICEMICO32:
1253 rtype = elf_lm32_reloc_type (type);
1258 rtype = elf_m32c_reloc_type (type);
1262 rtype = elf_mt_reloc_type (type);
1266 rtype = elf_bfin_reloc_type (type);
1270 rtype = elf_mep_reloc_type (type);
1274 rtype = elf_cr16_reloc_type (type);
1278 case EM_MICROBLAZE_OLD:
1279 rtype = elf_microblaze_reloc_type (type);
1283 rtype = elf_rl78_reloc_type (type);
1287 rtype = elf_rx_reloc_type (type);
1291 rtype = elf_metag_reloc_type (type);
1296 rtype = elf_xc16x_reloc_type (type);
1300 rtype = elf_tic6x_reloc_type (type);
1304 rtype = elf_tilegx_reloc_type (type);
1308 rtype = elf_tilepro_reloc_type (type);
1312 rtype = elf_xgate_reloc_type (type);
1315 case EM_ALTERA_NIOS2:
1316 rtype = elf_nios2_reloc_type (type);
1321 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1323 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1325 if (elf_header.e_machine == EM_ALPHA
1327 && streq (rtype, "R_ALPHA_LITUSE")
1330 switch (rels[i].r_addend)
1332 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1333 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1334 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1335 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1336 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1337 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1338 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1339 default: rtype = NULL;
1342 printf (" (%s)", rtype);
1346 printf (_("<unknown addend: %lx>"),
1347 (unsigned long) rels[i].r_addend);
1350 else if (symtab_index)
1352 if (symtab == NULL || symtab_index >= nsyms)
1353 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1356 Elf_Internal_Sym * psym;
1358 psym = symtab + symtab_index;
1362 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1366 unsigned int width = is_32bit_elf ? 8 : 14;
1368 /* Relocations against GNU_IFUNC symbols do not use the value
1369 of the symbol as the address to relocate against. Instead
1370 they invoke the function named by the symbol and use its
1371 result as the address for relocation.
1373 To indicate this to the user, do not display the value of
1374 the symbol in the "Symbols's Value" field. Instead show
1375 its name followed by () as a hint that the symbol is
1379 || psym->st_name == 0
1380 || psym->st_name >= strtablen)
1383 name = strtab + psym->st_name;
1385 len = print_symbol (width, name);
1386 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1390 print_vma (psym->st_value, LONG_HEX);
1392 printf (is_32bit_elf ? " " : " ");
1395 if (psym->st_name == 0)
1397 const char * sec_name = "<null>";
1400 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1402 if (psym->st_shndx < elf_header.e_shnum)
1404 = SECTION_NAME (section_headers + psym->st_shndx);
1405 else if (psym->st_shndx == SHN_ABS)
1407 else if (psym->st_shndx == SHN_COMMON)
1408 sec_name = "COMMON";
1409 else if ((elf_header.e_machine == EM_MIPS
1410 && psym->st_shndx == SHN_MIPS_SCOMMON)
1411 || (elf_header.e_machine == EM_TI_C6000
1412 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1413 sec_name = "SCOMMON";
1414 else if (elf_header.e_machine == EM_MIPS
1415 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1416 sec_name = "SUNDEF";
1417 else if ((elf_header.e_machine == EM_X86_64
1418 || elf_header.e_machine == EM_L1OM
1419 || elf_header.e_machine == EM_K1OM)
1420 && psym->st_shndx == SHN_X86_64_LCOMMON)
1421 sec_name = "LARGE_COMMON";
1422 else if (elf_header.e_machine == EM_IA_64
1423 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1424 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1425 sec_name = "ANSI_COM";
1426 else if (is_ia64_vms ()
1427 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1428 sec_name = "VMS_SYMVEC";
1431 sprintf (name_buf, "<section 0x%x>",
1432 (unsigned int) psym->st_shndx);
1433 sec_name = name_buf;
1436 print_symbol (22, sec_name);
1438 else if (strtab == NULL)
1439 printf (_("<string table index: %3ld>"), psym->st_name);
1440 else if (psym->st_name >= strtablen)
1441 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1443 print_symbol (22, strtab + psym->st_name);
1447 bfd_signed_vma off = rels[i].r_addend;
1450 printf (" - %" BFD_VMA_FMT "x", - off);
1452 printf (" + %" BFD_VMA_FMT "x", off);
1458 bfd_signed_vma off = rels[i].r_addend;
1460 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1462 printf ("-%" BFD_VMA_FMT "x", - off);
1464 printf ("%" BFD_VMA_FMT "x", off);
1467 if (elf_header.e_machine == EM_SPARCV9
1469 && streq (rtype, "R_SPARC_OLO10"))
1470 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1475 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1477 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1478 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1479 const char * rtype2 = elf_mips_reloc_type (type2);
1480 const char * rtype3 = elf_mips_reloc_type (type3);
1482 printf (" Type2: ");
1485 printf (_("unrecognized: %-7lx"),
1486 (unsigned long) type2 & 0xffffffff);
1488 printf ("%-17.17s", rtype2);
1490 printf ("\n Type3: ");
1493 printf (_("unrecognized: %-7lx"),
1494 (unsigned long) type3 & 0xffffffff);
1496 printf ("%-17.17s", rtype3);
1507 get_mips_dynamic_type (unsigned long type)
1511 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1512 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1513 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1514 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1515 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1516 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1517 case DT_MIPS_MSYM: return "MIPS_MSYM";
1518 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1519 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1520 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1521 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1522 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1523 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1524 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1525 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1526 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1527 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1528 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1529 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1530 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1531 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1532 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1533 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1534 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1535 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1536 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1537 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1538 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1539 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1540 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1541 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1542 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1543 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1544 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1545 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1546 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1547 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1548 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1549 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1550 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1551 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1552 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1553 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1554 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1555 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1562 get_sparc64_dynamic_type (unsigned long type)
1566 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1573 get_ppc_dynamic_type (unsigned long type)
1577 case DT_PPC_GOT: return "PPC_GOT";
1578 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1585 get_ppc64_dynamic_type (unsigned long type)
1589 case DT_PPC64_GLINK: return "PPC64_GLINK";
1590 case DT_PPC64_OPD: return "PPC64_OPD";
1591 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1592 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1599 get_parisc_dynamic_type (unsigned long type)
1603 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1604 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1605 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1606 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1607 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1608 case DT_HP_PREINIT: return "HP_PREINIT";
1609 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1610 case DT_HP_NEEDED: return "HP_NEEDED";
1611 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1612 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1613 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1614 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1615 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1616 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1617 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1618 case DT_HP_FILTERED: return "HP_FILTERED";
1619 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1620 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1621 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1622 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1623 case DT_PLT: return "PLT";
1624 case DT_PLT_SIZE: return "PLT_SIZE";
1625 case DT_DLT: return "DLT";
1626 case DT_DLT_SIZE: return "DLT_SIZE";
1633 get_ia64_dynamic_type (unsigned long type)
1637 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1638 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1639 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1640 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1641 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1642 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1643 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1644 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1645 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1646 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1647 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1648 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1649 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1650 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1651 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1652 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1653 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1654 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1655 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1656 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1657 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1658 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1659 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1660 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1661 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1662 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1663 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1664 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1665 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1666 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1667 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1674 get_alpha_dynamic_type (unsigned long type)
1678 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1685 get_score_dynamic_type (unsigned long type)
1689 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1690 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1691 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1692 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1693 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1694 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1701 get_tic6x_dynamic_type (unsigned long type)
1705 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1706 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1707 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1708 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1709 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1710 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1717 get_nios2_dynamic_type (unsigned long type)
1721 case DT_NIOS2_GP: return "NIOS2_GP";
1728 get_dynamic_type (unsigned long type)
1730 static char buff[64];
1734 case DT_NULL: return "NULL";
1735 case DT_NEEDED: return "NEEDED";
1736 case DT_PLTRELSZ: return "PLTRELSZ";
1737 case DT_PLTGOT: return "PLTGOT";
1738 case DT_HASH: return "HASH";
1739 case DT_STRTAB: return "STRTAB";
1740 case DT_SYMTAB: return "SYMTAB";
1741 case DT_RELA: return "RELA";
1742 case DT_RELASZ: return "RELASZ";
1743 case DT_RELAENT: return "RELAENT";
1744 case DT_STRSZ: return "STRSZ";
1745 case DT_SYMENT: return "SYMENT";
1746 case DT_INIT: return "INIT";
1747 case DT_FINI: return "FINI";
1748 case DT_SONAME: return "SONAME";
1749 case DT_RPATH: return "RPATH";
1750 case DT_SYMBOLIC: return "SYMBOLIC";
1751 case DT_REL: return "REL";
1752 case DT_RELSZ: return "RELSZ";
1753 case DT_RELENT: return "RELENT";
1754 case DT_PLTREL: return "PLTREL";
1755 case DT_DEBUG: return "DEBUG";
1756 case DT_TEXTREL: return "TEXTREL";
1757 case DT_JMPREL: return "JMPREL";
1758 case DT_BIND_NOW: return "BIND_NOW";
1759 case DT_INIT_ARRAY: return "INIT_ARRAY";
1760 case DT_FINI_ARRAY: return "FINI_ARRAY";
1761 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1762 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1763 case DT_RUNPATH: return "RUNPATH";
1764 case DT_FLAGS: return "FLAGS";
1766 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1767 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1769 case DT_CHECKSUM: return "CHECKSUM";
1770 case DT_PLTPADSZ: return "PLTPADSZ";
1771 case DT_MOVEENT: return "MOVEENT";
1772 case DT_MOVESZ: return "MOVESZ";
1773 case DT_FEATURE: return "FEATURE";
1774 case DT_POSFLAG_1: return "POSFLAG_1";
1775 case DT_SYMINSZ: return "SYMINSZ";
1776 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1778 case DT_ADDRRNGLO: return "ADDRRNGLO";
1779 case DT_CONFIG: return "CONFIG";
1780 case DT_DEPAUDIT: return "DEPAUDIT";
1781 case DT_AUDIT: return "AUDIT";
1782 case DT_PLTPAD: return "PLTPAD";
1783 case DT_MOVETAB: return "MOVETAB";
1784 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1786 case DT_VERSYM: return "VERSYM";
1788 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1789 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1790 case DT_RELACOUNT: return "RELACOUNT";
1791 case DT_RELCOUNT: return "RELCOUNT";
1792 case DT_FLAGS_1: return "FLAGS_1";
1793 case DT_VERDEF: return "VERDEF";
1794 case DT_VERDEFNUM: return "VERDEFNUM";
1795 case DT_VERNEED: return "VERNEED";
1796 case DT_VERNEEDNUM: return "VERNEEDNUM";
1798 case DT_AUXILIARY: return "AUXILIARY";
1799 case DT_USED: return "USED";
1800 case DT_FILTER: return "FILTER";
1802 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1803 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1804 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1805 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1806 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1807 case DT_GNU_HASH: return "GNU_HASH";
1810 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1812 const char * result;
1814 switch (elf_header.e_machine)
1817 case EM_MIPS_RS3_LE:
1818 result = get_mips_dynamic_type (type);
1821 result = get_sparc64_dynamic_type (type);
1824 result = get_ppc_dynamic_type (type);
1827 result = get_ppc64_dynamic_type (type);
1830 result = get_ia64_dynamic_type (type);
1833 result = get_alpha_dynamic_type (type);
1836 result = get_score_dynamic_type (type);
1839 result = get_tic6x_dynamic_type (type);
1841 case EM_ALTERA_NIOS2:
1842 result = get_nios2_dynamic_type (type);
1852 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1854 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1855 || (elf_header.e_machine == EM_PARISC
1856 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1858 const char * result;
1860 switch (elf_header.e_machine)
1863 result = get_parisc_dynamic_type (type);
1866 result = get_ia64_dynamic_type (type);
1876 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1880 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1887 get_file_type (unsigned e_type)
1889 static char buff[32];
1893 case ET_NONE: return _("NONE (None)");
1894 case ET_REL: return _("REL (Relocatable file)");
1895 case ET_EXEC: return _("EXEC (Executable file)");
1896 case ET_DYN: return _("DYN (Shared object file)");
1897 case ET_CORE: return _("CORE (Core file)");
1900 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1901 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1902 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1903 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1905 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1911 get_machine_name (unsigned e_machine)
1913 static char buff[64]; /* XXX */
1917 case EM_NONE: return _("None");
1918 case EM_AARCH64: return "AArch64";
1919 case EM_M32: return "WE32100";
1920 case EM_SPARC: return "Sparc";
1921 case EM_SPU: return "SPU";
1922 case EM_386: return "Intel 80386";
1923 case EM_68K: return "MC68000";
1924 case EM_88K: return "MC88000";
1925 case EM_486: return "Intel 80486";
1926 case EM_860: return "Intel 80860";
1927 case EM_MIPS: return "MIPS R3000";
1928 case EM_S370: return "IBM System/370";
1929 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1930 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1931 case EM_PARISC: return "HPPA";
1932 case EM_PPC_OLD: return "Power PC (old)";
1933 case EM_SPARC32PLUS: return "Sparc v8+" ;
1934 case EM_960: return "Intel 90860";
1935 case EM_PPC: return "PowerPC";
1936 case EM_PPC64: return "PowerPC64";
1937 case EM_FR20: return "Fujitsu FR20";
1938 case EM_RH32: return "TRW RH32";
1939 case EM_MCORE: return "MCORE";
1940 case EM_ARM: return "ARM";
1941 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1942 case EM_SH: return "Renesas / SuperH SH";
1943 case EM_SPARCV9: return "Sparc v9";
1944 case EM_TRICORE: return "Siemens Tricore";
1945 case EM_ARC: return "ARC";
1946 case EM_H8_300: return "Renesas H8/300";
1947 case EM_H8_300H: return "Renesas H8/300H";
1948 case EM_H8S: return "Renesas H8S";
1949 case EM_H8_500: return "Renesas H8/500";
1950 case EM_IA_64: return "Intel IA-64";
1951 case EM_MIPS_X: return "Stanford MIPS-X";
1952 case EM_COLDFIRE: return "Motorola Coldfire";
1953 case EM_ALPHA: return "Alpha";
1954 case EM_CYGNUS_D10V:
1955 case EM_D10V: return "d10v";
1956 case EM_CYGNUS_D30V:
1957 case EM_D30V: return "d30v";
1958 case EM_CYGNUS_M32R:
1959 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1960 case EM_CYGNUS_V850:
1961 case EM_V800: return "Renesas V850 (using RH850 ABI)";
1962 case EM_V850: return "Renesas V850";
1963 case EM_CYGNUS_MN10300:
1964 case EM_MN10300: return "mn10300";
1965 case EM_CYGNUS_MN10200:
1966 case EM_MN10200: return "mn10200";
1967 case EM_MOXIE: return "Moxie";
1968 case EM_CYGNUS_FR30:
1969 case EM_FR30: return "Fujitsu FR30";
1970 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1972 case EM_PJ: return "picoJava";
1973 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1974 case EM_PCP: return "Siemens PCP";
1975 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1976 case EM_NDR1: return "Denso NDR1 microprocesspr";
1977 case EM_STARCORE: return "Motorola Star*Core processor";
1978 case EM_ME16: return "Toyota ME16 processor";
1979 case EM_ST100: return "STMicroelectronics ST100 processor";
1980 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1981 case EM_PDSP: return "Sony DSP processor";
1982 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1983 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1984 case EM_FX66: return "Siemens FX66 microcontroller";
1985 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1986 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1987 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1988 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
1989 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1990 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1991 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1992 case EM_SVX: return "Silicon Graphics SVx";
1993 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1994 case EM_VAX: return "Digital VAX";
1996 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1997 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1998 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1999 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
2000 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
2001 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
2002 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
2003 case EM_PRISM: return "Vitesse Prism";
2004 case EM_X86_64: return "Advanced Micro Devices X86-64";
2005 case EM_L1OM: return "Intel L1OM";
2006 case EM_K1OM: return "Intel K1OM";
2008 case EM_S390: return "IBM S/390";
2009 case EM_SCORE: return "SUNPLUS S+Core";
2010 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
2012 case EM_OR32: return "OpenRISC";
2013 case EM_ARC_A5: return "ARC International ARCompact processor";
2014 case EM_CRX: return "National Semiconductor CRX microprocessor";
2015 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
2016 case EM_DLX: return "OpenDLX";
2018 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
2019 case EM_IQ2000: return "Vitesse IQ2000";
2021 case EM_XTENSA: return "Tensilica Xtensa Processor";
2022 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
2023 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
2024 case EM_NS32K: return "National Semiconductor 32000 series";
2025 case EM_TPC: return "Tenor Network TPC processor";
2026 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
2027 case EM_MAX: return "MAX Processor";
2028 case EM_CR: return "National Semiconductor CompactRISC";
2029 case EM_F2MC16: return "Fujitsu F2MC16";
2030 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
2031 case EM_LATTICEMICO32: return "Lattice Mico32";
2033 case EM_M32C: return "Renesas M32c";
2034 case EM_MT: return "Morpho Techologies MT processor";
2035 case EM_BLACKFIN: return "Analog Devices Blackfin";
2036 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
2037 case EM_SEP: return "Sharp embedded microprocessor";
2038 case EM_ARCA: return "Arca RISC microprocessor";
2039 case EM_UNICORE: return "Unicore";
2040 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
2041 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
2042 case EM_NIOS32: return "Altera Nios";
2043 case EM_ALTERA_NIOS2: return "Altera Nios II";
2045 case EM_XC16X: return "Infineon Technologies xc16x";
2046 case EM_M16C: return "Renesas M16C series microprocessors";
2047 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
2048 case EM_CE: return "Freescale Communication Engine RISC core";
2049 case EM_TSK3000: return "Altium TSK3000 core";
2050 case EM_RS08: return "Freescale RS08 embedded processor";
2051 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
2052 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
2053 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2054 case EM_SE_C17: return "Seiko Epson C17 family";
2055 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2056 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2057 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2058 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2059 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2060 case EM_R32C: return "Renesas R32C series microprocessors";
2061 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2062 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2063 case EM_8051: return "Intel 8051 and variants";
2064 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2065 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2066 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2067 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2068 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2069 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2070 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2071 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2074 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2075 case EM_RL78: return "Renesas RL78";
2076 case EM_RX: return "Renesas RX";
2077 case EM_METAG: return "Imagination Technologies Meta processor architecture";
2078 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2079 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2080 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2081 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2082 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2083 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2084 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2085 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2086 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2087 case EM_CUDA: return "NVIDIA CUDA architecture";
2088 case EM_XGATE: return "Motorola XGATE embedded processor";
2090 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2096 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2101 eabi = EF_ARM_EABI_VERSION (e_flags);
2102 e_flags &= ~ EF_ARM_EABIMASK;
2104 /* Handle "generic" ARM flags. */
2105 if (e_flags & EF_ARM_RELEXEC)
2107 strcat (buf, ", relocatable executable");
2108 e_flags &= ~ EF_ARM_RELEXEC;
2111 if (e_flags & EF_ARM_HASENTRY)
2113 strcat (buf, ", has entry point");
2114 e_flags &= ~ EF_ARM_HASENTRY;
2117 /* Now handle EABI specific flags. */
2121 strcat (buf, ", <unrecognized EABI>");
2126 case EF_ARM_EABI_VER1:
2127 strcat (buf, ", Version1 EABI");
2132 /* Process flags one bit at a time. */
2133 flag = e_flags & - e_flags;
2138 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2139 strcat (buf, ", sorted symbol tables");
2149 case EF_ARM_EABI_VER2:
2150 strcat (buf, ", Version2 EABI");
2155 /* Process flags one bit at a time. */
2156 flag = e_flags & - e_flags;
2161 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2162 strcat (buf, ", sorted symbol tables");
2165 case EF_ARM_DYNSYMSUSESEGIDX:
2166 strcat (buf, ", dynamic symbols use segment index");
2169 case EF_ARM_MAPSYMSFIRST:
2170 strcat (buf, ", mapping symbols precede others");
2180 case EF_ARM_EABI_VER3:
2181 strcat (buf, ", Version3 EABI");
2184 case EF_ARM_EABI_VER4:
2185 strcat (buf, ", Version4 EABI");
2190 /* Process flags one bit at a time. */
2191 flag = e_flags & - e_flags;
2197 strcat (buf, ", BE8");
2201 strcat (buf, ", LE8");
2212 case EF_ARM_EABI_VER5:
2213 strcat (buf, ", Version5 EABI");
2218 /* Process flags one bit at a time. */
2219 flag = e_flags & - e_flags;
2225 strcat (buf, ", BE8");
2229 strcat (buf, ", LE8");
2232 case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */
2233 strcat (buf, ", soft-float ABI");
2236 case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */
2237 strcat (buf, ", hard-float ABI");
2247 case EF_ARM_EABI_UNKNOWN:
2248 strcat (buf, ", GNU EABI");
2253 /* Process flags one bit at a time. */
2254 flag = e_flags & - e_flags;
2259 case EF_ARM_INTERWORK:
2260 strcat (buf, ", interworking enabled");
2263 case EF_ARM_APCS_26:
2264 strcat (buf, ", uses APCS/26");
2267 case EF_ARM_APCS_FLOAT:
2268 strcat (buf, ", uses APCS/float");
2272 strcat (buf, ", position independent");
2276 strcat (buf, ", 8 bit structure alignment");
2279 case EF_ARM_NEW_ABI:
2280 strcat (buf, ", uses new ABI");
2283 case EF_ARM_OLD_ABI:
2284 strcat (buf, ", uses old ABI");
2287 case EF_ARM_SOFT_FLOAT:
2288 strcat (buf, ", software FP");
2291 case EF_ARM_VFP_FLOAT:
2292 strcat (buf, ", VFP");
2295 case EF_ARM_MAVERICK_FLOAT:
2296 strcat (buf, ", Maverick FP");
2307 strcat (buf,_(", <unknown>"));
2311 get_machine_flags (unsigned e_flags, unsigned e_machine)
2313 static char buf[1024];
2325 decode_ARM_machine_flags (e_flags, buf);
2329 if (e_flags & EF_BFIN_PIC)
2330 strcat (buf, ", PIC");
2332 if (e_flags & EF_BFIN_FDPIC)
2333 strcat (buf, ", FDPIC");
2335 if (e_flags & EF_BFIN_CODE_IN_L1)
2336 strcat (buf, ", code in L1");
2338 if (e_flags & EF_BFIN_DATA_IN_L1)
2339 strcat (buf, ", data in L1");
2344 switch (e_flags & EF_FRV_CPU_MASK)
2346 case EF_FRV_CPU_GENERIC:
2350 strcat (buf, ", fr???");
2353 case EF_FRV_CPU_FR300:
2354 strcat (buf, ", fr300");
2357 case EF_FRV_CPU_FR400:
2358 strcat (buf, ", fr400");
2360 case EF_FRV_CPU_FR405:
2361 strcat (buf, ", fr405");
2364 case EF_FRV_CPU_FR450:
2365 strcat (buf, ", fr450");
2368 case EF_FRV_CPU_FR500:
2369 strcat (buf, ", fr500");
2371 case EF_FRV_CPU_FR550:
2372 strcat (buf, ", fr550");
2375 case EF_FRV_CPU_SIMPLE:
2376 strcat (buf, ", simple");
2378 case EF_FRV_CPU_TOMCAT:
2379 strcat (buf, ", tomcat");
2385 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2386 strcat (buf, ", m68000");
2387 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2388 strcat (buf, ", cpu32");
2389 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2390 strcat (buf, ", fido_a");
2393 char const * isa = _("unknown");
2394 char const * mac = _("unknown mac");
2395 char const * additional = NULL;
2397 switch (e_flags & EF_M68K_CF_ISA_MASK)
2399 case EF_M68K_CF_ISA_A_NODIV:
2401 additional = ", nodiv";
2403 case EF_M68K_CF_ISA_A:
2406 case EF_M68K_CF_ISA_A_PLUS:
2409 case EF_M68K_CF_ISA_B_NOUSP:
2411 additional = ", nousp";
2413 case EF_M68K_CF_ISA_B:
2416 case EF_M68K_CF_ISA_C:
2419 case EF_M68K_CF_ISA_C_NODIV:
2421 additional = ", nodiv";
2424 strcat (buf, ", cf, isa ");
2427 strcat (buf, additional);
2428 if (e_flags & EF_M68K_CF_FLOAT)
2429 strcat (buf, ", float");
2430 switch (e_flags & EF_M68K_CF_MAC_MASK)
2435 case EF_M68K_CF_MAC:
2438 case EF_M68K_CF_EMAC:
2441 case EF_M68K_CF_EMAC_B:
2454 if (e_flags & EF_PPC_EMB)
2455 strcat (buf, ", emb");
2457 if (e_flags & EF_PPC_RELOCATABLE)
2458 strcat (buf, _(", relocatable"));
2460 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2461 strcat (buf, _(", relocatable-lib"));
2465 if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
2466 strcat (buf, ", RH850 ABI");
2468 if (e_flags & EF_V800_850E3)
2469 strcat (buf, ", V3 architecture");
2471 if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
2472 strcat (buf, ", FPU not used");
2474 if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
2475 strcat (buf, ", regmode: COMMON");
2477 if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
2478 strcat (buf, ", r4 not used");
2480 if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
2481 strcat (buf, ", r30 not used");
2483 if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
2484 strcat (buf, ", r5 not used");
2486 if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
2487 strcat (buf, ", r2 not used");
2489 for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
2491 switch (e_flags & - e_flags)
2493 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
2494 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
2495 case EF_RH850_SIMD: strcat (buf, ", SIMD"); break;
2496 case EF_RH850_CACHE: strcat (buf, ", CACHE"); break;
2497 case EF_RH850_MMU: strcat (buf, ", MMU"); break;
2498 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
2499 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
2500 case EF_RH850_DATA_ALIGN8: strcat (buf, ", 8-byte alignment"); break;
2501 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
2502 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
2503 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
2504 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
2505 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
2506 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
2507 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
2508 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
2515 case EM_CYGNUS_V850:
2516 switch (e_flags & EF_V850_ARCH)
2518 case E_V850E3V5_ARCH:
2519 strcat (buf, ", v850e3v5");
2521 case E_V850E2V3_ARCH:
2522 strcat (buf, ", v850e2v3");
2525 strcat (buf, ", v850e2");
2528 strcat (buf, ", v850e1");
2531 strcat (buf, ", v850e");
2534 strcat (buf, ", v850");
2537 strcat (buf, _(", unknown v850 architecture variant"));
2543 case EM_CYGNUS_M32R:
2544 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2545 strcat (buf, ", m32r");
2549 case EM_MIPS_RS3_LE:
2550 if (e_flags & EF_MIPS_NOREORDER)
2551 strcat (buf, ", noreorder");
2553 if (e_flags & EF_MIPS_PIC)
2554 strcat (buf, ", pic");
2556 if (e_flags & EF_MIPS_CPIC)
2557 strcat (buf, ", cpic");
2559 if (e_flags & EF_MIPS_UCODE)
2560 strcat (buf, ", ugen_reserved");
2562 if (e_flags & EF_MIPS_ABI2)
2563 strcat (buf, ", abi2");
2565 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2566 strcat (buf, ", odk first");
2568 if (e_flags & EF_MIPS_32BITMODE)
2569 strcat (buf, ", 32bitmode");
2571 if (e_flags & EF_MIPS_NAN2008)
2572 strcat (buf, ", nan2008");
2574 if (e_flags & EF_MIPS_FP64)
2575 strcat (buf, ", fp64");
2577 switch ((e_flags & EF_MIPS_MACH))
2579 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2580 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2581 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2582 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2583 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2584 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2585 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2586 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2587 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2588 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2589 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2590 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2591 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2592 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2593 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2594 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2596 /* We simply ignore the field in this case to avoid confusion:
2597 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2600 default: strcat (buf, _(", unknown CPU")); break;
2603 switch ((e_flags & EF_MIPS_ABI))
2605 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2606 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2607 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2608 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2610 /* We simply ignore the field in this case to avoid confusion:
2611 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2612 This means it is likely to be an o32 file, but not for
2615 default: strcat (buf, _(", unknown ABI")); break;
2618 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2619 strcat (buf, ", mdmx");
2621 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2622 strcat (buf, ", mips16");
2624 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2625 strcat (buf, ", micromips");
2627 switch ((e_flags & EF_MIPS_ARCH))
2629 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2630 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2631 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2632 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2633 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2634 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2635 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2636 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2637 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2638 default: strcat (buf, _(", unknown ISA")); break;
2643 switch ((e_flags & EF_SH_MACH_MASK))
2645 case EF_SH1: strcat (buf, ", sh1"); break;
2646 case EF_SH2: strcat (buf, ", sh2"); break;
2647 case EF_SH3: strcat (buf, ", sh3"); break;
2648 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2649 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2650 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2651 case EF_SH3E: strcat (buf, ", sh3e"); break;
2652 case EF_SH4: strcat (buf, ", sh4"); break;
2653 case EF_SH5: strcat (buf, ", sh5"); break;
2654 case EF_SH2E: strcat (buf, ", sh2e"); break;
2655 case EF_SH4A: strcat (buf, ", sh4a"); break;
2656 case EF_SH2A: strcat (buf, ", sh2a"); break;
2657 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2658 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2659 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2660 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2661 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2662 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2663 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2664 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2665 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2666 default: strcat (buf, _(", unknown ISA")); break;
2669 if (e_flags & EF_SH_PIC)
2670 strcat (buf, ", pic");
2672 if (e_flags & EF_SH_FDPIC)
2673 strcat (buf, ", fdpic");
2677 if (e_flags & EF_SPARC_32PLUS)
2678 strcat (buf, ", v8+");
2680 if (e_flags & EF_SPARC_SUN_US1)
2681 strcat (buf, ", ultrasparcI");
2683 if (e_flags & EF_SPARC_SUN_US3)
2684 strcat (buf, ", ultrasparcIII");
2686 if (e_flags & EF_SPARC_HAL_R1)
2687 strcat (buf, ", halr1");
2689 if (e_flags & EF_SPARC_LEDATA)
2690 strcat (buf, ", ledata");
2692 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2693 strcat (buf, ", tso");
2695 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2696 strcat (buf, ", pso");
2698 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2699 strcat (buf, ", rmo");
2703 switch (e_flags & EF_PARISC_ARCH)
2705 case EFA_PARISC_1_0:
2706 strcpy (buf, ", PA-RISC 1.0");
2708 case EFA_PARISC_1_1:
2709 strcpy (buf, ", PA-RISC 1.1");
2711 case EFA_PARISC_2_0:
2712 strcpy (buf, ", PA-RISC 2.0");
2717 if (e_flags & EF_PARISC_TRAPNIL)
2718 strcat (buf, ", trapnil");
2719 if (e_flags & EF_PARISC_EXT)
2720 strcat (buf, ", ext");
2721 if (e_flags & EF_PARISC_LSB)
2722 strcat (buf, ", lsb");
2723 if (e_flags & EF_PARISC_WIDE)
2724 strcat (buf, ", wide");
2725 if (e_flags & EF_PARISC_NO_KABP)
2726 strcat (buf, ", no kabp");
2727 if (e_flags & EF_PARISC_LAZYSWAP)
2728 strcat (buf, ", lazyswap");
2733 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2734 strcat (buf, ", new calling convention");
2736 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2737 strcat (buf, ", gnu calling convention");
2741 if ((e_flags & EF_IA_64_ABI64))
2742 strcat (buf, ", 64-bit");
2744 strcat (buf, ", 32-bit");
2745 if ((e_flags & EF_IA_64_REDUCEDFP))
2746 strcat (buf, ", reduced fp model");
2747 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2748 strcat (buf, ", no function descriptors, constant gp");
2749 else if ((e_flags & EF_IA_64_CONS_GP))
2750 strcat (buf, ", constant gp");
2751 if ((e_flags & EF_IA_64_ABSOLUTE))
2752 strcat (buf, ", absolute");
2753 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2755 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2756 strcat (buf, ", vms_linkages");
2757 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2759 case EF_IA_64_VMS_COMCOD_SUCCESS:
2761 case EF_IA_64_VMS_COMCOD_WARNING:
2762 strcat (buf, ", warning");
2764 case EF_IA_64_VMS_COMCOD_ERROR:
2765 strcat (buf, ", error");
2767 case EF_IA_64_VMS_COMCOD_ABORT:
2768 strcat (buf, ", abort");
2777 if ((e_flags & EF_VAX_NONPIC))
2778 strcat (buf, ", non-PIC");
2779 if ((e_flags & EF_VAX_DFLOAT))
2780 strcat (buf, ", D-Float");
2781 if ((e_flags & EF_VAX_GFLOAT))
2782 strcat (buf, ", G-Float");
2786 if (e_flags & E_FLAG_RL78_G10)
2787 strcat (buf, ", G10");
2791 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2792 strcat (buf, ", 64-bit doubles");
2793 if (e_flags & E_FLAG_RX_DSP)
2794 strcat (buf, ", dsp");
2795 if (e_flags & E_FLAG_RX_PID)
2796 strcat (buf, ", pid");
2797 if (e_flags & E_FLAG_RX_ABI)
2798 strcat (buf, ", RX ABI");
2802 if (e_flags & EF_S390_HIGH_GPRS)
2803 strcat (buf, ", highgprs");
2807 if ((e_flags & EF_C6000_REL))
2808 strcat (buf, ", relocatable module");
2812 strcat (buf, _(": architecture variant: "));
2813 switch (e_flags & EF_MSP430_MACH)
2815 case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
2816 case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
2817 case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
2818 case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
2819 case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
2820 case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
2821 case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
2822 case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
2823 case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
2824 case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
2825 case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
2826 case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
2827 case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
2828 case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
2829 case E_MSP430_MACH_MSP430X : strcat (buf, "MSP430X"); break;
2831 strcat (buf, _(": unknown")); break;
2834 if (e_flags & ~ EF_MSP430_MACH)
2835 strcat (buf, _(": unknown extra flag bits also present"));
2843 get_osabi_name (unsigned int osabi)
2845 static char buff[32];
2849 case ELFOSABI_NONE: return "UNIX - System V";
2850 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2851 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2852 case ELFOSABI_GNU: return "UNIX - GNU";
2853 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2854 case ELFOSABI_AIX: return "UNIX - AIX";
2855 case ELFOSABI_IRIX: return "UNIX - IRIX";
2856 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2857 case ELFOSABI_TRU64: return "UNIX - TRU64";
2858 case ELFOSABI_MODESTO: return "Novell - Modesto";
2859 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2860 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2861 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2862 case ELFOSABI_AROS: return "AROS";
2863 case ELFOSABI_FENIXOS: return "FenixOS";
2866 switch (elf_header.e_machine)
2871 case ELFOSABI_ARM: return "ARM";
2881 case ELFOSABI_STANDALONE: return _("Standalone App");
2890 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2891 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2900 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2906 get_aarch64_segment_type (unsigned long type)
2910 case PT_AARCH64_ARCHEXT:
2911 return "AARCH64_ARCHEXT";
2920 get_arm_segment_type (unsigned long type)
2934 get_mips_segment_type (unsigned long type)
2938 case PT_MIPS_REGINFO:
2940 case PT_MIPS_RTPROC:
2942 case PT_MIPS_OPTIONS:
2952 get_parisc_segment_type (unsigned long type)
2956 case PT_HP_TLS: return "HP_TLS";
2957 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2958 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2959 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2960 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2961 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2962 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2963 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2964 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2965 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2966 case PT_HP_PARALLEL: return "HP_PARALLEL";
2967 case PT_HP_FASTBIND: return "HP_FASTBIND";
2968 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2969 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2970 case PT_HP_STACK: return "HP_STACK";
2971 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2972 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2973 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2974 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2983 get_ia64_segment_type (unsigned long type)
2987 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2988 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2989 case PT_HP_TLS: return "HP_TLS";
2990 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2991 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2992 case PT_IA_64_HP_STACK: return "HP_STACK";
3001 get_tic6x_segment_type (unsigned long type)
3005 case PT_C6000_PHATTR: return "C6000_PHATTR";
3014 get_segment_type (unsigned long p_type)
3016 static char buff[32];
3020 case PT_NULL: return "NULL";
3021 case PT_LOAD: return "LOAD";
3022 case PT_DYNAMIC: return "DYNAMIC";
3023 case PT_INTERP: return "INTERP";
3024 case PT_NOTE: return "NOTE";
3025 case PT_SHLIB: return "SHLIB";
3026 case PT_PHDR: return "PHDR";
3027 case PT_TLS: return "TLS";
3029 case PT_GNU_EH_FRAME:
3030 return "GNU_EH_FRAME";
3031 case PT_GNU_STACK: return "GNU_STACK";
3032 case PT_GNU_RELRO: return "GNU_RELRO";
3035 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3037 const char * result;
3039 switch (elf_header.e_machine)
3042 result = get_aarch64_segment_type (p_type);
3045 result = get_arm_segment_type (p_type);
3048 case EM_MIPS_RS3_LE:
3049 result = get_mips_segment_type (p_type);
3052 result = get_parisc_segment_type (p_type);
3055 result = get_ia64_segment_type (p_type);
3058 result = get_tic6x_segment_type (p_type);
3068 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3070 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3072 const char * result;
3074 switch (elf_header.e_machine)
3077 result = get_parisc_segment_type (p_type);
3080 result = get_ia64_segment_type (p_type);
3090 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3093 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3100 get_mips_section_type_name (unsigned int sh_type)
3104 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
3105 case SHT_MIPS_MSYM: return "MIPS_MSYM";
3106 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
3107 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
3108 case SHT_MIPS_UCODE: return "MIPS_UCODE";
3109 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
3110 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
3111 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
3112 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
3113 case SHT_MIPS_RELD: return "MIPS_RELD";
3114 case SHT_MIPS_IFACE: return "MIPS_IFACE";
3115 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
3116 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
3117 case SHT_MIPS_SHDR: return "MIPS_SHDR";
3118 case SHT_MIPS_FDESC: return "MIPS_FDESC";
3119 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
3120 case SHT_MIPS_DENSE: return "MIPS_DENSE";
3121 case SHT_MIPS_PDESC: return "MIPS_PDESC";
3122 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
3123 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
3124 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
3125 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
3126 case SHT_MIPS_LINE: return "MIPS_LINE";
3127 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
3128 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
3129 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
3130 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
3131 case SHT_MIPS_DWARF: return "MIPS_DWARF";
3132 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
3133 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
3134 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
3135 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
3136 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
3137 case SHT_MIPS_XLATE: return "MIPS_XLATE";
3138 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
3139 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
3140 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
3141 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
3142 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3150 get_parisc_section_type_name (unsigned int sh_type)
3154 case SHT_PARISC_EXT: return "PARISC_EXT";
3155 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
3156 case SHT_PARISC_DOC: return "PARISC_DOC";
3157 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
3158 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
3159 case SHT_PARISC_STUBS: return "PARISC_STUBS";
3160 case SHT_PARISC_DLKM: return "PARISC_DLKM";
3168 get_ia64_section_type_name (unsigned int sh_type)
3170 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
3171 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3172 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3176 case SHT_IA_64_EXT: return "IA_64_EXT";
3177 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
3178 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
3179 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
3180 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3181 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
3182 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3183 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3184 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3185 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3193 get_x86_64_section_type_name (unsigned int sh_type)
3197 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3205 get_aarch64_section_type_name (unsigned int sh_type)
3209 case SHT_AARCH64_ATTRIBUTES:
3210 return "AARCH64_ATTRIBUTES";
3218 get_arm_section_type_name (unsigned int sh_type)
3222 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3223 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3224 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3225 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3226 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3234 get_tic6x_section_type_name (unsigned int sh_type)
3238 case SHT_C6000_UNWIND:
3239 return "C6000_UNWIND";
3240 case SHT_C6000_PREEMPTMAP:
3241 return "C6000_PREEMPTMAP";
3242 case SHT_C6000_ATTRIBUTES:
3243 return "C6000_ATTRIBUTES";
3248 case SHT_TI_HANDLER:
3249 return "TI_HANDLER";
3250 case SHT_TI_INITINFO:
3251 return "TI_INITINFO";
3252 case SHT_TI_PHATTRS:
3253 return "TI_PHATTRS";
3261 get_msp430x_section_type_name (unsigned int sh_type)
3265 case SHT_MSP430_SEC_FLAGS: return "MSP430_SEC_FLAGS";
3266 case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3267 case SHT_MSP430_ATTRIBUTES: return "MSP430_ATTRIBUTES";
3268 default: return NULL;
3273 get_section_type_name (unsigned int sh_type)
3275 static char buff[32];
3279 case SHT_NULL: return "NULL";
3280 case SHT_PROGBITS: return "PROGBITS";
3281 case SHT_SYMTAB: return "SYMTAB";
3282 case SHT_STRTAB: return "STRTAB";
3283 case SHT_RELA: return "RELA";
3284 case SHT_HASH: return "HASH";
3285 case SHT_DYNAMIC: return "DYNAMIC";
3286 case SHT_NOTE: return "NOTE";
3287 case SHT_NOBITS: return "NOBITS";
3288 case SHT_REL: return "REL";
3289 case SHT_SHLIB: return "SHLIB";
3290 case SHT_DYNSYM: return "DYNSYM";
3291 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3292 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3293 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3294 case SHT_GNU_HASH: return "GNU_HASH";
3295 case SHT_GROUP: return "GROUP";
3296 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3297 case SHT_GNU_verdef: return "VERDEF";
3298 case SHT_GNU_verneed: return "VERNEED";
3299 case SHT_GNU_versym: return "VERSYM";
3300 case 0x6ffffff0: return "VERSYM";
3301 case 0x6ffffffc: return "VERDEF";
3302 case 0x7ffffffd: return "AUXILIARY";
3303 case 0x7fffffff: return "FILTER";
3304 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3307 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3309 const char * result;
3311 switch (elf_header.e_machine)
3314 case EM_MIPS_RS3_LE:
3315 result = get_mips_section_type_name (sh_type);
3318 result = get_parisc_section_type_name (sh_type);
3321 result = get_ia64_section_type_name (sh_type);
3326 result = get_x86_64_section_type_name (sh_type);
3329 result = get_aarch64_section_type_name (sh_type);
3332 result = get_arm_section_type_name (sh_type);
3335 result = get_tic6x_section_type_name (sh_type);
3338 result = get_msp430x_section_type_name (sh_type);
3348 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3350 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3352 const char * result;
3354 switch (elf_header.e_machine)
3357 result = get_ia64_section_type_name (sh_type);
3367 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3369 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3370 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3372 /* This message is probably going to be displayed in a 15
3373 character wide field, so put the hex value first. */
3374 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3380 #define OPTION_DEBUG_DUMP 512
3381 #define OPTION_DYN_SYMS 513
3382 #define OPTION_DWARF_DEPTH 514
3383 #define OPTION_DWARF_START 515
3384 #define OPTION_DWARF_CHECK 516
3386 static struct option options[] =
3388 {"all", no_argument, 0, 'a'},
3389 {"file-header", no_argument, 0, 'h'},
3390 {"program-headers", no_argument, 0, 'l'},
3391 {"headers", no_argument, 0, 'e'},
3392 {"histogram", no_argument, 0, 'I'},
3393 {"segments", no_argument, 0, 'l'},
3394 {"sections", no_argument, 0, 'S'},
3395 {"section-headers", no_argument, 0, 'S'},
3396 {"section-groups", no_argument, 0, 'g'},
3397 {"section-details", no_argument, 0, 't'},
3398 {"full-section-name",no_argument, 0, 'N'},
3399 {"symbols", no_argument, 0, 's'},
3400 {"syms", no_argument, 0, 's'},
3401 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3402 {"relocs", no_argument, 0, 'r'},
3403 {"notes", no_argument, 0, 'n'},
3404 {"dynamic", no_argument, 0, 'd'},
3405 {"arch-specific", no_argument, 0, 'A'},
3406 {"version-info", no_argument, 0, 'V'},
3407 {"use-dynamic", no_argument, 0, 'D'},
3408 {"unwind", no_argument, 0, 'u'},
3409 {"archive-index", no_argument, 0, 'c'},
3410 {"hex-dump", required_argument, 0, 'x'},
3411 {"relocated-dump", required_argument, 0, 'R'},
3412 {"string-dump", required_argument, 0, 'p'},
3413 #ifdef SUPPORT_DISASSEMBLY
3414 {"instruction-dump", required_argument, 0, 'i'},
3416 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3418 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3419 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3420 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3422 {"version", no_argument, 0, 'v'},
3423 {"wide", no_argument, 0, 'W'},
3424 {"help", no_argument, 0, 'H'},
3425 {0, no_argument, 0, 0}
3429 usage (FILE * stream)
3431 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3432 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3433 fprintf (stream, _(" Options are:\n\
3434 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3435 -h --file-header Display the ELF file header\n\
3436 -l --program-headers Display the program headers\n\
3437 --segments An alias for --program-headers\n\
3438 -S --section-headers Display the sections' header\n\
3439 --sections An alias for --section-headers\n\
3440 -g --section-groups Display the section groups\n\
3441 -t --section-details Display the section details\n\
3442 -e --headers Equivalent to: -h -l -S\n\
3443 -s --syms Display the symbol table\n\
3444 --symbols An alias for --syms\n\
3445 --dyn-syms Display the dynamic symbol table\n\
3446 -n --notes Display the core notes (if present)\n\
3447 -r --relocs Display the relocations (if present)\n\
3448 -u --unwind Display the unwind info (if present)\n\
3449 -d --dynamic Display the dynamic section (if present)\n\
3450 -V --version-info Display the version sections (if present)\n\
3451 -A --arch-specific Display architecture specific information (if any)\n\
3452 -c --archive-index Display the symbol/file index in an archive\n\
3453 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3454 -x --hex-dump=<number|name>\n\
3455 Dump the contents of section <number|name> as bytes\n\
3456 -p --string-dump=<number|name>\n\
3457 Dump the contents of section <number|name> as strings\n\
3458 -R --relocated-dump=<number|name>\n\
3459 Dump the contents of section <number|name> as relocated bytes\n\
3460 -w[lLiaprmfFsoRt] or\n\
3461 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3462 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3463 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3465 Display the contents of DWARF2 debug sections\n"));
3466 fprintf (stream, _("\
3467 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3468 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3470 #ifdef SUPPORT_DISASSEMBLY
3471 fprintf (stream, _("\
3472 -i --instruction-dump=<number|name>\n\
3473 Disassemble the contents of section <number|name>\n"));
3475 fprintf (stream, _("\
3476 -I --histogram Display histogram of bucket list lengths\n\
3477 -W --wide Allow output width to exceed 80 characters\n\
3478 @<file> Read options from <file>\n\
3479 -H --help Display this information\n\
3480 -v --version Display the version number of readelf\n"));
3482 if (REPORT_BUGS_TO[0] && stream == stdout)
3483 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3485 exit (stream == stdout ? 0 : 1);
3488 /* Record the fact that the user wants the contents of section number
3489 SECTION to be displayed using the method(s) encoded as flags bits
3490 in TYPE. Note, TYPE can be zero if we are creating the array for
3494 request_dump_bynumber (unsigned int section, dump_type type)
3496 if (section >= num_dump_sects)
3498 dump_type * new_dump_sects;
3500 new_dump_sects = (dump_type *) calloc (section + 1,
3501 sizeof (* dump_sects));
3503 if (new_dump_sects == NULL)
3504 error (_("Out of memory allocating dump request table.\n"));
3507 /* Copy current flag settings. */
3508 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3512 dump_sects = new_dump_sects;
3513 num_dump_sects = section + 1;
3518 dump_sects[section] |= type;
3523 /* Request a dump by section name. */
3526 request_dump_byname (const char * section, dump_type type)
3528 struct dump_list_entry * new_request;
3530 new_request = (struct dump_list_entry *)
3531 malloc (sizeof (struct dump_list_entry));
3533 error (_("Out of memory allocating dump request table.\n"));
3535 new_request->name = strdup (section);
3536 if (!new_request->name)
3537 error (_("Out of memory allocating dump request table.\n"));
3539 new_request->type = type;
3541 new_request->next = dump_sects_byname;
3542 dump_sects_byname = new_request;
3546 request_dump (dump_type type)
3552 section = strtoul (optarg, & cp, 0);
3554 if (! *cp && section >= 0)
3555 request_dump_bynumber (section, type);
3557 request_dump_byname (optarg, type);
3562 parse_args (int argc, char ** argv)
3569 while ((c = getopt_long
3570 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3588 do_section_groups++;
3596 do_section_groups++;
3601 do_section_details++;
3645 request_dump (HEX_DUMP);
3648 request_dump (STRING_DUMP);
3651 request_dump (RELOC_DUMP);
3658 dwarf_select_sections_all ();
3663 dwarf_select_sections_by_letters (optarg);
3666 case OPTION_DEBUG_DUMP:
3673 dwarf_select_sections_by_names (optarg);
3676 case OPTION_DWARF_DEPTH:
3680 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3683 case OPTION_DWARF_START:
3687 dwarf_start_die = strtoul (optarg, & cp, 0);
3690 case OPTION_DWARF_CHECK:
3693 case OPTION_DYN_SYMS:
3696 #ifdef SUPPORT_DISASSEMBLY
3698 request_dump (DISASS_DUMP);
3702 print_version (program_name);
3711 /* xgettext:c-format */
3712 error (_("Invalid option '-%c'\n"), c);
3719 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3720 && !do_segments && !do_header && !do_dump && !do_version
3721 && !do_histogram && !do_debugging && !do_arch && !do_notes
3722 && !do_section_groups && !do_archive_index
3727 warn (_("Nothing to do.\n"));
3733 get_elf_class (unsigned int elf_class)
3735 static char buff[32];
3739 case ELFCLASSNONE: return _("none");
3740 case ELFCLASS32: return "ELF32";
3741 case ELFCLASS64: return "ELF64";
3743 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3749 get_data_encoding (unsigned int encoding)
3751 static char buff[32];
3755 case ELFDATANONE: return _("none");
3756 case ELFDATA2LSB: return _("2's complement, little endian");
3757 case ELFDATA2MSB: return _("2's complement, big endian");
3759 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3764 /* Decode the data held in 'elf_header'. */
3767 process_file_header (void)
3769 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3770 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3771 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3772 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3775 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3779 init_dwarf_regnames (elf_header.e_machine);
3785 printf (_("ELF Header:\n"));
3786 printf (_(" Magic: "));
3787 for (i = 0; i < EI_NIDENT; i++)
3788 printf ("%2.2x ", elf_header.e_ident[i]);
3790 printf (_(" Class: %s\n"),
3791 get_elf_class (elf_header.e_ident[EI_CLASS]));
3792 printf (_(" Data: %s\n"),
3793 get_data_encoding (elf_header.e_ident[EI_DATA]));
3794 printf (_(" Version: %d %s\n"),
3795 elf_header.e_ident[EI_VERSION],
3796 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3798 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3799 ? _("<unknown: %lx>")
3801 printf (_(" OS/ABI: %s\n"),
3802 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3803 printf (_(" ABI Version: %d\n"),
3804 elf_header.e_ident[EI_ABIVERSION]);
3805 printf (_(" Type: %s\n"),
3806 get_file_type (elf_header.e_type));
3807 printf (_(" Machine: %s\n"),
3808 get_machine_name (elf_header.e_machine));
3809 printf (_(" Version: 0x%lx\n"),
3810 (unsigned long) elf_header.e_version);
3812 printf (_(" Entry point address: "));
3813 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3814 printf (_("\n Start of program headers: "));
3815 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3816 printf (_(" (bytes into file)\n Start of section headers: "));
3817 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3818 printf (_(" (bytes into file)\n"));
3820 printf (_(" Flags: 0x%lx%s\n"),
3821 (unsigned long) elf_header.e_flags,
3822 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3823 printf (_(" Size of this header: %ld (bytes)\n"),
3824 (long) elf_header.e_ehsize);
3825 printf (_(" Size of program headers: %ld (bytes)\n"),
3826 (long) elf_header.e_phentsize);
3827 printf (_(" Number of program headers: %ld"),
3828 (long) elf_header.e_phnum);
3829 if (section_headers != NULL
3830 && elf_header.e_phnum == PN_XNUM
3831 && section_headers[0].sh_info != 0)
3832 printf (" (%ld)", (long) section_headers[0].sh_info);
3833 putc ('\n', stdout);
3834 printf (_(" Size of section headers: %ld (bytes)\n"),
3835 (long) elf_header.e_shentsize);
3836 printf (_(" Number of section headers: %ld"),
3837 (long) elf_header.e_shnum);
3838 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3839 printf (" (%ld)", (long) section_headers[0].sh_size);
3840 putc ('\n', stdout);
3841 printf (_(" Section header string table index: %ld"),
3842 (long) elf_header.e_shstrndx);
3843 if (section_headers != NULL
3844 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3845 printf (" (%u)", section_headers[0].sh_link);
3846 else if (elf_header.e_shstrndx != SHN_UNDEF
3847 && elf_header.e_shstrndx >= elf_header.e_shnum)
3848 printf (_(" <corrupt: out of range>"));
3849 putc ('\n', stdout);
3852 if (section_headers != NULL)
3854 if (elf_header.e_phnum == PN_XNUM
3855 && section_headers[0].sh_info != 0)
3856 elf_header.e_phnum = section_headers[0].sh_info;
3857 if (elf_header.e_shnum == SHN_UNDEF)
3858 elf_header.e_shnum = section_headers[0].sh_size;
3859 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3860 elf_header.e_shstrndx = section_headers[0].sh_link;
3861 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3862 elf_header.e_shstrndx = SHN_UNDEF;
3863 free (section_headers);
3864 section_headers = NULL;
3872 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3874 Elf32_External_Phdr * phdrs;
3875 Elf32_External_Phdr * external;
3876 Elf_Internal_Phdr * internal;
3879 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3880 elf_header.e_phentsize,
3882 _("program headers"));
3886 for (i = 0, internal = pheaders, external = phdrs;
3887 i < elf_header.e_phnum;
3888 i++, internal++, external++)
3890 internal->p_type = BYTE_GET (external->p_type);
3891 internal->p_offset = BYTE_GET (external->p_offset);
3892 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3893 internal->p_paddr = BYTE_GET (external->p_paddr);
3894 internal->p_filesz = BYTE_GET (external->p_filesz);
3895 internal->p_memsz = BYTE_GET (external->p_memsz);
3896 internal->p_flags = BYTE_GET (external->p_flags);
3897 internal->p_align = BYTE_GET (external->p_align);
3906 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3908 Elf64_External_Phdr * phdrs;
3909 Elf64_External_Phdr * external;
3910 Elf_Internal_Phdr * internal;
3913 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3914 elf_header.e_phentsize,
3916 _("program headers"));
3920 for (i = 0, internal = pheaders, external = phdrs;
3921 i < elf_header.e_phnum;
3922 i++, internal++, external++)
3924 internal->p_type = BYTE_GET (external->p_type);
3925 internal->p_flags = BYTE_GET (external->p_flags);
3926 internal->p_offset = BYTE_GET (external->p_offset);
3927 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3928 internal->p_paddr = BYTE_GET (external->p_paddr);
3929 internal->p_filesz = BYTE_GET (external->p_filesz);
3930 internal->p_memsz = BYTE_GET (external->p_memsz);
3931 internal->p_align = BYTE_GET (external->p_align);
3939 /* Returns 1 if the program headers were read into `program_headers'. */
3942 get_program_headers (FILE * file)
3944 Elf_Internal_Phdr * phdrs;
3946 /* Check cache of prior read. */
3947 if (program_headers != NULL)
3950 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3951 sizeof (Elf_Internal_Phdr));
3955 error (_("Out of memory\n"));
3960 ? get_32bit_program_headers (file, phdrs)
3961 : get_64bit_program_headers (file, phdrs))
3963 program_headers = phdrs;
3971 /* Returns 1 if the program headers were loaded. */
3974 process_program_headers (FILE * file)
3976 Elf_Internal_Phdr * segment;
3979 if (elf_header.e_phnum == 0)
3981 /* PR binutils/12467. */
3982 if (elf_header.e_phoff != 0)
3983 warn (_("possibly corrupt ELF header - it has a non-zero program"
3984 " header offset, but no program headers"));
3985 else if (do_segments)
3986 printf (_("\nThere are no program headers in this file.\n"));
3990 if (do_segments && !do_header)
3992 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3993 printf (_("Entry point "));
3994 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3995 printf (_("\nThere are %d program headers, starting at offset "),
3996 elf_header.e_phnum);
3997 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4001 if (! get_program_headers (file))
4006 if (elf_header.e_phnum > 1)
4007 printf (_("\nProgram Headers:\n"));
4009 printf (_("\nProgram Headers:\n"));
4013 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4016 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
4020 (_(" Type Offset VirtAddr PhysAddr\n"));
4022 (_(" FileSiz MemSiz Flags Align\n"));
4029 for (i = 0, segment = program_headers;
4030 i < elf_header.e_phnum;
4035 printf (" %-14.14s ", get_segment_type (segment->p_type));
4039 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4040 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4041 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4042 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4043 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4045 (segment->p_flags & PF_R ? 'R' : ' '),
4046 (segment->p_flags & PF_W ? 'W' : ' '),
4047 (segment->p_flags & PF_X ? 'E' : ' '));
4048 printf ("%#lx", (unsigned long) segment->p_align);
4052 if ((unsigned long) segment->p_offset == segment->p_offset)
4053 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4056 print_vma (segment->p_offset, FULL_HEX);
4060 print_vma (segment->p_vaddr, FULL_HEX);
4062 print_vma (segment->p_paddr, FULL_HEX);
4065 if ((unsigned long) segment->p_filesz == segment->p_filesz)
4066 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4069 print_vma (segment->p_filesz, FULL_HEX);
4073 if ((unsigned long) segment->p_memsz == segment->p_memsz)
4074 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4077 print_vma (segment->p_memsz, FULL_HEX);
4081 (segment->p_flags & PF_R ? 'R' : ' '),
4082 (segment->p_flags & PF_W ? 'W' : ' '),
4083 (segment->p_flags & PF_X ? 'E' : ' '));
4085 if ((unsigned long) segment->p_align == segment->p_align)
4086 printf ("%#lx", (unsigned long) segment->p_align);
4089 print_vma (segment->p_align, PREFIX_HEX);
4094 print_vma (segment->p_offset, FULL_HEX);
4096 print_vma (segment->p_vaddr, FULL_HEX);
4098 print_vma (segment->p_paddr, FULL_HEX);
4100 print_vma (segment->p_filesz, FULL_HEX);
4102 print_vma (segment->p_memsz, FULL_HEX);
4104 (segment->p_flags & PF_R ? 'R' : ' '),
4105 (segment->p_flags & PF_W ? 'W' : ' '),
4106 (segment->p_flags & PF_X ? 'E' : ' '));
4107 print_vma (segment->p_align, HEX);
4111 switch (segment->p_type)
4115 error (_("more than one dynamic segment\n"));
4117 /* By default, assume that the .dynamic section is the first
4118 section in the DYNAMIC segment. */
4119 dynamic_addr = segment->p_offset;
4120 dynamic_size = segment->p_filesz;
4122 /* Try to locate the .dynamic section. If there is
4123 a section header table, we can easily locate it. */
4124 if (section_headers != NULL)
4126 Elf_Internal_Shdr * sec;
4128 sec = find_section (".dynamic");
4129 if (sec == NULL || sec->sh_size == 0)
4131 /* A corresponding .dynamic section is expected, but on
4132 IA-64/OpenVMS it is OK for it to be missing. */
4133 if (!is_ia64_vms ())
4134 error (_("no .dynamic section in the dynamic segment\n"));
4138 if (sec->sh_type == SHT_NOBITS)
4144 dynamic_addr = sec->sh_offset;
4145 dynamic_size = sec->sh_size;
4147 if (dynamic_addr < segment->p_offset
4148 || dynamic_addr > segment->p_offset + segment->p_filesz)
4149 warn (_("the .dynamic section is not contained"
4150 " within the dynamic segment\n"));
4151 else if (dynamic_addr > segment->p_offset)
4152 warn (_("the .dynamic section is not the first section"
4153 " in the dynamic segment.\n"));
4158 if (fseek (file, archive_file_offset + (long) segment->p_offset,
4160 error (_("Unable to find program interpreter name\n"));
4164 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
4166 if (ret >= (int) sizeof (fmt) || ret < 0)
4167 error (_("Internal error: failed to create format string to display program interpreter\n"));
4169 program_interpreter[0] = 0;
4170 if (fscanf (file, fmt, program_interpreter) <= 0)
4171 error (_("Unable to read program interpreter name\n"));
4174 printf (_("\n [Requesting program interpreter: %s]"),
4175 program_interpreter);
4181 putc ('\n', stdout);
4184 if (do_segments && section_headers != NULL && string_table != NULL)
4186 printf (_("\n Section to Segment mapping:\n"));
4187 printf (_(" Segment Sections...\n"));
4189 for (i = 0; i < elf_header.e_phnum; i++)
4192 Elf_Internal_Shdr * section;
4194 segment = program_headers + i;
4195 section = section_headers + 1;
4197 printf (" %2.2d ", i);
4199 for (j = 1; j < elf_header.e_shnum; j++, section++)
4201 if (!ELF_TBSS_SPECIAL (section, segment)
4202 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4203 printf ("%s ", SECTION_NAME (section));
4214 /* Find the file offset corresponding to VMA by using the program headers. */
4217 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4219 Elf_Internal_Phdr * seg;
4221 if (! get_program_headers (file))
4223 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4227 for (seg = program_headers;
4228 seg < program_headers + elf_header.e_phnum;
4231 if (seg->p_type != PT_LOAD)
4234 if (vma >= (seg->p_vaddr & -seg->p_align)
4235 && vma + size <= seg->p_vaddr + seg->p_filesz)
4236 return vma - seg->p_vaddr + seg->p_offset;
4239 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4240 (unsigned long) vma);
4246 get_32bit_section_headers (FILE * file, unsigned int num)
4248 Elf32_External_Shdr * shdrs;
4249 Elf_Internal_Shdr * internal;
4252 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4253 elf_header.e_shentsize, num,
4254 _("section headers"));
4258 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4259 sizeof (Elf_Internal_Shdr));
4261 if (section_headers == NULL)
4263 error (_("Out of memory\n"));
4267 for (i = 0, internal = section_headers;
4271 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4272 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4273 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4274 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4275 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4276 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4277 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4278 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4279 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4280 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4289 get_64bit_section_headers (FILE * file, unsigned int num)
4291 Elf64_External_Shdr * shdrs;
4292 Elf_Internal_Shdr * internal;
4295 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4296 elf_header.e_shentsize, num,
4297 _("section headers"));
4301 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4302 sizeof (Elf_Internal_Shdr));
4304 if (section_headers == NULL)
4306 error (_("Out of memory\n"));
4310 for (i = 0, internal = section_headers;
4314 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4315 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4316 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4317 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4318 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4319 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4320 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4321 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4322 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4323 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4331 static Elf_Internal_Sym *
4332 get_32bit_elf_symbols (FILE * file,
4333 Elf_Internal_Shdr * section,
4334 unsigned long * num_syms_return)
4336 unsigned long number = 0;
4337 Elf32_External_Sym * esyms = NULL;
4338 Elf_External_Sym_Shndx * shndx = NULL;
4339 Elf_Internal_Sym * isyms = NULL;
4340 Elf_Internal_Sym * psym;
4343 /* Run some sanity checks first. */
4344 if (section->sh_entsize == 0)
4346 error (_("sh_entsize is zero\n"));
4350 number = section->sh_size / section->sh_entsize;
4352 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4354 error (_("Invalid sh_entsize\n"));
4358 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4359 section->sh_size, _("symbols"));
4364 if (symtab_shndx_hdr != NULL
4365 && (symtab_shndx_hdr->sh_link
4366 == (unsigned long) (section - section_headers)))
4368 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4369 symtab_shndx_hdr->sh_offset,
4370 1, symtab_shndx_hdr->sh_size,
4371 _("symbol table section indicies"));
4376 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4380 error (_("Out of memory\n"));
4384 for (j = 0, psym = isyms; j < number; j++, psym++)
4386 psym->st_name = BYTE_GET (esyms[j].st_name);
4387 psym->st_value = BYTE_GET (esyms[j].st_value);
4388 psym->st_size = BYTE_GET (esyms[j].st_size);
4389 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4390 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4392 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4393 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4394 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4395 psym->st_info = BYTE_GET (esyms[j].st_info);
4396 psym->st_other = BYTE_GET (esyms[j].st_other);
4405 if (num_syms_return != NULL)
4406 * num_syms_return = isyms == NULL ? 0 : number;
4411 static Elf_Internal_Sym *
4412 get_64bit_elf_symbols (FILE * file,
4413 Elf_Internal_Shdr * section,
4414 unsigned long * num_syms_return)
4416 unsigned long number = 0;
4417 Elf64_External_Sym * esyms = NULL;
4418 Elf_External_Sym_Shndx * shndx = NULL;
4419 Elf_Internal_Sym * isyms = NULL;
4420 Elf_Internal_Sym * psym;
4423 /* Run some sanity checks first. */
4424 if (section->sh_entsize == 0)
4426 error (_("sh_entsize is zero\n"));
4430 number = section->sh_size / section->sh_entsize;
4432 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4434 error (_("Invalid sh_entsize\n"));
4438 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4439 section->sh_size, _("symbols"));
4443 if (symtab_shndx_hdr != NULL
4444 && (symtab_shndx_hdr->sh_link
4445 == (unsigned long) (section - section_headers)))
4447 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4448 symtab_shndx_hdr->sh_offset,
4449 1, symtab_shndx_hdr->sh_size,
4450 _("symbol table section indicies"));
4455 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4459 error (_("Out of memory\n"));
4463 for (j = 0, psym = isyms; j < number; j++, psym++)
4465 psym->st_name = BYTE_GET (esyms[j].st_name);
4466 psym->st_info = BYTE_GET (esyms[j].st_info);
4467 psym->st_other = BYTE_GET (esyms[j].st_other);
4468 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4470 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4472 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4473 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4474 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4476 psym->st_value = BYTE_GET (esyms[j].st_value);
4477 psym->st_size = BYTE_GET (esyms[j].st_size);
4486 if (num_syms_return != NULL)
4487 * num_syms_return = isyms == NULL ? 0 : number;
4493 get_elf_section_flags (bfd_vma sh_flags)
4495 static char buff[1024];
4497 int field_size = is_32bit_elf ? 8 : 16;
4499 int size = sizeof (buff) - (field_size + 4 + 1);
4500 bfd_vma os_flags = 0;
4501 bfd_vma proc_flags = 0;
4502 bfd_vma unknown_flags = 0;
4510 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4511 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4512 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4513 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4514 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4515 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4516 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4517 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4518 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4519 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4520 /* IA-64 specific. */
4521 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4522 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4523 /* IA-64 OpenVMS specific. */
4524 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4525 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4526 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4527 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4528 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4529 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4531 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4532 /* SPARC specific. */
4533 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4536 if (do_section_details)
4538 sprintf (buff, "[%*.*lx]: ",
4539 field_size, field_size, (unsigned long) sh_flags);
4540 p += field_size + 4;
4547 flag = sh_flags & - sh_flags;
4550 if (do_section_details)
4554 case SHF_WRITE: sindex = 0; break;
4555 case SHF_ALLOC: sindex = 1; break;
4556 case SHF_EXECINSTR: sindex = 2; break;
4557 case SHF_MERGE: sindex = 3; break;
4558 case SHF_STRINGS: sindex = 4; break;
4559 case SHF_INFO_LINK: sindex = 5; break;
4560 case SHF_LINK_ORDER: sindex = 6; break;
4561 case SHF_OS_NONCONFORMING: sindex = 7; break;
4562 case SHF_GROUP: sindex = 8; break;
4563 case SHF_TLS: sindex = 9; break;
4564 case SHF_EXCLUDE: sindex = 18; break;
4568 switch (elf_header.e_machine)
4571 if (flag == SHF_IA_64_SHORT)
4573 else if (flag == SHF_IA_64_NORECOV)
4576 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4579 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4580 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4581 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4582 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4583 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4584 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4595 case EM_OLD_SPARCV9:
4596 case EM_SPARC32PLUS:
4599 if (flag == SHF_ORDERED)
4609 if (p != buff + field_size + 4)
4611 if (size < (10 + 2))
4618 size -= flags [sindex].len;
4619 p = stpcpy (p, flags [sindex].str);
4621 else if (flag & SHF_MASKOS)
4623 else if (flag & SHF_MASKPROC)
4626 unknown_flags |= flag;
4632 case SHF_WRITE: *p = 'W'; break;
4633 case SHF_ALLOC: *p = 'A'; break;
4634 case SHF_EXECINSTR: *p = 'X'; break;
4635 case SHF_MERGE: *p = 'M'; break;
4636 case SHF_STRINGS: *p = 'S'; break;
4637 case SHF_INFO_LINK: *p = 'I'; break;
4638 case SHF_LINK_ORDER: *p = 'L'; break;
4639 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4640 case SHF_GROUP: *p = 'G'; break;
4641 case SHF_TLS: *p = 'T'; break;
4642 case SHF_EXCLUDE: *p = 'E'; break;
4645 if ((elf_header.e_machine == EM_X86_64
4646 || elf_header.e_machine == EM_L1OM
4647 || elf_header.e_machine == EM_K1OM)
4648 && flag == SHF_X86_64_LARGE)
4650 else if (flag & SHF_MASKOS)
4653 sh_flags &= ~ SHF_MASKOS;
4655 else if (flag & SHF_MASKPROC)
4658 sh_flags &= ~ SHF_MASKPROC;
4668 if (do_section_details)
4672 size -= 5 + field_size;
4673 if (p != buff + field_size + 4)
4681 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4682 (unsigned long) os_flags);
4683 p += 5 + field_size;
4687 size -= 7 + field_size;
4688 if (p != buff + field_size + 4)
4696 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4697 (unsigned long) proc_flags);
4698 p += 7 + field_size;
4702 size -= 10 + field_size;
4703 if (p != buff + field_size + 4)
4711 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4712 (unsigned long) unknown_flags);
4713 p += 10 + field_size;
4722 process_section_headers (FILE * file)
4724 Elf_Internal_Shdr * section;
4727 section_headers = NULL;
4729 if (elf_header.e_shnum == 0)
4731 /* PR binutils/12467. */
4732 if (elf_header.e_shoff != 0)
4733 warn (_("possibly corrupt ELF file header - it has a non-zero"
4734 " section header offset, but no section headers\n"));
4735 else if (do_sections)
4736 printf (_("\nThere are no sections in this file.\n"));
4741 if (do_sections && !do_header)
4742 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4743 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4747 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4750 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4753 /* Read in the string table, so that we have names to display. */
4754 if (elf_header.e_shstrndx != SHN_UNDEF
4755 && elf_header.e_shstrndx < elf_header.e_shnum)
4757 section = section_headers + elf_header.e_shstrndx;
4759 if (section->sh_size != 0)
4761 string_table = (char *) get_data (NULL, file, section->sh_offset,
4762 1, section->sh_size,
4765 string_table_length = string_table != NULL ? section->sh_size : 0;
4769 /* Scan the sections for the dynamic symbol table
4770 and dynamic string table and debug sections. */
4771 dynamic_symbols = NULL;
4772 dynamic_strings = NULL;
4773 dynamic_syminfo = NULL;
4774 symtab_shndx_hdr = NULL;
4776 eh_addr_size = is_32bit_elf ? 4 : 8;
4777 switch (elf_header.e_machine)
4780 case EM_MIPS_RS3_LE:
4781 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4782 FDE addresses. However, the ABI also has a semi-official ILP32
4783 variant for which the normal FDE address size rules apply.
4785 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4786 section, where XX is the size of longs in bits. Unfortunately,
4787 earlier compilers provided no way of distinguishing ILP32 objects
4788 from LP64 objects, so if there's any doubt, we should assume that
4789 the official LP64 form is being used. */
4790 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4791 && find_section (".gcc_compiled_long32") == NULL)
4797 switch (elf_header.e_flags & EF_H8_MACH)
4799 case E_H8_MACH_H8300:
4800 case E_H8_MACH_H8300HN:
4801 case E_H8_MACH_H8300SN:
4802 case E_H8_MACH_H8300SXN:
4805 case E_H8_MACH_H8300H:
4806 case E_H8_MACH_H8300S:
4807 case E_H8_MACH_H8300SX:
4815 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4817 case EF_M32C_CPU_M16C:
4824 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4827 bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64; \
4828 if (section->sh_entsize != expected_entsize) \
4830 error (_("Section %d has invalid sh_entsize of %" BFD_VMA_FMT "x\n"), \
4831 i, section->sh_entsize); \
4832 error (_("(Using the expected size of %d for the rest of this dump)\n"), \
4833 (int) expected_entsize); \
4834 section->sh_entsize = expected_entsize; \
4839 #define CHECK_ENTSIZE(section, i, type) \
4840 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4841 sizeof (Elf64_External_##type))
4843 for (i = 0, section = section_headers;
4844 i < elf_header.e_shnum;
4847 char * name = SECTION_NAME (section);
4849 if (section->sh_type == SHT_DYNSYM)
4851 if (dynamic_symbols != NULL)
4853 error (_("File contains multiple dynamic symbol tables\n"));
4857 CHECK_ENTSIZE (section, i, Sym);
4858 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
4860 else if (section->sh_type == SHT_STRTAB
4861 && streq (name, ".dynstr"))
4863 if (dynamic_strings != NULL)
4865 error (_("File contains multiple dynamic string tables\n"));
4869 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4870 1, section->sh_size,
4871 _("dynamic strings"));
4872 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4874 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4876 if (symtab_shndx_hdr != NULL)
4878 error (_("File contains multiple symtab shndx tables\n"));
4881 symtab_shndx_hdr = section;
4883 else if (section->sh_type == SHT_SYMTAB)
4884 CHECK_ENTSIZE (section, i, Sym);
4885 else if (section->sh_type == SHT_GROUP)
4886 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4887 else if (section->sh_type == SHT_REL)
4888 CHECK_ENTSIZE (section, i, Rel);
4889 else if (section->sh_type == SHT_RELA)
4890 CHECK_ENTSIZE (section, i, Rela);
4891 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4892 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4893 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4894 || do_debug_str || do_debug_loc || do_debug_ranges
4895 || do_debug_addr || do_debug_cu_index)
4896 && (const_strneq (name, ".debug_")
4897 || const_strneq (name, ".zdebug_")))
4900 name += sizeof (".zdebug_") - 1;
4902 name += sizeof (".debug_") - 1;
4905 || (do_debug_info && const_strneq (name, "info"))
4906 || (do_debug_info && const_strneq (name, "types"))
4907 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
4908 || (do_debug_lines && strcmp (name, "line") == 0)
4909 || (do_debug_lines && const_strneq (name, "line."))
4910 || (do_debug_pubnames && const_strneq (name, "pubnames"))
4911 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
4912 || (do_debug_aranges && const_strneq (name, "aranges"))
4913 || (do_debug_ranges && const_strneq (name, "ranges"))
4914 || (do_debug_frames && const_strneq (name, "frame"))
4915 || (do_debug_macinfo && const_strneq (name, "macinfo"))
4916 || (do_debug_macinfo && const_strneq (name, "macro"))
4917 || (do_debug_str && const_strneq (name, "str"))
4918 || (do_debug_loc && const_strneq (name, "loc"))
4919 || (do_debug_addr && const_strneq (name, "addr"))
4920 || (do_debug_cu_index && const_strneq (name, "cu_index"))
4921 || (do_debug_cu_index && const_strneq (name, "tu_index"))
4923 request_dump_bynumber (i, DEBUG_DUMP);
4925 /* Linkonce section to be combined with .debug_info at link time. */
4926 else if ((do_debugging || do_debug_info)
4927 && const_strneq (name, ".gnu.linkonce.wi."))
4928 request_dump_bynumber (i, DEBUG_DUMP);
4929 else if (do_debug_frames && streq (name, ".eh_frame"))
4930 request_dump_bynumber (i, DEBUG_DUMP);
4931 else if (do_gdb_index && streq (name, ".gdb_index"))
4932 request_dump_bynumber (i, DEBUG_DUMP);
4933 /* Trace sections for Itanium VMS. */
4934 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4935 || do_trace_aranges)
4936 && const_strneq (name, ".trace_"))
4938 name += sizeof (".trace_") - 1;
4941 || (do_trace_info && streq (name, "info"))
4942 || (do_trace_abbrevs && streq (name, "abbrev"))
4943 || (do_trace_aranges && streq (name, "aranges"))
4945 request_dump_bynumber (i, DEBUG_DUMP);
4953 if (elf_header.e_shnum > 1)
4954 printf (_("\nSection Headers:\n"));
4956 printf (_("\nSection Header:\n"));
4960 if (do_section_details)
4962 printf (_(" [Nr] Name\n"));
4963 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4967 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4971 if (do_section_details)
4973 printf (_(" [Nr] Name\n"));
4974 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4978 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4982 if (do_section_details)
4984 printf (_(" [Nr] Name\n"));
4985 printf (_(" Type Address Offset Link\n"));
4986 printf (_(" Size EntSize Info Align\n"));
4990 printf (_(" [Nr] Name Type Address Offset\n"));
4991 printf (_(" Size EntSize Flags Link Info Align\n"));
4995 if (do_section_details)
4996 printf (_(" Flags\n"));
4998 for (i = 0, section = section_headers;
4999 i < elf_header.e_shnum;
5002 printf (" [%2u] ", i);
5003 if (do_section_details)
5005 print_symbol (INT_MAX, SECTION_NAME (section));
5010 print_symbol (-17, SECTION_NAME (section));
5013 printf (do_wide ? " %-15s " : " %-15.15s ",
5014 get_section_type_name (section->sh_type));
5018 const char * link_too_big = NULL;
5020 print_vma (section->sh_addr, LONG_HEX);
5022 printf ( " %6.6lx %6.6lx %2.2lx",
5023 (unsigned long) section->sh_offset,
5024 (unsigned long) section->sh_size,
5025 (unsigned long) section->sh_entsize);
5027 if (do_section_details)
5028 fputs (" ", stdout);
5030 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5032 if (section->sh_link >= elf_header.e_shnum)
5035 /* The sh_link value is out of range. Normally this indicates
5036 an error but it can have special values in Solaris binaries. */
5037 switch (elf_header.e_machine)
5044 case EM_OLD_SPARCV9:
5045 case EM_SPARC32PLUS:
5048 if (section->sh_link == (SHN_BEFORE & 0xffff))
5049 link_too_big = "BEFORE";
5050 else if (section->sh_link == (SHN_AFTER & 0xffff))
5051 link_too_big = "AFTER";
5058 if (do_section_details)
5060 if (link_too_big != NULL && * link_too_big)
5061 printf ("<%s> ", link_too_big);
5063 printf ("%2u ", section->sh_link);
5064 printf ("%3u %2lu\n", section->sh_info,
5065 (unsigned long) section->sh_addralign);
5068 printf ("%2u %3u %2lu\n",
5071 (unsigned long) section->sh_addralign);
5073 if (link_too_big && ! * link_too_big)
5074 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5075 i, section->sh_link);
5079 print_vma (section->sh_addr, LONG_HEX);
5081 if ((long) section->sh_offset == section->sh_offset)
5082 printf (" %6.6lx", (unsigned long) section->sh_offset);
5086 print_vma (section->sh_offset, LONG_HEX);
5089 if ((unsigned long) section->sh_size == section->sh_size)
5090 printf (" %6.6lx", (unsigned long) section->sh_size);
5094 print_vma (section->sh_size, LONG_HEX);
5097 if ((unsigned long) section->sh_entsize == section->sh_entsize)
5098 printf (" %2.2lx", (unsigned long) section->sh_entsize);
5102 print_vma (section->sh_entsize, LONG_HEX);
5105 if (do_section_details)
5106 fputs (" ", stdout);
5108 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5110 printf ("%2u %3u ", section->sh_link, section->sh_info);
5112 if ((unsigned long) section->sh_addralign == section->sh_addralign)
5113 printf ("%2lu\n", (unsigned long) section->sh_addralign);
5116 print_vma (section->sh_addralign, DEC);
5120 else if (do_section_details)
5122 printf (" %-15.15s ",
5123 get_section_type_name (section->sh_type));
5124 print_vma (section->sh_addr, LONG_HEX);
5125 if ((long) section->sh_offset == section->sh_offset)
5126 printf (" %16.16lx", (unsigned long) section->sh_offset);
5130 print_vma (section->sh_offset, LONG_HEX);
5132 printf (" %u\n ", section->sh_link);
5133 print_vma (section->sh_size, LONG_HEX);
5135 print_vma (section->sh_entsize, LONG_HEX);
5137 printf (" %-16u %lu\n",
5139 (unsigned long) section->sh_addralign);
5144 print_vma (section->sh_addr, LONG_HEX);
5145 if ((long) section->sh_offset == section->sh_offset)
5146 printf (" %8.8lx", (unsigned long) section->sh_offset);
5150 print_vma (section->sh_offset, LONG_HEX);
5153 print_vma (section->sh_size, LONG_HEX);
5155 print_vma (section->sh_entsize, LONG_HEX);
5157 printf (" %3s ", get_elf_section_flags (section->sh_flags));
5159 printf (" %2u %3u %lu\n",
5162 (unsigned long) section->sh_addralign);
5165 if (do_section_details)
5166 printf (" %s\n", get_elf_section_flags (section->sh_flags));
5169 if (!do_section_details)
5171 if (elf_header.e_machine == EM_X86_64
5172 || elf_header.e_machine == EM_L1OM
5173 || elf_header.e_machine == EM_K1OM)
5174 printf (_("Key to Flags:\n\
5175 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
5176 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5177 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5179 printf (_("Key to Flags:\n\
5180 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
5181 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
5182 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
5189 get_group_flags (unsigned int flags)
5191 static char buff[32];
5201 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5208 process_section_groups (FILE * file)
5210 Elf_Internal_Shdr * section;
5212 struct group * group;
5213 Elf_Internal_Shdr * symtab_sec;
5214 Elf_Internal_Shdr * strtab_sec;
5215 Elf_Internal_Sym * symtab;
5216 unsigned long num_syms;
5220 /* Don't process section groups unless needed. */
5221 if (!do_unwind && !do_section_groups)
5224 if (elf_header.e_shnum == 0)
5226 if (do_section_groups)
5227 printf (_("\nThere are no sections to group in this file.\n"));
5232 if (section_headers == NULL)
5234 error (_("Section headers are not available!\n"));
5235 /* PR 13622: This can happen with a corrupt ELF header. */
5239 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5240 sizeof (struct group *));
5242 if (section_headers_groups == NULL)
5244 error (_("Out of memory\n"));
5248 /* Scan the sections for the group section. */
5250 for (i = 0, section = section_headers;
5251 i < elf_header.e_shnum;
5253 if (section->sh_type == SHT_GROUP)
5256 if (group_count == 0)
5258 if (do_section_groups)
5259 printf (_("\nThere are no section groups in this file.\n"));
5264 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5266 if (section_groups == NULL)
5268 error (_("Out of memory\n"));
5278 for (i = 0, section = section_headers, group = section_groups;
5279 i < elf_header.e_shnum;
5282 if (section->sh_type == SHT_GROUP)
5284 char * name = SECTION_NAME (section);
5286 unsigned char * start;
5287 unsigned char * indices;
5288 unsigned int entry, j, size;
5289 Elf_Internal_Shdr * sec;
5290 Elf_Internal_Sym * sym;
5292 /* Get the symbol table. */
5293 if (section->sh_link >= elf_header.e_shnum
5294 || ((sec = section_headers + section->sh_link)->sh_type
5297 error (_("Bad sh_link in group section `%s'\n"), name);
5301 if (symtab_sec != sec)
5306 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5311 error (_("Corrupt header in group section `%s'\n"), name);
5315 if (section->sh_info >= num_syms)
5317 error (_("Bad sh_info in group section `%s'\n"), name);
5321 sym = symtab + section->sh_info;
5323 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5325 if (sym->st_shndx == 0
5326 || sym->st_shndx >= elf_header.e_shnum)
5328 error (_("Bad sh_info in group section `%s'\n"), name);
5332 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5341 /* Get the string table. */
5342 if (symtab_sec->sh_link >= elf_header.e_shnum)
5351 != (sec = section_headers + symtab_sec->sh_link))
5356 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5357 1, strtab_sec->sh_size,
5359 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5361 group_name = sym->st_name < strtab_size
5362 ? strtab + sym->st_name : _("<corrupt>");
5365 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5366 1, section->sh_size,
5372 size = (section->sh_size / section->sh_entsize) - 1;
5373 entry = byte_get (indices, 4);
5376 if (do_section_groups)
5378 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5379 get_group_flags (entry), i, name, group_name, size);
5381 printf (_(" [Index] Name\n"));
5384 group->group_index = i;
5386 for (j = 0; j < size; j++)
5388 struct group_list * g;
5390 entry = byte_get (indices, 4);
5393 if (entry >= elf_header.e_shnum)
5395 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5396 entry, i, elf_header.e_shnum - 1);
5400 if (section_headers_groups [entry] != NULL)
5404 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5406 section_headers_groups [entry]->group_index);
5411 /* Intel C/C++ compiler may put section 0 in a
5412 section group. We just warn it the first time
5413 and ignore it afterwards. */
5414 static int warned = 0;
5417 error (_("section 0 in group section [%5u]\n"),
5418 section_headers_groups [entry]->group_index);
5424 section_headers_groups [entry] = group;
5426 if (do_section_groups)
5428 sec = section_headers + entry;
5429 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5432 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5433 g->section_index = entry;
5434 g->next = group->root;
5452 /* Data used to display dynamic fixups. */
5454 struct ia64_vms_dynfixup
5456 bfd_vma needed_ident; /* Library ident number. */
5457 bfd_vma needed; /* Index in the dstrtab of the library name. */
5458 bfd_vma fixup_needed; /* Index of the library. */
5459 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5460 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5463 /* Data used to display dynamic relocations. */
5465 struct ia64_vms_dynimgrela
5467 bfd_vma img_rela_cnt; /* Number of relocations. */
5468 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5471 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5475 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5476 const char *strtab, unsigned int strtab_sz)
5478 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5480 const char *lib_name;
5482 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5483 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5484 _("dynamic section image fixups"));
5488 if (fixup->needed < strtab_sz)
5489 lib_name = strtab + fixup->needed;
5492 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5493 (unsigned long) fixup->needed);
5496 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5497 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5499 (_("Seg Offset Type SymVec DataType\n"));
5501 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5506 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5507 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5508 type = BYTE_GET (imfs [i].type);
5509 rtype = elf_ia64_reloc_type (type);
5511 printf (" 0x%08x ", type);
5513 printf (" %-32s ", rtype);
5514 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5515 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5521 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5524 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5526 Elf64_External_VMS_IMAGE_RELA *imrs;
5529 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5530 1, imgrela->img_rela_cnt * sizeof (*imrs),
5531 _("dynamic section image relocations"));
5535 printf (_("\nImage relocs\n"));
5537 (_("Seg Offset Type Addend Seg Sym Off\n"));
5539 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5544 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5545 printf ("%08" BFD_VMA_FMT "x ",
5546 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5547 type = BYTE_GET (imrs [i].type);
5548 rtype = elf_ia64_reloc_type (type);
5550 printf ("0x%08x ", type);
5552 printf ("%-31s ", rtype);
5553 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5554 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5555 printf ("%08" BFD_VMA_FMT "x\n",
5556 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5562 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5565 process_ia64_vms_dynamic_relocs (FILE *file)
5567 struct ia64_vms_dynfixup fixup;
5568 struct ia64_vms_dynimgrela imgrela;
5569 Elf_Internal_Dyn *entry;
5571 bfd_vma strtab_off = 0;
5572 bfd_vma strtab_sz = 0;
5573 char *strtab = NULL;
5575 memset (&fixup, 0, sizeof (fixup));
5576 memset (&imgrela, 0, sizeof (imgrela));
5578 /* Note: the order of the entries is specified by the OpenVMS specs. */
5579 for (entry = dynamic_section;
5580 entry < dynamic_section + dynamic_nent;
5583 switch (entry->d_tag)
5585 case DT_IA_64_VMS_STRTAB_OFFSET:
5586 strtab_off = entry->d_un.d_val;
5589 strtab_sz = entry->d_un.d_val;
5591 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5592 1, strtab_sz, _("dynamic string section"));
5595 case DT_IA_64_VMS_NEEDED_IDENT:
5596 fixup.needed_ident = entry->d_un.d_val;
5599 fixup.needed = entry->d_un.d_val;
5601 case DT_IA_64_VMS_FIXUP_NEEDED:
5602 fixup.fixup_needed = entry->d_un.d_val;
5604 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5605 fixup.fixup_rela_cnt = entry->d_un.d_val;
5607 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5608 fixup.fixup_rela_off = entry->d_un.d_val;
5610 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5613 case DT_IA_64_VMS_IMG_RELA_CNT:
5614 imgrela.img_rela_cnt = entry->d_un.d_val;
5616 case DT_IA_64_VMS_IMG_RELA_OFF:
5617 imgrela.img_rela_off = entry->d_un.d_val;
5619 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5639 } dynamic_relocations [] =
5641 { "REL", DT_REL, DT_RELSZ, FALSE },
5642 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5643 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5646 /* Process the reloc section. */
5649 process_relocs (FILE * file)
5651 unsigned long rel_size;
5652 unsigned long rel_offset;
5658 if (do_using_dynamic)
5662 int has_dynamic_reloc;
5665 has_dynamic_reloc = 0;
5667 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5669 is_rela = dynamic_relocations [i].rela;
5670 name = dynamic_relocations [i].name;
5671 rel_size = dynamic_info [dynamic_relocations [i].size];
5672 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5674 has_dynamic_reloc |= rel_size;
5676 if (is_rela == UNKNOWN)
5678 if (dynamic_relocations [i].reloc == DT_JMPREL)
5679 switch (dynamic_info[DT_PLTREL])
5693 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5694 name, rel_offset, rel_size);
5696 dump_relocations (file,
5697 offset_from_vma (file, rel_offset, rel_size),
5699 dynamic_symbols, num_dynamic_syms,
5700 dynamic_strings, dynamic_strings_length, is_rela);
5705 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5707 if (! has_dynamic_reloc)
5708 printf (_("\nThere are no dynamic relocations in this file.\n"));
5712 Elf_Internal_Shdr * section;
5716 for (i = 0, section = section_headers;
5717 i < elf_header.e_shnum;
5720 if ( section->sh_type != SHT_RELA
5721 && section->sh_type != SHT_REL)
5724 rel_offset = section->sh_offset;
5725 rel_size = section->sh_size;
5729 Elf_Internal_Shdr * strsec;
5732 printf (_("\nRelocation section "));
5734 if (string_table == NULL)
5735 printf ("%d", section->sh_name);
5737 printf ("'%s'", SECTION_NAME (section));
5739 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5740 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5742 is_rela = section->sh_type == SHT_RELA;
5744 if (section->sh_link != 0
5745 && section->sh_link < elf_header.e_shnum)
5747 Elf_Internal_Shdr * symsec;
5748 Elf_Internal_Sym * symtab;
5749 unsigned long nsyms;
5750 unsigned long strtablen = 0;
5751 char * strtab = NULL;
5753 symsec = section_headers + section->sh_link;
5754 if (symsec->sh_type != SHT_SYMTAB
5755 && symsec->sh_type != SHT_DYNSYM)
5758 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5763 if (symsec->sh_link != 0
5764 && symsec->sh_link < elf_header.e_shnum)
5766 strsec = section_headers + symsec->sh_link;
5768 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5771 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5774 dump_relocations (file, rel_offset, rel_size,
5775 symtab, nsyms, strtab, strtablen, is_rela);
5781 dump_relocations (file, rel_offset, rel_size,
5782 NULL, 0, NULL, 0, is_rela);
5789 printf (_("\nThere are no relocations in this file.\n"));
5795 /* Process the unwind section. */
5797 #include "unwind-ia64.h"
5799 /* An absolute address consists of a section and an offset. If the
5800 section is NULL, the offset itself is the address, otherwise, the
5801 address equals to LOAD_ADDRESS(section) + offset. */
5805 unsigned short section;
5809 #define ABSADDR(a) \
5811 ? section_headers [(a).section].sh_addr + (a).offset \
5814 struct ia64_unw_table_entry
5816 struct absaddr start;
5818 struct absaddr info;
5821 struct ia64_unw_aux_info
5824 struct ia64_unw_table_entry *table; /* Unwind table. */
5825 unsigned long table_len; /* Length of unwind table. */
5826 unsigned char * info; /* Unwind info. */
5827 unsigned long info_size; /* Size of unwind info. */
5828 bfd_vma info_addr; /* starting address of unwind info. */
5829 bfd_vma seg_base; /* Starting address of segment. */
5830 Elf_Internal_Sym * symtab; /* The symbol table. */
5831 unsigned long nsyms; /* Number of symbols. */
5832 char * strtab; /* The string table. */
5833 unsigned long strtab_size; /* Size of string table. */
5837 find_symbol_for_address (Elf_Internal_Sym * symtab,
5838 unsigned long nsyms,
5839 const char * strtab,
5840 unsigned long strtab_size,
5841 struct absaddr addr,
5842 const char ** symname,
5845 bfd_vma dist = 0x100000;
5846 Elf_Internal_Sym * sym;
5847 Elf_Internal_Sym * best = NULL;
5850 REMOVE_ARCH_BITS (addr.offset);
5852 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5854 bfd_vma value = sym->st_value;
5856 REMOVE_ARCH_BITS (value);
5858 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5859 && sym->st_name != 0
5860 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5861 && addr.offset >= value
5862 && addr.offset - value < dist)
5865 dist = addr.offset - value;
5873 *symname = (best->st_name >= strtab_size
5874 ? _("<corrupt>") : strtab + best->st_name);
5880 *offset = addr.offset;
5884 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5886 struct ia64_unw_table_entry * tp;
5889 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5893 const unsigned char * dp;
5894 const unsigned char * head;
5895 const char * procname;
5897 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5898 aux->strtab_size, tp->start, &procname, &offset);
5900 fputs ("\n<", stdout);
5904 fputs (procname, stdout);
5907 printf ("+%lx", (unsigned long) offset);
5910 fputs (">: [", stdout);
5911 print_vma (tp->start.offset, PREFIX_HEX);
5912 fputc ('-', stdout);
5913 print_vma (tp->end.offset, PREFIX_HEX);
5914 printf ("], info at +0x%lx\n",
5915 (unsigned long) (tp->info.offset - aux->seg_base));
5917 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5918 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5920 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5921 (unsigned) UNW_VER (stamp),
5922 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5923 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5924 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5925 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5927 if (UNW_VER (stamp) != 1)
5929 printf (_("\tUnknown version.\n"));
5934 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5935 dp = unw_decode (dp, in_body, & in_body);
5940 slurp_ia64_unwind_table (FILE * file,
5941 struct ia64_unw_aux_info * aux,
5942 Elf_Internal_Shdr * sec)
5944 unsigned long size, nrelas, i;
5945 Elf_Internal_Phdr * seg;
5946 struct ia64_unw_table_entry * tep;
5947 Elf_Internal_Shdr * relsec;
5948 Elf_Internal_Rela * rela;
5949 Elf_Internal_Rela * rp;
5950 unsigned char * table;
5952 Elf_Internal_Sym * sym;
5953 const char * relname;
5955 /* First, find the starting address of the segment that includes
5958 if (elf_header.e_phnum)
5960 if (! get_program_headers (file))
5963 for (seg = program_headers;
5964 seg < program_headers + elf_header.e_phnum;
5967 if (seg->p_type != PT_LOAD)
5970 if (sec->sh_addr >= seg->p_vaddr
5971 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5973 aux->seg_base = seg->p_vaddr;
5979 /* Second, build the unwind table from the contents of the unwind section: */
5980 size = sec->sh_size;
5981 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5986 aux->table = (struct ia64_unw_table_entry *)
5987 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5989 for (tp = table; tp < table + size; ++tep)
5991 tep->start.section = SHN_UNDEF;
5992 tep->end.section = SHN_UNDEF;
5993 tep->info.section = SHN_UNDEF;
5994 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5995 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5996 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5997 tep->start.offset += aux->seg_base;
5998 tep->end.offset += aux->seg_base;
5999 tep->info.offset += aux->seg_base;
6003 /* Third, apply any relocations to the unwind table: */
6004 for (relsec = section_headers;
6005 relsec < section_headers + elf_header.e_shnum;
6008 if (relsec->sh_type != SHT_RELA
6009 || relsec->sh_info >= elf_header.e_shnum
6010 || section_headers + relsec->sh_info != sec)
6013 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6017 for (rp = rela; rp < rela + nrelas; ++rp)
6019 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
6020 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6022 if (! const_strneq (relname, "R_IA64_SEGREL"))
6024 warn (_("Skipping unexpected relocation type %s\n"), relname);
6028 i = rp->r_offset / (3 * eh_addr_size);
6030 switch (rp->r_offset/eh_addr_size % 3)
6033 aux->table[i].start.section = sym->st_shndx;
6034 aux->table[i].start.offset = rp->r_addend + sym->st_value;
6037 aux->table[i].end.section = sym->st_shndx;
6038 aux->table[i].end.offset = rp->r_addend + sym->st_value;
6041 aux->table[i].info.section = sym->st_shndx;
6042 aux->table[i].info.offset = rp->r_addend + sym->st_value;
6052 aux->table_len = size / (3 * eh_addr_size);
6057 ia64_process_unwind (FILE * file)
6059 Elf_Internal_Shdr * sec;
6060 Elf_Internal_Shdr * unwsec = NULL;
6061 Elf_Internal_Shdr * strsec;
6062 unsigned long i, unwcount = 0, unwstart = 0;
6063 struct ia64_unw_aux_info aux;
6065 memset (& aux, 0, sizeof (aux));
6067 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6069 if (sec->sh_type == SHT_SYMTAB
6070 && sec->sh_link < elf_header.e_shnum)
6072 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6074 strsec = section_headers + sec->sh_link;
6075 assert (aux.strtab == NULL);
6076 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6079 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6081 else if (sec->sh_type == SHT_IA_64_UNWIND)
6086 printf (_("\nThere are no unwind sections in this file.\n"));
6088 while (unwcount-- > 0)
6093 for (i = unwstart, sec = section_headers + unwstart;
6094 i < elf_header.e_shnum; ++i, ++sec)
6095 if (sec->sh_type == SHT_IA_64_UNWIND)
6102 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
6104 if ((unwsec->sh_flags & SHF_GROUP) != 0)
6106 /* We need to find which section group it is in. */
6107 struct group_list * g = section_headers_groups [i]->root;
6109 for (; g != NULL; g = g->next)
6111 sec = section_headers + g->section_index;
6113 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
6118 i = elf_header.e_shnum;
6120 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
6122 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
6123 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
6124 suffix = SECTION_NAME (unwsec) + len;
6125 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6127 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
6128 && streq (SECTION_NAME (sec) + len2, suffix))
6133 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
6134 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
6135 len = sizeof (ELF_STRING_ia64_unwind) - 1;
6136 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
6138 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
6139 suffix = SECTION_NAME (unwsec) + len;
6140 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
6142 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
6143 && streq (SECTION_NAME (sec) + len2, suffix))
6147 if (i == elf_header.e_shnum)
6149 printf (_("\nCould not find unwind info section for "));
6151 if (string_table == NULL)
6152 printf ("%d", unwsec->sh_name);
6154 printf (_("'%s'"), SECTION_NAME (unwsec));
6158 aux.info_addr = sec->sh_addr;
6159 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
6162 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
6164 printf (_("\nUnwind section "));
6166 if (string_table == NULL)
6167 printf ("%d", unwsec->sh_name);
6169 printf (_("'%s'"), SECTION_NAME (unwsec));
6171 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6172 (unsigned long) unwsec->sh_offset,
6173 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
6175 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
6177 if (aux.table_len > 0)
6178 dump_ia64_unwind (& aux);
6181 free ((char *) aux.table);
6183 free ((char *) aux.info);
6192 free ((char *) aux.strtab);
6195 struct hppa_unw_table_entry
6197 struct absaddr start;
6199 unsigned int Cannot_unwind:1; /* 0 */
6200 unsigned int Millicode:1; /* 1 */
6201 unsigned int Millicode_save_sr0:1; /* 2 */
6202 unsigned int Region_description:2; /* 3..4 */
6203 unsigned int reserved1:1; /* 5 */
6204 unsigned int Entry_SR:1; /* 6 */
6205 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6206 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6207 unsigned int Args_stored:1; /* 16 */
6208 unsigned int Variable_Frame:1; /* 17 */
6209 unsigned int Separate_Package_Body:1; /* 18 */
6210 unsigned int Frame_Extension_Millicode:1; /* 19 */
6211 unsigned int Stack_Overflow_Check:1; /* 20 */
6212 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
6213 unsigned int Ada_Region:1; /* 22 */
6214 unsigned int cxx_info:1; /* 23 */
6215 unsigned int cxx_try_catch:1; /* 24 */
6216 unsigned int sched_entry_seq:1; /* 25 */
6217 unsigned int reserved2:1; /* 26 */
6218 unsigned int Save_SP:1; /* 27 */
6219 unsigned int Save_RP:1; /* 28 */
6220 unsigned int Save_MRP_in_frame:1; /* 29 */
6221 unsigned int extn_ptr_defined:1; /* 30 */
6222 unsigned int Cleanup_defined:1; /* 31 */
6224 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6225 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6226 unsigned int Large_frame:1; /* 2 */
6227 unsigned int Pseudo_SP_Set:1; /* 3 */
6228 unsigned int reserved4:1; /* 4 */
6229 unsigned int Total_frame_size:27; /* 5..31 */
6232 struct hppa_unw_aux_info
6234 struct hppa_unw_table_entry *table; /* Unwind table. */
6235 unsigned long table_len; /* Length of unwind table. */
6236 bfd_vma seg_base; /* Starting address of segment. */
6237 Elf_Internal_Sym * symtab; /* The symbol table. */
6238 unsigned long nsyms; /* Number of symbols. */
6239 char * strtab; /* The string table. */
6240 unsigned long strtab_size; /* Size of string table. */
6244 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6246 struct hppa_unw_table_entry * tp;
6248 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6251 const char * procname;
6253 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6254 aux->strtab_size, tp->start, &procname,
6257 fputs ("\n<", stdout);
6261 fputs (procname, stdout);
6264 printf ("+%lx", (unsigned long) offset);
6267 fputs (">: [", stdout);
6268 print_vma (tp->start.offset, PREFIX_HEX);
6269 fputc ('-', stdout);
6270 print_vma (tp->end.offset, PREFIX_HEX);
6273 #define PF(_m) if (tp->_m) printf (#_m " ");
6274 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6277 PF(Millicode_save_sr0);
6278 /* PV(Region_description); */
6284 PF(Separate_Package_Body);
6285 PF(Frame_Extension_Millicode);
6286 PF(Stack_Overflow_Check);
6287 PF(Two_Instruction_SP_Increment);
6291 PF(sched_entry_seq);
6294 PF(Save_MRP_in_frame);
6295 PF(extn_ptr_defined);
6296 PF(Cleanup_defined);
6297 PF(MPE_XL_interrupt_marker);
6298 PF(HP_UX_interrupt_marker);
6301 PV(Total_frame_size);
6310 slurp_hppa_unwind_table (FILE * file,
6311 struct hppa_unw_aux_info * aux,
6312 Elf_Internal_Shdr * sec)
6314 unsigned long size, unw_ent_size, nentries, nrelas, i;
6315 Elf_Internal_Phdr * seg;
6316 struct hppa_unw_table_entry * tep;
6317 Elf_Internal_Shdr * relsec;
6318 Elf_Internal_Rela * rela;
6319 Elf_Internal_Rela * rp;
6320 unsigned char * table;
6322 Elf_Internal_Sym * sym;
6323 const char * relname;
6325 /* First, find the starting address of the segment that includes
6328 if (elf_header.e_phnum)
6330 if (! get_program_headers (file))
6333 for (seg = program_headers;
6334 seg < program_headers + elf_header.e_phnum;
6337 if (seg->p_type != PT_LOAD)
6340 if (sec->sh_addr >= seg->p_vaddr
6341 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6343 aux->seg_base = seg->p_vaddr;
6349 /* Second, build the unwind table from the contents of the unwind
6351 size = sec->sh_size;
6352 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6358 nentries = size / unw_ent_size;
6359 size = unw_ent_size * nentries;
6361 tep = aux->table = (struct hppa_unw_table_entry *)
6362 xcmalloc (nentries, sizeof (aux->table[0]));
6364 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6366 unsigned int tmp1, tmp2;
6368 tep->start.section = SHN_UNDEF;
6369 tep->end.section = SHN_UNDEF;
6371 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6372 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6373 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6374 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6376 tep->start.offset += aux->seg_base;
6377 tep->end.offset += aux->seg_base;
6379 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6380 tep->Millicode = (tmp1 >> 30) & 0x1;
6381 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6382 tep->Region_description = (tmp1 >> 27) & 0x3;
6383 tep->reserved1 = (tmp1 >> 26) & 0x1;
6384 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6385 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6386 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6387 tep->Args_stored = (tmp1 >> 15) & 0x1;
6388 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6389 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6390 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6391 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6392 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6393 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6394 tep->cxx_info = (tmp1 >> 8) & 0x1;
6395 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6396 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6397 tep->reserved2 = (tmp1 >> 5) & 0x1;
6398 tep->Save_SP = (tmp1 >> 4) & 0x1;
6399 tep->Save_RP = (tmp1 >> 3) & 0x1;
6400 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6401 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6402 tep->Cleanup_defined = tmp1 & 0x1;
6404 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6405 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6406 tep->Large_frame = (tmp2 >> 29) & 0x1;
6407 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6408 tep->reserved4 = (tmp2 >> 27) & 0x1;
6409 tep->Total_frame_size = tmp2 & 0x7ffffff;
6413 /* Third, apply any relocations to the unwind table. */
6414 for (relsec = section_headers;
6415 relsec < section_headers + elf_header.e_shnum;
6418 if (relsec->sh_type != SHT_RELA
6419 || relsec->sh_info >= elf_header.e_shnum
6420 || section_headers + relsec->sh_info != sec)
6423 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6427 for (rp = rela; rp < rela + nrelas; ++rp)
6429 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6430 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6432 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6433 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6435 warn (_("Skipping unexpected relocation type %s\n"), relname);
6439 i = rp->r_offset / unw_ent_size;
6441 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6444 aux->table[i].start.section = sym->st_shndx;
6445 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6448 aux->table[i].end.section = sym->st_shndx;
6449 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6459 aux->table_len = nentries;
6465 hppa_process_unwind (FILE * file)
6467 struct hppa_unw_aux_info aux;
6468 Elf_Internal_Shdr * unwsec = NULL;
6469 Elf_Internal_Shdr * strsec;
6470 Elf_Internal_Shdr * sec;
6473 if (string_table == NULL)
6476 memset (& aux, 0, sizeof (aux));
6478 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6480 if (sec->sh_type == SHT_SYMTAB
6481 && sec->sh_link < elf_header.e_shnum)
6483 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6485 strsec = section_headers + sec->sh_link;
6486 assert (aux.strtab == NULL);
6487 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6490 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6492 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6497 printf (_("\nThere are no unwind sections in this file.\n"));
6499 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6501 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6503 printf (_("\nUnwind section "));
6504 printf (_("'%s'"), SECTION_NAME (sec));
6506 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6507 (unsigned long) sec->sh_offset,
6508 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6510 slurp_hppa_unwind_table (file, &aux, sec);
6511 if (aux.table_len > 0)
6512 dump_hppa_unwind (&aux);
6515 free ((char *) aux.table);
6523 free ((char *) aux.strtab);
6528 unsigned char * data; /* The unwind data. */
6529 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
6530 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
6531 unsigned long nrelas; /* The number of relocations. */
6532 unsigned int rel_type; /* REL or RELA ? */
6533 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
6536 struct arm_unw_aux_info
6538 FILE * file; /* The file containing the unwind sections. */
6539 Elf_Internal_Sym * symtab; /* The file's symbol table. */
6540 unsigned long nsyms; /* Number of symbols. */
6541 char * strtab; /* The file's string table. */
6542 unsigned long strtab_size; /* Size of string table. */
6546 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6547 bfd_vma fn, struct absaddr addr)
6549 const char *procname;
6552 if (addr.section == SHN_UNDEF)
6555 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6556 aux->strtab_size, addr, &procname,
6559 print_vma (fn, PREFIX_HEX);
6563 fputs (" <", stdout);
6564 fputs (procname, stdout);
6567 printf ("+0x%lx", (unsigned long) sym_offset);
6568 fputc ('>', stdout);
6575 arm_free_section (struct arm_section *arm_sec)
6577 if (arm_sec->data != NULL)
6578 free (arm_sec->data);
6580 if (arm_sec->rela != NULL)
6581 free (arm_sec->rela);
6584 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6585 cached section and install SEC instead.
6586 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6587 and return its valued in * WORDP, relocating if necessary.
6588 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6589 relocation's offset in ADDR.
6590 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6591 into the string table of the symbol associated with the reloc. If no
6592 reloc was applied store -1 there.
6593 5) Return TRUE upon success, FALSE otherwise. */
6596 get_unwind_section_word (struct arm_unw_aux_info * aux,
6597 struct arm_section * arm_sec,
6598 Elf_Internal_Shdr * sec,
6599 bfd_vma word_offset,
6600 unsigned int * wordp,
6601 struct absaddr * addr,
6604 Elf_Internal_Rela *rp;
6605 Elf_Internal_Sym *sym;
6606 const char * relname;
6608 bfd_boolean wrapped;
6610 addr->section = SHN_UNDEF;
6613 if (sym_name != NULL)
6614 *sym_name = (bfd_vma) -1;
6616 /* If necessary, update the section cache. */
6617 if (sec != arm_sec->sec)
6619 Elf_Internal_Shdr *relsec;
6621 arm_free_section (arm_sec);
6624 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6625 sec->sh_size, _("unwind data"));
6626 arm_sec->rela = NULL;
6627 arm_sec->nrelas = 0;
6629 for (relsec = section_headers;
6630 relsec < section_headers + elf_header.e_shnum;
6633 if (relsec->sh_info >= elf_header.e_shnum
6634 || section_headers + relsec->sh_info != sec
6635 /* PR 15745: Check the section type as well. */
6636 || (relsec->sh_type != SHT_REL
6637 && relsec->sh_type != SHT_RELA))
6640 arm_sec->rel_type = relsec->sh_type;
6641 if (relsec->sh_type == SHT_REL)
6643 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6645 & arm_sec->rela, & arm_sec->nrelas))
6648 else /* relsec->sh_type == SHT_RELA */
6650 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6652 & arm_sec->rela, & arm_sec->nrelas))
6658 arm_sec->next_rela = arm_sec->rela;
6661 /* If there is no unwind data we can do nothing. */
6662 if (arm_sec->data == NULL)
6665 /* Get the word at the required offset. */
6666 word = byte_get (arm_sec->data + word_offset, 4);
6668 /* Look through the relocs to find the one that applies to the provided offset. */
6670 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6672 bfd_vma prelval, offset;
6674 if (rp->r_offset > word_offset && !wrapped)
6679 if (rp->r_offset > word_offset)
6682 if (rp->r_offset & 3)
6684 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6685 (unsigned long) rp->r_offset);
6689 if (rp->r_offset < word_offset)
6692 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6694 if (arm_sec->rel_type == SHT_REL)
6696 offset = word & 0x7fffffff;
6697 if (offset & 0x40000000)
6698 offset |= ~ (bfd_vma) 0x7fffffff;
6700 else if (arm_sec->rel_type == SHT_RELA)
6701 offset = rp->r_addend;
6705 offset += sym->st_value;
6706 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6708 /* Check that we are processing the expected reloc type. */
6709 if (elf_header.e_machine == EM_ARM)
6711 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6713 if (streq (relname, "R_ARM_NONE"))
6716 if (! streq (relname, "R_ARM_PREL31"))
6718 warn (_("Skipping unexpected relocation type %s\n"), relname);
6722 else if (elf_header.e_machine == EM_TI_C6000)
6724 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6726 if (streq (relname, "R_C6000_NONE"))
6729 if (! streq (relname, "R_C6000_PREL31"))
6731 warn (_("Skipping unexpected relocation type %s\n"), relname);
6738 /* This function currently only supports ARM and TI unwinders. */
6741 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6742 addr->section = sym->st_shndx;
6743 addr->offset = offset;
6745 * sym_name = sym->st_name;
6750 arm_sec->next_rela = rp;
6755 static const char *tic6x_unwind_regnames[16] =
6757 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6758 "A14", "A13", "A12", "A11", "A10",
6759 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6763 decode_tic6x_unwind_regmask (unsigned int mask)
6767 for (i = 12; mask; mask >>= 1, i--)
6771 fputs (tic6x_unwind_regnames[i], stdout);
6773 fputs (", ", stdout);
6779 if (remaining == 0 && more_words) \
6782 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
6783 data_offset, & word, & addr, NULL)) \
6789 #define GET_OP(OP) \
6794 (OP) = word >> 24; \
6799 printf (_("[Truncated opcode]\n")); \
6802 printf ("0x%02x ", OP)
6805 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6806 unsigned int word, unsigned int remaining,
6807 unsigned int more_words,
6808 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6809 struct arm_section *data_arm_sec)
6811 struct absaddr addr;
6813 /* Decode the unwinding instructions. */
6816 unsigned int op, op2;
6825 printf (" 0x%02x ", op);
6827 if ((op & 0xc0) == 0x00)
6829 int offset = ((op & 0x3f) << 2) + 4;
6831 printf (" vsp = vsp + %d", offset);
6833 else if ((op & 0xc0) == 0x40)
6835 int offset = ((op & 0x3f) << 2) + 4;
6837 printf (" vsp = vsp - %d", offset);
6839 else if ((op & 0xf0) == 0x80)
6842 if (op == 0x80 && op2 == 0)
6843 printf (_("Refuse to unwind"));
6846 unsigned int mask = ((op & 0x0f) << 8) | op2;
6851 for (i = 0; i < 12; i++)
6852 if (mask & (1 << i))
6858 printf ("r%d", 4 + i);
6863 else if ((op & 0xf0) == 0x90)
6865 if (op == 0x9d || op == 0x9f)
6866 printf (_(" [Reserved]"));
6868 printf (" vsp = r%d", op & 0x0f);
6870 else if ((op & 0xf0) == 0xa0)
6872 int end = 4 + (op & 0x07);
6877 for (i = 4; i <= end; i++)
6893 else if (op == 0xb0)
6894 printf (_(" finish"));
6895 else if (op == 0xb1)
6898 if (op2 == 0 || (op2 & 0xf0) != 0)
6899 printf (_("[Spare]"));
6902 unsigned int mask = op2 & 0x0f;
6907 for (i = 0; i < 12; i++)
6908 if (mask & (1 << i))
6919 else if (op == 0xb2)
6921 unsigned char buf[9];
6922 unsigned int i, len;
6923 unsigned long offset;
6925 for (i = 0; i < sizeof (buf); i++)
6928 if ((buf[i] & 0x80) == 0)
6931 assert (i < sizeof (buf));
6932 offset = read_uleb128 (buf, &len, buf + i + 1);
6933 assert (len == i + 1);
6934 offset = offset * 4 + 0x204;
6935 printf ("vsp = vsp + %ld", offset);
6937 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6939 unsigned int first, last;
6946 printf ("pop {D%d", first);
6948 printf ("-D%d", first + last);
6951 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6953 unsigned int count = op & 0x07;
6957 printf ("-D%d", 8 + count);
6960 else if (op >= 0xc0 && op <= 0xc5)
6962 unsigned int count = op & 0x07;
6964 printf (" pop {wR10");
6966 printf ("-wR%d", 10 + count);
6969 else if (op == 0xc6)
6971 unsigned int first, last;
6976 printf ("pop {wR%d", first);
6978 printf ("-wR%d", first + last);
6981 else if (op == 0xc7)
6984 if (op2 == 0 || (op2 & 0xf0) != 0)
6985 printf (_("[Spare]"));
6988 unsigned int mask = op2 & 0x0f;
6993 for (i = 0; i < 4; i++)
6994 if (mask & (1 << i))
7000 printf ("wCGR%d", i);
7006 printf (_(" [unsupported opcode]"));
7012 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
7013 unsigned int word, unsigned int remaining,
7014 unsigned int more_words,
7015 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
7016 struct arm_section *data_arm_sec)
7018 struct absaddr addr;
7020 /* Decode the unwinding instructions. */
7023 unsigned int op, op2;
7032 printf (" 0x%02x ", op);
7034 if ((op & 0xc0) == 0x00)
7036 int offset = ((op & 0x3f) << 3) + 8;
7037 printf (" sp = sp + %d", offset);
7039 else if ((op & 0xc0) == 0x80)
7042 if (op == 0x80 && op2 == 0)
7043 printf (_("Refuse to unwind"));
7046 unsigned int mask = ((op & 0x1f) << 8) | op2;
7048 printf ("pop compact {");
7052 decode_tic6x_unwind_regmask (mask);
7056 else if ((op & 0xf0) == 0xc0)
7064 unsigned int offset;
7068 /* Scan entire instruction first so that GET_OP output is not
7069 interleaved with disassembly. */
7071 for (i = 0; nregs < (op & 0xf); i++)
7077 regpos[nregs].offset = i * 2;
7078 regpos[nregs].reg = reg;
7085 regpos[nregs].offset = i * 2 + 1;
7086 regpos[nregs].reg = reg;
7091 printf (_("pop frame {"));
7093 for (i = i * 2; i > 0; i--)
7095 if (regpos[reg].offset == i - 1)
7097 name = tic6x_unwind_regnames[regpos[reg].reg];
7104 fputs (name, stdout);
7111 else if (op == 0xd0)
7112 printf (" MOV FP, SP");
7113 else if (op == 0xd1)
7114 printf (" __c6xabi_pop_rts");
7115 else if (op == 0xd2)
7117 unsigned char buf[9];
7118 unsigned int i, len;
7119 unsigned long offset;
7121 for (i = 0; i < sizeof (buf); i++)
7124 if ((buf[i] & 0x80) == 0)
7127 assert (i < sizeof (buf));
7128 offset = read_uleb128 (buf, &len, buf + i + 1);
7129 assert (len == i + 1);
7130 offset = offset * 8 + 0x408;
7131 printf (_("sp = sp + %ld"), offset);
7133 else if ((op & 0xf0) == 0xe0)
7135 if ((op & 0x0f) == 7)
7138 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
7142 printf (_(" [unsupported opcode]"));
7149 arm_expand_prel31 (bfd_vma word, bfd_vma where)
7153 offset = word & 0x7fffffff;
7154 if (offset & 0x40000000)
7155 offset |= ~ (bfd_vma) 0x7fffffff;
7157 if (elf_header.e_machine == EM_TI_C6000)
7160 return offset + where;
7164 decode_arm_unwind (struct arm_unw_aux_info * aux,
7166 unsigned int remaining,
7167 bfd_vma data_offset,
7168 Elf_Internal_Shdr * data_sec,
7169 struct arm_section * data_arm_sec)
7172 unsigned int more_words = 0;
7173 struct absaddr addr;
7174 bfd_vma sym_name = (bfd_vma) -1;
7178 /* Fetch the first word.
7179 Note - when decoding an object file the address extracted
7180 here will always be 0. So we also pass in the sym_name
7181 parameter so that we can find the symbol associated with
7182 the personality routine. */
7183 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
7184 & word, & addr, & sym_name))
7190 if ((word & 0x80000000) == 0)
7192 /* Expand prel31 for personality routine. */
7194 const char *procname;
7196 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
7197 printf (_(" Personality routine: "));
7199 && addr.section == SHN_UNDEF && addr.offset == 0
7200 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7202 procname = aux->strtab + sym_name;
7203 print_vma (fn, PREFIX_HEX);
7206 fputs (" <", stdout);
7207 fputs (procname, stdout);
7208 fputc ('>', stdout);
7212 procname = arm_print_vma_and_name (aux, fn, addr);
7213 fputc ('\n', stdout);
7215 /* The GCC personality routines use the standard compact
7216 encoding, starting with one byte giving the number of
7218 if (procname != NULL
7219 && (const_strneq (procname, "__gcc_personality_v0")
7220 || const_strneq (procname, "__gxx_personality_v0")
7221 || const_strneq (procname, "__gcj_personality_v0")
7222 || const_strneq (procname, "__gnu_objc_personality_v0")))
7229 printf (_(" [Truncated data]\n"));
7232 more_words = word >> 24;
7242 /* ARM EHABI Section 6.3:
7244 An exception-handling table entry for the compact model looks like:
7248 1 0 index Data for personalityRoutine[index] */
7250 if (elf_header.e_machine == EM_ARM
7251 && (word & 0x70000000))
7252 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7254 per_index = (word >> 24) & 0x7f;
7255 printf (_(" Compact model index: %d\n"), per_index);
7262 else if (per_index < 3)
7264 more_words = (word >> 16) & 0xff;
7270 switch (elf_header.e_machine)
7275 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7276 data_offset, data_sec, data_arm_sec);
7280 warn (_("Unknown ARM compact model index encountered\n"));
7281 printf (_(" [reserved]\n"));
7288 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7289 data_offset, data_sec, data_arm_sec);
7291 else if (per_index < 5)
7293 if (((word >> 17) & 0x7f) == 0x7f)
7294 printf (_(" Restore stack from frame pointer\n"));
7296 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
7297 printf (_(" Registers restored: "));
7299 printf (" (compact) ");
7300 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7302 printf (_(" Return register: %s\n"),
7303 tic6x_unwind_regnames[word & 0xf]);
7306 printf (_(" [reserved (%d)]\n"), per_index);
7310 error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7311 elf_header.e_machine);
7314 /* Decode the descriptors. Not implemented. */
7318 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7320 struct arm_section exidx_arm_sec, extab_arm_sec;
7321 unsigned int i, exidx_len;
7323 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7324 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7325 exidx_len = exidx_sec->sh_size / 8;
7327 for (i = 0; i < exidx_len; i++)
7329 unsigned int exidx_fn, exidx_entry;
7330 struct absaddr fn_addr, entry_addr;
7333 fputc ('\n', stdout);
7335 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7336 8 * i, & exidx_fn, & fn_addr, NULL)
7337 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7338 8 * i + 4, & exidx_entry, & entry_addr, NULL))
7340 arm_free_section (& exidx_arm_sec);
7341 arm_free_section (& extab_arm_sec);
7345 /* ARM EHABI, Section 5:
7346 An index table entry consists of 2 words.
7347 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
7348 if (exidx_fn & 0x80000000)
7349 warn (_("corrupt index table entry: %x\n"), exidx_fn);
7351 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7353 arm_print_vma_and_name (aux, fn, fn_addr);
7354 fputs (": ", stdout);
7356 if (exidx_entry == 1)
7358 print_vma (exidx_entry, PREFIX_HEX);
7359 fputs (" [cantunwind]\n", stdout);
7361 else if (exidx_entry & 0x80000000)
7363 print_vma (exidx_entry, PREFIX_HEX);
7364 fputc ('\n', stdout);
7365 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7369 bfd_vma table, table_offset = 0;
7370 Elf_Internal_Shdr *table_sec;
7372 fputs ("@", stdout);
7373 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7374 print_vma (table, PREFIX_HEX);
7377 /* Locate the matching .ARM.extab. */
7378 if (entry_addr.section != SHN_UNDEF
7379 && entry_addr.section < elf_header.e_shnum)
7381 table_sec = section_headers + entry_addr.section;
7382 table_offset = entry_addr.offset;
7386 table_sec = find_section_by_address (table);
7387 if (table_sec != NULL)
7388 table_offset = table - table_sec->sh_addr;
7390 if (table_sec == NULL)
7392 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7393 (unsigned long) table);
7396 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7403 arm_free_section (&exidx_arm_sec);
7404 arm_free_section (&extab_arm_sec);
7407 /* Used for both ARM and C6X unwinding tables. */
7410 arm_process_unwind (FILE *file)
7412 struct arm_unw_aux_info aux;
7413 Elf_Internal_Shdr *unwsec = NULL;
7414 Elf_Internal_Shdr *strsec;
7415 Elf_Internal_Shdr *sec;
7417 unsigned int sec_type;
7419 switch (elf_header.e_machine)
7422 sec_type = SHT_ARM_EXIDX;
7426 sec_type = SHT_C6000_UNWIND;
7430 error (_("Unsupported architecture type %d encountered when processing unwind table"),
7431 elf_header.e_machine);
7435 if (string_table == NULL)
7438 memset (& aux, 0, sizeof (aux));
7441 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7443 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7445 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7447 strsec = section_headers + sec->sh_link;
7448 assert (aux.strtab == NULL);
7449 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7450 1, strsec->sh_size, _("string table"));
7451 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7453 else if (sec->sh_type == sec_type)
7458 printf (_("\nThere are no unwind sections in this file.\n"));
7460 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7462 if (sec->sh_type == sec_type)
7464 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7466 (unsigned long) sec->sh_offset,
7467 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7469 dump_arm_unwind (&aux, sec);
7476 free ((char *) aux.strtab);
7480 process_unwind (FILE * file)
7482 struct unwind_handler
7485 void (* handler)(FILE *);
7488 { EM_ARM, arm_process_unwind },
7489 { EM_IA_64, ia64_process_unwind },
7490 { EM_PARISC, hppa_process_unwind },
7491 { EM_TI_C6000, arm_process_unwind },
7499 for (i = 0; handlers[i].handler != NULL; i++)
7500 if (elf_header.e_machine == handlers[i].machtype)
7502 handlers[i].handler (file);
7506 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7507 get_machine_name (elf_header.e_machine));
7511 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7513 switch (entry->d_tag)
7516 if (entry->d_un.d_val == 0)
7520 static const char * opts[] =
7522 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7523 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7524 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7525 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7531 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7532 if (entry->d_un.d_val & (1 << cnt))
7534 printf ("%s%s", first ? "" : " ", opts[cnt]);
7540 case DT_MIPS_IVERSION:
7541 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7542 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7544 printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7547 case DT_MIPS_TIME_STAMP:
7552 time_t atime = entry->d_un.d_val;
7553 tmp = gmtime (&atime);
7554 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7555 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7556 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7557 printf (_("Time Stamp: %s"), timebuf);
7561 case DT_MIPS_RLD_VERSION:
7562 case DT_MIPS_LOCAL_GOTNO:
7563 case DT_MIPS_CONFLICTNO:
7564 case DT_MIPS_LIBLISTNO:
7565 case DT_MIPS_SYMTABNO:
7566 case DT_MIPS_UNREFEXTNO:
7567 case DT_MIPS_HIPAGENO:
7568 case DT_MIPS_DELTA_CLASS_NO:
7569 case DT_MIPS_DELTA_INSTANCE_NO:
7570 case DT_MIPS_DELTA_RELOC_NO:
7571 case DT_MIPS_DELTA_SYM_NO:
7572 case DT_MIPS_DELTA_CLASSSYM_NO:
7573 case DT_MIPS_COMPACT_SIZE:
7574 print_vma (entry->d_un.d_ptr, DEC);
7578 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7584 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7586 switch (entry->d_tag)
7588 case DT_HP_DLD_FLAGS:
7597 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7598 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7599 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7600 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7601 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7602 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7603 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7604 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7605 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7606 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7607 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7608 { DT_HP_GST, "HP_GST" },
7609 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7610 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7611 { DT_HP_NODELETE, "HP_NODELETE" },
7612 { DT_HP_GROUP, "HP_GROUP" },
7613 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7617 bfd_vma val = entry->d_un.d_val;
7619 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7620 if (val & flags[cnt].bit)
7624 fputs (flags[cnt].str, stdout);
7626 val ^= flags[cnt].bit;
7629 if (val != 0 || first)
7633 print_vma (val, HEX);
7639 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7647 /* VMS vs Unix time offset and factor. */
7649 #define VMS_EPOCH_OFFSET 35067168000000000LL
7650 #define VMS_GRANULARITY_FACTOR 10000000
7652 /* Display a VMS time in a human readable format. */
7655 print_vms_time (bfd_int64_t vmstime)
7660 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7661 tm = gmtime (&unxtime);
7662 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7663 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7664 tm->tm_hour, tm->tm_min, tm->tm_sec);
7669 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7671 switch (entry->d_tag)
7673 case DT_IA_64_PLT_RESERVE:
7674 /* First 3 slots reserved. */
7675 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7677 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7680 case DT_IA_64_VMS_LINKTIME:
7682 print_vms_time (entry->d_un.d_val);
7686 case DT_IA_64_VMS_LNKFLAGS:
7687 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7688 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7689 printf (" CALL_DEBUG");
7690 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7691 printf (" NOP0BUFS");
7692 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7693 printf (" P0IMAGE");
7694 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7695 printf (" MKTHREADS");
7696 if (entry->d_un.d_val & VMS_LF_UPCALLS)
7697 printf (" UPCALLS");
7698 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7700 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7701 printf (" INITIALIZE");
7702 if (entry->d_un.d_val & VMS_LF_MAIN)
7704 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7705 printf (" EXE_INIT");
7706 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7707 printf (" TBK_IN_IMG");
7708 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7709 printf (" DBG_IN_IMG");
7710 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7711 printf (" TBK_IN_DSF");
7712 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7713 printf (" DBG_IN_DSF");
7714 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7715 printf (" SIGNATURES");
7716 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7717 printf (" REL_SEG_OFF");
7721 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7728 get_32bit_dynamic_section (FILE * file)
7730 Elf32_External_Dyn * edyn;
7731 Elf32_External_Dyn * ext;
7732 Elf_Internal_Dyn * entry;
7734 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7735 dynamic_size, _("dynamic section"));
7739 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7740 might not have the luxury of section headers. Look for the DT_NULL
7741 terminator to determine the number of entries. */
7742 for (ext = edyn, dynamic_nent = 0;
7743 (char *) ext < (char *) edyn + dynamic_size;
7747 if (BYTE_GET (ext->d_tag) == DT_NULL)
7751 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7753 if (dynamic_section == NULL)
7755 error (_("Out of memory\n"));
7760 for (ext = edyn, entry = dynamic_section;
7761 entry < dynamic_section + dynamic_nent;
7764 entry->d_tag = BYTE_GET (ext->d_tag);
7765 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7774 get_64bit_dynamic_section (FILE * file)
7776 Elf64_External_Dyn * edyn;
7777 Elf64_External_Dyn * ext;
7778 Elf_Internal_Dyn * entry;
7780 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7781 dynamic_size, _("dynamic section"));
7785 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7786 might not have the luxury of section headers. Look for the DT_NULL
7787 terminator to determine the number of entries. */
7788 for (ext = edyn, dynamic_nent = 0;
7789 (char *) ext < (char *) edyn + dynamic_size;
7793 if (BYTE_GET (ext->d_tag) == DT_NULL)
7797 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7799 if (dynamic_section == NULL)
7801 error (_("Out of memory\n"));
7806 for (ext = edyn, entry = dynamic_section;
7807 entry < dynamic_section + dynamic_nent;
7810 entry->d_tag = BYTE_GET (ext->d_tag);
7811 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7820 print_dynamic_flags (bfd_vma flags)
7828 flag = flags & - flags;
7838 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7839 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7840 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7841 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7842 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7843 default: fputs (_("unknown"), stdout); break;
7849 /* Parse and display the contents of the dynamic section. */
7852 process_dynamic_section (FILE * file)
7854 Elf_Internal_Dyn * entry;
7856 if (dynamic_size == 0)
7859 printf (_("\nThere is no dynamic section in this file.\n"));
7866 if (! get_32bit_dynamic_section (file))
7869 else if (! get_64bit_dynamic_section (file))
7872 /* Find the appropriate symbol table. */
7873 if (dynamic_symbols == NULL)
7875 for (entry = dynamic_section;
7876 entry < dynamic_section + dynamic_nent;
7879 Elf_Internal_Shdr section;
7881 if (entry->d_tag != DT_SYMTAB)
7884 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7886 /* Since we do not know how big the symbol table is,
7887 we default to reading in the entire file (!) and
7888 processing that. This is overkill, I know, but it
7890 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7892 if (archive_file_offset != 0)
7893 section.sh_size = archive_file_size - section.sh_offset;
7896 if (fseek (file, 0, SEEK_END))
7897 error (_("Unable to seek to end of file!\n"));
7899 section.sh_size = ftell (file) - section.sh_offset;
7903 section.sh_entsize = sizeof (Elf32_External_Sym);
7905 section.sh_entsize = sizeof (Elf64_External_Sym);
7907 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion, & num_dynamic_syms);
7908 if (num_dynamic_syms < 1)
7910 error (_("Unable to determine the number of symbols to load\n"));
7916 /* Similarly find a string table. */
7917 if (dynamic_strings == NULL)
7919 for (entry = dynamic_section;
7920 entry < dynamic_section + dynamic_nent;
7923 unsigned long offset;
7926 if (entry->d_tag != DT_STRTAB)
7929 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7931 /* Since we do not know how big the string table is,
7932 we default to reading in the entire file (!) and
7933 processing that. This is overkill, I know, but it
7936 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7938 if (archive_file_offset != 0)
7939 str_tab_len = archive_file_size - offset;
7942 if (fseek (file, 0, SEEK_END))
7943 error (_("Unable to seek to end of file\n"));
7944 str_tab_len = ftell (file) - offset;
7947 if (str_tab_len < 1)
7950 (_("Unable to determine the length of the dynamic string table\n"));
7954 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7956 _("dynamic string table"));
7957 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7962 /* And find the syminfo section if available. */
7963 if (dynamic_syminfo == NULL)
7965 unsigned long syminsz = 0;
7967 for (entry = dynamic_section;
7968 entry < dynamic_section + dynamic_nent;
7971 if (entry->d_tag == DT_SYMINENT)
7973 /* Note: these braces are necessary to avoid a syntax
7974 error from the SunOS4 C compiler. */
7975 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7977 else if (entry->d_tag == DT_SYMINSZ)
7978 syminsz = entry->d_un.d_val;
7979 else if (entry->d_tag == DT_SYMINFO)
7980 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7984 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7986 Elf_External_Syminfo * extsyminfo;
7987 Elf_External_Syminfo * extsym;
7988 Elf_Internal_Syminfo * syminfo;
7990 /* There is a syminfo section. Read the data. */
7991 extsyminfo = (Elf_External_Syminfo *)
7992 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7993 _("symbol information"));
7997 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7998 if (dynamic_syminfo == NULL)
8000 error (_("Out of memory\n"));
8004 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
8005 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
8006 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
8007 ++syminfo, ++extsym)
8009 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
8010 syminfo->si_flags = BYTE_GET (extsym->si_flags);
8017 if (do_dynamic && dynamic_addr)
8018 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
8019 dynamic_addr, dynamic_nent);
8021 printf (_(" Tag Type Name/Value\n"));
8023 for (entry = dynamic_section;
8024 entry < dynamic_section + dynamic_nent;
8032 print_vma (entry->d_tag, FULL_HEX);
8033 dtype = get_dynamic_type (entry->d_tag);
8034 printf (" (%s)%*s", dtype,
8035 ((is_32bit_elf ? 27 : 19)
8036 - (int) strlen (dtype)),
8040 switch (entry->d_tag)
8044 print_dynamic_flags (entry->d_un.d_val);
8054 switch (entry->d_tag)
8057 printf (_("Auxiliary library"));
8061 printf (_("Filter library"));
8065 printf (_("Configuration file"));
8069 printf (_("Dependency audit library"));
8073 printf (_("Audit library"));
8077 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8078 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
8082 print_vma (entry->d_un.d_val, PREFIX_HEX);
8091 printf (_("Flags:"));
8093 if (entry->d_un.d_val == 0)
8094 printf (_(" None\n"));
8097 unsigned long int val = entry->d_un.d_val;
8099 if (val & DTF_1_PARINIT)
8101 printf (" PARINIT");
8102 val ^= DTF_1_PARINIT;
8104 if (val & DTF_1_CONFEXP)
8106 printf (" CONFEXP");
8107 val ^= DTF_1_CONFEXP;
8110 printf (" %lx", val);
8119 printf (_("Flags:"));
8121 if (entry->d_un.d_val == 0)
8122 printf (_(" None\n"));
8125 unsigned long int val = entry->d_un.d_val;
8127 if (val & DF_P1_LAZYLOAD)
8129 printf (" LAZYLOAD");
8130 val ^= DF_P1_LAZYLOAD;
8132 if (val & DF_P1_GROUPPERM)
8134 printf (" GROUPPERM");
8135 val ^= DF_P1_GROUPPERM;
8138 printf (" %lx", val);
8147 printf (_("Flags:"));
8148 if (entry->d_un.d_val == 0)
8149 printf (_(" None\n"));
8152 unsigned long int val = entry->d_un.d_val;
8159 if (val & DF_1_GLOBAL)
8164 if (val & DF_1_GROUP)
8169 if (val & DF_1_NODELETE)
8171 printf (" NODELETE");
8172 val ^= DF_1_NODELETE;
8174 if (val & DF_1_LOADFLTR)
8176 printf (" LOADFLTR");
8177 val ^= DF_1_LOADFLTR;
8179 if (val & DF_1_INITFIRST)
8181 printf (" INITFIRST");
8182 val ^= DF_1_INITFIRST;
8184 if (val & DF_1_NOOPEN)
8189 if (val & DF_1_ORIGIN)
8194 if (val & DF_1_DIRECT)
8199 if (val & DF_1_TRANS)
8204 if (val & DF_1_INTERPOSE)
8206 printf (" INTERPOSE");
8207 val ^= DF_1_INTERPOSE;
8209 if (val & DF_1_NODEFLIB)
8211 printf (" NODEFLIB");
8212 val ^= DF_1_NODEFLIB;
8214 if (val & DF_1_NODUMP)
8219 if (val & DF_1_CONFALT)
8221 printf (" CONFALT");
8222 val ^= DF_1_CONFALT;
8224 if (val & DF_1_ENDFILTEE)
8226 printf (" ENDFILTEE");
8227 val ^= DF_1_ENDFILTEE;
8229 if (val & DF_1_DISPRELDNE)
8231 printf (" DISPRELDNE");
8232 val ^= DF_1_DISPRELDNE;
8234 if (val & DF_1_DISPRELPND)
8236 printf (" DISPRELPND");
8237 val ^= DF_1_DISPRELPND;
8239 if (val & DF_1_NODIRECT)
8241 printf (" NODIRECT");
8242 val ^= DF_1_NODIRECT;
8244 if (val & DF_1_IGNMULDEF)
8246 printf (" IGNMULDEF");
8247 val ^= DF_1_IGNMULDEF;
8249 if (val & DF_1_NOKSYMS)
8251 printf (" NOKSYMS");
8252 val ^= DF_1_NOKSYMS;
8254 if (val & DF_1_NOHDR)
8259 if (val & DF_1_EDITED)
8264 if (val & DF_1_NORELOC)
8266 printf (" NORELOC");
8267 val ^= DF_1_NORELOC;
8269 if (val & DF_1_SYMINTPOSE)
8271 printf (" SYMINTPOSE");
8272 val ^= DF_1_SYMINTPOSE;
8274 if (val & DF_1_GLOBAUDIT)
8276 printf (" GLOBAUDIT");
8277 val ^= DF_1_GLOBAUDIT;
8279 if (val & DF_1_SINGLETON)
8281 printf (" SINGLETON");
8282 val ^= DF_1_SINGLETON;
8285 printf (" %lx", val);
8292 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8294 puts (get_dynamic_type (entry->d_un.d_val));
8314 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8320 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8321 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8327 switch (entry->d_tag)
8330 printf (_("Shared library: [%s]"), name);
8332 if (streq (name, program_interpreter))
8333 printf (_(" program interpreter"));
8337 printf (_("Library soname: [%s]"), name);
8341 printf (_("Library rpath: [%s]"), name);
8345 printf (_("Library runpath: [%s]"), name);
8349 print_vma (entry->d_un.d_val, PREFIX_HEX);
8354 print_vma (entry->d_un.d_val, PREFIX_HEX);
8367 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8371 case DT_INIT_ARRAYSZ:
8372 case DT_FINI_ARRAYSZ:
8373 case DT_GNU_CONFLICTSZ:
8374 case DT_GNU_LIBLISTSZ:
8377 print_vma (entry->d_un.d_val, UNSIGNED);
8378 printf (_(" (bytes)\n"));
8388 print_vma (entry->d_un.d_val, UNSIGNED);
8401 if (entry->d_tag == DT_USED
8402 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8404 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8408 printf (_("Not needed object: [%s]\n"), name);
8413 print_vma (entry->d_un.d_val, PREFIX_HEX);
8419 /* The value of this entry is ignored. */
8424 case DT_GNU_PRELINKED:
8428 time_t atime = entry->d_un.d_val;
8430 tmp = gmtime (&atime);
8431 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8432 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8433 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8439 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8442 print_vma (entry->d_un.d_val, PREFIX_HEX);
8448 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8449 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8454 switch (elf_header.e_machine)
8457 case EM_MIPS_RS3_LE:
8458 dynamic_section_mips_val (entry);
8461 dynamic_section_parisc_val (entry);
8464 dynamic_section_ia64_val (entry);
8467 print_vma (entry->d_un.d_val, PREFIX_HEX);
8479 get_ver_flags (unsigned int flags)
8481 static char buff[32];
8488 if (flags & VER_FLG_BASE)
8489 strcat (buff, "BASE ");
8491 if (flags & VER_FLG_WEAK)
8493 if (flags & VER_FLG_BASE)
8494 strcat (buff, "| ");
8496 strcat (buff, "WEAK ");
8499 if (flags & VER_FLG_INFO)
8501 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8502 strcat (buff, "| ");
8504 strcat (buff, "INFO ");
8507 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8508 strcat (buff, _("| <unknown>"));
8513 /* Display the contents of the version sections. */
8516 process_version_sections (FILE * file)
8518 Elf_Internal_Shdr * section;
8525 for (i = 0, section = section_headers;
8526 i < elf_header.e_shnum;
8529 switch (section->sh_type)
8531 case SHT_GNU_verdef:
8533 Elf_External_Verdef * edefs;
8541 (_("\nVersion definition section '%s' contains %u entries:\n"),
8542 SECTION_NAME (section), section->sh_info);
8544 printf (_(" Addr: 0x"));
8545 printf_vma (section->sh_addr);
8546 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8547 (unsigned long) section->sh_offset, section->sh_link,
8548 section->sh_link < elf_header.e_shnum
8549 ? SECTION_NAME (section_headers + section->sh_link)
8552 edefs = (Elf_External_Verdef *)
8553 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8554 _("version definition section"));
8557 endbuf = (char *) edefs + section->sh_size;
8559 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8562 Elf_External_Verdef * edef;
8563 Elf_Internal_Verdef ent;
8564 Elf_External_Verdaux * eaux;
8565 Elf_Internal_Verdaux aux;
8569 /* Check for very large indicies. */
8570 if (idx > (size_t) (endbuf - (char *) edefs))
8573 vstart = ((char *) edefs) + idx;
8574 if (vstart + sizeof (*edef) > endbuf)
8577 edef = (Elf_External_Verdef *) vstart;
8579 ent.vd_version = BYTE_GET (edef->vd_version);
8580 ent.vd_flags = BYTE_GET (edef->vd_flags);
8581 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8582 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8583 ent.vd_hash = BYTE_GET (edef->vd_hash);
8584 ent.vd_aux = BYTE_GET (edef->vd_aux);
8585 ent.vd_next = BYTE_GET (edef->vd_next);
8587 printf (_(" %#06x: Rev: %d Flags: %s"),
8588 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8590 printf (_(" Index: %d Cnt: %d "),
8591 ent.vd_ndx, ent.vd_cnt);
8593 /* Check for overflow. */
8594 if (ent.vd_aux > (size_t) (endbuf - vstart))
8597 vstart += ent.vd_aux;
8599 eaux = (Elf_External_Verdaux *) vstart;
8601 aux.vda_name = BYTE_GET (eaux->vda_name);
8602 aux.vda_next = BYTE_GET (eaux->vda_next);
8604 if (VALID_DYNAMIC_NAME (aux.vda_name))
8605 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8607 printf (_("Name index: %ld\n"), aux.vda_name);
8609 isum = idx + ent.vd_aux;
8611 for (j = 1; j < ent.vd_cnt; j++)
8613 /* Check for overflow. */
8614 if (aux.vda_next > (size_t) (endbuf - vstart))
8617 isum += aux.vda_next;
8618 vstart += aux.vda_next;
8620 eaux = (Elf_External_Verdaux *) vstart;
8621 if (vstart + sizeof (*eaux) > endbuf)
8624 aux.vda_name = BYTE_GET (eaux->vda_name);
8625 aux.vda_next = BYTE_GET (eaux->vda_next);
8627 if (VALID_DYNAMIC_NAME (aux.vda_name))
8628 printf (_(" %#06x: Parent %d: %s\n"),
8629 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8631 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8632 isum, j, aux.vda_name);
8636 printf (_(" Version def aux past end of section\n"));
8641 if (cnt < section->sh_info)
8642 printf (_(" Version definition past end of section\n"));
8648 case SHT_GNU_verneed:
8650 Elf_External_Verneed * eneed;
8657 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8658 SECTION_NAME (section), section->sh_info);
8660 printf (_(" Addr: 0x"));
8661 printf_vma (section->sh_addr);
8662 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8663 (unsigned long) section->sh_offset, section->sh_link,
8664 section->sh_link < elf_header.e_shnum
8665 ? SECTION_NAME (section_headers + section->sh_link)
8668 eneed = (Elf_External_Verneed *) get_data (NULL, file,
8669 section->sh_offset, 1,
8671 _("Version Needs section"));
8674 endbuf = (char *) eneed + section->sh_size;
8676 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8678 Elf_External_Verneed * entry;
8679 Elf_Internal_Verneed ent;
8684 if (idx > (size_t) (endbuf - (char *) eneed))
8687 vstart = ((char *) eneed) + idx;
8688 if (vstart + sizeof (*entry) > endbuf)
8691 entry = (Elf_External_Verneed *) vstart;
8693 ent.vn_version = BYTE_GET (entry->vn_version);
8694 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
8695 ent.vn_file = BYTE_GET (entry->vn_file);
8696 ent.vn_aux = BYTE_GET (entry->vn_aux);
8697 ent.vn_next = BYTE_GET (entry->vn_next);
8699 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
8701 if (VALID_DYNAMIC_NAME (ent.vn_file))
8702 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8704 printf (_(" File: %lx"), ent.vn_file);
8706 printf (_(" Cnt: %d\n"), ent.vn_cnt);
8708 /* Check for overflow. */
8709 if (ent.vn_aux > (size_t) (endbuf - vstart))
8712 vstart += ent.vn_aux;
8714 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8716 Elf_External_Vernaux * eaux;
8717 Elf_Internal_Vernaux aux;
8719 if (vstart + sizeof (*eaux) > endbuf)
8721 eaux = (Elf_External_Vernaux *) vstart;
8723 aux.vna_hash = BYTE_GET (eaux->vna_hash);
8724 aux.vna_flags = BYTE_GET (eaux->vna_flags);
8725 aux.vna_other = BYTE_GET (eaux->vna_other);
8726 aux.vna_name = BYTE_GET (eaux->vna_name);
8727 aux.vna_next = BYTE_GET (eaux->vna_next);
8729 if (VALID_DYNAMIC_NAME (aux.vna_name))
8730 printf (_(" %#06x: Name: %s"),
8731 isum, GET_DYNAMIC_NAME (aux.vna_name));
8733 printf (_(" %#06x: Name index: %lx"),
8734 isum, aux.vna_name);
8736 printf (_(" Flags: %s Version: %d\n"),
8737 get_ver_flags (aux.vna_flags), aux.vna_other);
8739 /* Check for overflow. */
8740 if (aux.vna_next > (size_t) (endbuf - vstart))
8743 isum += aux.vna_next;
8744 vstart += aux.vna_next;
8748 warn (_("Missing Version Needs auxillary information\n"));
8753 if (cnt < section->sh_info)
8754 warn (_("Missing Version Needs information\n"));
8760 case SHT_GNU_versym:
8762 Elf_Internal_Shdr * link_section;
8765 unsigned char * edata;
8766 unsigned short * data;
8768 Elf_Internal_Sym * symbols;
8769 Elf_Internal_Shdr * string_sec;
8770 unsigned long num_syms;
8773 if (section->sh_link >= elf_header.e_shnum)
8776 link_section = section_headers + section->sh_link;
8777 total = section->sh_size / sizeof (Elf_External_Versym);
8779 if (link_section->sh_link >= elf_header.e_shnum)
8784 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
8785 if (symbols == NULL)
8788 string_sec = section_headers + link_section->sh_link;
8790 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8791 string_sec->sh_size,
8792 _("version string table"));
8799 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8800 SECTION_NAME (section), total);
8802 printf (_(" Addr: "));
8803 printf_vma (section->sh_addr);
8804 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8805 (unsigned long) section->sh_offset, section->sh_link,
8806 SECTION_NAME (link_section));
8808 off = offset_from_vma (file,
8809 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8810 total * sizeof (short));
8811 edata = (unsigned char *) get_data (NULL, file, off, total,
8813 _("version symbol data"));
8821 data = (short unsigned int *) cmalloc (total, sizeof (short));
8823 for (cnt = total; cnt --;)
8824 data[cnt] = byte_get (edata + cnt * sizeof (short),
8829 for (cnt = 0; cnt < total; cnt += 4)
8832 int check_def, check_need;
8835 printf (" %03x:", cnt);
8837 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8838 switch (data[cnt + j])
8841 fputs (_(" 0 (*local*) "), stdout);
8845 fputs (_(" 1 (*global*) "), stdout);
8849 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8850 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8852 /* If this index value is greater than the size of the symbols
8853 array, break to avoid an out-of-bounds read. */
8854 if ((unsigned long)(cnt + j) >= num_syms)
8856 warn (_("invalid index into symbol array\n"));
8862 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8863 || section_headers[symbols[cnt + j].st_shndx].sh_type
8866 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8873 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8875 Elf_Internal_Verneed ivn;
8876 unsigned long offset;
8878 offset = offset_from_vma
8879 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8880 sizeof (Elf_External_Verneed));
8884 Elf_Internal_Vernaux ivna;
8885 Elf_External_Verneed evn;
8886 Elf_External_Vernaux evna;
8887 unsigned long a_off;
8889 if (get_data (&evn, file, offset, sizeof (evn), 1,
8890 _("version need")) == NULL)
8893 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8894 ivn.vn_next = BYTE_GET (evn.vn_next);
8896 a_off = offset + ivn.vn_aux;
8900 if (get_data (&evna, file, a_off, sizeof (evna),
8901 1, _("version need aux (2)")) == NULL)
8908 ivna.vna_next = BYTE_GET (evna.vna_next);
8909 ivna.vna_other = BYTE_GET (evna.vna_other);
8912 a_off += ivna.vna_next;
8914 while (ivna.vna_other != data[cnt + j]
8915 && ivna.vna_next != 0);
8917 if (ivna.vna_other == data[cnt + j])
8919 ivna.vna_name = BYTE_GET (evna.vna_name);
8921 if (ivna.vna_name >= string_sec->sh_size)
8922 name = _("*invalid*");
8924 name = strtab + ivna.vna_name;
8925 nn += printf ("(%s%-*s",
8927 12 - (int) strlen (name),
8933 offset += ivn.vn_next;
8935 while (ivn.vn_next);
8938 if (check_def && data[cnt + j] != 0x8001
8939 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8941 Elf_Internal_Verdef ivd;
8942 Elf_External_Verdef evd;
8943 unsigned long offset;
8945 offset = offset_from_vma
8946 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8951 if (get_data (&evd, file, offset, sizeof (evd), 1,
8952 _("version def")) == NULL)
8959 ivd.vd_next = BYTE_GET (evd.vd_next);
8960 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8963 offset += ivd.vd_next;
8965 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8966 && ivd.vd_next != 0);
8968 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8970 Elf_External_Verdaux evda;
8971 Elf_Internal_Verdaux ivda;
8973 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8975 if (get_data (&evda, file,
8976 offset - ivd.vd_next + ivd.vd_aux,
8978 _("version def aux")) == NULL)
8981 ivda.vda_name = BYTE_GET (evda.vda_name);
8983 if (ivda.vda_name >= string_sec->sh_size)
8984 name = _("*invalid*");
8986 name = strtab + ivda.vda_name;
8987 nn += printf ("(%s%-*s",
8989 12 - (int) strlen (name),
8995 printf ("%*c", 18 - nn, ' ');
9013 printf (_("\nNo version information found in this file.\n"));
9019 get_symbol_binding (unsigned int binding)
9021 static char buff[32];
9025 case STB_LOCAL: return "LOCAL";
9026 case STB_GLOBAL: return "GLOBAL";
9027 case STB_WEAK: return "WEAK";
9029 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
9030 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
9032 else if (binding >= STB_LOOS && binding <= STB_HIOS)
9034 if (binding == STB_GNU_UNIQUE
9035 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9036 /* GNU is still using the default value 0. */
9037 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9039 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
9042 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
9048 get_symbol_type (unsigned int type)
9050 static char buff[32];
9054 case STT_NOTYPE: return "NOTYPE";
9055 case STT_OBJECT: return "OBJECT";
9056 case STT_FUNC: return "FUNC";
9057 case STT_SECTION: return "SECTION";
9058 case STT_FILE: return "FILE";
9059 case STT_COMMON: return "COMMON";
9060 case STT_TLS: return "TLS";
9061 case STT_RELC: return "RELC";
9062 case STT_SRELC: return "SRELC";
9064 if (type >= STT_LOPROC && type <= STT_HIPROC)
9066 if (elf_header.e_machine == EM_ARM)
9068 if (type == STT_ARM_TFUNC)
9069 return "THUMB_FUNC";
9070 if (type == STT_ARM_16BIT)
9071 return "THUMB_LABEL";
9074 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
9077 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
9078 return "PARISC_MILLI";
9080 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
9082 else if (type >= STT_LOOS && type <= STT_HIOS)
9084 if (elf_header.e_machine == EM_PARISC)
9086 if (type == STT_HP_OPAQUE)
9088 if (type == STT_HP_STUB)
9092 if (type == STT_GNU_IFUNC
9093 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
9094 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
9095 /* GNU is still using the default value 0. */
9096 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
9099 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
9102 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
9108 get_symbol_visibility (unsigned int visibility)
9112 case STV_DEFAULT: return "DEFAULT";
9113 case STV_INTERNAL: return "INTERNAL";
9114 case STV_HIDDEN: return "HIDDEN";
9115 case STV_PROTECTED: return "PROTECTED";
9121 get_mips_symbol_other (unsigned int other)
9133 case STO_MICROMIPS | STO_MIPS_PIC:
9134 return "MICROMIPS, MIPS PIC";
9143 get_ia64_symbol_other (unsigned int other)
9147 static char res[32];
9151 /* Function types is for images and .STB files only. */
9152 switch (elf_header.e_type)
9156 switch (VMS_ST_FUNC_TYPE (other))
9158 case VMS_SFT_CODE_ADDR:
9159 strcat (res, " CA");
9161 case VMS_SFT_SYMV_IDX:
9162 strcat (res, " VEC");
9165 strcat (res, " FD");
9167 case VMS_SFT_RESERVE:
9168 strcat (res, " RSV");
9177 switch (VMS_ST_LINKAGE (other))
9179 case VMS_STL_IGNORE:
9180 strcat (res, " IGN");
9182 case VMS_STL_RESERVE:
9183 strcat (res, " RSV");
9186 strcat (res, " STD");
9189 strcat (res, " LNK");
9204 get_symbol_other (unsigned int other)
9206 const char * result = NULL;
9207 static char buff [32];
9212 switch (elf_header.e_machine)
9215 result = get_mips_symbol_other (other);
9218 result = get_ia64_symbol_other (other);
9227 snprintf (buff, sizeof buff, _("<other>: %x"), other);
9232 get_symbol_index_type (unsigned int type)
9234 static char buff[32];
9238 case SHN_UNDEF: return "UND";
9239 case SHN_ABS: return "ABS";
9240 case SHN_COMMON: return "COM";
9242 if (type == SHN_IA_64_ANSI_COMMON
9243 && elf_header.e_machine == EM_IA_64
9244 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
9246 else if ((elf_header.e_machine == EM_X86_64
9247 || elf_header.e_machine == EM_L1OM
9248 || elf_header.e_machine == EM_K1OM)
9249 && type == SHN_X86_64_LCOMMON)
9251 else if ((type == SHN_MIPS_SCOMMON
9252 && elf_header.e_machine == EM_MIPS)
9253 || (type == SHN_TIC6X_SCOMMON
9254 && elf_header.e_machine == EM_TI_C6000))
9256 else if (type == SHN_MIPS_SUNDEFINED
9257 && elf_header.e_machine == EM_MIPS)
9259 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
9260 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
9261 else if (type >= SHN_LOOS && type <= SHN_HIOS)
9262 sprintf (buff, "OS [0x%04x]", type & 0xffff);
9263 else if (type >= SHN_LORESERVE)
9264 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9265 else if (type >= elf_header.e_shnum)
9266 sprintf (buff, "bad section index[%3d]", type);
9268 sprintf (buff, "%3d", type);
9276 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9278 unsigned char * e_data;
9281 e_data = (unsigned char *) cmalloc (number, ent_size);
9285 error (_("Out of memory\n"));
9289 if (fread (e_data, ent_size, number, file) != number)
9291 error (_("Unable to read in dynamic data\n"));
9295 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9299 error (_("Out of memory\n"));
9305 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9313 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9315 Elf_Internal_Sym * psym;
9318 psym = dynamic_symbols + si;
9320 n = print_vma (si, DEC_5);
9322 fputs (&" "[n], stdout);
9323 printf (" %3lu: ", hn);
9324 print_vma (psym->st_value, LONG_HEX);
9326 print_vma (psym->st_size, DEC_5);
9328 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9329 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9330 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9331 /* Check to see if any other bits in the st_other field are set.
9332 Note - displaying this information disrupts the layout of the
9333 table being generated, but for the moment this case is very
9335 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9336 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9337 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9338 if (VALID_DYNAMIC_NAME (psym->st_name))
9339 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9341 printf (_(" <corrupt: %14ld>"), psym->st_name);
9345 /* Dump the symbol table. */
9347 process_symbol_table (FILE * file)
9349 Elf_Internal_Shdr * section;
9350 bfd_vma nbuckets = 0;
9351 bfd_vma nchains = 0;
9352 bfd_vma * buckets = NULL;
9353 bfd_vma * chains = NULL;
9354 bfd_vma ngnubuckets = 0;
9355 bfd_vma * gnubuckets = NULL;
9356 bfd_vma * gnuchains = NULL;
9357 bfd_vma gnusymidx = 0;
9359 if (!do_syms && !do_dyn_syms && !do_histogram)
9362 if (dynamic_info[DT_HASH]
9364 || (do_using_dynamic
9366 && dynamic_strings != NULL)))
9368 unsigned char nb[8];
9369 unsigned char nc[8];
9370 int hash_ent_size = 4;
9372 if ((elf_header.e_machine == EM_ALPHA
9373 || elf_header.e_machine == EM_S390
9374 || elf_header.e_machine == EM_S390_OLD)
9375 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9379 (archive_file_offset
9380 + offset_from_vma (file, dynamic_info[DT_HASH],
9381 sizeof nb + sizeof nc)),
9384 error (_("Unable to seek to start of dynamic information\n"));
9388 if (fread (nb, hash_ent_size, 1, file) != 1)
9390 error (_("Failed to read in number of buckets\n"));
9394 if (fread (nc, hash_ent_size, 1, file) != 1)
9396 error (_("Failed to read in number of chains\n"));
9400 nbuckets = byte_get (nb, hash_ent_size);
9401 nchains = byte_get (nc, hash_ent_size);
9403 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9404 chains = get_dynamic_data (file, nchains, hash_ent_size);
9407 if (buckets == NULL || chains == NULL)
9409 if (do_using_dynamic)
9420 if (dynamic_info_DT_GNU_HASH
9422 || (do_using_dynamic
9424 && dynamic_strings != NULL)))
9426 unsigned char nb[16];
9427 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9428 bfd_vma buckets_vma;
9431 (archive_file_offset
9432 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9436 error (_("Unable to seek to start of dynamic information\n"));
9440 if (fread (nb, 16, 1, file) != 1)
9442 error (_("Failed to read in number of buckets\n"));
9446 ngnubuckets = byte_get (nb, 4);
9447 gnusymidx = byte_get (nb + 4, 4);
9448 bitmaskwords = byte_get (nb + 8, 4);
9449 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9451 buckets_vma += bitmaskwords * 4;
9453 buckets_vma += bitmaskwords * 8;
9456 (archive_file_offset
9457 + offset_from_vma (file, buckets_vma, 4)),
9460 error (_("Unable to seek to start of dynamic information\n"));
9464 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9466 if (gnubuckets == NULL)
9469 for (i = 0; i < ngnubuckets; i++)
9470 if (gnubuckets[i] != 0)
9472 if (gnubuckets[i] < gnusymidx)
9475 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9476 maxchain = gnubuckets[i];
9479 if (maxchain == 0xffffffff)
9482 maxchain -= gnusymidx;
9485 (archive_file_offset
9486 + offset_from_vma (file, buckets_vma
9487 + 4 * (ngnubuckets + maxchain), 4)),
9490 error (_("Unable to seek to start of dynamic information\n"));
9496 if (fread (nb, 4, 1, file) != 1)
9498 error (_("Failed to determine last chain length\n"));
9502 if (maxchain + 1 == 0)
9507 while ((byte_get (nb, 4) & 1) == 0);
9510 (archive_file_offset
9511 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9514 error (_("Unable to seek to start of dynamic information\n"));
9518 gnuchains = get_dynamic_data (file, maxchain, 4);
9521 if (gnuchains == NULL)
9526 if (do_using_dynamic)
9531 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9534 && dynamic_strings != NULL)
9538 if (dynamic_info[DT_HASH])
9542 printf (_("\nSymbol table for image:\n"));
9544 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9546 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9548 for (hn = 0; hn < nbuckets; hn++)
9553 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9554 print_dynamic_symbol (si, hn);
9558 if (dynamic_info_DT_GNU_HASH)
9560 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9562 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9564 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9566 for (hn = 0; hn < ngnubuckets; ++hn)
9567 if (gnubuckets[hn] != 0)
9569 bfd_vma si = gnubuckets[hn];
9570 bfd_vma off = si - gnusymidx;
9574 print_dynamic_symbol (si, hn);
9577 while ((gnuchains[off++] & 1) == 0);
9581 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9585 for (i = 0, section = section_headers;
9586 i < elf_header.e_shnum;
9590 char * strtab = NULL;
9591 unsigned long int strtab_size = 0;
9592 Elf_Internal_Sym * symtab;
9593 Elf_Internal_Sym * psym;
9594 unsigned long num_syms;
9596 if ((section->sh_type != SHT_SYMTAB
9597 && section->sh_type != SHT_DYNSYM)
9599 && section->sh_type == SHT_SYMTAB))
9602 if (section->sh_entsize == 0)
9604 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9605 SECTION_NAME (section));
9609 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9610 SECTION_NAME (section),
9611 (unsigned long) (section->sh_size / section->sh_entsize));
9614 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9616 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9618 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9622 if (section->sh_link == elf_header.e_shstrndx)
9624 strtab = string_table;
9625 strtab_size = string_table_length;
9627 else if (section->sh_link < elf_header.e_shnum)
9629 Elf_Internal_Shdr * string_sec;
9631 string_sec = section_headers + section->sh_link;
9633 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9634 1, string_sec->sh_size,
9636 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9639 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9641 printf ("%6d: ", si);
9642 print_vma (psym->st_value, LONG_HEX);
9644 print_vma (psym->st_size, DEC_5);
9645 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9646 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9647 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9648 /* Check to see if any other bits in the st_other field are set.
9649 Note - displaying this information disrupts the layout of the
9650 table being generated, but for the moment this case is very rare. */
9651 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9652 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9653 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9654 print_symbol (25, psym->st_name < strtab_size
9655 ? strtab + psym->st_name : _("<corrupt>"));
9657 if (section->sh_type == SHT_DYNSYM
9658 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9660 unsigned char data[2];
9661 unsigned short vers_data;
9662 unsigned long offset;
9666 offset = offset_from_vma
9667 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9668 sizeof data + si * sizeof (vers_data));
9670 if (get_data (&data, file, offset + si * sizeof (vers_data),
9671 sizeof (data), 1, _("version data")) == NULL)
9674 vers_data = byte_get (data, 2);
9676 is_nobits = (psym->st_shndx < elf_header.e_shnum
9677 && section_headers[psym->st_shndx].sh_type
9680 check_def = (psym->st_shndx != SHN_UNDEF);
9682 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9684 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9685 && (is_nobits || ! check_def))
9687 Elf_External_Verneed evn;
9688 Elf_Internal_Verneed ivn;
9689 Elf_Internal_Vernaux ivna;
9691 /* We must test both. */
9692 offset = offset_from_vma
9693 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9698 unsigned long vna_off;
9700 if (get_data (&evn, file, offset, sizeof (evn), 1,
9701 _("version need")) == NULL)
9709 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9710 ivn.vn_next = BYTE_GET (evn.vn_next);
9712 vna_off = offset + ivn.vn_aux;
9716 Elf_External_Vernaux evna;
9718 if (get_data (&evna, file, vna_off,
9720 _("version need aux (3)")) == NULL)
9728 ivna.vna_other = BYTE_GET (evna.vna_other);
9729 ivna.vna_next = BYTE_GET (evna.vna_next);
9730 ivna.vna_name = BYTE_GET (evna.vna_name);
9733 vna_off += ivna.vna_next;
9735 while (ivna.vna_other != vers_data
9736 && ivna.vna_next != 0);
9738 if (ivna.vna_other == vers_data)
9741 offset += ivn.vn_next;
9743 while (ivn.vn_next != 0);
9745 if (ivna.vna_other == vers_data)
9748 ivna.vna_name < strtab_size
9749 ? strtab + ivna.vna_name : _("<corrupt>"),
9753 else if (! is_nobits)
9754 error (_("bad dynamic symbol\n"));
9761 if (vers_data != 0x8001
9762 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9764 Elf_Internal_Verdef ivd;
9765 Elf_Internal_Verdaux ivda;
9766 Elf_External_Verdaux evda;
9769 off = offset_from_vma
9771 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9772 sizeof (Elf_External_Verdef));
9776 Elf_External_Verdef evd;
9778 if (get_data (&evd, file, off, sizeof (evd),
9779 1, _("version def")) == NULL)
9787 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9788 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9789 ivd.vd_next = BYTE_GET (evd.vd_next);
9794 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9795 && ivd.vd_next != 0);
9800 if (get_data (&evda, file, off, sizeof (evda),
9801 1, _("version def aux")) == NULL)
9804 ivda.vda_name = BYTE_GET (evda.vda_name);
9806 if (psym->st_name != ivda.vda_name)
9807 printf ((vers_data & VERSYM_HIDDEN)
9809 ivda.vda_name < strtab_size
9810 ? strtab + ivda.vda_name : _("<corrupt>"));
9820 if (strtab != string_table)
9826 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9828 if (do_histogram && buckets != NULL)
9830 unsigned long * lengths;
9831 unsigned long * counts;
9834 unsigned long maxlength = 0;
9835 unsigned long nzero_counts = 0;
9836 unsigned long nsyms = 0;
9838 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9839 (unsigned long) nbuckets);
9840 printf (_(" Length Number %% of total Coverage\n"));
9842 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9843 if (lengths == NULL)
9845 error (_("Out of memory\n"));
9848 for (hn = 0; hn < nbuckets; ++hn)
9850 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9853 if (maxlength < ++lengths[hn])
9858 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9862 error (_("Out of memory\n"));
9866 for (hn = 0; hn < nbuckets; ++hn)
9867 ++counts[lengths[hn]];
9872 printf (" 0 %-10lu (%5.1f%%)\n",
9873 counts[0], (counts[0] * 100.0) / nbuckets);
9874 for (i = 1; i <= maxlength; ++i)
9876 nzero_counts += counts[i] * i;
9877 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9878 i, counts[i], (counts[i] * 100.0) / nbuckets,
9879 (nzero_counts * 100.0) / nsyms);
9887 if (buckets != NULL)
9893 if (do_histogram && gnubuckets != NULL)
9895 unsigned long * lengths;
9896 unsigned long * counts;
9898 unsigned long maxlength = 0;
9899 unsigned long nzero_counts = 0;
9900 unsigned long nsyms = 0;
9902 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9903 if (lengths == NULL)
9905 error (_("Out of memory\n"));
9909 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9910 (unsigned long) ngnubuckets);
9911 printf (_(" Length Number %% of total Coverage\n"));
9913 for (hn = 0; hn < ngnubuckets; ++hn)
9914 if (gnubuckets[hn] != 0)
9916 bfd_vma off, length = 1;
9918 for (off = gnubuckets[hn] - gnusymidx;
9919 (gnuchains[off] & 1) == 0; ++off)
9921 lengths[hn] = length;
9922 if (length > maxlength)
9927 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9931 error (_("Out of memory\n"));
9935 for (hn = 0; hn < ngnubuckets; ++hn)
9936 ++counts[lengths[hn]];
9938 if (ngnubuckets > 0)
9941 printf (" 0 %-10lu (%5.1f%%)\n",
9942 counts[0], (counts[0] * 100.0) / ngnubuckets);
9943 for (j = 1; j <= maxlength; ++j)
9945 nzero_counts += counts[j] * j;
9946 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9947 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9948 (nzero_counts * 100.0) / nsyms);
9962 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9966 if (dynamic_syminfo == NULL
9968 /* No syminfo, this is ok. */
9971 /* There better should be a dynamic symbol section. */
9972 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9976 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9977 dynamic_syminfo_offset, dynamic_syminfo_nent);
9979 printf (_(" Num: Name BoundTo Flags\n"));
9980 for (i = 0; i < dynamic_syminfo_nent; ++i)
9982 unsigned short int flags = dynamic_syminfo[i].si_flags;
9984 printf ("%4d: ", i);
9985 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9986 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9988 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9991 switch (dynamic_syminfo[i].si_boundto)
9993 case SYMINFO_BT_SELF:
9994 fputs ("SELF ", stdout);
9996 case SYMINFO_BT_PARENT:
9997 fputs ("PARENT ", stdout);
10000 if (dynamic_syminfo[i].si_boundto > 0
10001 && dynamic_syminfo[i].si_boundto < dynamic_nent
10002 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
10004 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
10008 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
10012 if (flags & SYMINFO_FLG_DIRECT)
10013 printf (" DIRECT");
10014 if (flags & SYMINFO_FLG_PASSTHRU)
10015 printf (" PASSTHRU");
10016 if (flags & SYMINFO_FLG_COPY)
10018 if (flags & SYMINFO_FLG_LAZYLOAD)
10019 printf (" LAZYLOAD");
10027 /* Check to see if the given reloc needs to be handled in a target specific
10028 manner. If so then process the reloc and return TRUE otherwise return
10032 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
10033 unsigned char * start,
10034 Elf_Internal_Sym * symtab)
10036 unsigned int reloc_type = get_reloc_type (reloc->r_info);
10038 switch (elf_header.e_machine)
10041 case EM_MSP430_OLD:
10043 static Elf_Internal_Sym * saved_sym = NULL;
10045 switch (reloc_type)
10047 case 10: /* R_MSP430_SYM_DIFF */
10048 if (uses_msp430x_relocs ())
10050 case 21: /* R_MSP430X_SYM_DIFF */
10051 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10054 case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
10055 case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
10056 goto handle_sym_diff;
10058 case 5: /* R_MSP430_16_BYTE */
10059 case 9: /* R_MSP430_8 */
10060 if (uses_msp430x_relocs ())
10062 goto handle_sym_diff;
10064 case 2: /* R_MSP430_ABS16 */
10065 case 15: /* R_MSP430X_ABS16 */
10066 if (! uses_msp430x_relocs ())
10068 goto handle_sym_diff;
10071 if (saved_sym != NULL)
10075 value = reloc->r_addend
10076 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10077 - saved_sym->st_value);
10079 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10087 if (saved_sym != NULL)
10088 error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc"));
10095 case EM_CYGNUS_MN10300:
10097 static Elf_Internal_Sym * saved_sym = NULL;
10099 switch (reloc_type)
10101 case 34: /* R_MN10300_ALIGN */
10103 case 33: /* R_MN10300_SYM_DIFF */
10104 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
10106 case 1: /* R_MN10300_32 */
10107 case 2: /* R_MN10300_16 */
10108 if (saved_sym != NULL)
10112 value = reloc->r_addend
10113 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
10114 - saved_sym->st_value);
10116 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
10123 if (saved_sym != NULL)
10124 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
10134 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
10135 DWARF debug sections. This is a target specific test. Note - we do not
10136 go through the whole including-target-headers-multiple-times route, (as
10137 we have already done with <elf/h8.h>) because this would become very
10138 messy and even then this function would have to contain target specific
10139 information (the names of the relocs instead of their numeric values).
10140 FIXME: This is not the correct way to solve this problem. The proper way
10141 is to have target specific reloc sizing and typing functions created by
10142 the reloc-macros.h header, in the same way that it already creates the
10143 reloc naming functions. */
10146 is_32bit_abs_reloc (unsigned int reloc_type)
10148 switch (elf_header.e_machine)
10152 return reloc_type == 1; /* R_386_32. */
10154 return reloc_type == 1; /* R_68K_32. */
10156 return reloc_type == 1; /* R_860_32. */
10158 return reloc_type == 2; /* R_960_32. */
10160 return reloc_type == 258; /* R_AARCH64_ABS32 */
10162 return reloc_type == 1; /* R_ALPHA_REFLONG. */
10164 return reloc_type == 1; /* R_ARC_32. */
10166 return reloc_type == 2; /* R_ARM_ABS32 */
10169 return reloc_type == 1;
10170 case EM_ADAPTEVA_EPIPHANY:
10171 return reloc_type == 3;
10173 return reloc_type == 0x12; /* R_byte4_data. */
10175 return reloc_type == 3; /* R_CRIS_32. */
10177 return reloc_type == 3; /* R_CR16_NUM32. */
10179 return reloc_type == 15; /* R_CRX_NUM32. */
10180 case EM_CYGNUS_FRV:
10181 return reloc_type == 1;
10182 case EM_CYGNUS_D10V:
10184 return reloc_type == 6; /* R_D10V_32. */
10185 case EM_CYGNUS_D30V:
10187 return reloc_type == 12; /* R_D30V_32_NORMAL. */
10189 return reloc_type == 3; /* R_DLX_RELOC_32. */
10190 case EM_CYGNUS_FR30:
10192 return reloc_type == 3; /* R_FR30_32. */
10196 return reloc_type == 1; /* R_H8_DIR32. */
10198 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
10201 return reloc_type == 2; /* R_IP2K_32. */
10203 return reloc_type == 2; /* R_IQ2000_32. */
10204 case EM_LATTICEMICO32:
10205 return reloc_type == 3; /* R_LM32_32. */
10208 return reloc_type == 3; /* R_M32C_32. */
10210 return reloc_type == 34; /* R_M32R_32_RELA. */
10212 return reloc_type == 1; /* R_MCORE_ADDR32. */
10213 case EM_CYGNUS_MEP:
10214 return reloc_type == 4; /* R_MEP_32. */
10216 return reloc_type == 2; /* R_METAG_ADDR32. */
10217 case EM_MICROBLAZE:
10218 return reloc_type == 1; /* R_MICROBLAZE_32. */
10220 return reloc_type == 2; /* R_MIPS_32. */
10222 return reloc_type == 4; /* R_MMIX_32. */
10223 case EM_CYGNUS_MN10200:
10225 return reloc_type == 1; /* R_MN10200_32. */
10226 case EM_CYGNUS_MN10300:
10228 return reloc_type == 1; /* R_MN10300_32. */
10230 return reloc_type == 1; /* R_MOXIE_32. */
10231 case EM_MSP430_OLD:
10233 return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32. */
10235 return reloc_type == 2; /* R_MT_32. */
10236 case EM_ALTERA_NIOS2:
10237 return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32. */
10239 return reloc_type == 1; /* R_NIOS_32. */
10242 return reloc_type == 1; /* R_OR32_32. */
10244 return (reloc_type == 1 /* R_PARISC_DIR32. */
10245 || reloc_type == 41); /* R_PARISC_SECREL32. */
10248 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
10250 return reloc_type == 1; /* R_PPC64_ADDR32. */
10252 return reloc_type == 1; /* R_PPC_ADDR32. */
10254 return reloc_type == 1; /* R_RL78_DIR32. */
10256 return reloc_type == 1; /* R_RX_DIR32. */
10258 return reloc_type == 1; /* R_I370_ADDR31. */
10261 return reloc_type == 4; /* R_S390_32. */
10263 return reloc_type == 8; /* R_SCORE_ABS32. */
10265 return reloc_type == 1; /* R_SH_DIR32. */
10266 case EM_SPARC32PLUS:
10269 return reloc_type == 3 /* R_SPARC_32. */
10270 || reloc_type == 23; /* R_SPARC_UA32. */
10272 return reloc_type == 6; /* R_SPU_ADDR32 */
10274 return reloc_type == 1; /* R_C6000_ABS32. */
10276 return reloc_type == 2; /* R_TILEGX_32. */
10278 return reloc_type == 1; /* R_TILEPRO_32. */
10279 case EM_CYGNUS_V850:
10281 return reloc_type == 6; /* R_V850_ABS32. */
10283 return reloc_type == 0x33; /* R_V810_WORD. */
10285 return reloc_type == 1; /* R_VAX_32. */
10289 return reloc_type == 10; /* R_X86_64_32. */
10292 return reloc_type == 3; /* R_XC16C_ABS_32. */
10294 return reloc_type == 4; /* R_XGATE_32. */
10296 return reloc_type == 1; /* R_XSTROMY16_32. */
10297 case EM_XTENSA_OLD:
10299 return reloc_type == 1; /* R_XTENSA_32. */
10301 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
10302 elf_header.e_machine);
10307 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10308 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
10311 is_32bit_pcrel_reloc (unsigned int reloc_type)
10313 switch (elf_header.e_machine)
10317 return reloc_type == 2; /* R_386_PC32. */
10319 return reloc_type == 4; /* R_68K_PC32. */
10321 return reloc_type == 261; /* R_AARCH64_PREL32 */
10322 case EM_ADAPTEVA_EPIPHANY:
10323 return reloc_type == 6;
10325 return reloc_type == 10; /* R_ALPHA_SREL32. */
10327 return reloc_type == 3; /* R_ARM_REL32 */
10328 case EM_MICROBLAZE:
10329 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
10331 return reloc_type == 9; /* R_PARISC_PCREL32. */
10333 return reloc_type == 26; /* R_PPC_REL32. */
10335 return reloc_type == 26; /* R_PPC64_REL32. */
10338 return reloc_type == 5; /* R_390_PC32. */
10340 return reloc_type == 2; /* R_SH_REL32. */
10341 case EM_SPARC32PLUS:
10344 return reloc_type == 6; /* R_SPARC_DISP32. */
10346 return reloc_type == 13; /* R_SPU_REL32. */
10348 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
10350 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
10354 return reloc_type == 2; /* R_X86_64_PC32. */
10355 case EM_XTENSA_OLD:
10357 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
10359 /* Do not abort or issue an error message here. Not all targets use
10360 pc-relative 32-bit relocs in their DWARF debug information and we
10361 have already tested for target coverage in is_32bit_abs_reloc. A
10362 more helpful warning message will be generated by apply_relocations
10363 anyway, so just return. */
10368 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10369 a 64-bit absolute RELA relocation used in DWARF debug sections. */
10372 is_64bit_abs_reloc (unsigned int reloc_type)
10374 switch (elf_header.e_machine)
10377 return reloc_type == 257; /* R_AARCH64_ABS64. */
10379 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
10381 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
10383 return reloc_type == 80; /* R_PARISC_DIR64. */
10385 return reloc_type == 38; /* R_PPC64_ADDR64. */
10386 case EM_SPARC32PLUS:
10389 return reloc_type == 54; /* R_SPARC_UA64. */
10393 return reloc_type == 1; /* R_X86_64_64. */
10396 return reloc_type == 22; /* R_S390_64. */
10398 return reloc_type == 1; /* R_TILEGX_64. */
10400 return reloc_type == 18; /* R_MIPS_64. */
10406 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10407 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
10410 is_64bit_pcrel_reloc (unsigned int reloc_type)
10412 switch (elf_header.e_machine)
10415 return reloc_type == 260; /* R_AARCH64_PREL64. */
10417 return reloc_type == 11; /* R_ALPHA_SREL64. */
10419 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
10421 return reloc_type == 72; /* R_PARISC_PCREL64. */
10423 return reloc_type == 44; /* R_PPC64_REL64. */
10424 case EM_SPARC32PLUS:
10427 return reloc_type == 46; /* R_SPARC_DISP64. */
10431 return reloc_type == 24; /* R_X86_64_PC64. */
10434 return reloc_type == 23; /* R_S390_PC64. */
10436 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
10442 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10443 a 24-bit absolute RELA relocation used in DWARF debug sections. */
10446 is_24bit_abs_reloc (unsigned int reloc_type)
10448 switch (elf_header.e_machine)
10450 case EM_CYGNUS_MN10200:
10452 return reloc_type == 4; /* R_MN10200_24. */
10458 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10459 a 16-bit absolute RELA relocation used in DWARF debug sections. */
10462 is_16bit_abs_reloc (unsigned int reloc_type)
10464 switch (elf_header.e_machine)
10468 return reloc_type == 4; /* R_AVR_16. */
10469 case EM_ADAPTEVA_EPIPHANY:
10470 return reloc_type == 5;
10471 case EM_CYGNUS_D10V:
10473 return reloc_type == 3; /* R_D10V_16. */
10477 return reloc_type == R_H8_DIR16;
10480 return reloc_type == 1; /* R_IP2K_16. */
10483 return reloc_type == 1; /* R_M32C_16 */
10485 if (uses_msp430x_relocs ())
10486 return reloc_type == 2; /* R_MSP430_ABS16. */
10487 case EM_MSP430_OLD:
10488 return reloc_type == 5; /* R_MSP430_16_BYTE. */
10489 case EM_ALTERA_NIOS2:
10490 return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16. */
10492 return reloc_type == 9; /* R_NIOS_16. */
10494 return reloc_type == 2; /* R_C6000_ABS16. */
10497 return reloc_type == 2; /* R_XC16C_ABS_16. */
10498 case EM_CYGNUS_MN10200:
10500 return reloc_type == 2; /* R_MN10200_16. */
10501 case EM_CYGNUS_MN10300:
10503 return reloc_type == 2; /* R_MN10300_16. */
10505 return reloc_type == 3; /* R_XGATE_16. */
10511 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10512 relocation entries (possibly formerly used for SHT_GROUP sections). */
10515 is_none_reloc (unsigned int reloc_type)
10517 switch (elf_header.e_machine)
10519 case EM_68K: /* R_68K_NONE. */
10520 case EM_386: /* R_386_NONE. */
10521 case EM_SPARC32PLUS:
10523 case EM_SPARC: /* R_SPARC_NONE. */
10524 case EM_MIPS: /* R_MIPS_NONE. */
10525 case EM_PARISC: /* R_PARISC_NONE. */
10526 case EM_ALPHA: /* R_ALPHA_NONE. */
10527 case EM_ADAPTEVA_EPIPHANY:
10528 case EM_PPC: /* R_PPC_NONE. */
10529 case EM_PPC64: /* R_PPC64_NONE. */
10530 case EM_ARM: /* R_ARM_NONE. */
10531 case EM_IA_64: /* R_IA64_NONE. */
10532 case EM_SH: /* R_SH_NONE. */
10534 case EM_S390: /* R_390_NONE. */
10535 case EM_CRIS: /* R_CRIS_NONE. */
10536 case EM_X86_64: /* R_X86_64_NONE. */
10537 case EM_L1OM: /* R_X86_64_NONE. */
10538 case EM_K1OM: /* R_X86_64_NONE. */
10539 case EM_MN10300: /* R_MN10300_NONE. */
10540 case EM_MOXIE: /* R_MOXIE_NONE. */
10541 case EM_M32R: /* R_M32R_NONE. */
10542 case EM_TI_C6000:/* R_C6000_NONE. */
10543 case EM_TILEGX: /* R_TILEGX_NONE. */
10544 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10546 case EM_C166: /* R_XC16X_NONE. */
10547 case EM_ALTERA_NIOS2: /* R_NIOS2_NONE. */
10548 case EM_NIOS32: /* R_NIOS_NONE. */
10549 return reloc_type == 0;
10551 return reloc_type == 0 || reloc_type == 256;
10552 case EM_XTENSA_OLD:
10554 return (reloc_type == 0 /* R_XTENSA_NONE. */
10555 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10556 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10557 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10559 return reloc_type == 3; /* R_METAG_NONE. */
10564 /* Apply relocations to a section.
10565 Note: So far support has been added only for those relocations
10566 which can be found in debug sections.
10567 FIXME: Add support for more relocations ? */
10570 apply_relocations (void * file,
10571 Elf_Internal_Shdr * section,
10572 unsigned char * start)
10574 Elf_Internal_Shdr * relsec;
10575 unsigned char * end = start + section->sh_size;
10577 if (elf_header.e_type != ET_REL)
10580 /* Find the reloc section associated with the section. */
10581 for (relsec = section_headers;
10582 relsec < section_headers + elf_header.e_shnum;
10585 bfd_boolean is_rela;
10586 unsigned long num_relocs;
10587 Elf_Internal_Rela * relocs;
10588 Elf_Internal_Rela * rp;
10589 Elf_Internal_Shdr * symsec;
10590 Elf_Internal_Sym * symtab;
10591 unsigned long num_syms;
10592 Elf_Internal_Sym * sym;
10594 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10595 || relsec->sh_info >= elf_header.e_shnum
10596 || section_headers + relsec->sh_info != section
10597 || relsec->sh_size == 0
10598 || relsec->sh_link >= elf_header.e_shnum)
10601 is_rela = relsec->sh_type == SHT_RELA;
10605 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10606 relsec->sh_size, & relocs, & num_relocs))
10611 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10612 relsec->sh_size, & relocs, & num_relocs))
10616 /* SH uses RELA but uses in place value instead of the addend field. */
10617 if (elf_header.e_machine == EM_SH)
10620 symsec = section_headers + relsec->sh_link;
10621 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10623 for (rp = relocs; rp < relocs + num_relocs; ++rp)
10626 unsigned int reloc_type;
10627 unsigned int reloc_size;
10628 unsigned char * rloc;
10629 unsigned long sym_index;
10631 reloc_type = get_reloc_type (rp->r_info);
10633 if (target_specific_reloc_handling (rp, start, symtab))
10635 else if (is_none_reloc (reloc_type))
10637 else if (is_32bit_abs_reloc (reloc_type)
10638 || is_32bit_pcrel_reloc (reloc_type))
10640 else if (is_64bit_abs_reloc (reloc_type)
10641 || is_64bit_pcrel_reloc (reloc_type))
10643 else if (is_24bit_abs_reloc (reloc_type))
10645 else if (is_16bit_abs_reloc (reloc_type))
10649 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10650 reloc_type, SECTION_NAME (section));
10654 rloc = start + rp->r_offset;
10655 if ((rloc + reloc_size) > end || (rloc < start))
10657 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10658 (unsigned long) rp->r_offset,
10659 SECTION_NAME (section));
10663 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10664 if (sym_index >= num_syms)
10666 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10667 sym_index, SECTION_NAME (section));
10670 sym = symtab + sym_index;
10672 /* If the reloc has a symbol associated with it,
10673 make sure that it is of an appropriate type.
10675 Relocations against symbols without type can happen.
10676 Gcc -feliminate-dwarf2-dups may generate symbols
10677 without type for debug info.
10679 Icc generates relocations against function symbols
10680 instead of local labels.
10682 Relocations against object symbols can happen, eg when
10683 referencing a global array. For an example of this see
10684 the _clz.o binary in libgcc.a. */
10686 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10688 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10689 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10690 (long int)(rp - relocs),
10691 SECTION_NAME (relsec));
10697 addend += rp->r_addend;
10698 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10699 partial_inplace. */
10701 || (elf_header.e_machine == EM_XTENSA
10702 && reloc_type == 1)
10703 || ((elf_header.e_machine == EM_PJ
10704 || elf_header.e_machine == EM_PJ_OLD)
10705 && reloc_type == 1)
10706 || ((elf_header.e_machine == EM_D30V
10707 || elf_header.e_machine == EM_CYGNUS_D30V)
10708 && reloc_type == 12))
10709 addend += byte_get (rloc, reloc_size);
10711 if (is_32bit_pcrel_reloc (reloc_type)
10712 || is_64bit_pcrel_reloc (reloc_type))
10714 /* On HPPA, all pc-relative relocations are biased by 8. */
10715 if (elf_header.e_machine == EM_PARISC)
10717 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10721 byte_put (rloc, addend + sym->st_value, reloc_size);
10730 #ifdef SUPPORT_DISASSEMBLY
10732 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10734 printf (_("\nAssembly dump of section %s\n"),
10735 SECTION_NAME (section));
10737 /* XXX -- to be done --- XXX */
10743 /* Reads in the contents of SECTION from FILE, returning a pointer
10744 to a malloc'ed buffer or NULL if something went wrong. */
10747 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10749 bfd_size_type num_bytes;
10751 num_bytes = section->sh_size;
10753 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10755 printf (_("\nSection '%s' has no data to dump.\n"),
10756 SECTION_NAME (section));
10760 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10761 _("section contents"));
10766 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10768 Elf_Internal_Shdr * relsec;
10769 bfd_size_type num_bytes;
10773 char * name = SECTION_NAME (section);
10774 bfd_boolean some_strings_shown;
10776 start = get_section_contents (section, file);
10780 printf (_("\nString dump of section '%s':\n"), name);
10782 /* If the section being dumped has relocations against it the user might
10783 be expecting these relocations to have been applied. Check for this
10784 case and issue a warning message in order to avoid confusion.
10785 FIXME: Maybe we ought to have an option that dumps a section with
10786 relocs applied ? */
10787 for (relsec = section_headers;
10788 relsec < section_headers + elf_header.e_shnum;
10791 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10792 || relsec->sh_info >= elf_header.e_shnum
10793 || section_headers + relsec->sh_info != section
10794 || relsec->sh_size == 0
10795 || relsec->sh_link >= elf_header.e_shnum)
10798 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10802 num_bytes = section->sh_size;
10804 end = start + num_bytes;
10805 some_strings_shown = FALSE;
10809 while (!ISPRINT (* data))
10810 if (++ data >= end)
10816 /* PR 11128: Use two separate invocations in order to work
10817 around bugs in the Solaris 8 implementation of printf. */
10818 printf (" [%6tx] ", data - start);
10819 printf ("%s\n", data);
10821 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
10823 data += strlen (data);
10824 some_strings_shown = TRUE;
10828 if (! some_strings_shown)
10829 printf (_(" No strings found in this section."));
10837 dump_section_as_bytes (Elf_Internal_Shdr * section,
10839 bfd_boolean relocate)
10841 Elf_Internal_Shdr * relsec;
10842 bfd_size_type bytes;
10844 unsigned char * data;
10845 unsigned char * start;
10847 start = (unsigned char *) get_section_contents (section, file);
10851 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10855 apply_relocations (file, section, start);
10859 /* If the section being dumped has relocations against it the user might
10860 be expecting these relocations to have been applied. Check for this
10861 case and issue a warning message in order to avoid confusion.
10862 FIXME: Maybe we ought to have an option that dumps a section with
10863 relocs applied ? */
10864 for (relsec = section_headers;
10865 relsec < section_headers + elf_header.e_shnum;
10868 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10869 || relsec->sh_info >= elf_header.e_shnum
10870 || section_headers + relsec->sh_info != section
10871 || relsec->sh_size == 0
10872 || relsec->sh_link >= elf_header.e_shnum)
10875 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10880 addr = section->sh_addr;
10881 bytes = section->sh_size;
10890 lbytes = (bytes > 16 ? 16 : bytes);
10892 printf (" 0x%8.8lx ", (unsigned long) addr);
10894 for (j = 0; j < 16; j++)
10897 printf ("%2.2x", data[j]);
10905 for (j = 0; j < lbytes; j++)
10908 if (k >= ' ' && k < 0x7f)
10926 /* Uncompresses a section that was compressed using zlib, in place. */
10929 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10930 dwarf_size_type *size ATTRIBUTE_UNUSED)
10932 #ifndef HAVE_ZLIB_H
10935 dwarf_size_type compressed_size = *size;
10936 unsigned char * compressed_buffer = *buffer;
10937 dwarf_size_type uncompressed_size;
10938 unsigned char * uncompressed_buffer;
10941 dwarf_size_type header_size = 12;
10943 /* Read the zlib header. In this case, it should be "ZLIB" followed
10944 by the uncompressed section size, 8 bytes in big-endian order. */
10945 if (compressed_size < header_size
10946 || ! streq ((char *) compressed_buffer, "ZLIB"))
10949 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10950 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10951 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10952 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10953 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10954 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10955 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10956 uncompressed_size += compressed_buffer[11];
10958 /* It is possible the section consists of several compressed
10959 buffers concatenated together, so we uncompress in a loop. */
10960 strm.zalloc = NULL;
10962 strm.opaque = NULL;
10963 strm.avail_in = compressed_size - header_size;
10964 strm.next_in = (Bytef *) compressed_buffer + header_size;
10965 strm.avail_out = uncompressed_size;
10966 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10968 rc = inflateInit (& strm);
10969 while (strm.avail_in > 0)
10973 strm.next_out = ((Bytef *) uncompressed_buffer
10974 + (uncompressed_size - strm.avail_out));
10975 rc = inflate (&strm, Z_FINISH);
10976 if (rc != Z_STREAM_END)
10978 rc = inflateReset (& strm);
10980 rc = inflateEnd (& strm);
10982 || strm.avail_out != 0)
10985 free (compressed_buffer);
10986 *buffer = uncompressed_buffer;
10987 *size = uncompressed_size;
10991 free (uncompressed_buffer);
10992 /* Indicate decompression failure. */
10995 #endif /* HAVE_ZLIB_H */
10999 load_specific_debug_section (enum dwarf_section_display_enum debug,
11000 Elf_Internal_Shdr * sec, void * file)
11002 struct dwarf_section * section = &debug_displays [debug].section;
11005 /* If it is already loaded, do nothing. */
11006 if (section->start != NULL)
11009 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
11010 section->address = sec->sh_addr;
11011 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
11013 sec->sh_size, buf);
11014 if (section->start == NULL)
11018 section->size = sec->sh_size;
11019 if (uncompress_section_contents (§ion->start, §ion->size))
11020 sec->sh_size = section->size;
11023 if (section->start == NULL)
11026 if (debug_displays [debug].relocate)
11027 apply_relocations ((FILE *) file, sec, section->start);
11032 /* If this is not NULL, load_debug_section will only look for sections
11033 within the list of sections given here. */
11034 unsigned int *section_subset = NULL;
11037 load_debug_section (enum dwarf_section_display_enum debug, void * file)
11039 struct dwarf_section * section = &debug_displays [debug].section;
11040 Elf_Internal_Shdr * sec;
11042 /* Locate the debug section. */
11043 sec = find_section_in_set (section->uncompressed_name, section_subset);
11045 section->name = section->uncompressed_name;
11048 sec = find_section_in_set (section->compressed_name, section_subset);
11050 section->name = section->compressed_name;
11055 /* If we're loading from a subset of sections, and we've loaded
11056 a section matching this name before, it's likely that it's a
11058 if (section_subset != NULL)
11059 free_debug_section (debug);
11061 return load_specific_debug_section (debug, sec, (FILE *) file);
11065 free_debug_section (enum dwarf_section_display_enum debug)
11067 struct dwarf_section * section = &debug_displays [debug].section;
11069 if (section->start == NULL)
11072 free ((char *) section->start);
11073 section->start = NULL;
11074 section->address = 0;
11079 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
11081 char * name = SECTION_NAME (section);
11082 bfd_size_type length;
11086 length = section->sh_size;
11089 printf (_("\nSection '%s' has no debugging data.\n"), name);
11092 if (section->sh_type == SHT_NOBITS)
11094 /* There is no point in dumping the contents of a debugging section
11095 which has the NOBITS type - the bits in the file will be random.
11096 This can happen when a file containing a .eh_frame section is
11097 stripped with the --only-keep-debug command line option. */
11098 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
11102 if (const_strneq (name, ".gnu.linkonce.wi."))
11103 name = ".debug_info";
11105 /* See if we know how to display the contents of this section. */
11106 for (i = 0; i < max; i++)
11107 if (streq (debug_displays[i].section.uncompressed_name, name)
11108 || (i == line && const_strneq (name, ".debug_line."))
11109 || streq (debug_displays[i].section.compressed_name, name))
11111 struct dwarf_section * sec = &debug_displays [i].section;
11112 int secondary = (section != find_section (name));
11115 free_debug_section ((enum dwarf_section_display_enum) i);
11117 if (i == line && const_strneq (name, ".debug_line."))
11119 else if (streq (sec->uncompressed_name, name))
11120 sec->name = sec->uncompressed_name;
11122 sec->name = sec->compressed_name;
11123 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
11126 /* If this debug section is part of a CU/TU set in a .dwp file,
11127 restrict load_debug_section to the sections in that set. */
11128 section_subset = find_cu_tu_set (file, shndx);
11130 result &= debug_displays[i].display (sec, file);
11132 section_subset = NULL;
11134 if (secondary || (i != info && i != abbrev))
11135 free_debug_section ((enum dwarf_section_display_enum) i);
11143 printf (_("Unrecognized debug section: %s\n"), name);
11150 /* Set DUMP_SECTS for all sections where dumps were requested
11151 based on section name. */
11154 initialise_dumps_byname (void)
11156 struct dump_list_entry * cur;
11158 for (cur = dump_sects_byname; cur; cur = cur->next)
11163 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
11164 if (streq (SECTION_NAME (section_headers + i), cur->name))
11166 request_dump_bynumber (i, cur->type);
11171 warn (_("Section '%s' was not dumped because it does not exist!\n"),
11177 process_section_contents (FILE * file)
11179 Elf_Internal_Shdr * section;
11185 initialise_dumps_byname ();
11187 for (i = 0, section = section_headers;
11188 i < elf_header.e_shnum && i < num_dump_sects;
11191 #ifdef SUPPORT_DISASSEMBLY
11192 if (dump_sects[i] & DISASS_DUMP)
11193 disassemble_section (section, file);
11195 if (dump_sects[i] & HEX_DUMP)
11196 dump_section_as_bytes (section, file, FALSE);
11198 if (dump_sects[i] & RELOC_DUMP)
11199 dump_section_as_bytes (section, file, TRUE);
11201 if (dump_sects[i] & STRING_DUMP)
11202 dump_section_as_strings (section, file);
11204 if (dump_sects[i] & DEBUG_DUMP)
11205 display_debug_section (i, section, file);
11208 /* Check to see if the user requested a
11209 dump of a section that does not exist. */
11210 while (i++ < num_dump_sects)
11212 warn (_("Section %d was not dumped because it does not exist!\n"), i);
11216 process_mips_fpe_exception (int mask)
11221 if (mask & OEX_FPU_INEX)
11222 fputs ("INEX", stdout), first = 0;
11223 if (mask & OEX_FPU_UFLO)
11224 printf ("%sUFLO", first ? "" : "|"), first = 0;
11225 if (mask & OEX_FPU_OFLO)
11226 printf ("%sOFLO", first ? "" : "|"), first = 0;
11227 if (mask & OEX_FPU_DIV0)
11228 printf ("%sDIV0", first ? "" : "|"), first = 0;
11229 if (mask & OEX_FPU_INVAL)
11230 printf ("%sINVAL", first ? "" : "|");
11233 fputs ("0", stdout);
11236 /* Display's the value of TAG at location P. If TAG is
11237 greater than 0 it is assumed to be an unknown tag, and
11238 a message is printed to this effect. Otherwise it is
11239 assumed that a message has already been printed.
11241 If the bottom bit of TAG is set it assumed to have a
11242 string value, otherwise it is assumed to have an integer
11245 Returns an updated P pointing to the first unread byte
11246 beyond the end of TAG's value.
11248 Reads at or beyond END will not be made. */
11250 static unsigned char *
11251 display_tag_value (int tag,
11253 const unsigned char * const end)
11258 printf (" Tag_unknown_%d: ", tag);
11262 warn (_("corrupt tag\n"));
11266 /* FIXME: we could read beyond END here. */
11267 printf ("\"%s\"\n", p);
11268 p += strlen ((char *) p) + 1;
11274 val = read_uleb128 (p, &len, end);
11276 printf ("%ld (0x%lx)\n", val, val);
11282 /* ARM EABI attributes section. */
11287 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
11289 const char ** table;
11290 } arm_attr_public_tag;
11292 static const char * arm_attr_tag_CPU_arch[] =
11293 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
11294 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
11295 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
11296 static const char * arm_attr_tag_THUMB_ISA_use[] =
11297 {"No", "Thumb-1", "Thumb-2"};
11298 static const char * arm_attr_tag_FP_arch[] =
11299 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
11301 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
11302 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
11303 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
11304 static const char * arm_attr_tag_PCS_config[] =
11305 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
11306 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
11307 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
11308 {"V6", "SB", "TLS", "Unused"};
11309 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
11310 {"Absolute", "PC-relative", "SB-relative", "None"};
11311 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
11312 {"Absolute", "PC-relative", "None"};
11313 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
11314 {"None", "direct", "GOT-indirect"};
11315 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
11316 {"None", "??? 1", "2", "??? 3", "4"};
11317 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
11318 static const char * arm_attr_tag_ABI_FP_denormal[] =
11319 {"Unused", "Needed", "Sign only"};
11320 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
11321 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
11322 static const char * arm_attr_tag_ABI_FP_number_model[] =
11323 {"Unused", "Finite", "RTABI", "IEEE 754"};
11324 static const char * arm_attr_tag_ABI_enum_size[] =
11325 {"Unused", "small", "int", "forced to int"};
11326 static const char * arm_attr_tag_ABI_HardFP_use[] =
11327 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
11328 static const char * arm_attr_tag_ABI_VFP_args[] =
11329 {"AAPCS", "VFP registers", "custom"};
11330 static const char * arm_attr_tag_ABI_WMMX_args[] =
11331 {"AAPCS", "WMMX registers", "custom"};
11332 static const char * arm_attr_tag_ABI_optimization_goals[] =
11333 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11334 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
11335 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
11336 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
11337 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
11338 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
11339 static const char * arm_attr_tag_FP_HP_extension[] =
11340 {"Not Allowed", "Allowed"};
11341 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
11342 {"None", "IEEE 754", "Alternative Format"};
11343 static const char * arm_attr_tag_MPextension_use[] =
11344 {"Not Allowed", "Allowed"};
11345 static const char * arm_attr_tag_DIV_use[] =
11346 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
11347 "Allowed in v7-A with integer division extension"};
11348 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
11349 static const char * arm_attr_tag_Virtualization_use[] =
11350 {"Not Allowed", "TrustZone", "Virtualization Extensions",
11351 "TrustZone and Virtualization Extensions"};
11352 static const char * arm_attr_tag_MPextension_use_legacy[] =
11353 {"Not Allowed", "Allowed"};
11355 #define LOOKUP(id, name) \
11356 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
11357 static arm_attr_public_tag arm_attr_public_tags[] =
11359 {4, "CPU_raw_name", 1, NULL},
11360 {5, "CPU_name", 1, NULL},
11361 LOOKUP(6, CPU_arch),
11362 {7, "CPU_arch_profile", 0, NULL},
11363 LOOKUP(8, ARM_ISA_use),
11364 LOOKUP(9, THUMB_ISA_use),
11365 LOOKUP(10, FP_arch),
11366 LOOKUP(11, WMMX_arch),
11367 LOOKUP(12, Advanced_SIMD_arch),
11368 LOOKUP(13, PCS_config),
11369 LOOKUP(14, ABI_PCS_R9_use),
11370 LOOKUP(15, ABI_PCS_RW_data),
11371 LOOKUP(16, ABI_PCS_RO_data),
11372 LOOKUP(17, ABI_PCS_GOT_use),
11373 LOOKUP(18, ABI_PCS_wchar_t),
11374 LOOKUP(19, ABI_FP_rounding),
11375 LOOKUP(20, ABI_FP_denormal),
11376 LOOKUP(21, ABI_FP_exceptions),
11377 LOOKUP(22, ABI_FP_user_exceptions),
11378 LOOKUP(23, ABI_FP_number_model),
11379 {24, "ABI_align_needed", 0, NULL},
11380 {25, "ABI_align_preserved", 0, NULL},
11381 LOOKUP(26, ABI_enum_size),
11382 LOOKUP(27, ABI_HardFP_use),
11383 LOOKUP(28, ABI_VFP_args),
11384 LOOKUP(29, ABI_WMMX_args),
11385 LOOKUP(30, ABI_optimization_goals),
11386 LOOKUP(31, ABI_FP_optimization_goals),
11387 {32, "compatibility", 0, NULL},
11388 LOOKUP(34, CPU_unaligned_access),
11389 LOOKUP(36, FP_HP_extension),
11390 LOOKUP(38, ABI_FP_16bit_format),
11391 LOOKUP(42, MPextension_use),
11392 LOOKUP(44, DIV_use),
11393 {64, "nodefaults", 0, NULL},
11394 {65, "also_compatible_with", 0, NULL},
11395 LOOKUP(66, T2EE_use),
11396 {67, "conformance", 1, NULL},
11397 LOOKUP(68, Virtualization_use),
11398 LOOKUP(70, MPextension_use_legacy)
11402 static unsigned char *
11403 display_arm_attribute (unsigned char * p,
11404 const unsigned char * const end)
11409 arm_attr_public_tag * attr;
11413 tag = read_uleb128 (p, &len, end);
11416 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11418 if (arm_attr_public_tags[i].tag == tag)
11420 attr = &arm_attr_public_tags[i];
11427 printf (" Tag_%s: ", attr->name);
11428 switch (attr->type)
11433 case 7: /* Tag_CPU_arch_profile. */
11434 val = read_uleb128 (p, &len, end);
11438 case 0: printf (_("None\n")); break;
11439 case 'A': printf (_("Application\n")); break;
11440 case 'R': printf (_("Realtime\n")); break;
11441 case 'M': printf (_("Microcontroller\n")); break;
11442 case 'S': printf (_("Application or Realtime\n")); break;
11443 default: printf ("??? (%d)\n", val); break;
11447 case 24: /* Tag_align_needed. */
11448 val = read_uleb128 (p, &len, end);
11452 case 0: printf (_("None\n")); break;
11453 case 1: printf (_("8-byte\n")); break;
11454 case 2: printf (_("4-byte\n")); break;
11455 case 3: printf ("??? 3\n"); break;
11458 printf (_("8-byte and up to %d-byte extended\n"),
11461 printf ("??? (%d)\n", val);
11466 case 25: /* Tag_align_preserved. */
11467 val = read_uleb128 (p, &len, end);
11471 case 0: printf (_("None\n")); break;
11472 case 1: printf (_("8-byte, except leaf SP\n")); break;
11473 case 2: printf (_("8-byte\n")); break;
11474 case 3: printf ("??? 3\n"); break;
11477 printf (_("8-byte and up to %d-byte extended\n"),
11480 printf ("??? (%d)\n", val);
11485 case 32: /* Tag_compatibility. */
11486 val = read_uleb128 (p, &len, end);
11488 printf (_("flag = %d, vendor = %s\n"), val, p);
11489 p += strlen ((char *) p) + 1;
11492 case 64: /* Tag_nodefaults. */
11494 printf (_("True\n"));
11497 case 65: /* Tag_also_compatible_with. */
11498 val = read_uleb128 (p, &len, end);
11500 if (val == 6 /* Tag_CPU_arch. */)
11502 val = read_uleb128 (p, &len, end);
11504 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11505 printf ("??? (%d)\n", val);
11507 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11511 while (*(p++) != '\0' /* NUL terminator. */);
11520 return display_tag_value (-1, p, end);
11522 return display_tag_value (0, p, end);
11525 assert (attr->type & 0x80);
11526 val = read_uleb128 (p, &len, end);
11528 type = attr->type & 0x7f;
11530 printf ("??? (%d)\n", val);
11532 printf ("%s\n", attr->table[val]);
11537 return display_tag_value (tag, p, end);
11540 static unsigned char *
11541 display_gnu_attribute (unsigned char * p,
11542 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
11543 const unsigned char * const end)
11549 tag = read_uleb128 (p, &len, end);
11552 /* Tag_compatibility is the only generic GNU attribute defined at
11556 val = read_uleb128 (p, &len, end);
11560 printf (_("flag = %d, vendor = <corrupt>\n"), val);
11561 warn (_("corrupt vendor attribute\n"));
11565 printf (_("flag = %d, vendor = %s\n"), val, p);
11566 p += strlen ((char *) p) + 1;
11571 if ((tag & 2) == 0 && display_proc_gnu_attribute)
11572 return display_proc_gnu_attribute (p, tag, end);
11574 return display_tag_value (tag, p, end);
11577 static unsigned char *
11578 display_power_gnu_attribute (unsigned char * p,
11580 const unsigned char * const end)
11585 if (tag == Tag_GNU_Power_ABI_FP)
11587 val = read_uleb128 (p, &len, end);
11589 printf (" Tag_GNU_Power_ABI_FP: ");
11594 printf (_("Hard or soft float\n"));
11597 printf (_("Hard float\n"));
11600 printf (_("Soft float\n"));
11603 printf (_("Single-precision hard float\n"));
11606 printf ("??? (%d)\n", val);
11612 if (tag == Tag_GNU_Power_ABI_Vector)
11614 val = read_uleb128 (p, &len, end);
11616 printf (" Tag_GNU_Power_ABI_Vector: ");
11620 printf (_("Any\n"));
11623 printf (_("Generic\n"));
11626 printf ("AltiVec\n");
11632 printf ("??? (%d)\n", val);
11638 if (tag == Tag_GNU_Power_ABI_Struct_Return)
11642 warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return"));
11646 val = read_uleb128 (p, &len, end);
11648 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
11652 printf (_("Any\n"));
11655 printf ("r3/r4\n");
11658 printf (_("Memory\n"));
11661 printf ("??? (%d)\n", val);
11667 return display_tag_value (tag & 1, p, end);
11671 display_sparc_hwcaps (int mask)
11676 if (mask & ELF_SPARC_HWCAP_MUL32)
11677 fputs ("mul32", stdout), first = 0;
11678 if (mask & ELF_SPARC_HWCAP_DIV32)
11679 printf ("%sdiv32", first ? "" : "|"), first = 0;
11680 if (mask & ELF_SPARC_HWCAP_FSMULD)
11681 printf ("%sfsmuld", first ? "" : "|"), first = 0;
11682 if (mask & ELF_SPARC_HWCAP_V8PLUS)
11683 printf ("%sv8plus", first ? "" : "|"), first = 0;
11684 if (mask & ELF_SPARC_HWCAP_POPC)
11685 printf ("%spopc", first ? "" : "|"), first = 0;
11686 if (mask & ELF_SPARC_HWCAP_VIS)
11687 printf ("%svis", first ? "" : "|"), first = 0;
11688 if (mask & ELF_SPARC_HWCAP_VIS2)
11689 printf ("%svis2", first ? "" : "|"), first = 0;
11690 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11691 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11692 if (mask & ELF_SPARC_HWCAP_FMAF)
11693 printf ("%sfmaf", first ? "" : "|"), first = 0;
11694 if (mask & ELF_SPARC_HWCAP_VIS3)
11695 printf ("%svis3", first ? "" : "|"), first = 0;
11696 if (mask & ELF_SPARC_HWCAP_HPC)
11697 printf ("%shpc", first ? "" : "|"), first = 0;
11698 if (mask & ELF_SPARC_HWCAP_RANDOM)
11699 printf ("%srandom", first ? "" : "|"), first = 0;
11700 if (mask & ELF_SPARC_HWCAP_TRANS)
11701 printf ("%strans", first ? "" : "|"), first = 0;
11702 if (mask & ELF_SPARC_HWCAP_FJFMAU)
11703 printf ("%sfjfmau", first ? "" : "|"), first = 0;
11704 if (mask & ELF_SPARC_HWCAP_IMA)
11705 printf ("%sima", first ? "" : "|"), first = 0;
11706 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11707 printf ("%scspare", first ? "" : "|"), first = 0;
11710 fputc('0', stdout);
11711 fputc('\n', stdout);
11714 static unsigned char *
11715 display_sparc_gnu_attribute (unsigned char * p,
11717 const unsigned char * const end)
11719 if (tag == Tag_GNU_Sparc_HWCAPS)
11724 val = read_uleb128 (p, &len, end);
11726 printf (" Tag_GNU_Sparc_HWCAPS: ");
11727 display_sparc_hwcaps (val);
11731 return display_tag_value (tag, p, end);
11734 static unsigned char *
11735 display_mips_gnu_attribute (unsigned char * p,
11737 const unsigned char * const end)
11739 if (tag == Tag_GNU_MIPS_ABI_FP)
11744 val = read_uleb128 (p, &len, end);
11746 printf (" Tag_GNU_MIPS_ABI_FP: ");
11750 case Val_GNU_MIPS_ABI_FP_ANY:
11751 printf (_("Hard or soft float\n"));
11753 case Val_GNU_MIPS_ABI_FP_DOUBLE:
11754 printf (_("Hard float (double precision)\n"));
11756 case Val_GNU_MIPS_ABI_FP_SINGLE:
11757 printf (_("Hard float (single precision)\n"));
11759 case Val_GNU_MIPS_ABI_FP_SOFT:
11760 printf (_("Soft float\n"));
11762 case Val_GNU_MIPS_ABI_FP_64:
11763 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11766 printf ("??? (%d)\n", val);
11772 if (tag == Tag_GNU_MIPS_ABI_MSA)
11777 val = read_uleb128 (p, &len, end);
11779 printf (" Tag_GNU_MIPS_ABI_MSA: ");
11783 case Val_GNU_MIPS_ABI_MSA_ANY:
11784 printf (_("Any MSA or not\n"));
11786 case Val_GNU_MIPS_ABI_MSA_128:
11787 printf (_("128-bit MSA\n"));
11790 printf ("??? (%d)\n", val);
11796 return display_tag_value (tag & 1, p, end);
11799 static unsigned char *
11800 display_tic6x_attribute (unsigned char * p,
11801 const unsigned char * const end)
11807 tag = read_uleb128 (p, &len, end);
11813 val = read_uleb128 (p, &len, end);
11815 printf (" Tag_ISA: ");
11819 case C6XABI_Tag_ISA_none:
11820 printf (_("None\n"));
11822 case C6XABI_Tag_ISA_C62X:
11825 case C6XABI_Tag_ISA_C67X:
11828 case C6XABI_Tag_ISA_C67XP:
11829 printf ("C67x+\n");
11831 case C6XABI_Tag_ISA_C64X:
11834 case C6XABI_Tag_ISA_C64XP:
11835 printf ("C64x+\n");
11837 case C6XABI_Tag_ISA_C674X:
11838 printf ("C674x\n");
11841 printf ("??? (%d)\n", val);
11846 case Tag_ABI_wchar_t:
11847 val = read_uleb128 (p, &len, end);
11849 printf (" Tag_ABI_wchar_t: ");
11853 printf (_("Not used\n"));
11856 printf (_("2 bytes\n"));
11859 printf (_("4 bytes\n"));
11862 printf ("??? (%d)\n", val);
11867 case Tag_ABI_stack_align_needed:
11868 val = read_uleb128 (p, &len, end);
11870 printf (" Tag_ABI_stack_align_needed: ");
11874 printf (_("8-byte\n"));
11877 printf (_("16-byte\n"));
11880 printf ("??? (%d)\n", val);
11885 case Tag_ABI_stack_align_preserved:
11886 val = read_uleb128 (p, &len, end);
11888 printf (" Tag_ABI_stack_align_preserved: ");
11892 printf (_("8-byte\n"));
11895 printf (_("16-byte\n"));
11898 printf ("??? (%d)\n", val);
11904 val = read_uleb128 (p, &len, end);
11906 printf (" Tag_ABI_DSBT: ");
11910 printf (_("DSBT addressing not used\n"));
11913 printf (_("DSBT addressing used\n"));
11916 printf ("??? (%d)\n", val);
11922 val = read_uleb128 (p, &len, end);
11924 printf (" Tag_ABI_PID: ");
11928 printf (_("Data addressing position-dependent\n"));
11931 printf (_("Data addressing position-independent, GOT near DP\n"));
11934 printf (_("Data addressing position-independent, GOT far from DP\n"));
11937 printf ("??? (%d)\n", val);
11943 val = read_uleb128 (p, &len, end);
11945 printf (" Tag_ABI_PIC: ");
11949 printf (_("Code addressing position-dependent\n"));
11952 printf (_("Code addressing position-independent\n"));
11955 printf ("??? (%d)\n", val);
11960 case Tag_ABI_array_object_alignment:
11961 val = read_uleb128 (p, &len, end);
11963 printf (" Tag_ABI_array_object_alignment: ");
11967 printf (_("8-byte\n"));
11970 printf (_("4-byte\n"));
11973 printf (_("16-byte\n"));
11976 printf ("??? (%d)\n", val);
11981 case Tag_ABI_array_object_align_expected:
11982 val = read_uleb128 (p, &len, end);
11984 printf (" Tag_ABI_array_object_align_expected: ");
11988 printf (_("8-byte\n"));
11991 printf (_("4-byte\n"));
11994 printf (_("16-byte\n"));
11997 printf ("??? (%d)\n", val);
12002 case Tag_ABI_compatibility:
12003 val = read_uleb128 (p, &len, end);
12005 printf (" Tag_ABI_compatibility: ");
12006 printf (_("flag = %d, vendor = %s\n"), val, p);
12007 p += strlen ((char *) p) + 1;
12010 case Tag_ABI_conformance:
12011 printf (" Tag_ABI_conformance: ");
12012 printf ("\"%s\"\n", p);
12013 p += strlen ((char *) p) + 1;
12017 return display_tag_value (tag, p, end);
12021 display_raw_attribute (unsigned char * p, unsigned char * end)
12023 unsigned long addr = 0;
12024 size_t bytes = end - p;
12030 int lbytes = (bytes > 16 ? 16 : bytes);
12032 printf (" 0x%8.8lx ", addr);
12034 for (j = 0; j < 16; j++)
12037 printf ("%2.2x", p[j]);
12045 for (j = 0; j < lbytes; j++)
12048 if (k >= ' ' && k < 0x7f)
12064 static unsigned char *
12065 display_msp430x_attribute (unsigned char * p,
12066 const unsigned char * const end)
12072 tag = read_uleb128 (p, & len, end);
12077 case OFBA_MSPABI_Tag_ISA:
12078 val = read_uleb128 (p, &len, end);
12080 printf (" Tag_ISA: ");
12083 case 0: printf (_("None\n")); break;
12084 case 1: printf (_("MSP430\n")); break;
12085 case 2: printf (_("MSP430X\n")); break;
12086 default: printf ("??? (%d)\n", val); break;
12090 case OFBA_MSPABI_Tag_Code_Model:
12091 val = read_uleb128 (p, &len, end);
12093 printf (" Tag_Code_Model: ");
12096 case 0: printf (_("None\n")); break;
12097 case 1: printf (_("Small\n")); break;
12098 case 2: printf (_("Large\n")); break;
12099 default: printf ("??? (%d)\n", val); break;
12103 case OFBA_MSPABI_Tag_Data_Model:
12104 val = read_uleb128 (p, &len, end);
12106 printf (" Tag_Data_Model: ");
12109 case 0: printf (_("None\n")); break;
12110 case 1: printf (_("Small\n")); break;
12111 case 2: printf (_("Large\n")); break;
12112 case 3: printf (_("Restricted Large\n")); break;
12113 default: printf ("??? (%d)\n", val); break;
12118 printf (_(" <unknown tag %d>: "), tag);
12122 printf ("\"%s\"\n", p);
12123 p += strlen ((char *) p) + 1;
12127 val = read_uleb128 (p, &len, end);
12129 printf ("%d (0x%x)\n", val, val);
12138 process_attributes (FILE * file,
12139 const char * public_name,
12140 unsigned int proc_type,
12141 unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
12142 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
12144 Elf_Internal_Shdr * sect;
12145 unsigned char * contents;
12147 unsigned char * end;
12148 bfd_vma section_len;
12152 /* Find the section header so that we get the size. */
12153 for (i = 0, sect = section_headers;
12154 i < elf_header.e_shnum;
12157 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
12160 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
12161 sect->sh_size, _("attributes"));
12162 if (contents == NULL)
12168 len = sect->sh_size - 1;
12174 bfd_boolean public_section;
12175 bfd_boolean gnu_section;
12177 section_len = byte_get (p, 4);
12180 if (section_len > len)
12182 printf (_("ERROR: Bad section length (%d > %d)\n"),
12183 (int) section_len, (int) len);
12187 len -= section_len;
12188 printf (_("Attribute Section: %s\n"), p);
12190 if (public_name && streq ((char *) p, public_name))
12191 public_section = TRUE;
12193 public_section = FALSE;
12195 if (streq ((char *) p, "gnu"))
12196 gnu_section = TRUE;
12198 gnu_section = FALSE;
12200 namelen = strlen ((char *) p) + 1;
12202 section_len -= namelen + 4;
12204 while (section_len > 0)
12210 size = byte_get (p, 4);
12211 if (size > section_len)
12213 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
12214 (int) size, (int) section_len);
12215 size = section_len;
12218 section_len -= size;
12219 end = p + size - 1;
12225 printf (_("File Attributes\n"));
12228 printf (_("Section Attributes:"));
12231 printf (_("Symbol Attributes:"));
12237 val = read_uleb128 (p, &j, end);
12241 printf (" %d", val);
12246 printf (_("Unknown tag: %d\n"), tag);
12247 public_section = FALSE;
12251 if (public_section)
12254 p = display_pub_attribute (p, end);
12256 else if (gnu_section)
12259 p = display_gnu_attribute (p,
12260 display_proc_gnu_attribute,
12265 printf (_(" Unknown section contexts\n"));
12266 display_raw_attribute (p, end);
12273 printf (_("Unknown format '%c'\n"), *p);
12281 process_arm_specific (FILE * file)
12283 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
12284 display_arm_attribute, NULL);
12288 process_power_specific (FILE * file)
12290 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12291 display_power_gnu_attribute);
12295 process_sparc_specific (FILE * file)
12297 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12298 display_sparc_gnu_attribute);
12302 process_tic6x_specific (FILE * file)
12304 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
12305 display_tic6x_attribute, NULL);
12309 process_msp430x_specific (FILE * file)
12311 return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
12312 display_msp430x_attribute, NULL);
12315 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
12316 Print the Address, Access and Initial fields of an entry at VMA ADDR
12317 and return the VMA of the next entry. */
12320 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12323 print_vma (addr, LONG_HEX);
12325 if (addr < pltgot + 0xfff0)
12326 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
12328 printf ("%10s", "");
12331 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12336 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12337 print_vma (entry, LONG_HEX);
12339 return addr + (is_32bit_elf ? 4 : 8);
12342 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
12343 PLTGOT. Print the Address and Initial fields of an entry at VMA
12344 ADDR and return the VMA of the next entry. */
12347 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
12350 print_vma (addr, LONG_HEX);
12353 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
12358 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
12359 print_vma (entry, LONG_HEX);
12361 return addr + (is_32bit_elf ? 4 : 8);
12365 process_mips_specific (FILE * file)
12367 Elf_Internal_Dyn * entry;
12368 size_t liblist_offset = 0;
12369 size_t liblistno = 0;
12370 size_t conflictsno = 0;
12371 size_t options_offset = 0;
12372 size_t conflicts_offset = 0;
12373 size_t pltrelsz = 0;
12375 bfd_vma pltgot = 0;
12376 bfd_vma mips_pltgot = 0;
12377 bfd_vma jmprel = 0;
12378 bfd_vma local_gotno = 0;
12379 bfd_vma gotsym = 0;
12380 bfd_vma symtabno = 0;
12382 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
12383 display_mips_gnu_attribute);
12385 /* We have a lot of special sections. Thanks SGI! */
12386 if (dynamic_section == NULL)
12387 /* No information available. */
12390 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
12391 switch (entry->d_tag)
12393 case DT_MIPS_LIBLIST:
12395 = offset_from_vma (file, entry->d_un.d_val,
12396 liblistno * sizeof (Elf32_External_Lib));
12398 case DT_MIPS_LIBLISTNO:
12399 liblistno = entry->d_un.d_val;
12401 case DT_MIPS_OPTIONS:
12402 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
12404 case DT_MIPS_CONFLICT:
12406 = offset_from_vma (file, entry->d_un.d_val,
12407 conflictsno * sizeof (Elf32_External_Conflict));
12409 case DT_MIPS_CONFLICTNO:
12410 conflictsno = entry->d_un.d_val;
12413 pltgot = entry->d_un.d_ptr;
12415 case DT_MIPS_LOCAL_GOTNO:
12416 local_gotno = entry->d_un.d_val;
12418 case DT_MIPS_GOTSYM:
12419 gotsym = entry->d_un.d_val;
12421 case DT_MIPS_SYMTABNO:
12422 symtabno = entry->d_un.d_val;
12424 case DT_MIPS_PLTGOT:
12425 mips_pltgot = entry->d_un.d_ptr;
12428 pltrel = entry->d_un.d_val;
12431 pltrelsz = entry->d_un.d_val;
12434 jmprel = entry->d_un.d_ptr;
12440 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
12442 Elf32_External_Lib * elib;
12445 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12447 sizeof (Elf32_External_Lib),
12448 _("liblist section data"));
12451 printf (_("\nSection '.liblist' contains %lu entries:\n"),
12452 (unsigned long) liblistno);
12453 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
12456 for (cnt = 0; cnt < liblistno; ++cnt)
12463 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12464 atime = BYTE_GET (elib[cnt].l_time_stamp);
12465 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12466 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12467 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12469 tmp = gmtime (&atime);
12470 snprintf (timebuf, sizeof (timebuf),
12471 "%04u-%02u-%02uT%02u:%02u:%02u",
12472 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12473 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12475 printf ("%3lu: ", (unsigned long) cnt);
12476 if (VALID_DYNAMIC_NAME (liblist.l_name))
12477 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12479 printf (_("<corrupt: %9ld>"), liblist.l_name);
12480 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12481 liblist.l_version);
12483 if (liblist.l_flags == 0)
12487 static const struct
12494 { " EXACT_MATCH", LL_EXACT_MATCH },
12495 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12496 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12497 { " EXPORTS", LL_EXPORTS },
12498 { " DELAY_LOAD", LL_DELAY_LOAD },
12499 { " DELTA", LL_DELTA }
12501 int flags = liblist.l_flags;
12504 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12505 if ((flags & l_flags_vals[fcnt].bit) != 0)
12507 fputs (l_flags_vals[fcnt].name, stdout);
12508 flags ^= l_flags_vals[fcnt].bit;
12511 printf (" %#x", (unsigned int) flags);
12521 if (options_offset != 0)
12523 Elf_External_Options * eopt;
12524 Elf_Internal_Shdr * sect = section_headers;
12525 Elf_Internal_Options * iopt;
12526 Elf_Internal_Options * option;
12530 /* Find the section header so that we get the size. */
12531 while (sect->sh_type != SHT_MIPS_OPTIONS)
12534 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12535 sect->sh_size, _("options"));
12538 iopt = (Elf_Internal_Options *)
12539 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12542 error (_("Out of memory\n"));
12549 while (offset < sect->sh_size)
12551 Elf_External_Options * eoption;
12553 eoption = (Elf_External_Options *) ((char *) eopt + offset);
12555 option->kind = BYTE_GET (eoption->kind);
12556 option->size = BYTE_GET (eoption->size);
12557 option->section = BYTE_GET (eoption->section);
12558 option->info = BYTE_GET (eoption->info);
12560 offset += option->size;
12566 printf (_("\nSection '%s' contains %d entries:\n"),
12567 SECTION_NAME (sect), cnt);
12575 switch (option->kind)
12578 /* This shouldn't happen. */
12579 printf (" NULL %d %lx", option->section, option->info);
12582 printf (" REGINFO ");
12583 if (elf_header.e_machine == EM_MIPS)
12586 Elf32_External_RegInfo * ereg;
12587 Elf32_RegInfo reginfo;
12589 ereg = (Elf32_External_RegInfo *) (option + 1);
12590 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12591 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12592 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12593 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12594 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12595 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12597 printf ("GPR %08lx GP 0x%lx\n",
12598 reginfo.ri_gprmask,
12599 (unsigned long) reginfo.ri_gp_value);
12600 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12601 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12602 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12607 Elf64_External_RegInfo * ereg;
12608 Elf64_Internal_RegInfo reginfo;
12610 ereg = (Elf64_External_RegInfo *) (option + 1);
12611 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12612 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12613 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12614 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12615 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12616 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12618 printf ("GPR %08lx GP 0x",
12619 reginfo.ri_gprmask);
12620 printf_vma (reginfo.ri_gp_value);
12623 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12624 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12625 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12629 case ODK_EXCEPTIONS:
12630 fputs (" EXCEPTIONS fpe_min(", stdout);
12631 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12632 fputs (") fpe_max(", stdout);
12633 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12634 fputs (")", stdout);
12636 if (option->info & OEX_PAGE0)
12637 fputs (" PAGE0", stdout);
12638 if (option->info & OEX_SMM)
12639 fputs (" SMM", stdout);
12640 if (option->info & OEX_FPDBUG)
12641 fputs (" FPDBUG", stdout);
12642 if (option->info & OEX_DISMISS)
12643 fputs (" DISMISS", stdout);
12646 fputs (" PAD ", stdout);
12647 if (option->info & OPAD_PREFIX)
12648 fputs (" PREFIX", stdout);
12649 if (option->info & OPAD_POSTFIX)
12650 fputs (" POSTFIX", stdout);
12651 if (option->info & OPAD_SYMBOL)
12652 fputs (" SYMBOL", stdout);
12655 fputs (" HWPATCH ", stdout);
12656 if (option->info & OHW_R4KEOP)
12657 fputs (" R4KEOP", stdout);
12658 if (option->info & OHW_R8KPFETCH)
12659 fputs (" R8KPFETCH", stdout);
12660 if (option->info & OHW_R5KEOP)
12661 fputs (" R5KEOP", stdout);
12662 if (option->info & OHW_R5KCVTL)
12663 fputs (" R5KCVTL", stdout);
12666 fputs (" FILL ", stdout);
12667 /* XXX Print content of info word? */
12670 fputs (" TAGS ", stdout);
12671 /* XXX Print content of info word? */
12674 fputs (" HWAND ", stdout);
12675 if (option->info & OHWA0_R4KEOP_CHECKED)
12676 fputs (" R4KEOP_CHECKED", stdout);
12677 if (option->info & OHWA0_R4KEOP_CLEAN)
12678 fputs (" R4KEOP_CLEAN", stdout);
12681 fputs (" HWOR ", stdout);
12682 if (option->info & OHWA0_R4KEOP_CHECKED)
12683 fputs (" R4KEOP_CHECKED", stdout);
12684 if (option->info & OHWA0_R4KEOP_CLEAN)
12685 fputs (" R4KEOP_CLEAN", stdout);
12688 printf (" GP_GROUP %#06lx self-contained %#06lx",
12689 option->info & OGP_GROUP,
12690 (option->info & OGP_SELF) >> 16);
12693 printf (" IDENT %#06lx self-contained %#06lx",
12694 option->info & OGP_GROUP,
12695 (option->info & OGP_SELF) >> 16);
12698 /* This shouldn't happen. */
12699 printf (" %3d ??? %d %lx",
12700 option->kind, option->section, option->info);
12704 len = sizeof (* eopt);
12705 while (len < option->size)
12706 if (((char *) option)[len] >= ' '
12707 && ((char *) option)[len] < 0x7f)
12708 printf ("%c", ((char *) option)[len++]);
12710 printf ("\\%03o", ((char *) option)[len++]);
12712 fputs ("\n", stdout);
12720 if (conflicts_offset != 0 && conflictsno != 0)
12722 Elf32_Conflict * iconf;
12725 if (dynamic_symbols == NULL)
12727 error (_("conflict list found without a dynamic symbol table\n"));
12731 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12734 error (_("Out of memory\n"));
12740 Elf32_External_Conflict * econf32;
12742 econf32 = (Elf32_External_Conflict *)
12743 get_data (NULL, file, conflicts_offset, conflictsno,
12744 sizeof (* econf32), _("conflict"));
12748 for (cnt = 0; cnt < conflictsno; ++cnt)
12749 iconf[cnt] = BYTE_GET (econf32[cnt]);
12755 Elf64_External_Conflict * econf64;
12757 econf64 = (Elf64_External_Conflict *)
12758 get_data (NULL, file, conflicts_offset, conflictsno,
12759 sizeof (* econf64), _("conflict"));
12763 for (cnt = 0; cnt < conflictsno; ++cnt)
12764 iconf[cnt] = BYTE_GET (econf64[cnt]);
12769 printf (_("\nSection '.conflict' contains %lu entries:\n"),
12770 (unsigned long) conflictsno);
12771 puts (_(" Num: Index Value Name"));
12773 for (cnt = 0; cnt < conflictsno; ++cnt)
12775 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12777 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
12778 print_vma (psym->st_value, FULL_HEX);
12780 if (VALID_DYNAMIC_NAME (psym->st_name))
12781 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12783 printf (_("<corrupt: %14ld>"), psym->st_name);
12790 if (pltgot != 0 && local_gotno != 0)
12792 bfd_vma ent, local_end, global_end;
12794 unsigned char * data;
12798 addr_size = (is_32bit_elf ? 4 : 8);
12799 local_end = pltgot + local_gotno * addr_size;
12800 global_end = local_end + (symtabno - gotsym) * addr_size;
12802 offset = offset_from_vma (file, pltgot, global_end - pltgot);
12803 data = (unsigned char *) get_data (NULL, file, offset,
12804 global_end - pltgot, 1,
12805 _("Global Offset Table data"));
12809 printf (_("\nPrimary GOT:\n"));
12810 printf (_(" Canonical gp value: "));
12811 print_vma (pltgot + 0x7ff0, LONG_HEX);
12814 printf (_(" Reserved entries:\n"));
12815 printf (_(" %*s %10s %*s Purpose\n"),
12816 addr_size * 2, _("Address"), _("Access"),
12817 addr_size * 2, _("Initial"));
12818 ent = print_mips_got_entry (data, pltgot, ent);
12819 printf (_(" Lazy resolver\n"));
12821 && (byte_get (data + ent - pltgot, addr_size)
12822 >> (addr_size * 8 - 1)) != 0)
12824 ent = print_mips_got_entry (data, pltgot, ent);
12825 printf (_(" Module pointer (GNU extension)\n"));
12829 if (ent < local_end)
12831 printf (_(" Local entries:\n"));
12832 printf (" %*s %10s %*s\n",
12833 addr_size * 2, _("Address"), _("Access"),
12834 addr_size * 2, _("Initial"));
12835 while (ent < local_end)
12837 ent = print_mips_got_entry (data, pltgot, ent);
12843 if (gotsym < symtabno)
12847 printf (_(" Global entries:\n"));
12848 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
12849 addr_size * 2, _("Address"),
12851 addr_size * 2, _("Initial"),
12852 addr_size * 2, _("Sym.Val."),
12854 /* Note for translators: "Ndx" = abbreviated form of "Index". */
12855 _("Ndx"), _("Name"));
12857 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12858 for (i = gotsym; i < symtabno; i++)
12860 Elf_Internal_Sym * psym;
12862 psym = dynamic_symbols + i;
12863 ent = print_mips_got_entry (data, pltgot, ent);
12865 print_vma (psym->st_value, LONG_HEX);
12866 printf (" %-7s %3s ",
12867 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12868 get_symbol_index_type (psym->st_shndx));
12869 if (VALID_DYNAMIC_NAME (psym->st_name))
12870 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12872 printf (_("<corrupt: %14ld>"), psym->st_name);
12882 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12885 size_t offset, rel_offset;
12886 unsigned long count, i;
12887 unsigned char * data;
12888 int addr_size, sym_width;
12889 Elf_Internal_Rela * rels;
12891 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12892 if (pltrel == DT_RELA)
12894 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12899 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12904 addr_size = (is_32bit_elf ? 4 : 8);
12905 end = mips_pltgot + (2 + count) * addr_size;
12907 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12908 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12909 1, _("Procedure Linkage Table data"));
12913 printf ("\nPLT GOT:\n\n");
12914 printf (_(" Reserved entries:\n"));
12915 printf (_(" %*s %*s Purpose\n"),
12916 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12917 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12918 printf (_(" PLT lazy resolver\n"));
12919 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12920 printf (_(" Module pointer\n"));
12923 printf (_(" Entries:\n"));
12924 printf (" %*s %*s %*s %-7s %3s %s\n",
12925 addr_size * 2, _("Address"),
12926 addr_size * 2, _("Initial"),
12927 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12928 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12929 for (i = 0; i < count; i++)
12931 Elf_Internal_Sym * psym;
12933 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12934 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12936 print_vma (psym->st_value, LONG_HEX);
12937 printf (" %-7s %3s ",
12938 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12939 get_symbol_index_type (psym->st_shndx));
12940 if (VALID_DYNAMIC_NAME (psym->st_name))
12941 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12943 printf (_("<corrupt: %14ld>"), psym->st_name);
12957 process_gnu_liblist (FILE * file)
12959 Elf_Internal_Shdr * section;
12960 Elf_Internal_Shdr * string_sec;
12961 Elf32_External_Lib * elib;
12963 size_t strtab_size;
12970 for (i = 0, section = section_headers;
12971 i < elf_header.e_shnum;
12974 switch (section->sh_type)
12976 case SHT_GNU_LIBLIST:
12977 if (section->sh_link >= elf_header.e_shnum)
12980 elib = (Elf32_External_Lib *)
12981 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12982 _("liblist section data"));
12986 string_sec = section_headers + section->sh_link;
12988 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12989 string_sec->sh_size,
12990 _("liblist string table"));
12992 || section->sh_entsize != sizeof (Elf32_External_Lib))
12998 strtab_size = string_sec->sh_size;
13000 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
13001 SECTION_NAME (section),
13002 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
13004 puts (_(" Library Time Stamp Checksum Version Flags"));
13006 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
13014 liblist.l_name = BYTE_GET (elib[cnt].l_name);
13015 atime = BYTE_GET (elib[cnt].l_time_stamp);
13016 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
13017 liblist.l_version = BYTE_GET (elib[cnt].l_version);
13018 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
13020 tmp = gmtime (&atime);
13021 snprintf (timebuf, sizeof (timebuf),
13022 "%04u-%02u-%02uT%02u:%02u:%02u",
13023 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
13024 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
13026 printf ("%3lu: ", (unsigned long) cnt);
13028 printf ("%-20s", liblist.l_name < strtab_size
13029 ? strtab + liblist.l_name : _("<corrupt>"));
13031 printf ("%-20.20s", liblist.l_name < strtab_size
13032 ? strtab + liblist.l_name : _("<corrupt>"));
13033 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
13034 liblist.l_version, liblist.l_flags);
13045 static const char *
13046 get_note_type (unsigned e_type)
13048 static char buff[64];
13050 if (elf_header.e_type == ET_CORE)
13054 return _("NT_AUXV (auxiliary vector)");
13056 return _("NT_PRSTATUS (prstatus structure)");
13058 return _("NT_FPREGSET (floating point registers)");
13060 return _("NT_PRPSINFO (prpsinfo structure)");
13061 case NT_TASKSTRUCT:
13062 return _("NT_TASKSTRUCT (task structure)");
13064 return _("NT_PRXFPREG (user_xfpregs structure)");
13066 return _("NT_PPC_VMX (ppc Altivec registers)");
13068 return _("NT_PPC_VSX (ppc VSX registers)");
13070 return _("NT_386_TLS (x86 TLS information)");
13071 case NT_386_IOPERM:
13072 return _("NT_386_IOPERM (x86 I/O permissions)");
13073 case NT_X86_XSTATE:
13074 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
13075 case NT_S390_HIGH_GPRS:
13076 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
13077 case NT_S390_TIMER:
13078 return _("NT_S390_TIMER (s390 timer register)");
13079 case NT_S390_TODCMP:
13080 return _("NT_S390_TODCMP (s390 TOD comparator register)");
13081 case NT_S390_TODPREG:
13082 return _("NT_S390_TODPREG (s390 TOD programmable register)");
13084 return _("NT_S390_CTRS (s390 control registers)");
13085 case NT_S390_PREFIX:
13086 return _("NT_S390_PREFIX (s390 prefix register)");
13087 case NT_S390_LAST_BREAK:
13088 return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
13089 case NT_S390_SYSTEM_CALL:
13090 return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
13092 return _("NT_S390_TDB (s390 transaction diagnostic block)");
13094 return _("NT_ARM_VFP (arm VFP registers)");
13096 return _("NT_ARM_TLS (AArch TLS registers)");
13097 case NT_ARM_HW_BREAK:
13098 return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
13099 case NT_ARM_HW_WATCH:
13100 return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
13102 return _("NT_PSTATUS (pstatus structure)");
13104 return _("NT_FPREGS (floating point registers)");
13106 return _("NT_PSINFO (psinfo structure)");
13108 return _("NT_LWPSTATUS (lwpstatus_t structure)");
13110 return _("NT_LWPSINFO (lwpsinfo_t structure)");
13111 case NT_WIN32PSTATUS:
13112 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
13114 return _("NT_SIGINFO (siginfo_t data)");
13116 return _("NT_FILE (mapped files)");
13124 return _("NT_VERSION (version)");
13126 return _("NT_ARCH (architecture)");
13131 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13136 print_core_note (Elf_Internal_Note *pnote)
13138 unsigned int addr_size = is_32bit_elf ? 4 : 8;
13139 bfd_vma count, page_size;
13140 unsigned char *descdata, *filenames, *descend;
13142 if (pnote->type != NT_FILE)
13148 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
13149 /* Still "successful". */
13154 if (pnote->descsz < 2 * addr_size)
13156 printf (_(" Malformed note - too short for header\n"));
13160 descdata = (unsigned char *) pnote->descdata;
13161 descend = descdata + pnote->descsz;
13163 if (descdata[pnote->descsz - 1] != '\0')
13165 printf (_(" Malformed note - does not end with \\0\n"));
13169 count = byte_get (descdata, addr_size);
13170 descdata += addr_size;
13172 page_size = byte_get (descdata, addr_size);
13173 descdata += addr_size;
13175 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
13177 printf (_(" Malformed note - too short for supplied file count\n"));
13181 printf (_(" Page size: "));
13182 print_vma (page_size, DEC);
13185 printf (_(" %*s%*s%*s\n"),
13186 (int) (2 + 2 * addr_size), _("Start"),
13187 (int) (4 + 2 * addr_size), _("End"),
13188 (int) (4 + 2 * addr_size), _("Page Offset"));
13189 filenames = descdata + count * 3 * addr_size;
13190 while (--count > 0)
13192 bfd_vma start, end, file_ofs;
13194 if (filenames == descend)
13196 printf (_(" Malformed note - filenames end too early\n"));
13200 start = byte_get (descdata, addr_size);
13201 descdata += addr_size;
13202 end = byte_get (descdata, addr_size);
13203 descdata += addr_size;
13204 file_ofs = byte_get (descdata, addr_size);
13205 descdata += addr_size;
13208 print_vma (start, FULL_HEX);
13210 print_vma (end, FULL_HEX);
13212 print_vma (file_ofs, FULL_HEX);
13213 printf ("\n %s\n", filenames);
13215 filenames += 1 + strlen ((char *) filenames);
13221 static const char *
13222 get_gnu_elf_note_type (unsigned e_type)
13224 static char buff[64];
13228 case NT_GNU_ABI_TAG:
13229 return _("NT_GNU_ABI_TAG (ABI version tag)");
13231 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
13232 case NT_GNU_BUILD_ID:
13233 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
13234 case NT_GNU_GOLD_VERSION:
13235 return _("NT_GNU_GOLD_VERSION (gold version)");
13240 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13245 print_gnu_note (Elf_Internal_Note *pnote)
13247 switch (pnote->type)
13249 case NT_GNU_BUILD_ID:
13253 printf (_(" Build ID: "));
13254 for (i = 0; i < pnote->descsz; ++i)
13255 printf ("%02x", pnote->descdata[i] & 0xff);
13260 case NT_GNU_ABI_TAG:
13262 unsigned long os, major, minor, subminor;
13263 const char *osname;
13265 os = byte_get ((unsigned char *) pnote->descdata, 4);
13266 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
13267 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
13268 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
13272 case GNU_ABI_TAG_LINUX:
13275 case GNU_ABI_TAG_HURD:
13278 case GNU_ABI_TAG_SOLARIS:
13279 osname = "Solaris";
13281 case GNU_ABI_TAG_FREEBSD:
13282 osname = "FreeBSD";
13284 case GNU_ABI_TAG_NETBSD:
13288 osname = "Unknown";
13292 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
13293 major, minor, subminor);
13301 static const char *
13302 get_netbsd_elfcore_note_type (unsigned e_type)
13304 static char buff[64];
13306 if (e_type == NT_NETBSDCORE_PROCINFO)
13308 /* NetBSD core "procinfo" structure. */
13309 return _("NetBSD procinfo structure");
13312 /* As of Jan 2002 there are no other machine-independent notes
13313 defined for NetBSD core files. If the note type is less
13314 than the start of the machine-dependent note types, we don't
13317 if (e_type < NT_NETBSDCORE_FIRSTMACH)
13319 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13323 switch (elf_header.e_machine)
13325 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
13326 and PT_GETFPREGS == mach+2. */
13331 case EM_SPARC32PLUS:
13335 case NT_NETBSDCORE_FIRSTMACH + 0:
13336 return _("PT_GETREGS (reg structure)");
13337 case NT_NETBSDCORE_FIRSTMACH + 2:
13338 return _("PT_GETFPREGS (fpreg structure)");
13344 /* On all other arch's, PT_GETREGS == mach+1 and
13345 PT_GETFPREGS == mach+3. */
13349 case NT_NETBSDCORE_FIRSTMACH + 1:
13350 return _("PT_GETREGS (reg structure)");
13351 case NT_NETBSDCORE_FIRSTMACH + 3:
13352 return _("PT_GETFPREGS (fpreg structure)");
13358 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
13359 e_type - NT_NETBSDCORE_FIRSTMACH);
13363 static const char *
13364 get_stapsdt_note_type (unsigned e_type)
13366 static char buff[64];
13371 return _("NT_STAPSDT (SystemTap probe descriptors)");
13377 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13382 print_stapsdt_note (Elf_Internal_Note *pnote)
13384 int addr_size = is_32bit_elf ? 4 : 8;
13385 char *data = pnote->descdata;
13386 char *data_end = pnote->descdata + pnote->descsz;
13387 bfd_vma pc, base_addr, semaphore;
13388 char *provider, *probe, *arg_fmt;
13390 pc = byte_get ((unsigned char *) data, addr_size);
13392 base_addr = byte_get ((unsigned char *) data, addr_size);
13394 semaphore = byte_get ((unsigned char *) data, addr_size);
13398 data += strlen (data) + 1;
13400 data += strlen (data) + 1;
13402 data += strlen (data) + 1;
13404 printf (_(" Provider: %s\n"), provider);
13405 printf (_(" Name: %s\n"), probe);
13406 printf (_(" Location: "));
13407 print_vma (pc, FULL_HEX);
13408 printf (_(", Base: "));
13409 print_vma (base_addr, FULL_HEX);
13410 printf (_(", Semaphore: "));
13411 print_vma (semaphore, FULL_HEX);
13413 printf (_(" Arguments: %s\n"), arg_fmt);
13415 return data == data_end;
13418 static const char *
13419 get_ia64_vms_note_type (unsigned e_type)
13421 static char buff[64];
13426 return _("NT_VMS_MHD (module header)");
13428 return _("NT_VMS_LNM (language name)");
13430 return _("NT_VMS_SRC (source files)");
13432 return "NT_VMS_TITLE";
13434 return _("NT_VMS_EIDC (consistency check)");
13435 case NT_VMS_FPMODE:
13436 return _("NT_VMS_FPMODE (FP mode)");
13437 case NT_VMS_LINKTIME:
13438 return "NT_VMS_LINKTIME";
13439 case NT_VMS_IMGNAM:
13440 return _("NT_VMS_IMGNAM (image name)");
13442 return _("NT_VMS_IMGID (image id)");
13443 case NT_VMS_LINKID:
13444 return _("NT_VMS_LINKID (link id)");
13445 case NT_VMS_IMGBID:
13446 return _("NT_VMS_IMGBID (build id)");
13447 case NT_VMS_GSTNAM:
13448 return _("NT_VMS_GSTNAM (sym table name)");
13449 case NT_VMS_ORIG_DYN:
13450 return "NT_VMS_ORIG_DYN";
13451 case NT_VMS_PATCHTIME:
13452 return "NT_VMS_PATCHTIME";
13454 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13460 print_ia64_vms_note (Elf_Internal_Note * pnote)
13462 switch (pnote->type)
13465 if (pnote->descsz > 36)
13467 size_t l = strlen (pnote->descdata + 34);
13468 printf (_(" Creation date : %.17s\n"), pnote->descdata);
13469 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
13470 printf (_(" Module name : %s\n"), pnote->descdata + 34);
13471 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
13474 printf (_(" Invalid size\n"));
13477 printf (_(" Language: %s\n"), pnote->descdata);
13480 case NT_VMS_FPMODE:
13481 printf (_(" Floating Point mode: "));
13482 printf ("0x%016" BFD_VMA_FMT "x\n",
13483 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13485 case NT_VMS_LINKTIME:
13486 printf (_(" Link time: "));
13488 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13491 case NT_VMS_PATCHTIME:
13492 printf (_(" Patch time: "));
13494 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13497 case NT_VMS_ORIG_DYN:
13498 printf (_(" Major id: %u, minor id: %u\n"),
13499 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13500 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13501 printf (_(" Last modified : "));
13503 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13504 printf (_("\n Link flags : "));
13505 printf ("0x%016" BFD_VMA_FMT "x\n",
13506 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13507 printf (_(" Header flags: 0x%08x\n"),
13508 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13509 printf (_(" Image id : %s\n"), pnote->descdata + 32);
13512 case NT_VMS_IMGNAM:
13513 printf (_(" Image name: %s\n"), pnote->descdata);
13515 case NT_VMS_GSTNAM:
13516 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
13519 printf (_(" Image id: %s\n"), pnote->descdata);
13521 case NT_VMS_LINKID:
13522 printf (_(" Linker id: %s\n"), pnote->descdata);
13530 /* Note that by the ELF standard, the name field is already null byte
13531 terminated, and namesz includes the terminating null byte.
13532 I.E. the value of namesz for the name "FSF" is 4.
13534 If the value of namesz is zero, there is no name present. */
13536 process_note (Elf_Internal_Note * pnote)
13538 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13541 if (pnote->namesz == 0)
13542 /* If there is no note name, then use the default set of
13543 note type strings. */
13544 nt = get_note_type (pnote->type);
13546 else if (const_strneq (pnote->namedata, "GNU"))
13547 /* GNU-specific object file notes. */
13548 nt = get_gnu_elf_note_type (pnote->type);
13550 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13551 /* NetBSD-specific core file notes. */
13552 nt = get_netbsd_elfcore_note_type (pnote->type);
13554 else if (strneq (pnote->namedata, "SPU/", 4))
13556 /* SPU-specific core file notes. */
13557 nt = pnote->namedata + 4;
13561 else if (const_strneq (pnote->namedata, "IPF/VMS"))
13562 /* VMS/ia64-specific file notes. */
13563 nt = get_ia64_vms_note_type (pnote->type);
13565 else if (const_strneq (pnote->namedata, "stapsdt"))
13566 nt = get_stapsdt_note_type (pnote->type);
13569 /* Don't recognize this note name; just use the default set of
13570 note type strings. */
13571 nt = get_note_type (pnote->type);
13573 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13575 if (const_strneq (pnote->namedata, "IPF/VMS"))
13576 return print_ia64_vms_note (pnote);
13577 else if (const_strneq (pnote->namedata, "GNU"))
13578 return print_gnu_note (pnote);
13579 else if (const_strneq (pnote->namedata, "stapsdt"))
13580 return print_stapsdt_note (pnote);
13581 else if (const_strneq (pnote->namedata, "CORE"))
13582 return print_core_note (pnote);
13589 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13591 Elf_External_Note * pnotes;
13592 Elf_External_Note * external;
13598 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13600 if (pnotes == NULL)
13605 printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
13606 (unsigned long) offset, (unsigned long) length);
13607 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13609 while ((char *) external < (char *) pnotes + length)
13611 Elf_Internal_Note inote;
13614 char * temp = NULL;
13615 size_t data_remaining = ((char *) pnotes + length) - (char *) external;
13617 if (!is_ia64_vms ())
13619 /* PR binutils/15191
13620 Make sure that there is enough data to read. */
13621 min_notesz = offsetof (Elf_External_Note, name);
13622 if (data_remaining < min_notesz)
13624 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13625 (int) data_remaining);
13628 inote.type = BYTE_GET (external->type);
13629 inote.namesz = BYTE_GET (external->namesz);
13630 inote.namedata = external->name;
13631 inote.descsz = BYTE_GET (external->descsz);
13632 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13633 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13634 next = inote.descdata + align_power (inote.descsz, 2);
13638 Elf64_External_VMS_Note *vms_external;
13640 /* PR binutils/15191
13641 Make sure that there is enough data to read. */
13642 min_notesz = offsetof (Elf64_External_VMS_Note, name);
13643 if (data_remaining < min_notesz)
13645 warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
13646 (int) data_remaining);
13650 vms_external = (Elf64_External_VMS_Note *) external;
13651 inote.type = BYTE_GET (vms_external->type);
13652 inote.namesz = BYTE_GET (vms_external->namesz);
13653 inote.namedata = vms_external->name;
13654 inote.descsz = BYTE_GET (vms_external->descsz);
13655 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13656 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13657 next = inote.descdata + align_power (inote.descsz, 3);
13660 if (inote.descdata < (char *) external + min_notesz
13661 || next < (char *) external + min_notesz
13662 || data_remaining < (size_t)(next - (char *) external))
13664 warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
13665 (unsigned long) ((char *) external - (char *) pnotes));
13666 warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
13667 inote.type, inote.namesz, inote.descsz);
13671 external = (Elf_External_Note *) next;
13673 /* Verify that name is null terminated. It appears that at least
13674 one version of Linux (RedHat 6.0) generates corefiles that don't
13675 comply with the ELF spec by failing to include the null byte in
13677 if (inote.namedata[inote.namesz - 1] != '\0')
13679 temp = (char *) malloc (inote.namesz + 1);
13683 error (_("Out of memory\n"));
13688 strncpy (temp, inote.namedata, inote.namesz);
13689 temp[inote.namesz] = 0;
13691 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
13692 inote.namedata = temp;
13695 res &= process_note (& inote);
13710 process_corefile_note_segments (FILE * file)
13712 Elf_Internal_Phdr * segment;
13716 if (! get_program_headers (file))
13719 for (i = 0, segment = program_headers;
13720 i < elf_header.e_phnum;
13723 if (segment->p_type == PT_NOTE)
13724 res &= process_corefile_note_segment (file,
13725 (bfd_vma) segment->p_offset,
13726 (bfd_vma) segment->p_filesz);
13733 process_note_sections (FILE * file)
13735 Elf_Internal_Shdr * section;
13739 for (i = 0, section = section_headers;
13740 i < elf_header.e_shnum && section != NULL;
13742 if (section->sh_type == SHT_NOTE)
13743 res &= process_corefile_note_segment (file,
13744 (bfd_vma) section->sh_offset,
13745 (bfd_vma) section->sh_size);
13751 process_notes (FILE * file)
13753 /* If we have not been asked to display the notes then do nothing. */
13757 if (elf_header.e_type != ET_CORE)
13758 return process_note_sections (file);
13760 /* No program headers means no NOTE segment. */
13761 if (elf_header.e_phnum > 0)
13762 return process_corefile_note_segments (file);
13764 printf (_("No note segments present in the core file.\n"));
13769 process_arch_specific (FILE * file)
13774 switch (elf_header.e_machine)
13777 return process_arm_specific (file);
13779 case EM_MIPS_RS3_LE:
13780 return process_mips_specific (file);
13783 return process_power_specific (file);
13786 case EM_SPARC32PLUS:
13788 return process_sparc_specific (file);
13791 return process_tic6x_specific (file);
13794 return process_msp430x_specific (file);
13802 get_file_header (FILE * file)
13804 /* Read in the identity array. */
13805 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
13808 /* Determine how to read the rest of the header. */
13809 switch (elf_header.e_ident[EI_DATA])
13811 default: /* fall through */
13812 case ELFDATANONE: /* fall through */
13814 byte_get = byte_get_little_endian;
13815 byte_put = byte_put_little_endian;
13818 byte_get = byte_get_big_endian;
13819 byte_put = byte_put_big_endian;
13823 /* For now we only support 32 bit and 64 bit ELF files. */
13824 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
13826 /* Read in the rest of the header. */
13829 Elf32_External_Ehdr ehdr32;
13831 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
13834 elf_header.e_type = BYTE_GET (ehdr32.e_type);
13835 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
13836 elf_header.e_version = BYTE_GET (ehdr32.e_version);
13837 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
13838 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
13839 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
13840 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
13841 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
13842 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
13843 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
13844 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
13845 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
13846 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
13850 Elf64_External_Ehdr ehdr64;
13852 /* If we have been compiled with sizeof (bfd_vma) == 4, then
13853 we will not be able to cope with the 64bit data found in
13854 64 ELF files. Detect this now and abort before we start
13855 overwriting things. */
13856 if (sizeof (bfd_vma) < 8)
13858 error (_("This instance of readelf has been built without support for a\n\
13859 64 bit data type and so it cannot read 64 bit ELF files.\n"));
13863 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
13866 elf_header.e_type = BYTE_GET (ehdr64.e_type);
13867 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
13868 elf_header.e_version = BYTE_GET (ehdr64.e_version);
13869 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
13870 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
13871 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
13872 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
13873 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
13874 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
13875 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
13876 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
13877 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
13878 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
13881 if (elf_header.e_shoff)
13883 /* There may be some extensions in the first section header. Don't
13884 bomb if we can't read it. */
13886 get_32bit_section_headers (file, 1);
13888 get_64bit_section_headers (file, 1);
13894 /* Process one ELF object file according to the command line options.
13895 This file may actually be stored in an archive. The file is
13896 positioned at the start of the ELF object. */
13899 process_object (char * file_name, FILE * file)
13903 if (! get_file_header (file))
13905 error (_("%s: Failed to read file header\n"), file_name);
13909 /* Initialise per file variables. */
13910 for (i = ARRAY_SIZE (version_info); i--;)
13911 version_info[i] = 0;
13913 for (i = ARRAY_SIZE (dynamic_info); i--;)
13914 dynamic_info[i] = 0;
13915 dynamic_info_DT_GNU_HASH = 0;
13917 /* Process the file. */
13919 printf (_("\nFile: %s\n"), file_name);
13921 /* Initialise the dump_sects array from the cmdline_dump_sects array.
13922 Note we do this even if cmdline_dump_sects is empty because we
13923 must make sure that the dump_sets array is zeroed out before each
13924 object file is processed. */
13925 if (num_dump_sects > num_cmdline_dump_sects)
13926 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13928 if (num_cmdline_dump_sects > 0)
13930 if (num_dump_sects == 0)
13931 /* A sneaky way of allocating the dump_sects array. */
13932 request_dump_bynumber (num_cmdline_dump_sects, 0);
13934 assert (num_dump_sects >= num_cmdline_dump_sects);
13935 memcpy (dump_sects, cmdline_dump_sects,
13936 num_cmdline_dump_sects * sizeof (* dump_sects));
13939 if (! process_file_header ())
13942 if (! process_section_headers (file))
13944 /* Without loaded section headers we cannot process lots of
13946 do_unwind = do_version = do_dump = do_arch = 0;
13948 if (! do_using_dynamic)
13949 do_syms = do_dyn_syms = do_reloc = 0;
13952 if (! process_section_groups (file))
13954 /* Without loaded section groups we cannot process unwind. */
13958 if (process_program_headers (file))
13959 process_dynamic_section (file);
13961 process_relocs (file);
13963 process_unwind (file);
13965 process_symbol_table (file);
13967 process_syminfo (file);
13969 process_version_sections (file);
13971 process_section_contents (file);
13973 process_notes (file);
13975 process_gnu_liblist (file);
13977 process_arch_specific (file);
13979 if (program_headers)
13981 free (program_headers);
13982 program_headers = NULL;
13985 if (section_headers)
13987 free (section_headers);
13988 section_headers = NULL;
13993 free (string_table);
13994 string_table = NULL;
13995 string_table_length = 0;
13998 if (dynamic_strings)
14000 free (dynamic_strings);
14001 dynamic_strings = NULL;
14002 dynamic_strings_length = 0;
14005 if (dynamic_symbols)
14007 free (dynamic_symbols);
14008 dynamic_symbols = NULL;
14009 num_dynamic_syms = 0;
14012 if (dynamic_syminfo)
14014 free (dynamic_syminfo);
14015 dynamic_syminfo = NULL;
14018 if (dynamic_section)
14020 free (dynamic_section);
14021 dynamic_section = NULL;
14024 if (section_headers_groups)
14026 free (section_headers_groups);
14027 section_headers_groups = NULL;
14030 if (section_groups)
14032 struct group_list * g;
14033 struct group_list * next;
14035 for (i = 0; i < group_count; i++)
14037 for (g = section_groups [i].root; g != NULL; g = next)
14044 free (section_groups);
14045 section_groups = NULL;
14048 free_debug_memory ();
14053 /* Process an ELF archive.
14054 On entry the file is positioned just after the ARMAG string. */
14057 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
14059 struct archive_info arch;
14060 struct archive_info nested_arch;
14066 /* The ARCH structure is used to hold information about this archive. */
14067 arch.file_name = NULL;
14069 arch.index_array = NULL;
14070 arch.sym_table = NULL;
14071 arch.longnames = NULL;
14073 /* The NESTED_ARCH structure is used as a single-item cache of information
14074 about a nested archive (when members of a thin archive reside within
14075 another regular archive file). */
14076 nested_arch.file_name = NULL;
14077 nested_arch.file = NULL;
14078 nested_arch.index_array = NULL;
14079 nested_arch.sym_table = NULL;
14080 nested_arch.longnames = NULL;
14082 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
14088 if (do_archive_index)
14090 if (arch.sym_table == NULL)
14091 error (_("%s: unable to dump the index as none was found\n"), file_name);
14095 unsigned long current_pos;
14097 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
14098 file_name, (long) arch.index_num, arch.sym_size);
14099 current_pos = ftell (file);
14101 for (i = l = 0; i < arch.index_num; i++)
14103 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
14105 char * member_name;
14107 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
14109 if (member_name != NULL)
14111 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
14113 if (qualified_name != NULL)
14115 printf (_("Contents of binary %s at offset "), qualified_name);
14116 (void) print_vma (arch.index_array[i], PREFIX_HEX);
14118 free (qualified_name);
14123 if (l >= arch.sym_size)
14125 error (_("%s: end of the symbol table reached before the end of the index\n"),
14129 printf ("\t%s\n", arch.sym_table + l);
14130 l += strlen (arch.sym_table + l) + 1;
14133 if (arch.uses_64bit_indicies)
14138 if (l < arch.sym_size)
14139 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
14140 file_name, arch.sym_size - l);
14142 if (fseek (file, current_pos, SEEK_SET) != 0)
14144 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
14150 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
14151 && !do_segments && !do_header && !do_dump && !do_version
14152 && !do_histogram && !do_debugging && !do_arch && !do_notes
14153 && !do_section_groups && !do_dyn_syms)
14155 ret = 0; /* Archive index only. */
14166 char * qualified_name;
14168 /* Read the next archive header. */
14169 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
14171 error (_("%s: failed to seek to next archive header\n"), file_name);
14174 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
14175 if (got != sizeof arch.arhdr)
14179 error (_("%s: failed to read archive header\n"), file_name);
14183 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
14185 error (_("%s: did not find a valid archive header\n"), arch.file_name);
14190 arch.next_arhdr_offset += sizeof arch.arhdr;
14192 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
14193 if (archive_file_size & 01)
14194 ++archive_file_size;
14196 name = get_archive_member_name (&arch, &nested_arch);
14199 error (_("%s: bad archive file name\n"), file_name);
14203 namelen = strlen (name);
14205 qualified_name = make_qualified_name (&arch, &nested_arch, name);
14206 if (qualified_name == NULL)
14208 error (_("%s: bad archive file name\n"), file_name);
14213 if (is_thin_archive && arch.nested_member_origin == 0)
14215 /* This is a proxy for an external member of a thin archive. */
14216 FILE * member_file;
14217 char * member_file_name = adjust_relative_path (file_name, name, namelen);
14218 if (member_file_name == NULL)
14224 member_file = fopen (member_file_name, "rb");
14225 if (member_file == NULL)
14227 error (_("Input file '%s' is not readable.\n"), member_file_name);
14228 free (member_file_name);
14233 archive_file_offset = arch.nested_member_origin;
14235 ret |= process_object (qualified_name, member_file);
14237 fclose (member_file);
14238 free (member_file_name);
14240 else if (is_thin_archive)
14242 /* PR 15140: Allow for corrupt thin archives. */
14243 if (nested_arch.file == NULL)
14245 error (_("%s: contains corrupt thin archive: %s\n"),
14251 /* This is a proxy for a member of a nested archive. */
14252 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
14254 /* The nested archive file will have been opened and setup by
14255 get_archive_member_name. */
14256 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
14258 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
14263 ret |= process_object (qualified_name, nested_arch.file);
14267 archive_file_offset = arch.next_arhdr_offset;
14268 arch.next_arhdr_offset += archive_file_size;
14270 ret |= process_object (qualified_name, file);
14273 if (dump_sects != NULL)
14277 num_dump_sects = 0;
14280 free (qualified_name);
14284 if (nested_arch.file != NULL)
14285 fclose (nested_arch.file);
14286 release_archive (&nested_arch);
14287 release_archive (&arch);
14293 process_file (char * file_name)
14296 struct stat statbuf;
14297 char armag[SARMAG];
14300 if (stat (file_name, &statbuf) < 0)
14302 if (errno == ENOENT)
14303 error (_("'%s': No such file\n"), file_name);
14305 error (_("Could not locate '%s'. System error message: %s\n"),
14306 file_name, strerror (errno));
14310 if (! S_ISREG (statbuf.st_mode))
14312 error (_("'%s' is not an ordinary file\n"), file_name);
14316 file = fopen (file_name, "rb");
14319 error (_("Input file '%s' is not readable.\n"), file_name);
14323 if (fread (armag, SARMAG, 1, file) != 1)
14325 error (_("%s: Failed to read file's magic number\n"), file_name);
14330 if (memcmp (armag, ARMAG, SARMAG) == 0)
14331 ret = process_archive (file_name, file, FALSE);
14332 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
14333 ret = process_archive (file_name, file, TRUE);
14336 if (do_archive_index)
14337 error (_("File %s is not an archive so its index cannot be displayed.\n"),
14341 archive_file_size = archive_file_offset = 0;
14342 ret = process_object (file_name, file);
14350 #ifdef SUPPORT_DISASSEMBLY
14351 /* Needed by the i386 disassembler. For extra credit, someone could
14352 fix this so that we insert symbolic addresses here, esp for GOT/PLT
14356 print_address (unsigned int addr, FILE * outfile)
14358 fprintf (outfile,"0x%8.8x", addr);
14361 /* Needed by the i386 disassembler. */
14363 db_task_printsym (unsigned int addr)
14365 print_address (addr, stderr);
14370 main (int argc, char ** argv)
14374 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
14375 setlocale (LC_MESSAGES, "");
14377 #if defined (HAVE_SETLOCALE)
14378 setlocale (LC_CTYPE, "");
14380 bindtextdomain (PACKAGE, LOCALEDIR);
14381 textdomain (PACKAGE);
14383 expandargv (&argc, &argv);
14385 parse_args (argc, argv);
14387 if (num_dump_sects > 0)
14389 /* Make a copy of the dump_sects array. */
14390 cmdline_dump_sects = (dump_type *)
14391 malloc (num_dump_sects * sizeof (* dump_sects));
14392 if (cmdline_dump_sects == NULL)
14393 error (_("Out of memory allocating dump request table.\n"));
14396 memcpy (cmdline_dump_sects, dump_sects,
14397 num_dump_sects * sizeof (* dump_sects));
14398 num_cmdline_dump_sects = num_dump_sects;
14402 if (optind < (argc - 1))
14406 while (optind < argc)
14407 err |= process_file (argv[optind++]);
14409 if (dump_sects != NULL)
14411 if (cmdline_dump_sects != NULL)
14412 free (cmdline_dump_sects);