1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
4 Free Software Foundation, Inc.
6 Originally developed by Eric Youngdale <eric@andante.jic.com>
7 Modifications by Nick Clifton <nickc@redhat.com>
9 This file is part of GNU Binutils.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
26 /* The difference between readelf and objdump:
28 Both programs are capable of displaying the contents of ELF format files,
29 so why does the binutils project have two file dumpers ?
31 The reason is that objdump sees an ELF file through a BFD filter of the
32 world; if BFD has a bug where, say, it disagrees about a machine constant
33 in e_flags, then the odds are good that it will remain internally
34 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
35 GAS sees it the BFD way. There was need for a tool to go find out what
36 the file actually says.
38 This is why the readelf program does not link against the BFD library - it
39 exists as an independent program to help verify the correct working of BFD.
41 There is also the case that readelf can provide more information about an
42 ELF file than is provided by objdump. In particular it can display DWARF
43 debugging information which (at the moment) objdump cannot. */
55 /* Define BFD64 here, even if our default architecture is 32 bit ELF
56 as this will allow us to read in and parse 64bit and 32bit ELF files.
57 Only do this if we believe that the compiler can support a 64 bit
58 data type. For now we only rely on GCC being able to do this. */
67 #include "elf/common.h"
68 #include "elf/external.h"
69 #include "elf/internal.h"
72 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
73 we can obtain the H8 reloc numbers. We need these for the
74 get_reloc_size() function. We include h8.h again after defining
75 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
80 /* Undo the effects of #including reloc-macros.h. */
82 #undef START_RELOC_NUMBERS
86 #undef END_RELOC_NUMBERS
87 #undef _RELOC_MACROS_H
89 /* The following headers use the elf/reloc-macros.h file to
90 automatically generate relocation recognition functions
91 such as elf_mips_reloc_type() */
93 #define RELOC_MACROS_GEN_FUNC
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/fr30.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
124 #include "elf/microblaze.h"
125 #include "elf/mips.h"
126 #include "elf/mmix.h"
127 #include "elf/mn10200.h"
128 #include "elf/mn10300.h"
129 #include "elf/moxie.h"
131 #include "elf/msp430.h"
132 #include "elf/or32.h"
135 #include "elf/ppc64.h"
137 #include "elf/s390.h"
138 #include "elf/score.h"
140 #include "elf/sparc.h"
142 #include "elf/tic6x.h"
143 #include "elf/tilegx.h"
144 #include "elf/tilepro.h"
145 #include "elf/v850.h"
147 #include "elf/x86-64.h"
148 #include "elf/xc16x.h"
149 #include "elf/xstormy16.h"
150 #include "elf/xtensa.h"
153 #include "libiberty.h"
154 #include "safe-ctype.h"
155 #include "filenames.h"
157 char * program_name = "readelf";
158 static long archive_file_offset;
159 static unsigned long archive_file_size;
160 static unsigned long dynamic_addr;
161 static bfd_size_type dynamic_size;
162 static unsigned int dynamic_nent;
163 static char * dynamic_strings;
164 static unsigned long dynamic_strings_length;
165 static char * string_table;
166 static unsigned long string_table_length;
167 static unsigned long num_dynamic_syms;
168 static Elf_Internal_Sym * dynamic_symbols;
169 static Elf_Internal_Syminfo * dynamic_syminfo;
170 static unsigned long dynamic_syminfo_offset;
171 static unsigned int dynamic_syminfo_nent;
172 static char program_interpreter[PATH_MAX];
173 static bfd_vma dynamic_info[DT_ENCODING];
174 static bfd_vma dynamic_info_DT_GNU_HASH;
175 static bfd_vma version_info[16];
176 static Elf_Internal_Ehdr elf_header;
177 static Elf_Internal_Shdr * section_headers;
178 static Elf_Internal_Phdr * program_headers;
179 static Elf_Internal_Dyn * dynamic_section;
180 static Elf_Internal_Shdr * symtab_shndx_hdr;
181 static int show_name;
182 static int do_dynamic;
184 static int do_dyn_syms;
186 static int do_sections;
187 static int do_section_groups;
188 static int do_section_details;
189 static int do_segments;
190 static int do_unwind;
191 static int do_using_dynamic;
192 static int do_header;
194 static int do_version;
195 static int do_histogram;
196 static int do_debugging;
199 static int do_archive_index;
200 static int is_32bit_elf;
204 struct group_list * next;
205 unsigned int section_index;
210 struct group_list * root;
211 unsigned int group_index;
214 static size_t group_count;
215 static struct group * section_groups;
216 static struct group ** section_headers_groups;
219 /* Flag bits indicating particular types of dump. */
220 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
221 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
222 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
223 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
224 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
226 typedef unsigned char dump_type;
228 /* A linked list of the section names for which dumps were requested. */
229 struct dump_list_entry
233 struct dump_list_entry * next;
235 static struct dump_list_entry * dump_sects_byname;
237 /* A dynamic array of flags indicating for which sections a dump
238 has been requested via command line switches. */
239 static dump_type * cmdline_dump_sects = NULL;
240 static unsigned int num_cmdline_dump_sects = 0;
242 /* A dynamic array of flags indicating for which sections a dump of
243 some kind has been requested. It is reset on a per-object file
244 basis and then initialised from the cmdline_dump_sects array,
245 the results of interpreting the -w switch, and the
246 dump_sects_byname list. */
247 static dump_type * dump_sects = NULL;
248 static unsigned int num_dump_sects = 0;
251 /* How to print a vma value. */
252 typedef enum print_mode
266 #define SECTION_NAME(X) \
267 ((X) == NULL ? _("<none>") \
268 : string_table == NULL ? _("<no-name>") \
269 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
270 : string_table + (X)->sh_name))
272 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
274 #define GET_ELF_SYMBOLS(file, section) \
275 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
276 : get_64bit_elf_symbols (file, section))
278 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
279 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
280 already been called and verified that the string exists. */
281 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
283 #define REMOVE_ARCH_BITS(ADDR) \
286 if (elf_header.e_machine == EM_ARM) \
291 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
292 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
293 using malloc and fill that. In either case return the pointer to the start of
294 the retrieved data or NULL if something went wrong. If something does go wrong
295 emit an error message using REASON as part of the context. */
298 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
303 if (size == 0 || nmemb == 0)
306 if (fseek (file, archive_file_offset + offset, SEEK_SET))
308 error (_("Unable to seek to 0x%lx for %s\n"),
309 (unsigned long) archive_file_offset + offset, reason);
316 /* Check for overflow. */
317 if (nmemb < (~(size_t) 0 - 1) / size)
318 /* + 1 so that we can '\0' terminate invalid string table sections. */
319 mvar = malloc (size * nmemb + 1);
323 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
324 (unsigned long)(size * nmemb), reason);
328 ((char *) mvar)[size * nmemb] = '\0';
331 if (fread (mvar, size, nmemb, file) != nmemb)
333 error (_("Unable to read in 0x%lx bytes of %s\n"),
334 (unsigned long)(size * nmemb), reason);
343 /* Print a VMA value. */
346 print_vma (bfd_vma vma, print_mode mode)
359 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
366 return printf ("%5" BFD_VMA_FMT "d", vma);
374 return nc + printf ("%" BFD_VMA_FMT "x", vma);
377 return printf ("%" BFD_VMA_FMT "d", vma);
380 return printf ("%" BFD_VMA_FMT "u", vma);
385 /* Display a symbol on stdout. Handles the display of non-printing characters.
387 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
388 truncating as necessary. If WIDTH is negative then format the string to be
389 exactly - WIDTH characters, truncating or padding as necessary.
391 Returns the number of emitted characters. */
394 print_symbol (int width, const char *symbol)
397 bfd_boolean extra_padding = FALSE;
398 unsigned int num_printed = 0;
402 /* Set the width to a very large value. This simplifies the
408 /* Keep the width positive. This also helps. */
410 extra_padding = TRUE;
419 /* Look for non-printing symbols inside the symbol's name.
420 This test is triggered in particular by the names generated
421 by the assembler for local labels. */
432 printf ("%.*s", len, symbol);
438 if (*c == 0 || width == 0)
441 /* Now display the non-printing character, if
442 there is room left in which to dipslay it. */
443 if ((unsigned char) *c < 32)
448 printf ("^%c", *c + 0x40);
458 printf ("<0x%.2x>", (unsigned char) *c);
467 if (extra_padding && width > 0)
469 /* Fill in the remaining spaces. */
470 printf ("%-*s", width, " ");
477 /* Return a pointer to section NAME, or NULL if no such section exists. */
479 static Elf_Internal_Shdr *
480 find_section (const char * name)
484 for (i = 0; i < elf_header.e_shnum; i++)
485 if (streq (SECTION_NAME (section_headers + i), name))
486 return section_headers + i;
491 /* Return a pointer to a section containing ADDR, or NULL if no such
494 static Elf_Internal_Shdr *
495 find_section_by_address (bfd_vma addr)
499 for (i = 0; i < elf_header.e_shnum; i++)
501 Elf_Internal_Shdr *sec = section_headers + i;
502 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
509 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
513 read_uleb128 (unsigned char *data, unsigned int *length_return)
515 return read_leb128 (data, length_return, 0);
518 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
519 This OS has so many departures from the ELF standard that we test it at
525 return elf_header.e_machine == EM_IA_64
526 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
529 /* Guess the relocation size commonly used by the specific machines. */
532 guess_is_rela (unsigned int e_machine)
536 /* Targets that use REL relocations. */
552 /* Targets that use RELA relocations. */
556 case EM_ALTERA_NIOS2:
576 case EM_LATTICEMICO32:
584 case EM_CYGNUS_MN10200:
586 case EM_CYGNUS_MN10300:
615 case EM_MICROBLAZE_OLD:
636 warn (_("Don't know about relocations on this machine architecture\n"));
642 slurp_rela_relocs (FILE * file,
643 unsigned long rel_offset,
644 unsigned long rel_size,
645 Elf_Internal_Rela ** relasp,
646 unsigned long * nrelasp)
648 Elf_Internal_Rela * relas;
649 unsigned long nrelas;
654 Elf32_External_Rela * erelas;
656 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
657 rel_size, _("relocs"));
661 nrelas = rel_size / sizeof (Elf32_External_Rela);
663 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
664 sizeof (Elf_Internal_Rela));
669 error (_("out of memory parsing relocs\n"));
673 for (i = 0; i < nrelas; i++)
675 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
676 relas[i].r_info = BYTE_GET (erelas[i].r_info);
677 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
684 Elf64_External_Rela * erelas;
686 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
687 rel_size, _("relocs"));
691 nrelas = rel_size / sizeof (Elf64_External_Rela);
693 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
694 sizeof (Elf_Internal_Rela));
699 error (_("out of memory parsing relocs\n"));
703 for (i = 0; i < nrelas; i++)
705 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
706 relas[i].r_info = BYTE_GET (erelas[i].r_info);
707 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
709 /* The #ifdef BFD64 below is to prevent a compile time
710 warning. We know that if we do not have a 64 bit data
711 type that we will never execute this code anyway. */
713 if (elf_header.e_machine == EM_MIPS
714 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
716 /* In little-endian objects, r_info isn't really a
717 64-bit little-endian value: it has a 32-bit
718 little-endian symbol index followed by four
719 individual byte fields. Reorder INFO
721 bfd_vma inf = relas[i].r_info;
722 inf = (((inf & 0xffffffff) << 32)
723 | ((inf >> 56) & 0xff)
724 | ((inf >> 40) & 0xff00)
725 | ((inf >> 24) & 0xff0000)
726 | ((inf >> 8) & 0xff000000));
727 relas[i].r_info = inf;
740 slurp_rel_relocs (FILE * file,
741 unsigned long rel_offset,
742 unsigned long rel_size,
743 Elf_Internal_Rela ** relsp,
744 unsigned long * nrelsp)
746 Elf_Internal_Rela * rels;
752 Elf32_External_Rel * erels;
754 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
755 rel_size, _("relocs"));
759 nrels = rel_size / sizeof (Elf32_External_Rel);
761 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
766 error (_("out of memory parsing relocs\n"));
770 for (i = 0; i < nrels; i++)
772 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
773 rels[i].r_info = BYTE_GET (erels[i].r_info);
774 rels[i].r_addend = 0;
781 Elf64_External_Rel * erels;
783 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
784 rel_size, _("relocs"));
788 nrels = rel_size / sizeof (Elf64_External_Rel);
790 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
795 error (_("out of memory parsing relocs\n"));
799 for (i = 0; i < nrels; i++)
801 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
802 rels[i].r_info = BYTE_GET (erels[i].r_info);
803 rels[i].r_addend = 0;
805 /* The #ifdef BFD64 below is to prevent a compile time
806 warning. We know that if we do not have a 64 bit data
807 type that we will never execute this code anyway. */
809 if (elf_header.e_machine == EM_MIPS
810 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
812 /* In little-endian objects, r_info isn't really a
813 64-bit little-endian value: it has a 32-bit
814 little-endian symbol index followed by four
815 individual byte fields. Reorder INFO
817 bfd_vma inf = rels[i].r_info;
818 inf = (((inf & 0xffffffff) << 32)
819 | ((inf >> 56) & 0xff)
820 | ((inf >> 40) & 0xff00)
821 | ((inf >> 24) & 0xff0000)
822 | ((inf >> 8) & 0xff000000));
823 rels[i].r_info = inf;
835 /* Returns the reloc type extracted from the reloc info field. */
838 get_reloc_type (bfd_vma reloc_info)
841 return ELF32_R_TYPE (reloc_info);
843 switch (elf_header.e_machine)
846 /* Note: We assume that reloc_info has already been adjusted for us. */
847 return ELF64_MIPS_R_TYPE (reloc_info);
850 return ELF64_R_TYPE_ID (reloc_info);
853 return ELF64_R_TYPE (reloc_info);
857 /* Return the symbol index extracted from the reloc info field. */
860 get_reloc_symindex (bfd_vma reloc_info)
862 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
865 /* Display the contents of the relocation data found at the specified
869 dump_relocations (FILE * file,
870 unsigned long rel_offset,
871 unsigned long rel_size,
872 Elf_Internal_Sym * symtab,
875 unsigned long strtablen,
879 Elf_Internal_Rela * rels;
881 if (is_rela == UNKNOWN)
882 is_rela = guess_is_rela (elf_header.e_machine);
886 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
891 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
900 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
902 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
907 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
909 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
917 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
919 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
924 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
926 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
930 for (i = 0; i < rel_size; i++)
935 bfd_vma symtab_index;
938 offset = rels[i].r_offset;
939 inf = rels[i].r_info;
941 type = get_reloc_type (inf);
942 symtab_index = get_reloc_symindex (inf);
946 printf ("%8.8lx %8.8lx ",
947 (unsigned long) offset & 0xffffffff,
948 (unsigned long) inf & 0xffffffff);
952 #if BFD_HOST_64BIT_LONG
954 ? "%16.16lx %16.16lx "
955 : "%12.12lx %12.12lx ",
957 #elif BFD_HOST_64BIT_LONG_LONG
960 ? "%16.16llx %16.16llx "
961 : "%12.12llx %12.12llx ",
965 ? "%16.16I64x %16.16I64x "
966 : "%12.12I64x %12.12I64x ",
971 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
972 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
973 _bfd_int64_high (offset),
974 _bfd_int64_low (offset),
975 _bfd_int64_high (inf),
976 _bfd_int64_low (inf));
980 switch (elf_header.e_machine)
988 rtype = elf_m32r_reloc_type (type);
993 rtype = elf_i386_reloc_type (type);
998 rtype = elf_m68hc11_reloc_type (type);
1002 rtype = elf_m68k_reloc_type (type);
1006 rtype = elf_i960_reloc_type (type);
1011 rtype = elf_avr_reloc_type (type);
1014 case EM_OLD_SPARCV9:
1015 case EM_SPARC32PLUS:
1018 rtype = elf_sparc_reloc_type (type);
1022 rtype = elf_spu_reloc_type (type);
1026 case EM_CYGNUS_V850:
1027 rtype = v850_reloc_type (type);
1031 case EM_CYGNUS_D10V:
1032 rtype = elf_d10v_reloc_type (type);
1036 case EM_CYGNUS_D30V:
1037 rtype = elf_d30v_reloc_type (type);
1041 rtype = elf_dlx_reloc_type (type);
1045 rtype = elf_sh_reloc_type (type);
1049 case EM_CYGNUS_MN10300:
1050 rtype = elf_mn10300_reloc_type (type);
1054 case EM_CYGNUS_MN10200:
1055 rtype = elf_mn10200_reloc_type (type);
1059 case EM_CYGNUS_FR30:
1060 rtype = elf_fr30_reloc_type (type);
1064 rtype = elf_frv_reloc_type (type);
1068 rtype = elf_mcore_reloc_type (type);
1072 rtype = elf_mmix_reloc_type (type);
1076 rtype = elf_moxie_reloc_type (type);
1081 rtype = elf_msp430_reloc_type (type);
1085 rtype = elf_ppc_reloc_type (type);
1089 rtype = elf_ppc64_reloc_type (type);
1093 case EM_MIPS_RS3_LE:
1094 rtype = elf_mips_reloc_type (type);
1098 rtype = elf_alpha_reloc_type (type);
1102 rtype = elf_arm_reloc_type (type);
1106 rtype = elf_arc_reloc_type (type);
1110 rtype = elf_hppa_reloc_type (type);
1116 rtype = elf_h8_reloc_type (type);
1121 rtype = elf_or32_reloc_type (type);
1126 rtype = elf_pj_reloc_type (type);
1129 rtype = elf_ia64_reloc_type (type);
1133 rtype = elf_cris_reloc_type (type);
1137 rtype = elf_i860_reloc_type (type);
1143 rtype = elf_x86_64_reloc_type (type);
1147 rtype = i370_reloc_type (type);
1152 rtype = elf_s390_reloc_type (type);
1156 rtype = elf_score_reloc_type (type);
1160 rtype = elf_xstormy16_reloc_type (type);
1164 rtype = elf_crx_reloc_type (type);
1168 rtype = elf_vax_reloc_type (type);
1173 rtype = elf_ip2k_reloc_type (type);
1177 rtype = elf_iq2000_reloc_type (type);
1182 rtype = elf_xtensa_reloc_type (type);
1185 case EM_LATTICEMICO32:
1186 rtype = elf_lm32_reloc_type (type);
1191 rtype = elf_m32c_reloc_type (type);
1195 rtype = elf_mt_reloc_type (type);
1199 rtype = elf_bfin_reloc_type (type);
1203 rtype = elf_mep_reloc_type (type);
1208 rtype = elf_cr16_reloc_type (type);
1212 case EM_MICROBLAZE_OLD:
1213 rtype = elf_microblaze_reloc_type (type);
1217 rtype = elf_rx_reloc_type (type);
1222 rtype = elf_xc16x_reloc_type (type);
1226 rtype = elf_tic6x_reloc_type (type);
1230 rtype = elf_tilegx_reloc_type (type);
1234 rtype = elf_tilepro_reloc_type (type);
1239 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1241 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1243 if (elf_header.e_machine == EM_ALPHA
1245 && streq (rtype, "R_ALPHA_LITUSE")
1248 switch (rels[i].r_addend)
1250 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1251 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1252 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1253 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1254 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1255 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1256 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1257 default: rtype = NULL;
1260 printf (" (%s)", rtype);
1264 printf (_("<unknown addend: %lx>"),
1265 (unsigned long) rels[i].r_addend);
1268 else if (symtab_index)
1270 if (symtab == NULL || symtab_index >= nsyms)
1271 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1274 Elf_Internal_Sym * psym;
1276 psym = symtab + symtab_index;
1280 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1284 unsigned int width = is_32bit_elf ? 8 : 14;
1286 /* Relocations against GNU_IFUNC symbols do not use the value
1287 of the symbol as the address to relocate against. Instead
1288 they invoke the function named by the symbol and use its
1289 result as the address for relocation.
1291 To indicate this to the user, do not display the value of
1292 the symbol in the "Symbols's Value" field. Instead show
1293 its name followed by () as a hint that the symbol is
1297 || psym->st_name == 0
1298 || psym->st_name >= strtablen)
1301 name = strtab + psym->st_name;
1303 len = print_symbol (width, name);
1304 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1308 print_vma (psym->st_value, LONG_HEX);
1310 printf (is_32bit_elf ? " " : " ");
1313 if (psym->st_name == 0)
1315 const char * sec_name = "<null>";
1318 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1320 if (psym->st_shndx < elf_header.e_shnum)
1322 = SECTION_NAME (section_headers + psym->st_shndx);
1323 else if (psym->st_shndx == SHN_ABS)
1325 else if (psym->st_shndx == SHN_COMMON)
1326 sec_name = "COMMON";
1327 else if ((elf_header.e_machine == EM_MIPS
1328 && psym->st_shndx == SHN_MIPS_SCOMMON)
1329 || (elf_header.e_machine == EM_TI_C6000
1330 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1331 sec_name = "SCOMMON";
1332 else if (elf_header.e_machine == EM_MIPS
1333 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1334 sec_name = "SUNDEF";
1335 else if ((elf_header.e_machine == EM_X86_64
1336 || elf_header.e_machine == EM_L1OM
1337 || elf_header.e_machine == EM_K1OM)
1338 && psym->st_shndx == SHN_X86_64_LCOMMON)
1339 sec_name = "LARGE_COMMON";
1340 else if (elf_header.e_machine == EM_IA_64
1341 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1342 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1343 sec_name = "ANSI_COM";
1344 else if (is_ia64_vms ()
1345 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1346 sec_name = "VMS_SYMVEC";
1349 sprintf (name_buf, "<section 0x%x>",
1350 (unsigned int) psym->st_shndx);
1351 sec_name = name_buf;
1354 print_symbol (22, sec_name);
1356 else if (strtab == NULL)
1357 printf (_("<string table index: %3ld>"), psym->st_name);
1358 else if (psym->st_name >= strtablen)
1359 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1361 print_symbol (22, strtab + psym->st_name);
1365 bfd_signed_vma off = rels[i].r_addend;
1368 printf (" - %" BFD_VMA_FMT "x", - off);
1370 printf (" + %" BFD_VMA_FMT "x", off);
1376 printf ("%*c", is_32bit_elf ?
1377 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1378 print_vma (rels[i].r_addend, LONG_HEX);
1381 if (elf_header.e_machine == EM_SPARCV9
1383 && streq (rtype, "R_SPARC_OLO10"))
1384 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1389 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1391 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1392 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1393 const char * rtype2 = elf_mips_reloc_type (type2);
1394 const char * rtype3 = elf_mips_reloc_type (type3);
1396 printf (" Type2: ");
1399 printf (_("unrecognized: %-7lx"),
1400 (unsigned long) type2 & 0xffffffff);
1402 printf ("%-17.17s", rtype2);
1404 printf ("\n Type3: ");
1407 printf (_("unrecognized: %-7lx"),
1408 (unsigned long) type3 & 0xffffffff);
1410 printf ("%-17.17s", rtype3);
1421 get_mips_dynamic_type (unsigned long type)
1425 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1426 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1427 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1428 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1429 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1430 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1431 case DT_MIPS_MSYM: return "MIPS_MSYM";
1432 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1433 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1434 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1435 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1436 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1437 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1438 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1439 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1440 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1441 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1442 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1443 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1444 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1445 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1446 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1447 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1448 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1449 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1450 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1451 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1452 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1453 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1454 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1455 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1456 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1457 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1458 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1459 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1460 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1461 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1462 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1463 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1464 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1465 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1466 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1467 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1468 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1469 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1476 get_sparc64_dynamic_type (unsigned long type)
1480 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1487 get_ppc_dynamic_type (unsigned long type)
1491 case DT_PPC_GOT: return "PPC_GOT";
1492 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1499 get_ppc64_dynamic_type (unsigned long type)
1503 case DT_PPC64_GLINK: return "PPC64_GLINK";
1504 case DT_PPC64_OPD: return "PPC64_OPD";
1505 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1506 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1513 get_parisc_dynamic_type (unsigned long type)
1517 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1518 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1519 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1520 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1521 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1522 case DT_HP_PREINIT: return "HP_PREINIT";
1523 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1524 case DT_HP_NEEDED: return "HP_NEEDED";
1525 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1526 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1527 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1528 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1529 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1530 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1531 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1532 case DT_HP_FILTERED: return "HP_FILTERED";
1533 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1534 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1535 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1536 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1537 case DT_PLT: return "PLT";
1538 case DT_PLT_SIZE: return "PLT_SIZE";
1539 case DT_DLT: return "DLT";
1540 case DT_DLT_SIZE: return "DLT_SIZE";
1547 get_ia64_dynamic_type (unsigned long type)
1551 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1552 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1553 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1554 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1555 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1556 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1557 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1558 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1559 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1560 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1561 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1562 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1563 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1564 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1565 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1566 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1567 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1568 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1569 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1570 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1571 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1572 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1573 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1574 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1575 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1576 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1577 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1578 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1579 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1580 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1581 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1588 get_alpha_dynamic_type (unsigned long type)
1592 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1599 get_score_dynamic_type (unsigned long type)
1603 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1604 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1605 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1606 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1607 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1608 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1615 get_tic6x_dynamic_type (unsigned long type)
1619 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1620 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1621 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1622 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1623 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1624 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1631 get_dynamic_type (unsigned long type)
1633 static char buff[64];
1637 case DT_NULL: return "NULL";
1638 case DT_NEEDED: return "NEEDED";
1639 case DT_PLTRELSZ: return "PLTRELSZ";
1640 case DT_PLTGOT: return "PLTGOT";
1641 case DT_HASH: return "HASH";
1642 case DT_STRTAB: return "STRTAB";
1643 case DT_SYMTAB: return "SYMTAB";
1644 case DT_RELA: return "RELA";
1645 case DT_RELASZ: return "RELASZ";
1646 case DT_RELAENT: return "RELAENT";
1647 case DT_STRSZ: return "STRSZ";
1648 case DT_SYMENT: return "SYMENT";
1649 case DT_INIT: return "INIT";
1650 case DT_FINI: return "FINI";
1651 case DT_SONAME: return "SONAME";
1652 case DT_RPATH: return "RPATH";
1653 case DT_SYMBOLIC: return "SYMBOLIC";
1654 case DT_REL: return "REL";
1655 case DT_RELSZ: return "RELSZ";
1656 case DT_RELENT: return "RELENT";
1657 case DT_PLTREL: return "PLTREL";
1658 case DT_DEBUG: return "DEBUG";
1659 case DT_TEXTREL: return "TEXTREL";
1660 case DT_JMPREL: return "JMPREL";
1661 case DT_BIND_NOW: return "BIND_NOW";
1662 case DT_INIT_ARRAY: return "INIT_ARRAY";
1663 case DT_FINI_ARRAY: return "FINI_ARRAY";
1664 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1665 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1666 case DT_RUNPATH: return "RUNPATH";
1667 case DT_FLAGS: return "FLAGS";
1669 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1670 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1672 case DT_CHECKSUM: return "CHECKSUM";
1673 case DT_PLTPADSZ: return "PLTPADSZ";
1674 case DT_MOVEENT: return "MOVEENT";
1675 case DT_MOVESZ: return "MOVESZ";
1676 case DT_FEATURE: return "FEATURE";
1677 case DT_POSFLAG_1: return "POSFLAG_1";
1678 case DT_SYMINSZ: return "SYMINSZ";
1679 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1681 case DT_ADDRRNGLO: return "ADDRRNGLO";
1682 case DT_CONFIG: return "CONFIG";
1683 case DT_DEPAUDIT: return "DEPAUDIT";
1684 case DT_AUDIT: return "AUDIT";
1685 case DT_PLTPAD: return "PLTPAD";
1686 case DT_MOVETAB: return "MOVETAB";
1687 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1689 case DT_VERSYM: return "VERSYM";
1691 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1692 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1693 case DT_RELACOUNT: return "RELACOUNT";
1694 case DT_RELCOUNT: return "RELCOUNT";
1695 case DT_FLAGS_1: return "FLAGS_1";
1696 case DT_VERDEF: return "VERDEF";
1697 case DT_VERDEFNUM: return "VERDEFNUM";
1698 case DT_VERNEED: return "VERNEED";
1699 case DT_VERNEEDNUM: return "VERNEEDNUM";
1701 case DT_AUXILIARY: return "AUXILIARY";
1702 case DT_USED: return "USED";
1703 case DT_FILTER: return "FILTER";
1705 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1706 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1707 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1708 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1709 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1710 case DT_GNU_HASH: return "GNU_HASH";
1713 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1715 const char * result;
1717 switch (elf_header.e_machine)
1720 case EM_MIPS_RS3_LE:
1721 result = get_mips_dynamic_type (type);
1724 result = get_sparc64_dynamic_type (type);
1727 result = get_ppc_dynamic_type (type);
1730 result = get_ppc64_dynamic_type (type);
1733 result = get_ia64_dynamic_type (type);
1736 result = get_alpha_dynamic_type (type);
1739 result = get_score_dynamic_type (type);
1742 result = get_tic6x_dynamic_type (type);
1752 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1754 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1755 || (elf_header.e_machine == EM_PARISC
1756 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1758 const char * result;
1760 switch (elf_header.e_machine)
1763 result = get_parisc_dynamic_type (type);
1766 result = get_ia64_dynamic_type (type);
1776 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1780 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1787 get_file_type (unsigned e_type)
1789 static char buff[32];
1793 case ET_NONE: return _("NONE (None)");
1794 case ET_REL: return _("REL (Relocatable file)");
1795 case ET_EXEC: return _("EXEC (Executable file)");
1796 case ET_DYN: return _("DYN (Shared object file)");
1797 case ET_CORE: return _("CORE (Core file)");
1800 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1801 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1802 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1803 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1805 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1811 get_machine_name (unsigned e_machine)
1813 static char buff[64]; /* XXX */
1817 case EM_NONE: return _("None");
1818 case EM_M32: return "WE32100";
1819 case EM_SPARC: return "Sparc";
1820 case EM_SPU: return "SPU";
1821 case EM_386: return "Intel 80386";
1822 case EM_68K: return "MC68000";
1823 case EM_88K: return "MC88000";
1824 case EM_486: return "Intel 80486";
1825 case EM_860: return "Intel 80860";
1826 case EM_MIPS: return "MIPS R3000";
1827 case EM_S370: return "IBM System/370";
1828 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1829 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1830 case EM_PARISC: return "HPPA";
1831 case EM_PPC_OLD: return "Power PC (old)";
1832 case EM_SPARC32PLUS: return "Sparc v8+" ;
1833 case EM_960: return "Intel 90860";
1834 case EM_PPC: return "PowerPC";
1835 case EM_PPC64: return "PowerPC64";
1836 case EM_V800: return "NEC V800";
1837 case EM_FR20: return "Fujitsu FR20";
1838 case EM_RH32: return "TRW RH32";
1839 case EM_MCORE: return "MCORE";
1840 case EM_ARM: return "ARM";
1841 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1842 case EM_SH: return "Renesas / SuperH SH";
1843 case EM_SPARCV9: return "Sparc v9";
1844 case EM_TRICORE: return "Siemens Tricore";
1845 case EM_ARC: return "ARC";
1846 case EM_H8_300: return "Renesas H8/300";
1847 case EM_H8_300H: return "Renesas H8/300H";
1848 case EM_H8S: return "Renesas H8S";
1849 case EM_H8_500: return "Renesas H8/500";
1850 case EM_IA_64: return "Intel IA-64";
1851 case EM_MIPS_X: return "Stanford MIPS-X";
1852 case EM_COLDFIRE: return "Motorola Coldfire";
1853 case EM_68HC12: return "Motorola M68HC12";
1854 case EM_ALPHA: return "Alpha";
1855 case EM_CYGNUS_D10V:
1856 case EM_D10V: return "d10v";
1857 case EM_CYGNUS_D30V:
1858 case EM_D30V: return "d30v";
1859 case EM_CYGNUS_M32R:
1860 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1861 case EM_CYGNUS_V850:
1862 case EM_V850: return "Renesas v850";
1863 case EM_CYGNUS_MN10300:
1864 case EM_MN10300: return "mn10300";
1865 case EM_CYGNUS_MN10200:
1866 case EM_MN10200: return "mn10200";
1867 case EM_MOXIE: return "Moxie";
1868 case EM_CYGNUS_FR30:
1869 case EM_FR30: return "Fujitsu FR30";
1870 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1872 case EM_PJ: return "picoJava";
1873 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1874 case EM_PCP: return "Siemens PCP";
1875 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1876 case EM_NDR1: return "Denso NDR1 microprocesspr";
1877 case EM_STARCORE: return "Motorola Star*Core processor";
1878 case EM_ME16: return "Toyota ME16 processor";
1879 case EM_ST100: return "STMicroelectronics ST100 processor";
1880 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1881 case EM_PDSP: return "Sony DSP processor";
1882 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1883 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1884 case EM_FX66: return "Siemens FX66 microcontroller";
1885 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1886 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1887 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1888 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1889 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1890 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1891 case EM_SVX: return "Silicon Graphics SVx";
1892 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1893 case EM_VAX: return "Digital VAX";
1895 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1896 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1897 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1898 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1899 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1900 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1901 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1902 case EM_PRISM: return "Vitesse Prism";
1903 case EM_X86_64: return "Advanced Micro Devices X86-64";
1904 case EM_L1OM: return "Intel L1OM";
1905 case EM_K1OM: return "Intel K1OM";
1907 case EM_S390: return "IBM S/390";
1908 case EM_SCORE: return "SUNPLUS S+Core";
1909 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
1911 case EM_OR32: return "OpenRISC";
1912 case EM_ARC_A5: return "ARC International ARCompact processor";
1913 case EM_CRX: return "National Semiconductor CRX microprocessor";
1914 case EM_DLX: return "OpenDLX";
1916 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1917 case EM_IQ2000: return "Vitesse IQ2000";
1919 case EM_XTENSA: return "Tensilica Xtensa Processor";
1920 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
1921 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
1922 case EM_NS32K: return "National Semiconductor 32000 series";
1923 case EM_TPC: return "Tenor Network TPC processor";
1924 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
1925 case EM_MAX: return "MAX Processor";
1926 case EM_CR: return "National Semiconductor CompactRISC";
1927 case EM_F2MC16: return "Fujitsu F2MC16";
1928 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
1929 case EM_LATTICEMICO32: return "Lattice Mico32";
1931 case EM_M32C: return "Renesas M32c";
1932 case EM_MT: return "Morpho Techologies MT processor";
1933 case EM_BLACKFIN: return "Analog Devices Blackfin";
1934 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
1935 case EM_SEP: return "Sharp embedded microprocessor";
1936 case EM_ARCA: return "Arca RISC microprocessor";
1937 case EM_UNICORE: return "Unicore";
1938 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
1939 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
1940 case EM_NIOS32: return "Altera Nios";
1941 case EM_ALTERA_NIOS2: return "Altera Nios II";
1943 case EM_XC16X: return "Infineon Technologies xc16x";
1944 case EM_M16C: return "Renesas M16C series microprocessors";
1945 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
1946 case EM_CE: return "Freescale Communication Engine RISC core";
1947 case EM_TSK3000: return "Altium TSK3000 core";
1948 case EM_RS08: return "Freescale RS08 embedded processor";
1949 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
1950 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
1951 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
1952 case EM_SE_C17: return "Seiko Epson C17 family";
1953 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
1954 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
1955 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
1956 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
1957 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
1958 case EM_R32C: return "Renesas R32C series microprocessors";
1959 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
1960 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
1961 case EM_8051: return "Intel 8051 and variants";
1962 case EM_STXP7X: return "STMicroelectronics STxP7x family";
1963 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
1964 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
1965 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
1966 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
1967 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
1968 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
1969 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
1971 case EM_CR16_OLD: return "National Semiconductor's CR16";
1972 case EM_MICROBLAZE: return "Xilinx MicroBlaze";
1973 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
1974 case EM_RX: return "Renesas RX";
1975 case EM_METAG: return "Imagination Technologies META processor architecture";
1976 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
1977 case EM_ECOG16: return "Cyan Technology eCOG16 family";
1978 case EM_ETPU: return "Freescale Extended Time Processing Unit";
1979 case EM_SLE9X: return "Infineon Technologies SLE9X core";
1980 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
1981 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
1982 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
1983 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
1984 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
1985 case EM_CUDA: return "NVIDIA CUDA architecture";
1987 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
1993 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1998 eabi = EF_ARM_EABI_VERSION (e_flags);
1999 e_flags &= ~ EF_ARM_EABIMASK;
2001 /* Handle "generic" ARM flags. */
2002 if (e_flags & EF_ARM_RELEXEC)
2004 strcat (buf, ", relocatable executable");
2005 e_flags &= ~ EF_ARM_RELEXEC;
2008 if (e_flags & EF_ARM_HASENTRY)
2010 strcat (buf, ", has entry point");
2011 e_flags &= ~ EF_ARM_HASENTRY;
2014 /* Now handle EABI specific flags. */
2018 strcat (buf, ", <unrecognized EABI>");
2023 case EF_ARM_EABI_VER1:
2024 strcat (buf, ", Version1 EABI");
2029 /* Process flags one bit at a time. */
2030 flag = e_flags & - e_flags;
2035 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2036 strcat (buf, ", sorted symbol tables");
2046 case EF_ARM_EABI_VER2:
2047 strcat (buf, ", Version2 EABI");
2052 /* Process flags one bit at a time. */
2053 flag = e_flags & - e_flags;
2058 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2059 strcat (buf, ", sorted symbol tables");
2062 case EF_ARM_DYNSYMSUSESEGIDX:
2063 strcat (buf, ", dynamic symbols use segment index");
2066 case EF_ARM_MAPSYMSFIRST:
2067 strcat (buf, ", mapping symbols precede others");
2077 case EF_ARM_EABI_VER3:
2078 strcat (buf, ", Version3 EABI");
2081 case EF_ARM_EABI_VER4:
2082 strcat (buf, ", Version4 EABI");
2085 case EF_ARM_EABI_VER5:
2086 strcat (buf, ", Version5 EABI");
2092 /* Process flags one bit at a time. */
2093 flag = e_flags & - e_flags;
2099 strcat (buf, ", BE8");
2103 strcat (buf, ", LE8");
2113 case EF_ARM_EABI_UNKNOWN:
2114 strcat (buf, ", GNU EABI");
2119 /* Process flags one bit at a time. */
2120 flag = e_flags & - e_flags;
2125 case EF_ARM_INTERWORK:
2126 strcat (buf, ", interworking enabled");
2129 case EF_ARM_APCS_26:
2130 strcat (buf, ", uses APCS/26");
2133 case EF_ARM_APCS_FLOAT:
2134 strcat (buf, ", uses APCS/float");
2138 strcat (buf, ", position independent");
2142 strcat (buf, ", 8 bit structure alignment");
2145 case EF_ARM_NEW_ABI:
2146 strcat (buf, ", uses new ABI");
2149 case EF_ARM_OLD_ABI:
2150 strcat (buf, ", uses old ABI");
2153 case EF_ARM_SOFT_FLOAT:
2154 strcat (buf, ", software FP");
2157 case EF_ARM_VFP_FLOAT:
2158 strcat (buf, ", VFP");
2161 case EF_ARM_MAVERICK_FLOAT:
2162 strcat (buf, ", Maverick FP");
2173 strcat (buf,_(", <unknown>"));
2177 get_machine_flags (unsigned e_flags, unsigned e_machine)
2179 static char buf[1024];
2191 decode_ARM_machine_flags (e_flags, buf);
2195 if (e_flags & EF_BFIN_PIC)
2196 strcat (buf, ", PIC");
2198 if (e_flags & EF_BFIN_FDPIC)
2199 strcat (buf, ", FDPIC");
2201 if (e_flags & EF_BFIN_CODE_IN_L1)
2202 strcat (buf, ", code in L1");
2204 if (e_flags & EF_BFIN_DATA_IN_L1)
2205 strcat (buf, ", data in L1");
2210 switch (e_flags & EF_FRV_CPU_MASK)
2212 case EF_FRV_CPU_GENERIC:
2216 strcat (buf, ", fr???");
2219 case EF_FRV_CPU_FR300:
2220 strcat (buf, ", fr300");
2223 case EF_FRV_CPU_FR400:
2224 strcat (buf, ", fr400");
2226 case EF_FRV_CPU_FR405:
2227 strcat (buf, ", fr405");
2230 case EF_FRV_CPU_FR450:
2231 strcat (buf, ", fr450");
2234 case EF_FRV_CPU_FR500:
2235 strcat (buf, ", fr500");
2237 case EF_FRV_CPU_FR550:
2238 strcat (buf, ", fr550");
2241 case EF_FRV_CPU_SIMPLE:
2242 strcat (buf, ", simple");
2244 case EF_FRV_CPU_TOMCAT:
2245 strcat (buf, ", tomcat");
2251 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2252 strcat (buf, ", m68000");
2253 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2254 strcat (buf, ", cpu32");
2255 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2256 strcat (buf, ", fido_a");
2259 char const * isa = _("unknown");
2260 char const * mac = _("unknown mac");
2261 char const * additional = NULL;
2263 switch (e_flags & EF_M68K_CF_ISA_MASK)
2265 case EF_M68K_CF_ISA_A_NODIV:
2267 additional = ", nodiv";
2269 case EF_M68K_CF_ISA_A:
2272 case EF_M68K_CF_ISA_A_PLUS:
2275 case EF_M68K_CF_ISA_B_NOUSP:
2277 additional = ", nousp";
2279 case EF_M68K_CF_ISA_B:
2282 case EF_M68K_CF_ISA_C:
2285 case EF_M68K_CF_ISA_C_NODIV:
2287 additional = ", nodiv";
2290 strcat (buf, ", cf, isa ");
2293 strcat (buf, additional);
2294 if (e_flags & EF_M68K_CF_FLOAT)
2295 strcat (buf, ", float");
2296 switch (e_flags & EF_M68K_CF_MAC_MASK)
2301 case EF_M68K_CF_MAC:
2304 case EF_M68K_CF_EMAC:
2307 case EF_M68K_CF_EMAC_B:
2320 if (e_flags & EF_PPC_EMB)
2321 strcat (buf, ", emb");
2323 if (e_flags & EF_PPC_RELOCATABLE)
2324 strcat (buf, _(", relocatable"));
2326 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2327 strcat (buf, _(", relocatable-lib"));
2331 case EM_CYGNUS_V850:
2332 switch (e_flags & EF_V850_ARCH)
2334 case E_V850E2V3_ARCH:
2335 strcat (buf, ", v850e2v3");
2338 strcat (buf, ", v850e2");
2341 strcat (buf, ", v850e1");
2344 strcat (buf, ", v850e");
2347 strcat (buf, ", v850");
2350 strcat (buf, _(", unknown v850 architecture variant"));
2356 case EM_CYGNUS_M32R:
2357 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2358 strcat (buf, ", m32r");
2362 case EM_MIPS_RS3_LE:
2363 if (e_flags & EF_MIPS_NOREORDER)
2364 strcat (buf, ", noreorder");
2366 if (e_flags & EF_MIPS_PIC)
2367 strcat (buf, ", pic");
2369 if (e_flags & EF_MIPS_CPIC)
2370 strcat (buf, ", cpic");
2372 if (e_flags & EF_MIPS_UCODE)
2373 strcat (buf, ", ugen_reserved");
2375 if (e_flags & EF_MIPS_ABI2)
2376 strcat (buf, ", abi2");
2378 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2379 strcat (buf, ", odk first");
2381 if (e_flags & EF_MIPS_32BITMODE)
2382 strcat (buf, ", 32bitmode");
2384 switch ((e_flags & EF_MIPS_MACH))
2386 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2387 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2388 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2389 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2390 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2391 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2392 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2393 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2394 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2395 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2396 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2397 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2398 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2399 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2400 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2401 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2403 /* We simply ignore the field in this case to avoid confusion:
2404 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2407 default: strcat (buf, _(", unknown CPU")); break;
2410 switch ((e_flags & EF_MIPS_ABI))
2412 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2413 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2414 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2415 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2417 /* We simply ignore the field in this case to avoid confusion:
2418 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2419 This means it is likely to be an o32 file, but not for
2422 default: strcat (buf, _(", unknown ABI")); break;
2425 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2426 strcat (buf, ", mdmx");
2428 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2429 strcat (buf, ", mips16");
2431 switch ((e_flags & EF_MIPS_ARCH))
2433 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2434 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2435 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2436 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2437 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2438 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2439 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2440 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2441 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2442 default: strcat (buf, _(", unknown ISA")); break;
2445 if (e_flags & EF_SH_PIC)
2446 strcat (buf, ", pic");
2448 if (e_flags & EF_SH_FDPIC)
2449 strcat (buf, ", fdpic");
2453 switch ((e_flags & EF_SH_MACH_MASK))
2455 case EF_SH1: strcat (buf, ", sh1"); break;
2456 case EF_SH2: strcat (buf, ", sh2"); break;
2457 case EF_SH3: strcat (buf, ", sh3"); break;
2458 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2459 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2460 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2461 case EF_SH3E: strcat (buf, ", sh3e"); break;
2462 case EF_SH4: strcat (buf, ", sh4"); break;
2463 case EF_SH5: strcat (buf, ", sh5"); break;
2464 case EF_SH2E: strcat (buf, ", sh2e"); break;
2465 case EF_SH4A: strcat (buf, ", sh4a"); break;
2466 case EF_SH2A: strcat (buf, ", sh2a"); break;
2467 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2468 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2469 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2470 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2471 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2472 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2473 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2474 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2475 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2476 default: strcat (buf, _(", unknown ISA")); break;
2482 if (e_flags & EF_SPARC_32PLUS)
2483 strcat (buf, ", v8+");
2485 if (e_flags & EF_SPARC_SUN_US1)
2486 strcat (buf, ", ultrasparcI");
2488 if (e_flags & EF_SPARC_SUN_US3)
2489 strcat (buf, ", ultrasparcIII");
2491 if (e_flags & EF_SPARC_HAL_R1)
2492 strcat (buf, ", halr1");
2494 if (e_flags & EF_SPARC_LEDATA)
2495 strcat (buf, ", ledata");
2497 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2498 strcat (buf, ", tso");
2500 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2501 strcat (buf, ", pso");
2503 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2504 strcat (buf, ", rmo");
2508 switch (e_flags & EF_PARISC_ARCH)
2510 case EFA_PARISC_1_0:
2511 strcpy (buf, ", PA-RISC 1.0");
2513 case EFA_PARISC_1_1:
2514 strcpy (buf, ", PA-RISC 1.1");
2516 case EFA_PARISC_2_0:
2517 strcpy (buf, ", PA-RISC 2.0");
2522 if (e_flags & EF_PARISC_TRAPNIL)
2523 strcat (buf, ", trapnil");
2524 if (e_flags & EF_PARISC_EXT)
2525 strcat (buf, ", ext");
2526 if (e_flags & EF_PARISC_LSB)
2527 strcat (buf, ", lsb");
2528 if (e_flags & EF_PARISC_WIDE)
2529 strcat (buf, ", wide");
2530 if (e_flags & EF_PARISC_NO_KABP)
2531 strcat (buf, ", no kabp");
2532 if (e_flags & EF_PARISC_LAZYSWAP)
2533 strcat (buf, ", lazyswap");
2538 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2539 strcat (buf, ", new calling convention");
2541 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2542 strcat (buf, ", gnu calling convention");
2546 if ((e_flags & EF_IA_64_ABI64))
2547 strcat (buf, ", 64-bit");
2549 strcat (buf, ", 32-bit");
2550 if ((e_flags & EF_IA_64_REDUCEDFP))
2551 strcat (buf, ", reduced fp model");
2552 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2553 strcat (buf, ", no function descriptors, constant gp");
2554 else if ((e_flags & EF_IA_64_CONS_GP))
2555 strcat (buf, ", constant gp");
2556 if ((e_flags & EF_IA_64_ABSOLUTE))
2557 strcat (buf, ", absolute");
2558 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2560 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2561 strcat (buf, ", vms_linkages");
2562 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2564 case EF_IA_64_VMS_COMCOD_SUCCESS:
2566 case EF_IA_64_VMS_COMCOD_WARNING:
2567 strcat (buf, ", warning");
2569 case EF_IA_64_VMS_COMCOD_ERROR:
2570 strcat (buf, ", error");
2572 case EF_IA_64_VMS_COMCOD_ABORT:
2573 strcat (buf, ", abort");
2582 if ((e_flags & EF_VAX_NONPIC))
2583 strcat (buf, ", non-PIC");
2584 if ((e_flags & EF_VAX_DFLOAT))
2585 strcat (buf, ", D-Float");
2586 if ((e_flags & EF_VAX_GFLOAT))
2587 strcat (buf, ", G-Float");
2591 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2592 strcat (buf, ", 64-bit doubles");
2593 if (e_flags & E_FLAG_RX_DSP)
2594 strcat (buf, ", dsp");
2597 if (e_flags & EF_S390_HIGH_GPRS)
2598 strcat (buf, ", highgprs");
2601 if ((e_flags & EF_C6000_REL))
2602 strcat (buf, ", relocatable module");
2610 get_osabi_name (unsigned int osabi)
2612 static char buff[32];
2616 case ELFOSABI_NONE: return "UNIX - System V";
2617 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2618 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2619 case ELFOSABI_GNU: return "UNIX - GNU";
2620 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2621 case ELFOSABI_AIX: return "UNIX - AIX";
2622 case ELFOSABI_IRIX: return "UNIX - IRIX";
2623 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2624 case ELFOSABI_TRU64: return "UNIX - TRU64";
2625 case ELFOSABI_MODESTO: return "Novell - Modesto";
2626 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2627 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2628 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2629 case ELFOSABI_AROS: return "AROS";
2630 case ELFOSABI_FENIXOS: return "FenixOS";
2633 switch (elf_header.e_machine)
2638 case ELFOSABI_ARM: return "ARM";
2648 case ELFOSABI_STANDALONE: return _("Standalone App");
2657 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2658 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2667 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2673 get_arm_segment_type (unsigned long type)
2687 get_mips_segment_type (unsigned long type)
2691 case PT_MIPS_REGINFO:
2693 case PT_MIPS_RTPROC:
2695 case PT_MIPS_OPTIONS:
2705 get_parisc_segment_type (unsigned long type)
2709 case PT_HP_TLS: return "HP_TLS";
2710 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2711 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2712 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2713 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2714 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2715 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2716 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2717 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2718 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2719 case PT_HP_PARALLEL: return "HP_PARALLEL";
2720 case PT_HP_FASTBIND: return "HP_FASTBIND";
2721 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2722 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2723 case PT_HP_STACK: return "HP_STACK";
2724 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2725 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2726 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2727 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2736 get_ia64_segment_type (unsigned long type)
2740 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2741 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2742 case PT_HP_TLS: return "HP_TLS";
2743 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2744 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2745 case PT_IA_64_HP_STACK: return "HP_STACK";
2754 get_tic6x_segment_type (unsigned long type)
2758 case PT_C6000_PHATTR: return "C6000_PHATTR";
2767 get_segment_type (unsigned long p_type)
2769 static char buff[32];
2773 case PT_NULL: return "NULL";
2774 case PT_LOAD: return "LOAD";
2775 case PT_DYNAMIC: return "DYNAMIC";
2776 case PT_INTERP: return "INTERP";
2777 case PT_NOTE: return "NOTE";
2778 case PT_SHLIB: return "SHLIB";
2779 case PT_PHDR: return "PHDR";
2780 case PT_TLS: return "TLS";
2782 case PT_GNU_EH_FRAME:
2783 return "GNU_EH_FRAME";
2784 case PT_GNU_STACK: return "GNU_STACK";
2785 case PT_GNU_RELRO: return "GNU_RELRO";
2788 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2790 const char * result;
2792 switch (elf_header.e_machine)
2795 result = get_arm_segment_type (p_type);
2798 case EM_MIPS_RS3_LE:
2799 result = get_mips_segment_type (p_type);
2802 result = get_parisc_segment_type (p_type);
2805 result = get_ia64_segment_type (p_type);
2808 result = get_tic6x_segment_type (p_type);
2818 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2820 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2822 const char * result;
2824 switch (elf_header.e_machine)
2827 result = get_parisc_segment_type (p_type);
2830 result = get_ia64_segment_type (p_type);
2840 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2843 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2850 get_mips_section_type_name (unsigned int sh_type)
2854 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2855 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2856 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2857 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2858 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2859 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2860 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2861 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2862 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2863 case SHT_MIPS_RELD: return "MIPS_RELD";
2864 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2865 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2866 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2867 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2868 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2869 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2870 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2871 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2872 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2873 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2874 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2875 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2876 case SHT_MIPS_LINE: return "MIPS_LINE";
2877 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2878 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2879 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2880 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2881 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2882 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2883 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2884 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2885 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2886 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2887 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2888 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2889 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2890 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2891 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2892 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2900 get_parisc_section_type_name (unsigned int sh_type)
2904 case SHT_PARISC_EXT: return "PARISC_EXT";
2905 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2906 case SHT_PARISC_DOC: return "PARISC_DOC";
2907 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2908 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2909 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2910 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2918 get_ia64_section_type_name (unsigned int sh_type)
2920 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2921 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2922 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2926 case SHT_IA_64_EXT: return "IA_64_EXT";
2927 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2928 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2929 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2930 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2931 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2932 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2933 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2934 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2935 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2943 get_x86_64_section_type_name (unsigned int sh_type)
2947 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2955 get_arm_section_type_name (unsigned int sh_type)
2959 case SHT_ARM_EXIDX: return "ARM_EXIDX";
2960 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
2961 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
2962 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
2963 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
2971 get_tic6x_section_type_name (unsigned int sh_type)
2975 case SHT_C6000_UNWIND:
2976 return "C6000_UNWIND";
2977 case SHT_C6000_PREEMPTMAP:
2978 return "C6000_PREEMPTMAP";
2979 case SHT_C6000_ATTRIBUTES:
2980 return "C6000_ATTRIBUTES";
2985 case SHT_TI_HANDLER:
2986 return "TI_HANDLER";
2987 case SHT_TI_INITINFO:
2988 return "TI_INITINFO";
2989 case SHT_TI_PHATTRS:
2990 return "TI_PHATTRS";
2998 get_section_type_name (unsigned int sh_type)
3000 static char buff[32];
3004 case SHT_NULL: return "NULL";
3005 case SHT_PROGBITS: return "PROGBITS";
3006 case SHT_SYMTAB: return "SYMTAB";
3007 case SHT_STRTAB: return "STRTAB";
3008 case SHT_RELA: return "RELA";
3009 case SHT_HASH: return "HASH";
3010 case SHT_DYNAMIC: return "DYNAMIC";
3011 case SHT_NOTE: return "NOTE";
3012 case SHT_NOBITS: return "NOBITS";
3013 case SHT_REL: return "REL";
3014 case SHT_SHLIB: return "SHLIB";
3015 case SHT_DYNSYM: return "DYNSYM";
3016 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3017 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3018 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3019 case SHT_GNU_HASH: return "GNU_HASH";
3020 case SHT_GROUP: return "GROUP";
3021 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3022 case SHT_GNU_verdef: return "VERDEF";
3023 case SHT_GNU_verneed: return "VERNEED";
3024 case SHT_GNU_versym: return "VERSYM";
3025 case 0x6ffffff0: return "VERSYM";
3026 case 0x6ffffffc: return "VERDEF";
3027 case 0x7ffffffd: return "AUXILIARY";
3028 case 0x7fffffff: return "FILTER";
3029 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3032 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3034 const char * result;
3036 switch (elf_header.e_machine)
3039 case EM_MIPS_RS3_LE:
3040 result = get_mips_section_type_name (sh_type);
3043 result = get_parisc_section_type_name (sh_type);
3046 result = get_ia64_section_type_name (sh_type);
3051 result = get_x86_64_section_type_name (sh_type);
3054 result = get_arm_section_type_name (sh_type);
3057 result = get_tic6x_section_type_name (sh_type);
3067 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3069 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3071 const char * result;
3073 switch (elf_header.e_machine)
3076 result = get_ia64_section_type_name (sh_type);
3086 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3088 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3089 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3091 /* This message is probably going to be displayed in a 15
3092 character wide field, so put the hex value first. */
3093 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3099 #define OPTION_DEBUG_DUMP 512
3100 #define OPTION_DYN_SYMS 513
3101 #define OPTION_DWARF_DEPTH 514
3102 #define OPTION_DWARF_START 515
3104 static struct option options[] =
3106 {"all", no_argument, 0, 'a'},
3107 {"file-header", no_argument, 0, 'h'},
3108 {"program-headers", no_argument, 0, 'l'},
3109 {"headers", no_argument, 0, 'e'},
3110 {"histogram", no_argument, 0, 'I'},
3111 {"segments", no_argument, 0, 'l'},
3112 {"sections", no_argument, 0, 'S'},
3113 {"section-headers", no_argument, 0, 'S'},
3114 {"section-groups", no_argument, 0, 'g'},
3115 {"section-details", no_argument, 0, 't'},
3116 {"full-section-name",no_argument, 0, 'N'},
3117 {"symbols", no_argument, 0, 's'},
3118 {"syms", no_argument, 0, 's'},
3119 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3120 {"relocs", no_argument, 0, 'r'},
3121 {"notes", no_argument, 0, 'n'},
3122 {"dynamic", no_argument, 0, 'd'},
3123 {"arch-specific", no_argument, 0, 'A'},
3124 {"version-info", no_argument, 0, 'V'},
3125 {"use-dynamic", no_argument, 0, 'D'},
3126 {"unwind", no_argument, 0, 'u'},
3127 {"archive-index", no_argument, 0, 'c'},
3128 {"hex-dump", required_argument, 0, 'x'},
3129 {"relocated-dump", required_argument, 0, 'R'},
3130 {"string-dump", required_argument, 0, 'p'},
3131 #ifdef SUPPORT_DISASSEMBLY
3132 {"instruction-dump", required_argument, 0, 'i'},
3134 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3136 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3137 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3139 {"version", no_argument, 0, 'v'},
3140 {"wide", no_argument, 0, 'W'},
3141 {"help", no_argument, 0, 'H'},
3142 {0, no_argument, 0, 0}
3146 usage (FILE * stream)
3148 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3149 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3150 fprintf (stream, _(" Options are:\n\
3151 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3152 -h --file-header Display the ELF file header\n\
3153 -l --program-headers Display the program headers\n\
3154 --segments An alias for --program-headers\n\
3155 -S --section-headers Display the sections' header\n\
3156 --sections An alias for --section-headers\n\
3157 -g --section-groups Display the section groups\n\
3158 -t --section-details Display the section details\n\
3159 -e --headers Equivalent to: -h -l -S\n\
3160 -s --syms Display the symbol table\n\
3161 --symbols An alias for --syms\n\
3162 --dyn-syms Display the dynamic symbol table\n\
3163 -n --notes Display the core notes (if present)\n\
3164 -r --relocs Display the relocations (if present)\n\
3165 -u --unwind Display the unwind info (if present)\n\
3166 -d --dynamic Display the dynamic section (if present)\n\
3167 -V --version-info Display the version sections (if present)\n\
3168 -A --arch-specific Display architecture specific information (if any).\n\
3169 -c --archive-index Display the symbol/file index in an archive\n\
3170 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3171 -x --hex-dump=<number|name>\n\
3172 Dump the contents of section <number|name> as bytes\n\
3173 -p --string-dump=<number|name>\n\
3174 Dump the contents of section <number|name> as strings\n\
3175 -R --relocated-dump=<number|name>\n\
3176 Dump the contents of section <number|name> as relocated bytes\n\
3177 -w[lLiaprmfFsoRt] or\n\
3178 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3179 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3180 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges]\n\
3181 Display the contents of DWARF2 debug sections\n"));
3182 fprintf (stream, _("\
3183 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3184 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3186 #ifdef SUPPORT_DISASSEMBLY
3187 fprintf (stream, _("\
3188 -i --instruction-dump=<number|name>\n\
3189 Disassemble the contents of section <number|name>\n"));
3191 fprintf (stream, _("\
3192 -I --histogram Display histogram of bucket list lengths\n\
3193 -W --wide Allow output width to exceed 80 characters\n\
3194 @<file> Read options from <file>\n\
3195 -H --help Display this information\n\
3196 -v --version Display the version number of readelf\n"));
3198 if (REPORT_BUGS_TO[0] && stream == stdout)
3199 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3201 exit (stream == stdout ? 0 : 1);
3204 /* Record the fact that the user wants the contents of section number
3205 SECTION to be displayed using the method(s) encoded as flags bits
3206 in TYPE. Note, TYPE can be zero if we are creating the array for
3210 request_dump_bynumber (unsigned int section, dump_type type)
3212 if (section >= num_dump_sects)
3214 dump_type * new_dump_sects;
3216 new_dump_sects = (dump_type *) calloc (section + 1,
3217 sizeof (* dump_sects));
3219 if (new_dump_sects == NULL)
3220 error (_("Out of memory allocating dump request table.\n"));
3223 /* Copy current flag settings. */
3224 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3228 dump_sects = new_dump_sects;
3229 num_dump_sects = section + 1;
3234 dump_sects[section] |= type;
3239 /* Request a dump by section name. */
3242 request_dump_byname (const char * section, dump_type type)
3244 struct dump_list_entry * new_request;
3246 new_request = (struct dump_list_entry *)
3247 malloc (sizeof (struct dump_list_entry));
3249 error (_("Out of memory allocating dump request table.\n"));
3251 new_request->name = strdup (section);
3252 if (!new_request->name)
3253 error (_("Out of memory allocating dump request table.\n"));
3255 new_request->type = type;
3257 new_request->next = dump_sects_byname;
3258 dump_sects_byname = new_request;
3262 request_dump (dump_type type)
3268 section = strtoul (optarg, & cp, 0);
3270 if (! *cp && section >= 0)
3271 request_dump_bynumber (section, type);
3273 request_dump_byname (optarg, type);
3278 parse_args (int argc, char ** argv)
3285 while ((c = getopt_long
3286 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3304 do_section_groups++;
3312 do_section_groups++;
3317 do_section_details++;
3361 request_dump (HEX_DUMP);
3364 request_dump (STRING_DUMP);
3367 request_dump (RELOC_DUMP);
3374 dwarf_select_sections_all ();
3379 dwarf_select_sections_by_letters (optarg);
3382 case OPTION_DEBUG_DUMP:
3389 dwarf_select_sections_by_names (optarg);
3392 case OPTION_DWARF_DEPTH:
3396 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3399 case OPTION_DWARF_START:
3403 dwarf_start_die = strtoul (optarg, & cp, 0);
3406 case OPTION_DYN_SYMS:
3409 #ifdef SUPPORT_DISASSEMBLY
3411 request_dump (DISASS_DUMP);
3415 print_version (program_name);
3424 /* xgettext:c-format */
3425 error (_("Invalid option '-%c'\n"), c);
3432 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3433 && !do_segments && !do_header && !do_dump && !do_version
3434 && !do_histogram && !do_debugging && !do_arch && !do_notes
3435 && !do_section_groups && !do_archive_index
3440 warn (_("Nothing to do.\n"));
3446 get_elf_class (unsigned int elf_class)
3448 static char buff[32];
3452 case ELFCLASSNONE: return _("none");
3453 case ELFCLASS32: return "ELF32";
3454 case ELFCLASS64: return "ELF64";
3456 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3462 get_data_encoding (unsigned int encoding)
3464 static char buff[32];
3468 case ELFDATANONE: return _("none");
3469 case ELFDATA2LSB: return _("2's complement, little endian");
3470 case ELFDATA2MSB: return _("2's complement, big endian");
3472 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3477 /* Decode the data held in 'elf_header'. */
3480 process_file_header (void)
3482 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3483 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3484 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3485 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3488 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3492 init_dwarf_regnames (elf_header.e_machine);
3498 printf (_("ELF Header:\n"));
3499 printf (_(" Magic: "));
3500 for (i = 0; i < EI_NIDENT; i++)
3501 printf ("%2.2x ", elf_header.e_ident[i]);
3503 printf (_(" Class: %s\n"),
3504 get_elf_class (elf_header.e_ident[EI_CLASS]));
3505 printf (_(" Data: %s\n"),
3506 get_data_encoding (elf_header.e_ident[EI_DATA]));
3507 printf (_(" Version: %d %s\n"),
3508 elf_header.e_ident[EI_VERSION],
3509 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3511 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3512 ? _("<unknown: %lx>")
3514 printf (_(" OS/ABI: %s\n"),
3515 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3516 printf (_(" ABI Version: %d\n"),
3517 elf_header.e_ident[EI_ABIVERSION]);
3518 printf (_(" Type: %s\n"),
3519 get_file_type (elf_header.e_type));
3520 printf (_(" Machine: %s\n"),
3521 get_machine_name (elf_header.e_machine));
3522 printf (_(" Version: 0x%lx\n"),
3523 (unsigned long) elf_header.e_version);
3525 printf (_(" Entry point address: "));
3526 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3527 printf (_("\n Start of program headers: "));
3528 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3529 printf (_(" (bytes into file)\n Start of section headers: "));
3530 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3531 printf (_(" (bytes into file)\n"));
3533 printf (_(" Flags: 0x%lx%s\n"),
3534 (unsigned long) elf_header.e_flags,
3535 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3536 printf (_(" Size of this header: %ld (bytes)\n"),
3537 (long) elf_header.e_ehsize);
3538 printf (_(" Size of program headers: %ld (bytes)\n"),
3539 (long) elf_header.e_phentsize);
3540 printf (_(" Number of program headers: %ld"),
3541 (long) elf_header.e_phnum);
3542 if (section_headers != NULL
3543 && elf_header.e_phnum == PN_XNUM
3544 && section_headers[0].sh_info != 0)
3545 printf (" (%ld)", (long) section_headers[0].sh_info);
3546 putc ('\n', stdout);
3547 printf (_(" Size of section headers: %ld (bytes)\n"),
3548 (long) elf_header.e_shentsize);
3549 printf (_(" Number of section headers: %ld"),
3550 (long) elf_header.e_shnum);
3551 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3552 printf (" (%ld)", (long) section_headers[0].sh_size);
3553 putc ('\n', stdout);
3554 printf (_(" Section header string table index: %ld"),
3555 (long) elf_header.e_shstrndx);
3556 if (section_headers != NULL
3557 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3558 printf (" (%u)", section_headers[0].sh_link);
3559 else if (elf_header.e_shstrndx != SHN_UNDEF
3560 && elf_header.e_shstrndx >= elf_header.e_shnum)
3561 printf (_(" <corrupt: out of range>"));
3562 putc ('\n', stdout);
3565 if (section_headers != NULL)
3567 if (elf_header.e_phnum == PN_XNUM
3568 && section_headers[0].sh_info != 0)
3569 elf_header.e_phnum = section_headers[0].sh_info;
3570 if (elf_header.e_shnum == SHN_UNDEF)
3571 elf_header.e_shnum = section_headers[0].sh_size;
3572 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3573 elf_header.e_shstrndx = section_headers[0].sh_link;
3574 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3575 elf_header.e_shstrndx = SHN_UNDEF;
3576 free (section_headers);
3577 section_headers = NULL;
3585 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3587 Elf32_External_Phdr * phdrs;
3588 Elf32_External_Phdr * external;
3589 Elf_Internal_Phdr * internal;
3592 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3593 elf_header.e_phentsize,
3595 _("program headers"));
3599 for (i = 0, internal = pheaders, external = phdrs;
3600 i < elf_header.e_phnum;
3601 i++, internal++, external++)
3603 internal->p_type = BYTE_GET (external->p_type);
3604 internal->p_offset = BYTE_GET (external->p_offset);
3605 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3606 internal->p_paddr = BYTE_GET (external->p_paddr);
3607 internal->p_filesz = BYTE_GET (external->p_filesz);
3608 internal->p_memsz = BYTE_GET (external->p_memsz);
3609 internal->p_flags = BYTE_GET (external->p_flags);
3610 internal->p_align = BYTE_GET (external->p_align);
3619 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3621 Elf64_External_Phdr * phdrs;
3622 Elf64_External_Phdr * external;
3623 Elf_Internal_Phdr * internal;
3626 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3627 elf_header.e_phentsize,
3629 _("program headers"));
3633 for (i = 0, internal = pheaders, external = phdrs;
3634 i < elf_header.e_phnum;
3635 i++, internal++, external++)
3637 internal->p_type = BYTE_GET (external->p_type);
3638 internal->p_flags = BYTE_GET (external->p_flags);
3639 internal->p_offset = BYTE_GET (external->p_offset);
3640 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3641 internal->p_paddr = BYTE_GET (external->p_paddr);
3642 internal->p_filesz = BYTE_GET (external->p_filesz);
3643 internal->p_memsz = BYTE_GET (external->p_memsz);
3644 internal->p_align = BYTE_GET (external->p_align);
3652 /* Returns 1 if the program headers were read into `program_headers'. */
3655 get_program_headers (FILE * file)
3657 Elf_Internal_Phdr * phdrs;
3659 /* Check cache of prior read. */
3660 if (program_headers != NULL)
3663 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3664 sizeof (Elf_Internal_Phdr));
3668 error (_("Out of memory\n"));
3673 ? get_32bit_program_headers (file, phdrs)
3674 : get_64bit_program_headers (file, phdrs))
3676 program_headers = phdrs;
3684 /* Returns 1 if the program headers were loaded. */
3687 process_program_headers (FILE * file)
3689 Elf_Internal_Phdr * segment;
3692 if (elf_header.e_phnum == 0)
3694 /* PR binutils/12467. */
3695 if (elf_header.e_phoff != 0)
3696 warn (_("possibly corrupt ELF header - it has a non-zero program"
3697 " header offset, but no program headers"));
3698 else if (do_segments)
3699 printf (_("\nThere are no program headers in this file.\n"));
3703 if (do_segments && !do_header)
3705 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3706 printf (_("Entry point "));
3707 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3708 printf (_("\nThere are %d program headers, starting at offset "),
3709 elf_header.e_phnum);
3710 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3714 if (! get_program_headers (file))
3719 if (elf_header.e_phnum > 1)
3720 printf (_("\nProgram Headers:\n"));
3722 printf (_("\nProgram Headers:\n"));
3726 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3729 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3733 (_(" Type Offset VirtAddr PhysAddr\n"));
3735 (_(" FileSiz MemSiz Flags Align\n"));
3742 for (i = 0, segment = program_headers;
3743 i < elf_header.e_phnum;
3748 printf (" %-14.14s ", get_segment_type (segment->p_type));
3752 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3753 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3754 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3755 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3756 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3758 (segment->p_flags & PF_R ? 'R' : ' '),
3759 (segment->p_flags & PF_W ? 'W' : ' '),
3760 (segment->p_flags & PF_X ? 'E' : ' '));
3761 printf ("%#lx", (unsigned long) segment->p_align);
3765 if ((unsigned long) segment->p_offset == segment->p_offset)
3766 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3769 print_vma (segment->p_offset, FULL_HEX);
3773 print_vma (segment->p_vaddr, FULL_HEX);
3775 print_vma (segment->p_paddr, FULL_HEX);
3778 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3779 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3782 print_vma (segment->p_filesz, FULL_HEX);
3786 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3787 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3790 print_vma (segment->p_offset, FULL_HEX);
3794 (segment->p_flags & PF_R ? 'R' : ' '),
3795 (segment->p_flags & PF_W ? 'W' : ' '),
3796 (segment->p_flags & PF_X ? 'E' : ' '));
3798 if ((unsigned long) segment->p_align == segment->p_align)
3799 printf ("%#lx", (unsigned long) segment->p_align);
3802 print_vma (segment->p_align, PREFIX_HEX);
3807 print_vma (segment->p_offset, FULL_HEX);
3809 print_vma (segment->p_vaddr, FULL_HEX);
3811 print_vma (segment->p_paddr, FULL_HEX);
3813 print_vma (segment->p_filesz, FULL_HEX);
3815 print_vma (segment->p_memsz, FULL_HEX);
3817 (segment->p_flags & PF_R ? 'R' : ' '),
3818 (segment->p_flags & PF_W ? 'W' : ' '),
3819 (segment->p_flags & PF_X ? 'E' : ' '));
3820 print_vma (segment->p_align, HEX);
3824 switch (segment->p_type)
3828 error (_("more than one dynamic segment\n"));
3830 /* By default, assume that the .dynamic section is the first
3831 section in the DYNAMIC segment. */
3832 dynamic_addr = segment->p_offset;
3833 dynamic_size = segment->p_filesz;
3835 /* Try to locate the .dynamic section. If there is
3836 a section header table, we can easily locate it. */
3837 if (section_headers != NULL)
3839 Elf_Internal_Shdr * sec;
3841 sec = find_section (".dynamic");
3842 if (sec == NULL || sec->sh_size == 0)
3844 /* A corresponding .dynamic section is expected, but on
3845 IA-64/OpenVMS it is OK for it to be missing. */
3846 if (!is_ia64_vms ())
3847 error (_("no .dynamic section in the dynamic segment\n"));
3851 if (sec->sh_type == SHT_NOBITS)
3857 dynamic_addr = sec->sh_offset;
3858 dynamic_size = sec->sh_size;
3860 if (dynamic_addr < segment->p_offset
3861 || dynamic_addr > segment->p_offset + segment->p_filesz)
3862 warn (_("the .dynamic section is not contained"
3863 " within the dynamic segment\n"));
3864 else if (dynamic_addr > segment->p_offset)
3865 warn (_("the .dynamic section is not the first section"
3866 " in the dynamic segment.\n"));
3871 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3873 error (_("Unable to find program interpreter name\n"));
3877 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3879 if (ret >= (int) sizeof (fmt) || ret < 0)
3880 error (_("Internal error: failed to create format string to display program interpreter\n"));
3882 program_interpreter[0] = 0;
3883 if (fscanf (file, fmt, program_interpreter) <= 0)
3884 error (_("Unable to read program interpreter name\n"));
3887 printf (_("\n [Requesting program interpreter: %s]"),
3888 program_interpreter);
3894 putc ('\n', stdout);
3897 if (do_segments && section_headers != NULL && string_table != NULL)
3899 printf (_("\n Section to Segment mapping:\n"));
3900 printf (_(" Segment Sections...\n"));
3902 for (i = 0; i < elf_header.e_phnum; i++)
3905 Elf_Internal_Shdr * section;
3907 segment = program_headers + i;
3908 section = section_headers + 1;
3910 printf (" %2.2d ", i);
3912 for (j = 1; j < elf_header.e_shnum; j++, section++)
3914 if (!ELF_TBSS_SPECIAL (section, segment)
3915 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3916 printf ("%s ", SECTION_NAME (section));
3927 /* Find the file offset corresponding to VMA by using the program headers. */
3930 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3932 Elf_Internal_Phdr * seg;
3934 if (! get_program_headers (file))
3936 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3940 for (seg = program_headers;
3941 seg < program_headers + elf_header.e_phnum;
3944 if (seg->p_type != PT_LOAD)
3947 if (vma >= (seg->p_vaddr & -seg->p_align)
3948 && vma + size <= seg->p_vaddr + seg->p_filesz)
3949 return vma - seg->p_vaddr + seg->p_offset;
3952 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3953 (unsigned long) vma);
3959 get_32bit_section_headers (FILE * file, unsigned int num)
3961 Elf32_External_Shdr * shdrs;
3962 Elf_Internal_Shdr * internal;
3965 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3966 elf_header.e_shentsize, num,
3967 _("section headers"));
3971 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3972 sizeof (Elf_Internal_Shdr));
3974 if (section_headers == NULL)
3976 error (_("Out of memory\n"));
3980 for (i = 0, internal = section_headers;
3984 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3985 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3986 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3987 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3988 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3989 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3990 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3991 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3992 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3993 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4002 get_64bit_section_headers (FILE * file, unsigned int num)
4004 Elf64_External_Shdr * shdrs;
4005 Elf_Internal_Shdr * internal;
4008 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4009 elf_header.e_shentsize, num,
4010 _("section headers"));
4014 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4015 sizeof (Elf_Internal_Shdr));
4017 if (section_headers == NULL)
4019 error (_("Out of memory\n"));
4023 for (i = 0, internal = section_headers;
4027 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4028 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4029 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4030 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4031 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4032 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4033 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4034 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4035 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4036 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4044 static Elf_Internal_Sym *
4045 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4047 unsigned long number;
4048 Elf32_External_Sym * esyms = NULL;
4049 Elf_External_Sym_Shndx * shndx;
4050 Elf_Internal_Sym * isyms = NULL;
4051 Elf_Internal_Sym * psym;
4054 /* Run some sanity checks first. */
4055 if (section->sh_entsize == 0)
4057 error (_("sh_entsize is zero\n"));
4061 number = section->sh_size / section->sh_entsize;
4063 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4065 error (_("Invalid sh_entsize\n"));
4069 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4070 section->sh_size, _("symbols"));
4075 if (symtab_shndx_hdr != NULL
4076 && (symtab_shndx_hdr->sh_link
4077 == (unsigned long) (section - section_headers)))
4079 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4080 symtab_shndx_hdr->sh_offset,
4081 1, symtab_shndx_hdr->sh_size,
4087 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4091 error (_("Out of memory\n"));
4095 for (j = 0, psym = isyms; j < number; j++, psym++)
4097 psym->st_name = BYTE_GET (esyms[j].st_name);
4098 psym->st_value = BYTE_GET (esyms[j].st_value);
4099 psym->st_size = BYTE_GET (esyms[j].st_size);
4100 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4101 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4103 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4104 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4105 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4106 psym->st_info = BYTE_GET (esyms[j].st_info);
4107 psym->st_other = BYTE_GET (esyms[j].st_other);
4119 static Elf_Internal_Sym *
4120 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4122 unsigned long number;
4123 Elf64_External_Sym * esyms;
4124 Elf_External_Sym_Shndx * shndx;
4125 Elf_Internal_Sym * isyms;
4126 Elf_Internal_Sym * psym;
4129 /* Run some sanity checks first. */
4130 if (section->sh_entsize == 0)
4132 error (_("sh_entsize is zero\n"));
4136 number = section->sh_size / section->sh_entsize;
4138 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4140 error (_("Invalid sh_entsize\n"));
4144 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4145 section->sh_size, _("symbols"));
4150 if (symtab_shndx_hdr != NULL
4151 && (symtab_shndx_hdr->sh_link
4152 == (unsigned long) (section - section_headers)))
4154 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4155 symtab_shndx_hdr->sh_offset,
4156 1, symtab_shndx_hdr->sh_size,
4165 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4169 error (_("Out of memory\n"));
4176 for (j = 0, psym = isyms;
4180 psym->st_name = BYTE_GET (esyms[j].st_name);
4181 psym->st_info = BYTE_GET (esyms[j].st_info);
4182 psym->st_other = BYTE_GET (esyms[j].st_other);
4183 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4184 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4186 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4187 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4188 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4189 psym->st_value = BYTE_GET (esyms[j].st_value);
4190 psym->st_size = BYTE_GET (esyms[j].st_size);
4201 get_elf_section_flags (bfd_vma sh_flags)
4203 static char buff[1024];
4205 int field_size = is_32bit_elf ? 8 : 16;
4207 int size = sizeof (buff) - (field_size + 4 + 1);
4208 bfd_vma os_flags = 0;
4209 bfd_vma proc_flags = 0;
4210 bfd_vma unknown_flags = 0;
4218 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4219 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4220 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4221 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4222 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4223 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4224 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4225 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4226 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4227 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4228 /* IA-64 specific. */
4229 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4230 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4231 /* IA-64 OpenVMS specific. */
4232 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4233 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4234 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4235 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4236 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4237 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4239 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4240 /* SPARC specific. */
4241 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4244 if (do_section_details)
4246 sprintf (buff, "[%*.*lx]: ",
4247 field_size, field_size, (unsigned long) sh_flags);
4248 p += field_size + 4;
4255 flag = sh_flags & - sh_flags;
4258 if (do_section_details)
4262 case SHF_WRITE: sindex = 0; break;
4263 case SHF_ALLOC: sindex = 1; break;
4264 case SHF_EXECINSTR: sindex = 2; break;
4265 case SHF_MERGE: sindex = 3; break;
4266 case SHF_STRINGS: sindex = 4; break;
4267 case SHF_INFO_LINK: sindex = 5; break;
4268 case SHF_LINK_ORDER: sindex = 6; break;
4269 case SHF_OS_NONCONFORMING: sindex = 7; break;
4270 case SHF_GROUP: sindex = 8; break;
4271 case SHF_TLS: sindex = 9; break;
4272 case SHF_EXCLUDE: sindex = 18; break;
4276 switch (elf_header.e_machine)
4279 if (flag == SHF_IA_64_SHORT)
4281 else if (flag == SHF_IA_64_NORECOV)
4284 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4287 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4288 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4289 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4290 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4291 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4292 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4303 case EM_OLD_SPARCV9:
4304 case EM_SPARC32PLUS:
4307 if (flag == SHF_ORDERED)
4317 if (p != buff + field_size + 4)
4319 if (size < (10 + 2))
4326 size -= flags [sindex].len;
4327 p = stpcpy (p, flags [sindex].str);
4329 else if (flag & SHF_MASKOS)
4331 else if (flag & SHF_MASKPROC)
4334 unknown_flags |= flag;
4340 case SHF_WRITE: *p = 'W'; break;
4341 case SHF_ALLOC: *p = 'A'; break;
4342 case SHF_EXECINSTR: *p = 'X'; break;
4343 case SHF_MERGE: *p = 'M'; break;
4344 case SHF_STRINGS: *p = 'S'; break;
4345 case SHF_INFO_LINK: *p = 'I'; break;
4346 case SHF_LINK_ORDER: *p = 'L'; break;
4347 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4348 case SHF_GROUP: *p = 'G'; break;
4349 case SHF_TLS: *p = 'T'; break;
4350 case SHF_EXCLUDE: *p = 'E'; break;
4353 if ((elf_header.e_machine == EM_X86_64
4354 || elf_header.e_machine == EM_L1OM
4355 || elf_header.e_machine == EM_K1OM)
4356 && flag == SHF_X86_64_LARGE)
4358 else if (flag & SHF_MASKOS)
4361 sh_flags &= ~ SHF_MASKOS;
4363 else if (flag & SHF_MASKPROC)
4366 sh_flags &= ~ SHF_MASKPROC;
4376 if (do_section_details)
4380 size -= 5 + field_size;
4381 if (p != buff + field_size + 4)
4389 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4390 (unsigned long) os_flags);
4391 p += 5 + field_size;
4395 size -= 7 + field_size;
4396 if (p != buff + field_size + 4)
4404 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4405 (unsigned long) proc_flags);
4406 p += 7 + field_size;
4410 size -= 10 + field_size;
4411 if (p != buff + field_size + 4)
4419 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4420 (unsigned long) unknown_flags);
4421 p += 10 + field_size;
4430 process_section_headers (FILE * file)
4432 Elf_Internal_Shdr * section;
4435 section_headers = NULL;
4437 if (elf_header.e_shnum == 0)
4439 /* PR binutils/12467. */
4440 if (elf_header.e_shoff != 0)
4441 warn (_("possibly corrupt ELF file header - it has a non-zero"
4442 " section header offset, but no section headers\n"));
4443 else if (do_sections)
4444 printf (_("\nThere are no sections in this file.\n"));
4449 if (do_sections && !do_header)
4450 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4451 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4455 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4458 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4461 /* Read in the string table, so that we have names to display. */
4462 if (elf_header.e_shstrndx != SHN_UNDEF
4463 && elf_header.e_shstrndx < elf_header.e_shnum)
4465 section = section_headers + elf_header.e_shstrndx;
4467 if (section->sh_size != 0)
4469 string_table = (char *) get_data (NULL, file, section->sh_offset,
4470 1, section->sh_size,
4473 string_table_length = string_table != NULL ? section->sh_size : 0;
4477 /* Scan the sections for the dynamic symbol table
4478 and dynamic string table and debug sections. */
4479 dynamic_symbols = NULL;
4480 dynamic_strings = NULL;
4481 dynamic_syminfo = NULL;
4482 symtab_shndx_hdr = NULL;
4484 eh_addr_size = is_32bit_elf ? 4 : 8;
4485 switch (elf_header.e_machine)
4488 case EM_MIPS_RS3_LE:
4489 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4490 FDE addresses. However, the ABI also has a semi-official ILP32
4491 variant for which the normal FDE address size rules apply.
4493 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4494 section, where XX is the size of longs in bits. Unfortunately,
4495 earlier compilers provided no way of distinguishing ILP32 objects
4496 from LP64 objects, so if there's any doubt, we should assume that
4497 the official LP64 form is being used. */
4498 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4499 && find_section (".gcc_compiled_long32") == NULL)
4505 switch (elf_header.e_flags & EF_H8_MACH)
4507 case E_H8_MACH_H8300:
4508 case E_H8_MACH_H8300HN:
4509 case E_H8_MACH_H8300SN:
4510 case E_H8_MACH_H8300SXN:
4513 case E_H8_MACH_H8300H:
4514 case E_H8_MACH_H8300S:
4515 case E_H8_MACH_H8300SX:
4523 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4525 case EF_M32C_CPU_M16C:
4532 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4535 size_t expected_entsize \
4536 = is_32bit_elf ? size32 : size64; \
4537 if (section->sh_entsize != expected_entsize) \
4538 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4539 i, (unsigned long int) section->sh_entsize, \
4540 (unsigned long int) expected_entsize); \
4541 section->sh_entsize = expected_entsize; \
4544 #define CHECK_ENTSIZE(section, i, type) \
4545 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4546 sizeof (Elf64_External_##type))
4548 for (i = 0, section = section_headers;
4549 i < elf_header.e_shnum;
4552 char * name = SECTION_NAME (section);
4554 if (section->sh_type == SHT_DYNSYM)
4556 if (dynamic_symbols != NULL)
4558 error (_("File contains multiple dynamic symbol tables\n"));
4562 CHECK_ENTSIZE (section, i, Sym);
4563 num_dynamic_syms = section->sh_size / section->sh_entsize;
4564 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4566 else if (section->sh_type == SHT_STRTAB
4567 && streq (name, ".dynstr"))
4569 if (dynamic_strings != NULL)
4571 error (_("File contains multiple dynamic string tables\n"));
4575 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4576 1, section->sh_size,
4577 _("dynamic strings"));
4578 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4580 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4582 if (symtab_shndx_hdr != NULL)
4584 error (_("File contains multiple symtab shndx tables\n"));
4587 symtab_shndx_hdr = section;
4589 else if (section->sh_type == SHT_SYMTAB)
4590 CHECK_ENTSIZE (section, i, Sym);
4591 else if (section->sh_type == SHT_GROUP)
4592 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4593 else if (section->sh_type == SHT_REL)
4594 CHECK_ENTSIZE (section, i, Rel);
4595 else if (section->sh_type == SHT_RELA)
4596 CHECK_ENTSIZE (section, i, Rela);
4597 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4598 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4599 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4600 || do_debug_str || do_debug_loc || do_debug_ranges)
4601 && (const_strneq (name, ".debug_")
4602 || const_strneq (name, ".zdebug_")))
4605 name += sizeof (".zdebug_") - 1;
4607 name += sizeof (".debug_") - 1;
4610 || (do_debug_info && streq (name, "info"))
4611 || (do_debug_info && streq (name, "types"))
4612 || (do_debug_abbrevs && streq (name, "abbrev"))
4613 || (do_debug_lines && streq (name, "line"))
4614 || (do_debug_pubnames && streq (name, "pubnames"))
4615 || (do_debug_pubtypes && streq (name, "pubtypes"))
4616 || (do_debug_aranges && streq (name, "aranges"))
4617 || (do_debug_ranges && streq (name, "ranges"))
4618 || (do_debug_frames && streq (name, "frame"))
4619 || (do_debug_macinfo && streq (name, "macinfo"))
4620 || (do_debug_str && streq (name, "str"))
4621 || (do_debug_loc && streq (name, "loc"))
4623 request_dump_bynumber (i, DEBUG_DUMP);
4625 /* Linkonce section to be combined with .debug_info at link time. */
4626 else if ((do_debugging || do_debug_info)
4627 && const_strneq (name, ".gnu.linkonce.wi."))
4628 request_dump_bynumber (i, DEBUG_DUMP);
4629 else if (do_debug_frames && streq (name, ".eh_frame"))
4630 request_dump_bynumber (i, DEBUG_DUMP);
4631 else if (do_gdb_index && streq (name, ".gdb_index"))
4632 request_dump_bynumber (i, DEBUG_DUMP);
4633 /* Trace sections for Itanium VMS. */
4634 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4635 || do_trace_aranges)
4636 && const_strneq (name, ".trace_"))
4638 name += sizeof (".trace_") - 1;
4641 || (do_trace_info && streq (name, "info"))
4642 || (do_trace_abbrevs && streq (name, "abbrev"))
4643 || (do_trace_aranges && streq (name, "aranges"))
4645 request_dump_bynumber (i, DEBUG_DUMP);
4653 if (elf_header.e_shnum > 1)
4654 printf (_("\nSection Headers:\n"));
4656 printf (_("\nSection Header:\n"));
4660 if (do_section_details)
4662 printf (_(" [Nr] Name\n"));
4663 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4667 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4671 if (do_section_details)
4673 printf (_(" [Nr] Name\n"));
4674 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4678 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4682 if (do_section_details)
4684 printf (_(" [Nr] Name\n"));
4685 printf (_(" Type Address Offset Link\n"));
4686 printf (_(" Size EntSize Info Align\n"));
4690 printf (_(" [Nr] Name Type Address Offset\n"));
4691 printf (_(" Size EntSize Flags Link Info Align\n"));
4695 if (do_section_details)
4696 printf (_(" Flags\n"));
4698 for (i = 0, section = section_headers;
4699 i < elf_header.e_shnum;
4702 if (do_section_details)
4704 printf (" [%2u] %s\n",
4706 SECTION_NAME (section));
4707 if (is_32bit_elf || do_wide)
4708 printf (" %-15.15s ",
4709 get_section_type_name (section->sh_type));
4712 printf ((do_wide ? " [%2u] %-17s %-15s "
4713 : " [%2u] %-17.17s %-15.15s "),
4715 SECTION_NAME (section),
4716 get_section_type_name (section->sh_type));
4720 const char * link_too_big = NULL;
4722 print_vma (section->sh_addr, LONG_HEX);
4724 printf ( " %6.6lx %6.6lx %2.2lx",
4725 (unsigned long) section->sh_offset,
4726 (unsigned long) section->sh_size,
4727 (unsigned long) section->sh_entsize);
4729 if (do_section_details)
4730 fputs (" ", stdout);
4732 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4734 if (section->sh_link >= elf_header.e_shnum)
4737 /* The sh_link value is out of range. Normally this indicates
4738 an error but it can have special values in Solaris binaries. */
4739 switch (elf_header.e_machine)
4746 case EM_OLD_SPARCV9:
4747 case EM_SPARC32PLUS:
4750 if (section->sh_link == (SHN_BEFORE & 0xffff))
4751 link_too_big = "BEFORE";
4752 else if (section->sh_link == (SHN_AFTER & 0xffff))
4753 link_too_big = "AFTER";
4760 if (do_section_details)
4762 if (link_too_big != NULL && * link_too_big)
4763 printf ("<%s> ", link_too_big);
4765 printf ("%2u ", section->sh_link);
4766 printf ("%3u %2lu\n", section->sh_info,
4767 (unsigned long) section->sh_addralign);
4770 printf ("%2u %3u %2lu\n",
4773 (unsigned long) section->sh_addralign);
4775 if (link_too_big && ! * link_too_big)
4776 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4777 i, section->sh_link);
4781 print_vma (section->sh_addr, LONG_HEX);
4783 if ((long) section->sh_offset == section->sh_offset)
4784 printf (" %6.6lx", (unsigned long) section->sh_offset);
4788 print_vma (section->sh_offset, LONG_HEX);
4791 if ((unsigned long) section->sh_size == section->sh_size)
4792 printf (" %6.6lx", (unsigned long) section->sh_size);
4796 print_vma (section->sh_size, LONG_HEX);
4799 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4800 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4804 print_vma (section->sh_entsize, LONG_HEX);
4807 if (do_section_details)
4808 fputs (" ", stdout);
4810 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4812 printf ("%2u %3u ", section->sh_link, section->sh_info);
4814 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4815 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4818 print_vma (section->sh_addralign, DEC);
4822 else if (do_section_details)
4824 printf (" %-15.15s ",
4825 get_section_type_name (section->sh_type));
4826 print_vma (section->sh_addr, LONG_HEX);
4827 if ((long) section->sh_offset == section->sh_offset)
4828 printf (" %16.16lx", (unsigned long) section->sh_offset);
4832 print_vma (section->sh_offset, LONG_HEX);
4834 printf (" %u\n ", section->sh_link);
4835 print_vma (section->sh_size, LONG_HEX);
4837 print_vma (section->sh_entsize, LONG_HEX);
4839 printf (" %-16u %lu\n",
4841 (unsigned long) section->sh_addralign);
4846 print_vma (section->sh_addr, LONG_HEX);
4847 if ((long) section->sh_offset == section->sh_offset)
4848 printf (" %8.8lx", (unsigned long) section->sh_offset);
4852 print_vma (section->sh_offset, LONG_HEX);
4855 print_vma (section->sh_size, LONG_HEX);
4857 print_vma (section->sh_entsize, LONG_HEX);
4859 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4861 printf (" %2u %3u %lu\n",
4864 (unsigned long) section->sh_addralign);
4867 if (do_section_details)
4868 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4871 if (!do_section_details)
4873 if (elf_header.e_machine == EM_X86_64
4874 || elf_header.e_machine == EM_L1OM
4875 || elf_header.e_machine == EM_K1OM)
4876 printf (_("Key to Flags:\n\
4877 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4878 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4879 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4881 printf (_("Key to Flags:\n\
4882 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4883 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4884 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4891 get_group_flags (unsigned int flags)
4893 static char buff[32];
4903 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4910 process_section_groups (FILE * file)
4912 Elf_Internal_Shdr * section;
4914 struct group * group;
4915 Elf_Internal_Shdr * symtab_sec;
4916 Elf_Internal_Shdr * strtab_sec;
4917 Elf_Internal_Sym * symtab;
4921 /* Don't process section groups unless needed. */
4922 if (!do_unwind && !do_section_groups)
4925 if (elf_header.e_shnum == 0)
4927 if (do_section_groups)
4928 printf (_("\nThere are no sections to group in this file.\n"));
4933 if (section_headers == NULL)
4935 error (_("Section headers are not available!\n"));
4939 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4940 sizeof (struct group *));
4942 if (section_headers_groups == NULL)
4944 error (_("Out of memory\n"));
4948 /* Scan the sections for the group section. */
4950 for (i = 0, section = section_headers;
4951 i < elf_header.e_shnum;
4953 if (section->sh_type == SHT_GROUP)
4956 if (group_count == 0)
4958 if (do_section_groups)
4959 printf (_("\nThere are no section groups in this file.\n"));
4964 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4966 if (section_groups == NULL)
4968 error (_("Out of memory\n"));
4977 for (i = 0, section = section_headers, group = section_groups;
4978 i < elf_header.e_shnum;
4981 if (section->sh_type == SHT_GROUP)
4983 char * name = SECTION_NAME (section);
4985 unsigned char * start;
4986 unsigned char * indices;
4987 unsigned int entry, j, size;
4988 Elf_Internal_Shdr * sec;
4989 Elf_Internal_Sym * sym;
4991 /* Get the symbol table. */
4992 if (section->sh_link >= elf_header.e_shnum
4993 || ((sec = section_headers + section->sh_link)->sh_type
4996 error (_("Bad sh_link in group section `%s'\n"), name);
5000 if (symtab_sec != sec)
5005 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
5010 error (_("Corrupt header in group section `%s'\n"), name);
5014 sym = symtab + section->sh_info;
5016 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5018 if (sym->st_shndx == 0
5019 || sym->st_shndx >= elf_header.e_shnum)
5021 error (_("Bad sh_info in group section `%s'\n"), name);
5025 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5034 /* Get the string table. */
5035 if (symtab_sec->sh_link >= elf_header.e_shnum)
5044 != (sec = section_headers + symtab_sec->sh_link))
5049 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5050 1, strtab_sec->sh_size,
5052 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5054 group_name = sym->st_name < strtab_size
5055 ? strtab + sym->st_name : _("<corrupt>");
5058 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5059 1, section->sh_size,
5065 size = (section->sh_size / section->sh_entsize) - 1;
5066 entry = byte_get (indices, 4);
5069 if (do_section_groups)
5071 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5072 get_group_flags (entry), i, name, group_name, size);
5074 printf (_(" [Index] Name\n"));
5077 group->group_index = i;
5079 for (j = 0; j < size; j++)
5081 struct group_list * g;
5083 entry = byte_get (indices, 4);
5086 if (entry >= elf_header.e_shnum)
5088 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5089 entry, i, elf_header.e_shnum - 1);
5093 if (section_headers_groups [entry] != NULL)
5097 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5099 section_headers_groups [entry]->group_index);
5104 /* Intel C/C++ compiler may put section 0 in a
5105 section group. We just warn it the first time
5106 and ignore it afterwards. */
5107 static int warned = 0;
5110 error (_("section 0 in group section [%5u]\n"),
5111 section_headers_groups [entry]->group_index);
5117 section_headers_groups [entry] = group;
5119 if (do_section_groups)
5121 sec = section_headers + entry;
5122 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5125 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5126 g->section_index = entry;
5127 g->next = group->root;
5145 /* Data used to display dynamic fixups. */
5147 struct ia64_vms_dynfixup
5149 bfd_vma needed_ident; /* Library ident number. */
5150 bfd_vma needed; /* Index in the dstrtab of the library name. */
5151 bfd_vma fixup_needed; /* Index of the library. */
5152 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5153 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5156 /* Data used to display dynamic relocations. */
5158 struct ia64_vms_dynimgrela
5160 bfd_vma img_rela_cnt; /* Number of relocations. */
5161 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5164 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5168 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5169 const char *strtab, unsigned int strtab_sz)
5171 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5173 const char *lib_name;
5175 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5176 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5177 _("dynamic section image fixups"));
5181 if (fixup->needed < strtab_sz)
5182 lib_name = strtab + fixup->needed;
5185 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5186 (unsigned long) fixup->needed);
5189 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5190 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5192 (_("Seg Offset Type SymVec DataType\n"));
5194 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5199 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5200 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5201 type = BYTE_GET (imfs [i].type);
5202 rtype = elf_ia64_reloc_type (type);
5204 printf (" 0x%08x ", type);
5206 printf (" %-32s ", rtype);
5207 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5208 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5214 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5217 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5219 Elf64_External_VMS_IMAGE_RELA *imrs;
5222 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5223 1, imgrela->img_rela_cnt * sizeof (*imrs),
5224 _("dynamic section image relas"));
5228 printf (_("\nImage relocs\n"));
5230 (_("Seg Offset Type Addend Seg Sym Off\n"));
5232 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5237 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5238 printf ("%08" BFD_VMA_FMT "x ",
5239 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5240 type = BYTE_GET (imrs [i].type);
5241 rtype = elf_ia64_reloc_type (type);
5243 printf ("0x%08x ", type);
5245 printf ("%-31s ", rtype);
5246 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5247 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5248 printf ("%08" BFD_VMA_FMT "x\n",
5249 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5255 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5258 process_ia64_vms_dynamic_relocs (FILE *file)
5260 struct ia64_vms_dynfixup fixup;
5261 struct ia64_vms_dynimgrela imgrela;
5262 Elf_Internal_Dyn *entry;
5264 bfd_vma strtab_off = 0;
5265 bfd_vma strtab_sz = 0;
5266 char *strtab = NULL;
5268 memset (&fixup, 0, sizeof (fixup));
5269 memset (&imgrela, 0, sizeof (imgrela));
5271 /* Note: the order of the entries is specified by the OpenVMS specs. */
5272 for (entry = dynamic_section;
5273 entry < dynamic_section + dynamic_nent;
5276 switch (entry->d_tag)
5278 case DT_IA_64_VMS_STRTAB_OFFSET:
5279 strtab_off = entry->d_un.d_val;
5282 strtab_sz = entry->d_un.d_val;
5284 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5285 1, strtab_sz, _("dynamic string section"));
5288 case DT_IA_64_VMS_NEEDED_IDENT:
5289 fixup.needed_ident = entry->d_un.d_val;
5292 fixup.needed = entry->d_un.d_val;
5294 case DT_IA_64_VMS_FIXUP_NEEDED:
5295 fixup.fixup_needed = entry->d_un.d_val;
5297 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5298 fixup.fixup_rela_cnt = entry->d_un.d_val;
5300 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5301 fixup.fixup_rela_off = entry->d_un.d_val;
5303 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5306 case DT_IA_64_VMS_IMG_RELA_CNT:
5307 imgrela.img_rela_cnt = entry->d_un.d_val;
5309 case DT_IA_64_VMS_IMG_RELA_OFF:
5310 imgrela.img_rela_off = entry->d_un.d_val;
5312 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5332 } dynamic_relocations [] =
5334 { "REL", DT_REL, DT_RELSZ, FALSE },
5335 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5336 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5339 /* Process the reloc section. */
5342 process_relocs (FILE * file)
5344 unsigned long rel_size;
5345 unsigned long rel_offset;
5351 if (do_using_dynamic)
5355 int has_dynamic_reloc;
5358 has_dynamic_reloc = 0;
5360 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5362 is_rela = dynamic_relocations [i].rela;
5363 name = dynamic_relocations [i].name;
5364 rel_size = dynamic_info [dynamic_relocations [i].size];
5365 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5367 has_dynamic_reloc |= rel_size;
5369 if (is_rela == UNKNOWN)
5371 if (dynamic_relocations [i].reloc == DT_JMPREL)
5372 switch (dynamic_info[DT_PLTREL])
5386 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5387 name, rel_offset, rel_size);
5389 dump_relocations (file,
5390 offset_from_vma (file, rel_offset, rel_size),
5392 dynamic_symbols, num_dynamic_syms,
5393 dynamic_strings, dynamic_strings_length, is_rela);
5398 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5400 if (! has_dynamic_reloc)
5401 printf (_("\nThere are no dynamic relocations in this file.\n"));
5405 Elf_Internal_Shdr * section;
5409 for (i = 0, section = section_headers;
5410 i < elf_header.e_shnum;
5413 if ( section->sh_type != SHT_RELA
5414 && section->sh_type != SHT_REL)
5417 rel_offset = section->sh_offset;
5418 rel_size = section->sh_size;
5422 Elf_Internal_Shdr * strsec;
5425 printf (_("\nRelocation section "));
5427 if (string_table == NULL)
5428 printf ("%d", section->sh_name);
5430 printf (_("'%s'"), SECTION_NAME (section));
5432 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5433 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5435 is_rela = section->sh_type == SHT_RELA;
5437 if (section->sh_link != 0
5438 && section->sh_link < elf_header.e_shnum)
5440 Elf_Internal_Shdr * symsec;
5441 Elf_Internal_Sym * symtab;
5442 unsigned long nsyms;
5443 unsigned long strtablen = 0;
5444 char * strtab = NULL;
5446 symsec = section_headers + section->sh_link;
5447 if (symsec->sh_type != SHT_SYMTAB
5448 && symsec->sh_type != SHT_DYNSYM)
5451 nsyms = symsec->sh_size / symsec->sh_entsize;
5452 symtab = GET_ELF_SYMBOLS (file, symsec);
5457 if (symsec->sh_link != 0
5458 && symsec->sh_link < elf_header.e_shnum)
5460 strsec = section_headers + symsec->sh_link;
5462 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5465 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5468 dump_relocations (file, rel_offset, rel_size,
5469 symtab, nsyms, strtab, strtablen, is_rela);
5475 dump_relocations (file, rel_offset, rel_size,
5476 NULL, 0, NULL, 0, is_rela);
5483 printf (_("\nThere are no relocations in this file.\n"));
5489 /* Process the unwind section. */
5491 #include "unwind-ia64.h"
5493 /* An absolute address consists of a section and an offset. If the
5494 section is NULL, the offset itself is the address, otherwise, the
5495 address equals to LOAD_ADDRESS(section) + offset. */
5499 unsigned short section;
5503 #define ABSADDR(a) \
5505 ? section_headers [(a).section].sh_addr + (a).offset \
5508 struct ia64_unw_table_entry
5510 struct absaddr start;
5512 struct absaddr info;
5515 struct ia64_unw_aux_info
5518 struct ia64_unw_table_entry *table; /* Unwind table. */
5519 unsigned long table_len; /* Length of unwind table. */
5520 unsigned char * info; /* Unwind info. */
5521 unsigned long info_size; /* Size of unwind info. */
5522 bfd_vma info_addr; /* starting address of unwind info. */
5523 bfd_vma seg_base; /* Starting address of segment. */
5524 Elf_Internal_Sym * symtab; /* The symbol table. */
5525 unsigned long nsyms; /* Number of symbols. */
5526 char * strtab; /* The string table. */
5527 unsigned long strtab_size; /* Size of string table. */
5531 find_symbol_for_address (Elf_Internal_Sym * symtab,
5532 unsigned long nsyms,
5533 const char * strtab,
5534 unsigned long strtab_size,
5535 struct absaddr addr,
5536 const char ** symname,
5539 bfd_vma dist = 0x100000;
5540 Elf_Internal_Sym * sym;
5541 Elf_Internal_Sym * best = NULL;
5544 REMOVE_ARCH_BITS (addr.offset);
5546 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5548 bfd_vma value = sym->st_value;
5550 REMOVE_ARCH_BITS (value);
5552 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5553 && sym->st_name != 0
5554 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5555 && addr.offset >= value
5556 && addr.offset - value < dist)
5559 dist = addr.offset - value;
5566 *symname = (best->st_name >= strtab_size
5567 ? _("<corrupt>") : strtab + best->st_name);
5572 *offset = addr.offset;
5576 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5578 struct ia64_unw_table_entry * tp;
5581 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5585 const unsigned char * dp;
5586 const unsigned char * head;
5587 const char * procname;
5589 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5590 aux->strtab_size, tp->start, &procname, &offset);
5592 fputs ("\n<", stdout);
5596 fputs (procname, stdout);
5599 printf ("+%lx", (unsigned long) offset);
5602 fputs (">: [", stdout);
5603 print_vma (tp->start.offset, PREFIX_HEX);
5604 fputc ('-', stdout);
5605 print_vma (tp->end.offset, PREFIX_HEX);
5606 printf ("], info at +0x%lx\n",
5607 (unsigned long) (tp->info.offset - aux->seg_base));
5609 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5610 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5612 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5613 (unsigned) UNW_VER (stamp),
5614 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5615 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5616 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5617 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5619 if (UNW_VER (stamp) != 1)
5621 printf (_("\tUnknown version.\n"));
5626 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5627 dp = unw_decode (dp, in_body, & in_body);
5632 slurp_ia64_unwind_table (FILE * file,
5633 struct ia64_unw_aux_info * aux,
5634 Elf_Internal_Shdr * sec)
5636 unsigned long size, nrelas, i;
5637 Elf_Internal_Phdr * seg;
5638 struct ia64_unw_table_entry * tep;
5639 Elf_Internal_Shdr * relsec;
5640 Elf_Internal_Rela * rela;
5641 Elf_Internal_Rela * rp;
5642 unsigned char * table;
5644 Elf_Internal_Sym * sym;
5645 const char * relname;
5647 /* First, find the starting address of the segment that includes
5650 if (elf_header.e_phnum)
5652 if (! get_program_headers (file))
5655 for (seg = program_headers;
5656 seg < program_headers + elf_header.e_phnum;
5659 if (seg->p_type != PT_LOAD)
5662 if (sec->sh_addr >= seg->p_vaddr
5663 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5665 aux->seg_base = seg->p_vaddr;
5671 /* Second, build the unwind table from the contents of the unwind section: */
5672 size = sec->sh_size;
5673 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5678 aux->table = (struct ia64_unw_table_entry *)
5679 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5681 for (tp = table; tp < table + size; ++tep)
5683 tep->start.section = SHN_UNDEF;
5684 tep->end.section = SHN_UNDEF;
5685 tep->info.section = SHN_UNDEF;
5686 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5687 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5688 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5689 tep->start.offset += aux->seg_base;
5690 tep->end.offset += aux->seg_base;
5691 tep->info.offset += aux->seg_base;
5695 /* Third, apply any relocations to the unwind table: */
5696 for (relsec = section_headers;
5697 relsec < section_headers + elf_header.e_shnum;
5700 if (relsec->sh_type != SHT_RELA
5701 || relsec->sh_info >= elf_header.e_shnum
5702 || section_headers + relsec->sh_info != sec)
5705 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5709 for (rp = rela; rp < rela + nrelas; ++rp)
5711 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5712 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5714 if (! const_strneq (relname, "R_IA64_SEGREL"))
5716 warn (_("Skipping unexpected relocation type %s\n"), relname);
5720 i = rp->r_offset / (3 * eh_addr_size);
5722 switch (rp->r_offset/eh_addr_size % 3)
5725 aux->table[i].start.section = sym->st_shndx;
5726 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5729 aux->table[i].end.section = sym->st_shndx;
5730 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5733 aux->table[i].info.section = sym->st_shndx;
5734 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5744 aux->table_len = size / (3 * eh_addr_size);
5749 ia64_process_unwind (FILE * file)
5751 Elf_Internal_Shdr * sec;
5752 Elf_Internal_Shdr * unwsec = NULL;
5753 Elf_Internal_Shdr * strsec;
5754 unsigned long i, unwcount = 0, unwstart = 0;
5755 struct ia64_unw_aux_info aux;
5757 memset (& aux, 0, sizeof (aux));
5759 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5761 if (sec->sh_type == SHT_SYMTAB
5762 && sec->sh_link < elf_header.e_shnum)
5764 aux.nsyms = sec->sh_size / sec->sh_entsize;
5765 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5767 strsec = section_headers + sec->sh_link;
5768 assert (aux.strtab == NULL);
5769 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5772 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5774 else if (sec->sh_type == SHT_IA_64_UNWIND)
5779 printf (_("\nThere are no unwind sections in this file.\n"));
5781 while (unwcount-- > 0)
5786 for (i = unwstart, sec = section_headers + unwstart;
5787 i < elf_header.e_shnum; ++i, ++sec)
5788 if (sec->sh_type == SHT_IA_64_UNWIND)
5795 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5797 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5799 /* We need to find which section group it is in. */
5800 struct group_list * g = section_headers_groups [i]->root;
5802 for (; g != NULL; g = g->next)
5804 sec = section_headers + g->section_index;
5806 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5811 i = elf_header.e_shnum;
5813 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5815 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5816 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5817 suffix = SECTION_NAME (unwsec) + len;
5818 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5820 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5821 && streq (SECTION_NAME (sec) + len2, suffix))
5826 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5827 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5828 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5829 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5831 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5832 suffix = SECTION_NAME (unwsec) + len;
5833 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5835 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5836 && streq (SECTION_NAME (sec) + len2, suffix))
5840 if (i == elf_header.e_shnum)
5842 printf (_("\nCould not find unwind info section for "));
5844 if (string_table == NULL)
5845 printf ("%d", unwsec->sh_name);
5847 printf (_("'%s'"), SECTION_NAME (unwsec));
5851 aux.info_addr = sec->sh_addr;
5852 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5855 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
5857 printf (_("\nUnwind section "));
5859 if (string_table == NULL)
5860 printf ("%d", unwsec->sh_name);
5862 printf (_("'%s'"), SECTION_NAME (unwsec));
5864 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5865 (unsigned long) unwsec->sh_offset,
5866 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5868 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5870 if (aux.table_len > 0)
5871 dump_ia64_unwind (& aux);
5874 free ((char *) aux.table);
5876 free ((char *) aux.info);
5885 free ((char *) aux.strtab);
5890 struct hppa_unw_table_entry
5892 struct absaddr start;
5894 unsigned int Cannot_unwind:1; /* 0 */
5895 unsigned int Millicode:1; /* 1 */
5896 unsigned int Millicode_save_sr0:1; /* 2 */
5897 unsigned int Region_description:2; /* 3..4 */
5898 unsigned int reserved1:1; /* 5 */
5899 unsigned int Entry_SR:1; /* 6 */
5900 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5901 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5902 unsigned int Args_stored:1; /* 16 */
5903 unsigned int Variable_Frame:1; /* 17 */
5904 unsigned int Separate_Package_Body:1; /* 18 */
5905 unsigned int Frame_Extension_Millicode:1; /* 19 */
5906 unsigned int Stack_Overflow_Check:1; /* 20 */
5907 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5908 unsigned int Ada_Region:1; /* 22 */
5909 unsigned int cxx_info:1; /* 23 */
5910 unsigned int cxx_try_catch:1; /* 24 */
5911 unsigned int sched_entry_seq:1; /* 25 */
5912 unsigned int reserved2:1; /* 26 */
5913 unsigned int Save_SP:1; /* 27 */
5914 unsigned int Save_RP:1; /* 28 */
5915 unsigned int Save_MRP_in_frame:1; /* 29 */
5916 unsigned int extn_ptr_defined:1; /* 30 */
5917 unsigned int Cleanup_defined:1; /* 31 */
5919 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5920 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5921 unsigned int Large_frame:1; /* 2 */
5922 unsigned int Pseudo_SP_Set:1; /* 3 */
5923 unsigned int reserved4:1; /* 4 */
5924 unsigned int Total_frame_size:27; /* 5..31 */
5927 struct hppa_unw_aux_info
5929 struct hppa_unw_table_entry *table; /* Unwind table. */
5930 unsigned long table_len; /* Length of unwind table. */
5931 bfd_vma seg_base; /* Starting address of segment. */
5932 Elf_Internal_Sym * symtab; /* The symbol table. */
5933 unsigned long nsyms; /* Number of symbols. */
5934 char * strtab; /* The string table. */
5935 unsigned long strtab_size; /* Size of string table. */
5939 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5941 struct hppa_unw_table_entry * tp;
5943 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5946 const char * procname;
5948 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5949 aux->strtab_size, tp->start, &procname,
5952 fputs ("\n<", stdout);
5956 fputs (procname, stdout);
5959 printf ("+%lx", (unsigned long) offset);
5962 fputs (">: [", stdout);
5963 print_vma (tp->start.offset, PREFIX_HEX);
5964 fputc ('-', stdout);
5965 print_vma (tp->end.offset, PREFIX_HEX);
5968 #define PF(_m) if (tp->_m) printf (#_m " ");
5969 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5972 PF(Millicode_save_sr0);
5973 /* PV(Region_description); */
5979 PF(Separate_Package_Body);
5980 PF(Frame_Extension_Millicode);
5981 PF(Stack_Overflow_Check);
5982 PF(Two_Instruction_SP_Increment);
5986 PF(sched_entry_seq);
5989 PF(Save_MRP_in_frame);
5990 PF(extn_ptr_defined);
5991 PF(Cleanup_defined);
5992 PF(MPE_XL_interrupt_marker);
5993 PF(HP_UX_interrupt_marker);
5996 PV(Total_frame_size);
6005 slurp_hppa_unwind_table (FILE * file,
6006 struct hppa_unw_aux_info * aux,
6007 Elf_Internal_Shdr * sec)
6009 unsigned long size, unw_ent_size, nentries, nrelas, i;
6010 Elf_Internal_Phdr * seg;
6011 struct hppa_unw_table_entry * tep;
6012 Elf_Internal_Shdr * relsec;
6013 Elf_Internal_Rela * rela;
6014 Elf_Internal_Rela * rp;
6015 unsigned char * table;
6017 Elf_Internal_Sym * sym;
6018 const char * relname;
6020 /* First, find the starting address of the segment that includes
6023 if (elf_header.e_phnum)
6025 if (! get_program_headers (file))
6028 for (seg = program_headers;
6029 seg < program_headers + elf_header.e_phnum;
6032 if (seg->p_type != PT_LOAD)
6035 if (sec->sh_addr >= seg->p_vaddr
6036 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6038 aux->seg_base = seg->p_vaddr;
6044 /* Second, build the unwind table from the contents of the unwind
6046 size = sec->sh_size;
6047 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6053 nentries = size / unw_ent_size;
6054 size = unw_ent_size * nentries;
6056 tep = aux->table = (struct hppa_unw_table_entry *)
6057 xcmalloc (nentries, sizeof (aux->table[0]));
6059 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6061 unsigned int tmp1, tmp2;
6063 tep->start.section = SHN_UNDEF;
6064 tep->end.section = SHN_UNDEF;
6066 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6067 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6068 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6069 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6071 tep->start.offset += aux->seg_base;
6072 tep->end.offset += aux->seg_base;
6074 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6075 tep->Millicode = (tmp1 >> 30) & 0x1;
6076 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6077 tep->Region_description = (tmp1 >> 27) & 0x3;
6078 tep->reserved1 = (tmp1 >> 26) & 0x1;
6079 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6080 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6081 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6082 tep->Args_stored = (tmp1 >> 15) & 0x1;
6083 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6084 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6085 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6086 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6087 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6088 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6089 tep->cxx_info = (tmp1 >> 8) & 0x1;
6090 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6091 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6092 tep->reserved2 = (tmp1 >> 5) & 0x1;
6093 tep->Save_SP = (tmp1 >> 4) & 0x1;
6094 tep->Save_RP = (tmp1 >> 3) & 0x1;
6095 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6096 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6097 tep->Cleanup_defined = tmp1 & 0x1;
6099 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6100 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6101 tep->Large_frame = (tmp2 >> 29) & 0x1;
6102 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6103 tep->reserved4 = (tmp2 >> 27) & 0x1;
6104 tep->Total_frame_size = tmp2 & 0x7ffffff;
6108 /* Third, apply any relocations to the unwind table. */
6109 for (relsec = section_headers;
6110 relsec < section_headers + elf_header.e_shnum;
6113 if (relsec->sh_type != SHT_RELA
6114 || relsec->sh_info >= elf_header.e_shnum
6115 || section_headers + relsec->sh_info != sec)
6118 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6122 for (rp = rela; rp < rela + nrelas; ++rp)
6124 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6125 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6127 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6128 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6130 warn (_("Skipping unexpected relocation type %s\n"), relname);
6134 i = rp->r_offset / unw_ent_size;
6136 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6139 aux->table[i].start.section = sym->st_shndx;
6140 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6143 aux->table[i].end.section = sym->st_shndx;
6144 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6154 aux->table_len = nentries;
6160 hppa_process_unwind (FILE * file)
6162 struct hppa_unw_aux_info aux;
6163 Elf_Internal_Shdr * unwsec = NULL;
6164 Elf_Internal_Shdr * strsec;
6165 Elf_Internal_Shdr * sec;
6168 memset (& aux, 0, sizeof (aux));
6170 if (string_table == NULL)
6173 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6175 if (sec->sh_type == SHT_SYMTAB
6176 && sec->sh_link < elf_header.e_shnum)
6178 aux.nsyms = sec->sh_size / sec->sh_entsize;
6179 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6181 strsec = section_headers + sec->sh_link;
6182 assert (aux.strtab == NULL);
6183 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6186 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6188 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6193 printf (_("\nThere are no unwind sections in this file.\n"));
6195 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6197 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6199 printf (_("\nUnwind section "));
6200 printf (_("'%s'"), SECTION_NAME (sec));
6202 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6203 (unsigned long) sec->sh_offset,
6204 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6206 slurp_hppa_unwind_table (file, &aux, sec);
6207 if (aux.table_len > 0)
6208 dump_hppa_unwind (&aux);
6211 free ((char *) aux.table);
6219 free ((char *) aux.strtab);
6226 unsigned char *data;
6228 Elf_Internal_Shdr *sec;
6229 Elf_Internal_Rela *rela;
6230 unsigned long nrelas;
6231 unsigned int rel_type;
6233 Elf_Internal_Rela *next_rela;
6236 struct arm_unw_aux_info
6240 Elf_Internal_Sym *symtab; /* The symbol table. */
6241 unsigned long nsyms; /* Number of symbols. */
6242 char *strtab; /* The string table. */
6243 unsigned long strtab_size; /* Size of string table. */
6247 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6248 bfd_vma fn, struct absaddr addr)
6250 const char *procname;
6253 if (addr.section == SHN_UNDEF)
6256 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6257 aux->strtab_size, addr, &procname,
6260 print_vma (fn, PREFIX_HEX);
6264 fputs (" <", stdout);
6265 fputs (procname, stdout);
6268 printf ("+0x%lx", (unsigned long) sym_offset);
6269 fputc ('>', stdout);
6276 arm_free_section (struct arm_section *arm_sec)
6278 if (arm_sec->data != NULL)
6279 free (arm_sec->data);
6281 if (arm_sec->rela != NULL)
6282 free (arm_sec->rela);
6286 arm_section_get_word (struct arm_unw_aux_info *aux,
6287 struct arm_section *arm_sec,
6288 Elf_Internal_Shdr *sec, bfd_vma word_offset,
6289 unsigned int *wordp, struct absaddr *addr)
6291 Elf_Internal_Rela *rp;
6292 Elf_Internal_Sym *sym;
6293 const char * relname;
6295 bfd_boolean wrapped;
6297 addr->section = SHN_UNDEF;
6300 if (sec != arm_sec->sec)
6302 Elf_Internal_Shdr *relsec;
6304 arm_free_section (arm_sec);
6307 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6308 sec->sh_size, _("unwind data"));
6309 arm_sec->rela = NULL;
6310 arm_sec->nrelas = 0;
6312 for (relsec = section_headers;
6313 relsec < section_headers + elf_header.e_shnum;
6316 if (relsec->sh_info >= elf_header.e_shnum
6317 || section_headers + relsec->sh_info != sec)
6320 if (relsec->sh_type == SHT_REL)
6322 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6324 & arm_sec->rela, & arm_sec->nrelas))
6328 else if (relsec->sh_type == SHT_RELA)
6330 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6332 & arm_sec->rela, & arm_sec->nrelas))
6338 arm_sec->next_rela = arm_sec->rela;
6341 if (arm_sec->data == NULL)
6344 word = byte_get (arm_sec->data + word_offset, 4);
6347 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6349 bfd_vma prelval, offset;
6351 if (rp->r_offset > word_offset && !wrapped)
6356 if (rp->r_offset > word_offset)
6359 if (rp->r_offset & 3)
6361 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6362 (unsigned long) rp->r_offset);
6366 if (rp->r_offset < word_offset)
6369 switch (elf_header.e_machine)
6372 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6376 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6383 if (streq (relname, "R_ARM_NONE")
6384 || streq (relname, "R_C6000_NONE"))
6387 if (!(streq (relname, "R_ARM_PREL31")
6388 || streq (relname, "R_C6000_PREL31")))
6390 warn (_("Skipping unexpected relocation type %s\n"), relname);
6394 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6396 if (arm_sec->rel_type == SHT_REL)
6398 offset = word & 0x7fffffff;
6399 if (offset & 0x40000000)
6400 offset |= ~ (bfd_vma) 0x7fffffff;
6403 offset = rp->r_addend;
6405 offset += sym->st_value;
6406 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6408 if (streq (relname, "R_C6000_PREL31"))
6411 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6412 addr->section = sym->st_shndx;
6413 addr->offset = offset;
6418 arm_sec->next_rela = rp;
6423 static const char *tic6x_unwind_regnames[16] = {
6424 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6425 "A14", "A13", "A12", "A11", "A10",
6426 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"};
6429 decode_tic6x_unwind_regmask (unsigned int mask)
6433 for (i = 12; mask; mask >>= 1, i--)
6437 fputs (tic6x_unwind_regnames[i], stdout);
6439 fputs (", ", stdout);
6445 if (remaining == 0 && more_words) \
6448 if (!arm_section_get_word (aux, data_arm_sec, data_sec, \
6449 data_offset, &word, &addr)) \
6455 #define GET_OP(OP) \
6460 (OP) = word >> 24; \
6465 printf (_("[Truncated opcode]\n")); \
6468 printf ("0x%02x ", OP)
6471 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6472 unsigned int word, unsigned int remaining,
6473 unsigned int more_words,
6474 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6475 struct arm_section *data_arm_sec)
6477 struct absaddr addr;
6479 /* Decode the unwinding instructions. */
6482 unsigned int op, op2;
6491 printf (" 0x%02x ", op);
6493 if ((op & 0xc0) == 0x00)
6495 int offset = ((op & 0x3f) << 2) + 4;
6497 printf (" vsp = vsp + %d", offset);
6499 else if ((op & 0xc0) == 0x40)
6501 int offset = ((op & 0x3f) << 2) + 4;
6503 printf (" vsp = vsp - %d", offset);
6505 else if ((op & 0xf0) == 0x80)
6508 if (op == 0x80 && op2 == 0)
6509 printf (_("Refuse to unwind"));
6512 unsigned int mask = ((op & 0x0f) << 8) | op2;
6517 for (i = 0; i < 12; i++)
6518 if (mask & (1 << i))
6524 printf ("r%d", 4 + i);
6529 else if ((op & 0xf0) == 0x90)
6531 if (op == 0x9d || op == 0x9f)
6532 printf (_(" [Reserved]"));
6534 printf (" vsp = r%d", op & 0x0f);
6536 else if ((op & 0xf0) == 0xa0)
6538 int end = 4 + (op & 0x07);
6543 for (i = 4; i <= end; i++)
6559 else if (op == 0xb0)
6560 printf (_(" finish"));
6561 else if (op == 0xb1)
6564 if (op2 == 0 || (op2 & 0xf0) != 0)
6565 printf (_("[Spare]"));
6568 unsigned int mask = op2 & 0x0f;
6573 for (i = 0; i < 12; i++)
6574 if (mask & (1 << i))
6585 else if (op == 0xb2)
6587 unsigned char buf[9];
6588 unsigned int i, len;
6589 unsigned long offset;
6591 for (i = 0; i < sizeof (buf); i++)
6594 if ((buf[i] & 0x80) == 0)
6597 assert (i < sizeof (buf));
6598 offset = read_uleb128 (buf, &len);
6599 assert (len == i + 1);
6600 offset = offset * 4 + 0x204;
6601 printf ("vsp = vsp + %ld", offset);
6603 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6605 unsigned int first, last;
6612 printf ("pop {D%d", first);
6614 printf ("-D%d", first + last);
6617 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6619 unsigned int count = op & 0x07;
6623 printf ("-D%d", 8 + count);
6626 else if (op >= 0xc0 && op <= 0xc5)
6628 unsigned int count = op & 0x07;
6630 printf (" pop {wR10");
6632 printf ("-wR%d", 10 + count);
6635 else if (op == 0xc6)
6637 unsigned int first, last;
6642 printf ("pop {wR%d", first);
6644 printf ("-wR%d", first + last);
6647 else if (op == 0xc7)
6650 if (op2 == 0 || (op2 & 0xf0) != 0)
6651 printf (_("[Spare]"));
6654 unsigned int mask = op2 & 0x0f;
6659 for (i = 0; i < 4; i++)
6660 if (mask & (1 << i))
6666 printf ("wCGR%d", i);
6672 printf (_(" [unsupported opcode]"));
6678 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
6679 unsigned int word, unsigned int remaining,
6680 unsigned int more_words,
6681 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6682 struct arm_section *data_arm_sec)
6684 struct absaddr addr;
6686 /* Decode the unwinding instructions. */
6689 unsigned int op, op2;
6698 printf (_(" 0x%02x "), op);
6700 if ((op & 0xc0) == 0x00)
6702 int offset = ((op & 0x3f) << 3) + 8;
6703 printf (_(" sp = sp + %d"), offset);
6705 else if ((op & 0xc0) == 0x80)
6708 if (op == 0x80 && op2 == 0)
6709 printf (_("Refuse to unwind"));
6712 unsigned int mask = ((op & 0x1f) << 8) | op2;
6714 printf ("pop compact {");
6718 decode_tic6x_unwind_regmask (mask);
6722 else if ((op & 0xf0) == 0xc0)
6729 unsigned int offset;
6733 /* Scan entire instruction first so that GET_OP output is not
6734 interleaved with disassembly. */
6736 for (i = 0; nregs < (op & 0xf); i++)
6742 regpos[nregs].offset = i * 2;
6743 regpos[nregs].reg = reg;
6750 regpos[nregs].offset = i * 2 + 1;
6751 regpos[nregs].reg = reg;
6756 printf (_("pop frame {"));
6758 for (i = i * 2; i > 0; i--)
6760 if (regpos[reg].offset == i - 1)
6762 name = tic6x_unwind_regnames[regpos[reg].reg];
6769 fputs (name, stdout);
6776 else if (op == 0xd0)
6777 printf (" MOV FP, SP");
6778 else if (op == 0xd1)
6779 printf (" __c6xabi_pop_rts");
6780 else if (op == 0xd2)
6782 unsigned char buf[9];
6783 unsigned int i, len;
6784 unsigned long offset;
6785 for (i = 0; i < sizeof (buf); i++)
6788 if ((buf[i] & 0x80) == 0)
6791 assert (i < sizeof (buf));
6792 offset = read_uleb128 (buf, &len);
6793 assert (len == i + 1);
6794 offset = offset * 8 + 0x408;
6795 printf (_("sp = sp + %ld"), offset);
6797 else if ((op & 0xf0) == 0xe0)
6799 if ((op & 0x0f) == 7)
6802 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
6806 printf (_(" [unsupported opcode]"));
6813 expand_prel31 (bfd_vma word, bfd_vma where)
6817 offset = word & 0x7fffffff;
6818 if (offset & 0x40000000)
6819 offset |= ~ (bfd_vma) 0x7fffffff;
6821 if (elf_header.e_machine == EM_TI_C6000)
6824 return offset + where;
6828 decode_arm_unwind (struct arm_unw_aux_info *aux,
6829 unsigned int word, unsigned int remaining,
6830 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6831 struct arm_section *data_arm_sec)
6834 unsigned int more_words = 0;
6835 struct absaddr addr;
6839 /* Fetch the first word. */
6840 if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6846 if ((word & 0x80000000) == 0)
6848 /* Expand prel31 for personality routine. */
6850 const char *procname;
6852 fn = expand_prel31 (word, data_sec->sh_addr + data_offset);
6853 printf (_(" Personality routine: "));
6854 procname = arm_print_vma_and_name (aux, fn, addr);
6855 fputc ('\n', stdout);
6857 /* The GCC personality routines use the standard compact
6858 encoding, starting with one byte giving the number of
6860 if (procname != NULL
6861 && (const_strneq (procname, "__gcc_personality_v0")
6862 || const_strneq (procname, "__gxx_personality_v0")
6863 || const_strneq (procname, "__gcj_personality_v0")
6864 || const_strneq (procname, "__gnu_objc_personality_v0")))
6871 printf (_(" [Truncated data]\n"));
6874 more_words = word >> 24;
6885 per_index = (word >> 24) & 0x7f;
6886 printf (_(" Compact model %d\n"), per_index);
6893 else if (per_index < 3)
6895 more_words = (word >> 16) & 0xff;
6901 switch (elf_header.e_machine)
6906 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
6907 data_offset, data_sec, data_arm_sec);
6910 printf (" [reserved]\n");
6916 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
6917 data_offset, data_sec, data_arm_sec);
6919 else if (per_index < 5)
6921 if (((word >> 17) & 0x7f) == 0x7f)
6922 printf (_(" Restore stack from frame pointer\n"));
6924 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
6925 printf (_(" Registers restored: "));
6927 printf (" (compact) ");
6928 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
6930 printf (_(" Return register: %s\n"),
6931 tic6x_unwind_regnames[word & 0xf]);
6934 printf (" [reserved]\n");
6941 /* Decode the descriptors. Not implemented. */
6945 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6947 struct arm_section exidx_arm_sec, extab_arm_sec;
6948 unsigned int i, exidx_len;
6950 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6951 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6952 exidx_len = exidx_sec->sh_size / 8;
6954 for (i = 0; i < exidx_len; i++)
6956 unsigned int exidx_fn, exidx_entry;
6957 struct absaddr fn_addr, entry_addr;
6960 fputc ('\n', stdout);
6962 if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6963 8 * i, &exidx_fn, &fn_addr)
6964 || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6965 8 * i + 4, &exidx_entry, &entry_addr))
6967 arm_free_section (&exidx_arm_sec);
6968 arm_free_section (&extab_arm_sec);
6972 fn = expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
6974 arm_print_vma_and_name (aux, fn, entry_addr);
6975 fputs (": ", stdout);
6977 if (exidx_entry == 1)
6979 print_vma (exidx_entry, PREFIX_HEX);
6980 fputs (" [cantunwind]\n", stdout);
6982 else if (exidx_entry & 0x80000000)
6984 print_vma (exidx_entry, PREFIX_HEX);
6985 fputc ('\n', stdout);
6986 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6990 bfd_vma table, table_offset = 0;
6991 Elf_Internal_Shdr *table_sec;
6993 fputs ("@", stdout);
6994 table = expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
6995 print_vma (table, PREFIX_HEX);
6998 /* Locate the matching .ARM.extab. */
6999 if (entry_addr.section != SHN_UNDEF
7000 && entry_addr.section < elf_header.e_shnum)
7002 table_sec = section_headers + entry_addr.section;
7003 table_offset = entry_addr.offset;
7007 table_sec = find_section_by_address (table);
7008 if (table_sec != NULL)
7009 table_offset = table - table_sec->sh_addr;
7011 if (table_sec == NULL)
7013 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7014 (unsigned long) table);
7017 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7024 arm_free_section (&exidx_arm_sec);
7025 arm_free_section (&extab_arm_sec);
7028 /* Used for both ARM and C6X unwinding tables. */
7030 arm_process_unwind (FILE *file)
7032 struct arm_unw_aux_info aux;
7033 Elf_Internal_Shdr *unwsec = NULL;
7034 Elf_Internal_Shdr *strsec;
7035 Elf_Internal_Shdr *sec;
7037 unsigned int sec_type;
7039 memset (& aux, 0, sizeof (aux));
7042 switch (elf_header.e_machine)
7045 sec_type = SHT_ARM_EXIDX;
7049 sec_type = SHT_C6000_UNWIND;
7056 if (string_table == NULL)
7059 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7061 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7063 aux.nsyms = sec->sh_size / sec->sh_entsize;
7064 aux.symtab = GET_ELF_SYMBOLS (file, sec);
7066 strsec = section_headers + sec->sh_link;
7067 assert (aux.strtab == NULL);
7068 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7069 1, strsec->sh_size, _("string table"));
7070 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7072 else if (sec->sh_type == sec_type)
7077 printf (_("\nThere are no unwind sections in this file.\n"));
7079 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7081 if (sec->sh_type == sec_type)
7083 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7085 (unsigned long) sec->sh_offset,
7086 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7088 dump_arm_unwind (&aux, sec);
7095 free ((char *) aux.strtab);
7101 process_unwind (FILE * file)
7103 struct unwind_handler
7106 int (* handler)(FILE *);
7109 { EM_ARM, arm_process_unwind },
7110 { EM_IA_64, ia64_process_unwind },
7111 { EM_PARISC, hppa_process_unwind },
7112 { EM_TI_C6000, arm_process_unwind },
7120 for (i = 0; handlers[i].handler != NULL; i++)
7121 if (elf_header.e_machine == handlers[i].machtype)
7122 return handlers[i].handler (file);
7124 printf (_("\nThere are no unwind sections in this file.\n"));
7129 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7131 switch (entry->d_tag)
7134 if (entry->d_un.d_val == 0)
7135 printf (_("NONE\n"));
7138 static const char * opts[] =
7140 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7141 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7142 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7143 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7149 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7150 if (entry->d_un.d_val & (1 << cnt))
7152 printf ("%s%s", first ? "" : " ", opts[cnt]);
7159 case DT_MIPS_IVERSION:
7160 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7161 printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7163 printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
7166 case DT_MIPS_TIME_STAMP:
7171 time_t atime = entry->d_un.d_val;
7172 tmp = gmtime (&atime);
7173 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7174 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7175 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7176 printf (_("Time Stamp: %s\n"), timebuf);
7180 case DT_MIPS_RLD_VERSION:
7181 case DT_MIPS_LOCAL_GOTNO:
7182 case DT_MIPS_CONFLICTNO:
7183 case DT_MIPS_LIBLISTNO:
7184 case DT_MIPS_SYMTABNO:
7185 case DT_MIPS_UNREFEXTNO:
7186 case DT_MIPS_HIPAGENO:
7187 case DT_MIPS_DELTA_CLASS_NO:
7188 case DT_MIPS_DELTA_INSTANCE_NO:
7189 case DT_MIPS_DELTA_RELOC_NO:
7190 case DT_MIPS_DELTA_SYM_NO:
7191 case DT_MIPS_DELTA_CLASSSYM_NO:
7192 case DT_MIPS_COMPACT_SIZE:
7193 printf ("%ld\n", (long) entry->d_un.d_ptr);
7197 printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
7202 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7204 switch (entry->d_tag)
7206 case DT_HP_DLD_FLAGS:
7215 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7216 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7217 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7218 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7219 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7220 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7221 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7222 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7223 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7224 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7225 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7226 { DT_HP_GST, "HP_GST" },
7227 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7228 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7229 { DT_HP_NODELETE, "HP_NODELETE" },
7230 { DT_HP_GROUP, "HP_GROUP" },
7231 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7235 bfd_vma val = entry->d_un.d_val;
7237 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7238 if (val & flags[cnt].bit)
7242 fputs (flags[cnt].str, stdout);
7244 val ^= flags[cnt].bit;
7247 if (val != 0 || first)
7251 print_vma (val, HEX);
7257 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7265 /* VMS vs Unix time offset and factor. */
7267 #define VMS_EPOCH_OFFSET 35067168000000000LL
7268 #define VMS_GRANULARITY_FACTOR 10000000
7270 /* Display a VMS time in a human readable format. */
7273 print_vms_time (bfd_int64_t vmstime)
7278 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7279 tm = gmtime (&unxtime);
7280 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7281 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7282 tm->tm_hour, tm->tm_min, tm->tm_sec);
7287 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7289 switch (entry->d_tag)
7291 case DT_IA_64_PLT_RESERVE:
7292 /* First 3 slots reserved. */
7293 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7295 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7298 case DT_IA_64_VMS_LINKTIME:
7300 print_vms_time (entry->d_un.d_val);
7304 case DT_IA_64_VMS_LNKFLAGS:
7305 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7306 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7307 printf (" CALL_DEBUG");
7308 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7309 printf (" NOP0BUFS");
7310 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7311 printf (" P0IMAGE");
7312 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7313 printf (" MKTHREADS");
7314 if (entry->d_un.d_val & VMS_LF_UPCALLS)
7315 printf (" UPCALLS");
7316 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7318 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7319 printf (" INITIALIZE");
7320 if (entry->d_un.d_val & VMS_LF_MAIN)
7322 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7323 printf (" EXE_INIT");
7324 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7325 printf (" TBK_IN_IMG");
7326 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7327 printf (" DBG_IN_IMG");
7328 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7329 printf (" TBK_IN_DSF");
7330 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7331 printf (" DBG_IN_DSF");
7332 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7333 printf (" SIGNATURES");
7334 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7335 printf (" REL_SEG_OFF");
7339 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7346 get_32bit_dynamic_section (FILE * file)
7348 Elf32_External_Dyn * edyn;
7349 Elf32_External_Dyn * ext;
7350 Elf_Internal_Dyn * entry;
7352 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7353 dynamic_size, _("dynamic section"));
7357 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7358 might not have the luxury of section headers. Look for the DT_NULL
7359 terminator to determine the number of entries. */
7360 for (ext = edyn, dynamic_nent = 0;
7361 (char *) ext < (char *) edyn + dynamic_size;
7365 if (BYTE_GET (ext->d_tag) == DT_NULL)
7369 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7371 if (dynamic_section == NULL)
7373 error (_("Out of memory\n"));
7378 for (ext = edyn, entry = dynamic_section;
7379 entry < dynamic_section + dynamic_nent;
7382 entry->d_tag = BYTE_GET (ext->d_tag);
7383 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7392 get_64bit_dynamic_section (FILE * file)
7394 Elf64_External_Dyn * edyn;
7395 Elf64_External_Dyn * ext;
7396 Elf_Internal_Dyn * entry;
7398 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7399 dynamic_size, _("dynamic section"));
7403 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7404 might not have the luxury of section headers. Look for the DT_NULL
7405 terminator to determine the number of entries. */
7406 for (ext = edyn, dynamic_nent = 0;
7407 (char *) ext < (char *) edyn + dynamic_size;
7411 if (BYTE_GET (ext->d_tag) == DT_NULL)
7415 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7417 if (dynamic_section == NULL)
7419 error (_("Out of memory\n"));
7424 for (ext = edyn, entry = dynamic_section;
7425 entry < dynamic_section + dynamic_nent;
7428 entry->d_tag = BYTE_GET (ext->d_tag);
7429 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7438 print_dynamic_flags (bfd_vma flags)
7446 flag = flags & - flags;
7456 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7457 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7458 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7459 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7460 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7461 default: fputs (_("unknown"), stdout); break;
7467 /* Parse and display the contents of the dynamic section. */
7470 process_dynamic_section (FILE * file)
7472 Elf_Internal_Dyn * entry;
7474 if (dynamic_size == 0)
7477 printf (_("\nThere is no dynamic section in this file.\n"));
7484 if (! get_32bit_dynamic_section (file))
7487 else if (! get_64bit_dynamic_section (file))
7490 /* Find the appropriate symbol table. */
7491 if (dynamic_symbols == NULL)
7493 for (entry = dynamic_section;
7494 entry < dynamic_section + dynamic_nent;
7497 Elf_Internal_Shdr section;
7499 if (entry->d_tag != DT_SYMTAB)
7502 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7504 /* Since we do not know how big the symbol table is,
7505 we default to reading in the entire file (!) and
7506 processing that. This is overkill, I know, but it
7508 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7510 if (archive_file_offset != 0)
7511 section.sh_size = archive_file_size - section.sh_offset;
7514 if (fseek (file, 0, SEEK_END))
7515 error (_("Unable to seek to end of file!\n"));
7517 section.sh_size = ftell (file) - section.sh_offset;
7521 section.sh_entsize = sizeof (Elf32_External_Sym);
7523 section.sh_entsize = sizeof (Elf64_External_Sym);
7525 num_dynamic_syms = section.sh_size / section.sh_entsize;
7526 if (num_dynamic_syms < 1)
7528 error (_("Unable to determine the number of symbols to load\n"));
7532 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
7536 /* Similarly find a string table. */
7537 if (dynamic_strings == NULL)
7539 for (entry = dynamic_section;
7540 entry < dynamic_section + dynamic_nent;
7543 unsigned long offset;
7546 if (entry->d_tag != DT_STRTAB)
7549 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7551 /* Since we do not know how big the string table is,
7552 we default to reading in the entire file (!) and
7553 processing that. This is overkill, I know, but it
7556 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7558 if (archive_file_offset != 0)
7559 str_tab_len = archive_file_size - offset;
7562 if (fseek (file, 0, SEEK_END))
7563 error (_("Unable to seek to end of file\n"));
7564 str_tab_len = ftell (file) - offset;
7567 if (str_tab_len < 1)
7570 (_("Unable to determine the length of the dynamic string table\n"));
7574 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7576 _("dynamic string table"));
7577 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7582 /* And find the syminfo section if available. */
7583 if (dynamic_syminfo == NULL)
7585 unsigned long syminsz = 0;
7587 for (entry = dynamic_section;
7588 entry < dynamic_section + dynamic_nent;
7591 if (entry->d_tag == DT_SYMINENT)
7593 /* Note: these braces are necessary to avoid a syntax
7594 error from the SunOS4 C compiler. */
7595 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7597 else if (entry->d_tag == DT_SYMINSZ)
7598 syminsz = entry->d_un.d_val;
7599 else if (entry->d_tag == DT_SYMINFO)
7600 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7604 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7606 Elf_External_Syminfo * extsyminfo;
7607 Elf_External_Syminfo * extsym;
7608 Elf_Internal_Syminfo * syminfo;
7610 /* There is a syminfo section. Read the data. */
7611 extsyminfo = (Elf_External_Syminfo *)
7612 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7613 _("symbol information"));
7617 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7618 if (dynamic_syminfo == NULL)
7620 error (_("Out of memory\n"));
7624 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7625 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7626 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7627 ++syminfo, ++extsym)
7629 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7630 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7637 if (do_dynamic && dynamic_addr)
7638 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7639 dynamic_addr, dynamic_nent);
7641 printf (_(" Tag Type Name/Value\n"));
7643 for (entry = dynamic_section;
7644 entry < dynamic_section + dynamic_nent;
7652 print_vma (entry->d_tag, FULL_HEX);
7653 dtype = get_dynamic_type (entry->d_tag);
7654 printf (" (%s)%*s", dtype,
7655 ((is_32bit_elf ? 27 : 19)
7656 - (int) strlen (dtype)),
7660 switch (entry->d_tag)
7664 print_dynamic_flags (entry->d_un.d_val);
7674 switch (entry->d_tag)
7677 printf (_("Auxiliary library"));
7681 printf (_("Filter library"));
7685 printf (_("Configuration file"));
7689 printf (_("Dependency audit library"));
7693 printf (_("Audit library"));
7697 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7698 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7702 print_vma (entry->d_un.d_val, PREFIX_HEX);
7711 printf (_("Flags:"));
7713 if (entry->d_un.d_val == 0)
7714 printf (_(" None\n"));
7717 unsigned long int val = entry->d_un.d_val;
7719 if (val & DTF_1_PARINIT)
7721 printf (" PARINIT");
7722 val ^= DTF_1_PARINIT;
7724 if (val & DTF_1_CONFEXP)
7726 printf (" CONFEXP");
7727 val ^= DTF_1_CONFEXP;
7730 printf (" %lx", val);
7739 printf (_("Flags:"));
7741 if (entry->d_un.d_val == 0)
7742 printf (_(" None\n"));
7745 unsigned long int val = entry->d_un.d_val;
7747 if (val & DF_P1_LAZYLOAD)
7749 printf (" LAZYLOAD");
7750 val ^= DF_P1_LAZYLOAD;
7752 if (val & DF_P1_GROUPPERM)
7754 printf (" GROUPPERM");
7755 val ^= DF_P1_GROUPPERM;
7758 printf (" %lx", val);
7767 printf (_("Flags:"));
7768 if (entry->d_un.d_val == 0)
7769 printf (_(" None\n"));
7772 unsigned long int val = entry->d_un.d_val;
7779 if (val & DF_1_GLOBAL)
7784 if (val & DF_1_GROUP)
7789 if (val & DF_1_NODELETE)
7791 printf (" NODELETE");
7792 val ^= DF_1_NODELETE;
7794 if (val & DF_1_LOADFLTR)
7796 printf (" LOADFLTR");
7797 val ^= DF_1_LOADFLTR;
7799 if (val & DF_1_INITFIRST)
7801 printf (" INITFIRST");
7802 val ^= DF_1_INITFIRST;
7804 if (val & DF_1_NOOPEN)
7809 if (val & DF_1_ORIGIN)
7814 if (val & DF_1_DIRECT)
7819 if (val & DF_1_TRANS)
7824 if (val & DF_1_INTERPOSE)
7826 printf (" INTERPOSE");
7827 val ^= DF_1_INTERPOSE;
7829 if (val & DF_1_NODEFLIB)
7831 printf (" NODEFLIB");
7832 val ^= DF_1_NODEFLIB;
7834 if (val & DF_1_NODUMP)
7839 if (val & DF_1_CONLFAT)
7841 printf (" CONLFAT");
7842 val ^= DF_1_CONLFAT;
7845 printf (" %lx", val);
7852 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7854 puts (get_dynamic_type (entry->d_un.d_val));
7874 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7880 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7881 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7887 switch (entry->d_tag)
7890 printf (_("Shared library: [%s]"), name);
7892 if (streq (name, program_interpreter))
7893 printf (_(" program interpreter"));
7897 printf (_("Library soname: [%s]"), name);
7901 printf (_("Library rpath: [%s]"), name);
7905 printf (_("Library runpath: [%s]"), name);
7909 print_vma (entry->d_un.d_val, PREFIX_HEX);
7914 print_vma (entry->d_un.d_val, PREFIX_HEX);
7927 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7931 case DT_INIT_ARRAYSZ:
7932 case DT_FINI_ARRAYSZ:
7933 case DT_GNU_CONFLICTSZ:
7934 case DT_GNU_LIBLISTSZ:
7937 print_vma (entry->d_un.d_val, UNSIGNED);
7938 printf (_(" (bytes)\n"));
7948 print_vma (entry->d_un.d_val, UNSIGNED);
7961 if (entry->d_tag == DT_USED
7962 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7964 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7968 printf (_("Not needed object: [%s]\n"), name);
7973 print_vma (entry->d_un.d_val, PREFIX_HEX);
7979 /* The value of this entry is ignored. */
7984 case DT_GNU_PRELINKED:
7988 time_t atime = entry->d_un.d_val;
7990 tmp = gmtime (&atime);
7991 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
7992 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7993 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7999 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8002 print_vma (entry->d_un.d_val, PREFIX_HEX);
8008 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8009 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8014 switch (elf_header.e_machine)
8017 case EM_MIPS_RS3_LE:
8018 dynamic_section_mips_val (entry);
8021 dynamic_section_parisc_val (entry);
8024 dynamic_section_ia64_val (entry);
8027 print_vma (entry->d_un.d_val, PREFIX_HEX);
8039 get_ver_flags (unsigned int flags)
8041 static char buff[32];
8048 if (flags & VER_FLG_BASE)
8049 strcat (buff, "BASE ");
8051 if (flags & VER_FLG_WEAK)
8053 if (flags & VER_FLG_BASE)
8054 strcat (buff, "| ");
8056 strcat (buff, "WEAK ");
8059 if (flags & VER_FLG_INFO)
8061 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8062 strcat (buff, "| ");
8064 strcat (buff, "INFO ");
8067 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8068 strcat (buff, _("| <unknown>"));
8073 /* Display the contents of the version sections. */
8076 process_version_sections (FILE * file)
8078 Elf_Internal_Shdr * section;
8085 for (i = 0, section = section_headers;
8086 i < elf_header.e_shnum;
8089 switch (section->sh_type)
8091 case SHT_GNU_verdef:
8093 Elf_External_Verdef * edefs;
8101 (_("\nVersion definition section '%s' contains %u entries:\n"),
8102 SECTION_NAME (section), section->sh_info);
8104 printf (_(" Addr: 0x"));
8105 printf_vma (section->sh_addr);
8106 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8107 (unsigned long) section->sh_offset, section->sh_link,
8108 section->sh_link < elf_header.e_shnum
8109 ? SECTION_NAME (section_headers + section->sh_link)
8112 edefs = (Elf_External_Verdef *)
8113 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8114 _("version definition section"));
8117 endbuf = (char *) edefs + section->sh_size;
8119 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8122 Elf_External_Verdef * edef;
8123 Elf_Internal_Verdef ent;
8124 Elf_External_Verdaux * eaux;
8125 Elf_Internal_Verdaux aux;
8129 /* Check for negative or very large indicies. */
8130 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
8133 vstart = ((char *) edefs) + idx;
8134 if (vstart + sizeof (*edef) > endbuf)
8137 edef = (Elf_External_Verdef *) vstart;
8139 ent.vd_version = BYTE_GET (edef->vd_version);
8140 ent.vd_flags = BYTE_GET (edef->vd_flags);
8141 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8142 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8143 ent.vd_hash = BYTE_GET (edef->vd_hash);
8144 ent.vd_aux = BYTE_GET (edef->vd_aux);
8145 ent.vd_next = BYTE_GET (edef->vd_next);
8147 printf (_(" %#06x: Rev: %d Flags: %s"),
8148 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8150 printf (_(" Index: %d Cnt: %d "),
8151 ent.vd_ndx, ent.vd_cnt);
8153 /* Check for overflow. */
8154 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
8155 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
8158 vstart += ent.vd_aux;
8160 eaux = (Elf_External_Verdaux *) vstart;
8162 aux.vda_name = BYTE_GET (eaux->vda_name);
8163 aux.vda_next = BYTE_GET (eaux->vda_next);
8165 if (VALID_DYNAMIC_NAME (aux.vda_name))
8166 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8168 printf (_("Name index: %ld\n"), aux.vda_name);
8170 isum = idx + ent.vd_aux;
8172 for (j = 1; j < ent.vd_cnt; j++)
8174 /* Check for overflow. */
8175 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
8176 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
8179 isum += aux.vda_next;
8180 vstart += aux.vda_next;
8182 eaux = (Elf_External_Verdaux *) vstart;
8183 if (vstart + sizeof (*eaux) > endbuf)
8186 aux.vda_name = BYTE_GET (eaux->vda_name);
8187 aux.vda_next = BYTE_GET (eaux->vda_next);
8189 if (VALID_DYNAMIC_NAME (aux.vda_name))
8190 printf (_(" %#06x: Parent %d: %s\n"),
8191 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8193 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8194 isum, j, aux.vda_name);
8198 printf (_(" Version def aux past end of section\n"));
8203 if (cnt < section->sh_info)
8204 printf (_(" Version definition past end of section\n"));
8210 case SHT_GNU_verneed:
8212 Elf_External_Verneed * eneed;
8219 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8220 SECTION_NAME (section), section->sh_info);
8222 printf (_(" Addr: 0x"));
8223 printf_vma (section->sh_addr);
8224 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8225 (unsigned long) section->sh_offset, section->sh_link,
8226 section->sh_link < elf_header.e_shnum
8227 ? SECTION_NAME (section_headers + section->sh_link)
8230 eneed = (Elf_External_Verneed *) get_data (NULL, file,
8231 section->sh_offset, 1,
8233 _("version need section"));
8236 endbuf = (char *) eneed + section->sh_size;
8238 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8240 Elf_External_Verneed * entry;
8241 Elf_Internal_Verneed ent;
8246 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
8249 vstart = ((char *) eneed) + idx;
8250 if (vstart + sizeof (*entry) > endbuf)
8253 entry = (Elf_External_Verneed *) vstart;
8255 ent.vn_version = BYTE_GET (entry->vn_version);
8256 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
8257 ent.vn_file = BYTE_GET (entry->vn_file);
8258 ent.vn_aux = BYTE_GET (entry->vn_aux);
8259 ent.vn_next = BYTE_GET (entry->vn_next);
8261 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
8263 if (VALID_DYNAMIC_NAME (ent.vn_file))
8264 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8266 printf (_(" File: %lx"), ent.vn_file);
8268 printf (_(" Cnt: %d\n"), ent.vn_cnt);
8270 /* Check for overflow. */
8271 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
8272 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
8275 vstart += ent.vn_aux;
8277 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8279 Elf_External_Vernaux * eaux;
8280 Elf_Internal_Vernaux aux;
8282 if (vstart + sizeof (*eaux) > endbuf)
8284 eaux = (Elf_External_Vernaux *) vstart;
8286 aux.vna_hash = BYTE_GET (eaux->vna_hash);
8287 aux.vna_flags = BYTE_GET (eaux->vna_flags);
8288 aux.vna_other = BYTE_GET (eaux->vna_other);
8289 aux.vna_name = BYTE_GET (eaux->vna_name);
8290 aux.vna_next = BYTE_GET (eaux->vna_next);
8292 if (VALID_DYNAMIC_NAME (aux.vna_name))
8293 printf (_(" %#06x: Name: %s"),
8294 isum, GET_DYNAMIC_NAME (aux.vna_name));
8296 printf (_(" %#06x: Name index: %lx"),
8297 isum, aux.vna_name);
8299 printf (_(" Flags: %s Version: %d\n"),
8300 get_ver_flags (aux.vna_flags), aux.vna_other);
8302 /* Check for overflow. */
8303 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
8304 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
8307 isum += aux.vna_next;
8308 vstart += aux.vna_next;
8311 printf (_(" Version need aux past end of section\n"));
8315 if (cnt < section->sh_info)
8316 printf (_(" Version need past end of section\n"));
8322 case SHT_GNU_versym:
8324 Elf_Internal_Shdr * link_section;
8327 unsigned char * edata;
8328 unsigned short * data;
8330 Elf_Internal_Sym * symbols;
8331 Elf_Internal_Shdr * string_sec;
8334 if (section->sh_link >= elf_header.e_shnum)
8337 link_section = section_headers + section->sh_link;
8338 total = section->sh_size / sizeof (Elf_External_Versym);
8340 if (link_section->sh_link >= elf_header.e_shnum)
8345 symbols = GET_ELF_SYMBOLS (file, link_section);
8346 if (symbols == NULL)
8349 string_sec = section_headers + link_section->sh_link;
8351 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8352 string_sec->sh_size,
8353 _("version string table"));
8360 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8361 SECTION_NAME (section), total);
8363 printf (_(" Addr: "));
8364 printf_vma (section->sh_addr);
8365 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8366 (unsigned long) section->sh_offset, section->sh_link,
8367 SECTION_NAME (link_section));
8369 off = offset_from_vma (file,
8370 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8371 total * sizeof (short));
8372 edata = (unsigned char *) get_data (NULL, file, off, total,
8374 _("version symbol data"));
8382 data = (short unsigned int *) cmalloc (total, sizeof (short));
8384 for (cnt = total; cnt --;)
8385 data[cnt] = byte_get (edata + cnt * sizeof (short),
8390 for (cnt = 0; cnt < total; cnt += 4)
8393 int check_def, check_need;
8396 printf (" %03x:", cnt);
8398 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8399 switch (data[cnt + j])
8402 fputs (_(" 0 (*local*) "), stdout);
8406 fputs (_(" 1 (*global*) "), stdout);
8410 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8411 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8413 /* If this index value is greater than the size of the symbols
8414 array, break to avoid an out-of-bounds read, */
8415 if ((unsigned long)(cnt + j) >=
8416 ((unsigned long)link_section->sh_size /
8417 (unsigned long)link_section->sh_entsize))
8419 warn (_("invalid index into symbol array\n"));
8425 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8426 || section_headers[symbols[cnt + j].st_shndx].sh_type
8429 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8436 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8438 Elf_Internal_Verneed ivn;
8439 unsigned long offset;
8441 offset = offset_from_vma
8442 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8443 sizeof (Elf_External_Verneed));
8447 Elf_Internal_Vernaux ivna;
8448 Elf_External_Verneed evn;
8449 Elf_External_Vernaux evna;
8450 unsigned long a_off;
8452 if (get_data (&evn, file, offset, sizeof (evn), 1,
8453 _("version need")) == NULL)
8456 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8457 ivn.vn_next = BYTE_GET (evn.vn_next);
8459 a_off = offset + ivn.vn_aux;
8463 if (get_data (&evna, file, a_off, sizeof (evna),
8464 1, _("version need aux (2)")) == NULL)
8471 ivna.vna_next = BYTE_GET (evna.vna_next);
8472 ivna.vna_other = BYTE_GET (evna.vna_other);
8475 a_off += ivna.vna_next;
8477 while (ivna.vna_other != data[cnt + j]
8478 && ivna.vna_next != 0);
8480 if (ivna.vna_other == data[cnt + j])
8482 ivna.vna_name = BYTE_GET (evna.vna_name);
8484 if (ivna.vna_name >= string_sec->sh_size)
8485 name = _("*invalid*");
8487 name = strtab + ivna.vna_name;
8488 nn += printf ("(%s%-*s",
8490 12 - (int) strlen (name),
8496 offset += ivn.vn_next;
8498 while (ivn.vn_next);
8501 if (check_def && data[cnt + j] != 0x8001
8502 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8504 Elf_Internal_Verdef ivd;
8505 Elf_External_Verdef evd;
8506 unsigned long offset;
8508 offset = offset_from_vma
8509 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8514 if (get_data (&evd, file, offset, sizeof (evd), 1,
8515 _("version def")) == NULL)
8522 ivd.vd_next = BYTE_GET (evd.vd_next);
8523 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8526 offset += ivd.vd_next;
8528 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8529 && ivd.vd_next != 0);
8531 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8533 Elf_External_Verdaux evda;
8534 Elf_Internal_Verdaux ivda;
8536 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8538 if (get_data (&evda, file,
8539 offset - ivd.vd_next + ivd.vd_aux,
8541 _("version def aux")) == NULL)
8544 ivda.vda_name = BYTE_GET (evda.vda_name);
8546 if (ivda.vda_name >= string_sec->sh_size)
8547 name = _("*invalid*");
8549 name = strtab + ivda.vda_name;
8550 nn += printf ("(%s%-*s",
8552 12 - (int) strlen (name),
8558 printf ("%*c", 18 - nn, ' ');
8576 printf (_("\nNo version information found in this file.\n"));
8582 get_symbol_binding (unsigned int binding)
8584 static char buff[32];
8588 case STB_LOCAL: return "LOCAL";
8589 case STB_GLOBAL: return "GLOBAL";
8590 case STB_WEAK: return "WEAK";
8592 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8593 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8595 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8597 if (binding == STB_GNU_UNIQUE
8598 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8599 /* GNU is still using the default value 0. */
8600 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8602 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8605 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8611 get_symbol_type (unsigned int type)
8613 static char buff[32];
8617 case STT_NOTYPE: return "NOTYPE";
8618 case STT_OBJECT: return "OBJECT";
8619 case STT_FUNC: return "FUNC";
8620 case STT_SECTION: return "SECTION";
8621 case STT_FILE: return "FILE";
8622 case STT_COMMON: return "COMMON";
8623 case STT_TLS: return "TLS";
8624 case STT_RELC: return "RELC";
8625 case STT_SRELC: return "SRELC";
8627 if (type >= STT_LOPROC && type <= STT_HIPROC)
8629 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8630 return "THUMB_FUNC";
8632 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8635 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8636 return "PARISC_MILLI";
8638 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8640 else if (type >= STT_LOOS && type <= STT_HIOS)
8642 if (elf_header.e_machine == EM_PARISC)
8644 if (type == STT_HP_OPAQUE)
8646 if (type == STT_HP_STUB)
8650 if (type == STT_GNU_IFUNC
8651 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8652 /* GNU is still using the default value 0. */
8653 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8656 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8659 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8665 get_symbol_visibility (unsigned int visibility)
8669 case STV_DEFAULT: return "DEFAULT";
8670 case STV_INTERNAL: return "INTERNAL";
8671 case STV_HIDDEN: return "HIDDEN";
8672 case STV_PROTECTED: return "PROTECTED";
8678 get_mips_symbol_other (unsigned int other)
8682 case STO_OPTIONAL: return "OPTIONAL";
8683 case STO_MIPS16: return "MIPS16";
8684 case STO_MIPS_PLT: return "MIPS PLT";
8685 case STO_MIPS_PIC: return "MIPS PIC";
8686 default: return NULL;
8691 get_ia64_symbol_other (unsigned int other)
8695 static char res[32];
8699 /* Function types is for images and .STB files only. */
8700 switch (elf_header.e_type)
8704 switch (VMS_ST_FUNC_TYPE (other))
8706 case VMS_SFT_CODE_ADDR:
8707 strcat (res, " CA");
8709 case VMS_SFT_SYMV_IDX:
8710 strcat (res, " VEC");
8713 strcat (res, " FD");
8715 case VMS_SFT_RESERVE:
8716 strcat (res, " RSV");
8725 switch (VMS_ST_LINKAGE (other))
8727 case VMS_STL_IGNORE:
8728 strcat (res, " IGN");
8730 case VMS_STL_RESERVE:
8731 strcat (res, " RSV");
8734 strcat (res, " STD");
8737 strcat (res, " LNK");
8752 get_symbol_other (unsigned int other)
8754 const char * result = NULL;
8755 static char buff [32];
8760 switch (elf_header.e_machine)
8763 result = get_mips_symbol_other (other);
8766 result = get_ia64_symbol_other (other);
8775 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8780 get_symbol_index_type (unsigned int type)
8782 static char buff[32];
8786 case SHN_UNDEF: return "UND";
8787 case SHN_ABS: return "ABS";
8788 case SHN_COMMON: return "COM";
8790 if (type == SHN_IA_64_ANSI_COMMON
8791 && elf_header.e_machine == EM_IA_64
8792 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8794 else if ((elf_header.e_machine == EM_X86_64
8795 || elf_header.e_machine == EM_L1OM
8796 || elf_header.e_machine == EM_K1OM)
8797 && type == SHN_X86_64_LCOMMON)
8799 else if ((type == SHN_MIPS_SCOMMON
8800 && elf_header.e_machine == EM_MIPS)
8801 || (type == SHN_TIC6X_SCOMMON
8802 && elf_header.e_machine == EM_TI_C6000))
8804 else if (type == SHN_MIPS_SUNDEFINED
8805 && elf_header.e_machine == EM_MIPS)
8807 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8808 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8809 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8810 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8811 else if (type >= SHN_LORESERVE)
8812 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8814 sprintf (buff, "%3d", type);
8822 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8824 unsigned char * e_data;
8827 e_data = (unsigned char *) cmalloc (number, ent_size);
8831 error (_("Out of memory\n"));
8835 if (fread (e_data, ent_size, number, file) != number)
8837 error (_("Unable to read in dynamic data\n"));
8841 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8845 error (_("Out of memory\n"));
8851 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8859 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8861 Elf_Internal_Sym * psym;
8864 psym = dynamic_symbols + si;
8866 n = print_vma (si, DEC_5);
8868 fputs (" " + n, stdout);
8869 printf (" %3lu: ", hn);
8870 print_vma (psym->st_value, LONG_HEX);
8872 print_vma (psym->st_size, DEC_5);
8874 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8875 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8876 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8877 /* Check to see if any other bits in the st_other field are set.
8878 Note - displaying this information disrupts the layout of the
8879 table being generated, but for the moment this case is very
8881 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8882 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8883 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8884 if (VALID_DYNAMIC_NAME (psym->st_name))
8885 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8887 printf (_(" <corrupt: %14ld>"), psym->st_name);
8891 /* Dump the symbol table. */
8893 process_symbol_table (FILE * file)
8895 Elf_Internal_Shdr * section;
8896 bfd_vma nbuckets = 0;
8897 bfd_vma nchains = 0;
8898 bfd_vma * buckets = NULL;
8899 bfd_vma * chains = NULL;
8900 bfd_vma ngnubuckets = 0;
8901 bfd_vma * gnubuckets = NULL;
8902 bfd_vma * gnuchains = NULL;
8903 bfd_vma gnusymidx = 0;
8905 if (!do_syms && !do_dyn_syms && !do_histogram)
8908 if (dynamic_info[DT_HASH]
8910 || (do_using_dynamic
8912 && dynamic_strings != NULL)))
8914 unsigned char nb[8];
8915 unsigned char nc[8];
8916 int hash_ent_size = 4;
8918 if ((elf_header.e_machine == EM_ALPHA
8919 || elf_header.e_machine == EM_S390
8920 || elf_header.e_machine == EM_S390_OLD)
8921 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8925 (archive_file_offset
8926 + offset_from_vma (file, dynamic_info[DT_HASH],
8927 sizeof nb + sizeof nc)),
8930 error (_("Unable to seek to start of dynamic information\n"));
8934 if (fread (nb, hash_ent_size, 1, file) != 1)
8936 error (_("Failed to read in number of buckets\n"));
8940 if (fread (nc, hash_ent_size, 1, file) != 1)
8942 error (_("Failed to read in number of chains\n"));
8946 nbuckets = byte_get (nb, hash_ent_size);
8947 nchains = byte_get (nc, hash_ent_size);
8949 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8950 chains = get_dynamic_data (file, nchains, hash_ent_size);
8953 if (buckets == NULL || chains == NULL)
8955 if (do_using_dynamic)
8966 if (dynamic_info_DT_GNU_HASH
8968 || (do_using_dynamic
8970 && dynamic_strings != NULL)))
8972 unsigned char nb[16];
8973 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8974 bfd_vma buckets_vma;
8977 (archive_file_offset
8978 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8982 error (_("Unable to seek to start of dynamic information\n"));
8986 if (fread (nb, 16, 1, file) != 1)
8988 error (_("Failed to read in number of buckets\n"));
8992 ngnubuckets = byte_get (nb, 4);
8993 gnusymidx = byte_get (nb + 4, 4);
8994 bitmaskwords = byte_get (nb + 8, 4);
8995 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
8997 buckets_vma += bitmaskwords * 4;
8999 buckets_vma += bitmaskwords * 8;
9002 (archive_file_offset
9003 + offset_from_vma (file, buckets_vma, 4)),
9006 error (_("Unable to seek to start of dynamic information\n"));
9010 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9012 if (gnubuckets == NULL)
9015 for (i = 0; i < ngnubuckets; i++)
9016 if (gnubuckets[i] != 0)
9018 if (gnubuckets[i] < gnusymidx)
9021 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9022 maxchain = gnubuckets[i];
9025 if (maxchain == 0xffffffff)
9028 maxchain -= gnusymidx;
9031 (archive_file_offset
9032 + offset_from_vma (file, buckets_vma
9033 + 4 * (ngnubuckets + maxchain), 4)),
9036 error (_("Unable to seek to start of dynamic information\n"));
9042 if (fread (nb, 4, 1, file) != 1)
9044 error (_("Failed to determine last chain length\n"));
9048 if (maxchain + 1 == 0)
9053 while ((byte_get (nb, 4) & 1) == 0);
9056 (archive_file_offset
9057 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9060 error (_("Unable to seek to start of dynamic information\n"));
9064 gnuchains = get_dynamic_data (file, maxchain, 4);
9067 if (gnuchains == NULL)
9072 if (do_using_dynamic)
9077 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9080 && dynamic_strings != NULL)
9084 if (dynamic_info[DT_HASH])
9088 printf (_("\nSymbol table for image:\n"));
9090 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9092 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9094 for (hn = 0; hn < nbuckets; hn++)
9099 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9100 print_dynamic_symbol (si, hn);
9104 if (dynamic_info_DT_GNU_HASH)
9106 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9108 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9110 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9112 for (hn = 0; hn < ngnubuckets; ++hn)
9113 if (gnubuckets[hn] != 0)
9115 bfd_vma si = gnubuckets[hn];
9116 bfd_vma off = si - gnusymidx;
9120 print_dynamic_symbol (si, hn);
9123 while ((gnuchains[off++] & 1) == 0);
9127 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9131 for (i = 0, section = section_headers;
9132 i < elf_header.e_shnum;
9136 char * strtab = NULL;
9137 unsigned long int strtab_size = 0;
9138 Elf_Internal_Sym * symtab;
9139 Elf_Internal_Sym * psym;
9141 if ((section->sh_type != SHT_SYMTAB
9142 && section->sh_type != SHT_DYNSYM)
9144 && section->sh_type == SHT_SYMTAB))
9147 if (section->sh_entsize == 0)
9149 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9150 SECTION_NAME (section));
9154 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9155 SECTION_NAME (section),
9156 (unsigned long) (section->sh_size / section->sh_entsize));
9159 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9161 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9163 symtab = GET_ELF_SYMBOLS (file, section);
9167 if (section->sh_link == elf_header.e_shstrndx)
9169 strtab = string_table;
9170 strtab_size = string_table_length;
9172 else if (section->sh_link < elf_header.e_shnum)
9174 Elf_Internal_Shdr * string_sec;
9176 string_sec = section_headers + section->sh_link;
9178 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9179 1, string_sec->sh_size,
9181 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9184 for (si = 0, psym = symtab;
9185 si < section->sh_size / section->sh_entsize;
9188 printf ("%6d: ", si);
9189 print_vma (psym->st_value, LONG_HEX);
9191 print_vma (psym->st_size, DEC_5);
9192 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9193 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9194 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9195 /* Check to see if any other bits in the st_other field are set.
9196 Note - displaying this information disrupts the layout of the
9197 table being generated, but for the moment this case is very rare. */
9198 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9199 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9200 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9201 print_symbol (25, psym->st_name < strtab_size
9202 ? strtab + psym->st_name : _("<corrupt>"));
9204 if (section->sh_type == SHT_DYNSYM
9205 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9207 unsigned char data[2];
9208 unsigned short vers_data;
9209 unsigned long offset;
9213 offset = offset_from_vma
9214 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9215 sizeof data + si * sizeof (vers_data));
9217 if (get_data (&data, file, offset + si * sizeof (vers_data),
9218 sizeof (data), 1, _("version data")) == NULL)
9221 vers_data = byte_get (data, 2);
9223 is_nobits = (psym->st_shndx < elf_header.e_shnum
9224 && section_headers[psym->st_shndx].sh_type
9227 check_def = (psym->st_shndx != SHN_UNDEF);
9229 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9231 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9232 && (is_nobits || ! check_def))
9234 Elf_External_Verneed evn;
9235 Elf_Internal_Verneed ivn;
9236 Elf_Internal_Vernaux ivna;
9238 /* We must test both. */
9239 offset = offset_from_vma
9240 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9245 unsigned long vna_off;
9247 if (get_data (&evn, file, offset, sizeof (evn), 1,
9248 _("version need")) == NULL)
9256 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9257 ivn.vn_next = BYTE_GET (evn.vn_next);
9259 vna_off = offset + ivn.vn_aux;
9263 Elf_External_Vernaux evna;
9265 if (get_data (&evna, file, vna_off,
9267 _("version need aux (3)")) == NULL)
9275 ivna.vna_other = BYTE_GET (evna.vna_other);
9276 ivna.vna_next = BYTE_GET (evna.vna_next);
9277 ivna.vna_name = BYTE_GET (evna.vna_name);
9280 vna_off += ivna.vna_next;
9282 while (ivna.vna_other != vers_data
9283 && ivna.vna_next != 0);
9285 if (ivna.vna_other == vers_data)
9288 offset += ivn.vn_next;
9290 while (ivn.vn_next != 0);
9292 if (ivna.vna_other == vers_data)
9295 ivna.vna_name < strtab_size
9296 ? strtab + ivna.vna_name : _("<corrupt>"),
9300 else if (! is_nobits)
9301 error (_("bad dynamic symbol\n"));
9308 if (vers_data != 0x8001
9309 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9311 Elf_Internal_Verdef ivd;
9312 Elf_Internal_Verdaux ivda;
9313 Elf_External_Verdaux evda;
9316 off = offset_from_vma
9318 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9319 sizeof (Elf_External_Verdef));
9323 Elf_External_Verdef evd;
9325 if (get_data (&evd, file, off, sizeof (evd),
9326 1, _("version def")) == NULL)
9334 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9335 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9336 ivd.vd_next = BYTE_GET (evd.vd_next);
9341 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9342 && ivd.vd_next != 0);
9347 if (get_data (&evda, file, off, sizeof (evda),
9348 1, _("version def aux")) == NULL)
9351 ivda.vda_name = BYTE_GET (evda.vda_name);
9353 if (psym->st_name != ivda.vda_name)
9354 printf ((vers_data & VERSYM_HIDDEN)
9356 ivda.vda_name < strtab_size
9357 ? strtab + ivda.vda_name : _("<corrupt>"));
9367 if (strtab != string_table)
9373 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9375 if (do_histogram && buckets != NULL)
9377 unsigned long * lengths;
9378 unsigned long * counts;
9381 unsigned long maxlength = 0;
9382 unsigned long nzero_counts = 0;
9383 unsigned long nsyms = 0;
9385 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9386 (unsigned long) nbuckets);
9387 printf (_(" Length Number %% of total Coverage\n"));
9389 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9390 if (lengths == NULL)
9392 error (_("Out of memory\n"));
9395 for (hn = 0; hn < nbuckets; ++hn)
9397 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9400 if (maxlength < ++lengths[hn])
9405 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9408 error (_("Out of memory\n"));
9412 for (hn = 0; hn < nbuckets; ++hn)
9413 ++counts[lengths[hn]];
9418 printf (" 0 %-10lu (%5.1f%%)\n",
9419 counts[0], (counts[0] * 100.0) / nbuckets);
9420 for (i = 1; i <= maxlength; ++i)
9422 nzero_counts += counts[i] * i;
9423 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9424 i, counts[i], (counts[i] * 100.0) / nbuckets,
9425 (nzero_counts * 100.0) / nsyms);
9433 if (buckets != NULL)
9439 if (do_histogram && gnubuckets != NULL)
9441 unsigned long * lengths;
9442 unsigned long * counts;
9444 unsigned long maxlength = 0;
9445 unsigned long nzero_counts = 0;
9446 unsigned long nsyms = 0;
9448 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9449 if (lengths == NULL)
9451 error (_("Out of memory\n"));
9455 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9456 (unsigned long) ngnubuckets);
9457 printf (_(" Length Number %% of total Coverage\n"));
9459 for (hn = 0; hn < ngnubuckets; ++hn)
9460 if (gnubuckets[hn] != 0)
9462 bfd_vma off, length = 1;
9464 for (off = gnubuckets[hn] - gnusymidx;
9465 (gnuchains[off] & 1) == 0; ++off)
9467 lengths[hn] = length;
9468 if (length > maxlength)
9473 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9476 error (_("Out of memory\n"));
9480 for (hn = 0; hn < ngnubuckets; ++hn)
9481 ++counts[lengths[hn]];
9483 if (ngnubuckets > 0)
9486 printf (" 0 %-10lu (%5.1f%%)\n",
9487 counts[0], (counts[0] * 100.0) / ngnubuckets);
9488 for (j = 1; j <= maxlength; ++j)
9490 nzero_counts += counts[j] * j;
9491 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9492 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9493 (nzero_counts * 100.0) / nsyms);
9507 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9511 if (dynamic_syminfo == NULL
9513 /* No syminfo, this is ok. */
9516 /* There better should be a dynamic symbol section. */
9517 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9521 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9522 dynamic_syminfo_offset, dynamic_syminfo_nent);
9524 printf (_(" Num: Name BoundTo Flags\n"));
9525 for (i = 0; i < dynamic_syminfo_nent; ++i)
9527 unsigned short int flags = dynamic_syminfo[i].si_flags;
9529 printf ("%4d: ", i);
9530 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9531 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9533 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9536 switch (dynamic_syminfo[i].si_boundto)
9538 case SYMINFO_BT_SELF:
9539 fputs ("SELF ", stdout);
9541 case SYMINFO_BT_PARENT:
9542 fputs ("PARENT ", stdout);
9545 if (dynamic_syminfo[i].si_boundto > 0
9546 && dynamic_syminfo[i].si_boundto < dynamic_nent
9547 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9549 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9553 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9557 if (flags & SYMINFO_FLG_DIRECT)
9559 if (flags & SYMINFO_FLG_PASSTHRU)
9560 printf (" PASSTHRU");
9561 if (flags & SYMINFO_FLG_COPY)
9563 if (flags & SYMINFO_FLG_LAZYLOAD)
9564 printf (" LAZYLOAD");
9572 /* Check to see if the given reloc needs to be handled in a target specific
9573 manner. If so then process the reloc and return TRUE otherwise return
9577 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9578 unsigned char * start,
9579 Elf_Internal_Sym * symtab)
9581 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9583 switch (elf_header.e_machine)
9586 case EM_CYGNUS_MN10300:
9588 static Elf_Internal_Sym * saved_sym = NULL;
9592 case 34: /* R_MN10300_ALIGN */
9594 case 33: /* R_MN10300_SYM_DIFF */
9595 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9597 case 1: /* R_MN10300_32 */
9598 case 2: /* R_MN10300_16 */
9599 if (saved_sym != NULL)
9603 value = reloc->r_addend
9604 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9605 - saved_sym->st_value);
9607 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9614 if (saved_sym != NULL)
9615 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9625 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9626 DWARF debug sections. This is a target specific test. Note - we do not
9627 go through the whole including-target-headers-multiple-times route, (as
9628 we have already done with <elf/h8.h>) because this would become very
9629 messy and even then this function would have to contain target specific
9630 information (the names of the relocs instead of their numeric values).
9631 FIXME: This is not the correct way to solve this problem. The proper way
9632 is to have target specific reloc sizing and typing functions created by
9633 the reloc-macros.h header, in the same way that it already creates the
9634 reloc naming functions. */
9637 is_32bit_abs_reloc (unsigned int reloc_type)
9639 switch (elf_header.e_machine)
9643 return reloc_type == 1; /* R_386_32. */
9645 return reloc_type == 1; /* R_68K_32. */
9647 return reloc_type == 1; /* R_860_32. */
9649 return reloc_type == 2; /* R_960_32. */
9651 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9653 return reloc_type == 1; /* R_ARC_32. */
9655 return reloc_type == 2; /* R_ARM_ABS32 */
9658 return reloc_type == 1;
9660 return reloc_type == 0x12; /* R_byte4_data. */
9662 return reloc_type == 3; /* R_CRIS_32. */
9665 return reloc_type == 3; /* R_CR16_NUM32. */
9667 return reloc_type == 15; /* R_CRX_NUM32. */
9669 return reloc_type == 1;
9670 case EM_CYGNUS_D10V:
9672 return reloc_type == 6; /* R_D10V_32. */
9673 case EM_CYGNUS_D30V:
9675 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9677 return reloc_type == 3; /* R_DLX_RELOC_32. */
9678 case EM_CYGNUS_FR30:
9680 return reloc_type == 3; /* R_FR30_32. */
9684 return reloc_type == 1; /* R_H8_DIR32. */
9686 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9689 return reloc_type == 2; /* R_IP2K_32. */
9691 return reloc_type == 2; /* R_IQ2000_32. */
9692 case EM_LATTICEMICO32:
9693 return reloc_type == 3; /* R_LM32_32. */
9696 return reloc_type == 3; /* R_M32C_32. */
9698 return reloc_type == 34; /* R_M32R_32_RELA. */
9700 return reloc_type == 1; /* R_MCORE_ADDR32. */
9702 return reloc_type == 4; /* R_MEP_32. */
9704 return reloc_type == 1; /* R_MICROBLAZE_32. */
9706 return reloc_type == 2; /* R_MIPS_32. */
9708 return reloc_type == 4; /* R_MMIX_32. */
9709 case EM_CYGNUS_MN10200:
9711 return reloc_type == 1; /* R_MN10200_32. */
9712 case EM_CYGNUS_MN10300:
9714 return reloc_type == 1; /* R_MN10300_32. */
9716 return reloc_type == 1; /* R_MOXIE_32. */
9719 return reloc_type == 1; /* R_MSP43_32. */
9721 return reloc_type == 2; /* R_MT_32. */
9722 case EM_ALTERA_NIOS2:
9724 return reloc_type == 1; /* R_NIOS_32. */
9727 return reloc_type == 1; /* R_OR32_32. */
9729 return (reloc_type == 1 /* R_PARISC_DIR32. */
9730 || reloc_type == 41); /* R_PARISC_SECREL32. */
9733 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9735 return reloc_type == 1; /* R_PPC64_ADDR32. */
9737 return reloc_type == 1; /* R_PPC_ADDR32. */
9739 return reloc_type == 1; /* R_RX_DIR32. */
9741 return reloc_type == 1; /* R_I370_ADDR31. */
9744 return reloc_type == 4; /* R_S390_32. */
9746 return reloc_type == 8; /* R_SCORE_ABS32. */
9748 return reloc_type == 1; /* R_SH_DIR32. */
9749 case EM_SPARC32PLUS:
9752 return reloc_type == 3 /* R_SPARC_32. */
9753 || reloc_type == 23; /* R_SPARC_UA32. */
9755 return reloc_type == 6; /* R_SPU_ADDR32 */
9757 return reloc_type == 1; /* R_C6000_ABS32. */
9759 return reloc_type == 2; /* R_TILEGX_32. */
9761 return reloc_type == 1; /* R_TILEPRO_32. */
9762 case EM_CYGNUS_V850:
9764 return reloc_type == 6; /* R_V850_ABS32. */
9766 return reloc_type == 1; /* R_VAX_32. */
9770 return reloc_type == 10; /* R_X86_64_32. */
9773 return reloc_type == 3; /* R_XC16C_ABS_32. */
9775 return reloc_type == 1; /* R_XSTROMY16_32. */
9778 return reloc_type == 1; /* R_XTENSA_32. */
9780 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9781 elf_header.e_machine);
9786 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9787 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9790 is_32bit_pcrel_reloc (unsigned int reloc_type)
9792 switch (elf_header.e_machine)
9796 return reloc_type == 2; /* R_386_PC32. */
9798 return reloc_type == 4; /* R_68K_PC32. */
9800 return reloc_type == 10; /* R_ALPHA_SREL32. */
9802 return reloc_type == 3; /* R_ARM_REL32 */
9804 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
9806 return reloc_type == 9; /* R_PARISC_PCREL32. */
9808 return reloc_type == 26; /* R_PPC_REL32. */
9810 return reloc_type == 26; /* R_PPC64_REL32. */
9813 return reloc_type == 5; /* R_390_PC32. */
9815 return reloc_type == 2; /* R_SH_REL32. */
9816 case EM_SPARC32PLUS:
9819 return reloc_type == 6; /* R_SPARC_DISP32. */
9821 return reloc_type == 13; /* R_SPU_REL32. */
9823 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
9825 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
9829 return reloc_type == 2; /* R_X86_64_PC32. */
9832 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
9834 /* Do not abort or issue an error message here. Not all targets use
9835 pc-relative 32-bit relocs in their DWARF debug information and we
9836 have already tested for target coverage in is_32bit_abs_reloc. A
9837 more helpful warning message will be generated by apply_relocations
9838 anyway, so just return. */
9843 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9844 a 64-bit absolute RELA relocation used in DWARF debug sections. */
9847 is_64bit_abs_reloc (unsigned int reloc_type)
9849 switch (elf_header.e_machine)
9852 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
9854 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
9856 return reloc_type == 80; /* R_PARISC_DIR64. */
9858 return reloc_type == 38; /* R_PPC64_ADDR64. */
9859 case EM_SPARC32PLUS:
9862 return reloc_type == 54; /* R_SPARC_UA64. */
9866 return reloc_type == 1; /* R_X86_64_64. */
9869 return reloc_type == 22; /* R_S390_64. */
9871 return reloc_type == 1; /* R_TILEGX_64. */
9873 return reloc_type == 18; /* R_MIPS_64. */
9879 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9880 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
9883 is_64bit_pcrel_reloc (unsigned int reloc_type)
9885 switch (elf_header.e_machine)
9888 return reloc_type == 11; /* R_ALPHA_SREL64. */
9890 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
9892 return reloc_type == 72; /* R_PARISC_PCREL64. */
9894 return reloc_type == 44; /* R_PPC64_REL64. */
9895 case EM_SPARC32PLUS:
9898 return reloc_type == 46; /* R_SPARC_DISP64. */
9902 return reloc_type == 24; /* R_X86_64_PC64. */
9905 return reloc_type == 23; /* R_S390_PC64. */
9907 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
9913 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9914 a 24-bit absolute RELA relocation used in DWARF debug sections. */
9917 is_24bit_abs_reloc (unsigned int reloc_type)
9919 switch (elf_header.e_machine)
9921 case EM_CYGNUS_MN10200:
9923 return reloc_type == 4; /* R_MN10200_24. */
9929 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9930 a 16-bit absolute RELA relocation used in DWARF debug sections. */
9933 is_16bit_abs_reloc (unsigned int reloc_type)
9935 switch (elf_header.e_machine)
9939 return reloc_type == 4; /* R_AVR_16. */
9940 case EM_CYGNUS_D10V:
9942 return reloc_type == 3; /* R_D10V_16. */
9946 return reloc_type == R_H8_DIR16;
9949 return reloc_type == 1; /* R_IP2K_16. */
9952 return reloc_type == 1; /* R_M32C_16 */
9955 return reloc_type == 5; /* R_MSP430_16_BYTE. */
9956 case EM_ALTERA_NIOS2:
9958 return reloc_type == 9; /* R_NIOS_16. */
9960 return reloc_type == 2; /* R_C6000_ABS16. */
9963 return reloc_type == 2; /* R_XC16C_ABS_16. */
9969 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9970 relocation entries (possibly formerly used for SHT_GROUP sections). */
9973 is_none_reloc (unsigned int reloc_type)
9975 switch (elf_header.e_machine)
9977 case EM_68K: /* R_68K_NONE. */
9978 case EM_386: /* R_386_NONE. */
9979 case EM_SPARC32PLUS:
9981 case EM_SPARC: /* R_SPARC_NONE. */
9982 case EM_MIPS: /* R_MIPS_NONE. */
9983 case EM_PARISC: /* R_PARISC_NONE. */
9984 case EM_ALPHA: /* R_ALPHA_NONE. */
9985 case EM_PPC: /* R_PPC_NONE. */
9986 case EM_PPC64: /* R_PPC64_NONE. */
9987 case EM_ARM: /* R_ARM_NONE. */
9988 case EM_IA_64: /* R_IA64_NONE. */
9989 case EM_SH: /* R_SH_NONE. */
9991 case EM_S390: /* R_390_NONE. */
9992 case EM_CRIS: /* R_CRIS_NONE. */
9993 case EM_X86_64: /* R_X86_64_NONE. */
9994 case EM_L1OM: /* R_X86_64_NONE. */
9995 case EM_K1OM: /* R_X86_64_NONE. */
9996 case EM_MN10300: /* R_MN10300_NONE. */
9997 case EM_MOXIE: /* R_MOXIE_NONE. */
9998 case EM_M32R: /* R_M32R_NONE. */
9999 case EM_TI_C6000:/* R_C6000_NONE. */
10000 case EM_TILEGX: /* R_TILEGX_NONE. */
10001 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10003 case EM_C166: /* R_XC16X_NONE. */
10004 return reloc_type == 0;
10005 case EM_XTENSA_OLD:
10007 return (reloc_type == 0 /* R_XTENSA_NONE. */
10008 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10009 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10010 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10015 /* Apply relocations to a section.
10016 Note: So far support has been added only for those relocations
10017 which can be found in debug sections.
10018 FIXME: Add support for more relocations ? */
10021 apply_relocations (void * file,
10022 Elf_Internal_Shdr * section,
10023 unsigned char * start)
10025 Elf_Internal_Shdr * relsec;
10026 unsigned char * end = start + section->sh_size;
10028 if (elf_header.e_type != ET_REL)
10031 /* Find the reloc section associated with the section. */
10032 for (relsec = section_headers;
10033 relsec < section_headers + elf_header.e_shnum;
10036 bfd_boolean is_rela;
10037 unsigned long num_relocs;
10038 Elf_Internal_Rela * relocs;
10039 Elf_Internal_Rela * rp;
10040 Elf_Internal_Shdr * symsec;
10041 Elf_Internal_Sym * symtab;
10042 Elf_Internal_Sym * sym;
10044 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10045 || relsec->sh_info >= elf_header.e_shnum
10046 || section_headers + relsec->sh_info != section
10047 || relsec->sh_size == 0
10048 || relsec->sh_link >= elf_header.e_shnum)
10051 is_rela = relsec->sh_type == SHT_RELA;
10055 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10056 relsec->sh_size, & relocs, & num_relocs))
10061 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10062 relsec->sh_size, & relocs, & num_relocs))
10066 /* SH uses RELA but uses in place value instead of the addend field. */
10067 if (elf_header.e_machine == EM_SH)
10070 symsec = section_headers + relsec->sh_link;
10071 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
10073 for (rp = relocs; rp < relocs + num_relocs; ++rp)
10076 unsigned int reloc_type;
10077 unsigned int reloc_size;
10078 unsigned char * rloc;
10080 reloc_type = get_reloc_type (rp->r_info);
10082 if (target_specific_reloc_handling (rp, start, symtab))
10084 else if (is_none_reloc (reloc_type))
10086 else if (is_32bit_abs_reloc (reloc_type)
10087 || is_32bit_pcrel_reloc (reloc_type))
10089 else if (is_64bit_abs_reloc (reloc_type)
10090 || is_64bit_pcrel_reloc (reloc_type))
10092 else if (is_24bit_abs_reloc (reloc_type))
10094 else if (is_16bit_abs_reloc (reloc_type))
10098 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10099 reloc_type, SECTION_NAME (section));
10103 rloc = start + rp->r_offset;
10104 if ((rloc + reloc_size) > end)
10106 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10107 (unsigned long) rp->r_offset,
10108 SECTION_NAME (section));
10112 sym = symtab + get_reloc_symindex (rp->r_info);
10114 /* If the reloc has a symbol associated with it,
10115 make sure that it is of an appropriate type.
10117 Relocations against symbols without type can happen.
10118 Gcc -feliminate-dwarf2-dups may generate symbols
10119 without type for debug info.
10121 Icc generates relocations against function symbols
10122 instead of local labels.
10124 Relocations against object symbols can happen, eg when
10125 referencing a global array. For an example of this see
10126 the _clz.o binary in libgcc.a. */
10128 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10130 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10131 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10132 (long int)(rp - relocs),
10133 SECTION_NAME (relsec));
10139 addend += rp->r_addend;
10140 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10141 partial_inplace. */
10143 || (elf_header.e_machine == EM_XTENSA
10144 && reloc_type == 1)
10145 || ((elf_header.e_machine == EM_PJ
10146 || elf_header.e_machine == EM_PJ_OLD)
10147 && reloc_type == 1)
10148 || ((elf_header.e_machine == EM_D30V
10149 || elf_header.e_machine == EM_CYGNUS_D30V)
10150 && reloc_type == 12))
10151 addend += byte_get (rloc, reloc_size);
10153 if (is_32bit_pcrel_reloc (reloc_type)
10154 || is_64bit_pcrel_reloc (reloc_type))
10156 /* On HPPA, all pc-relative relocations are biased by 8. */
10157 if (elf_header.e_machine == EM_PARISC)
10159 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10163 byte_put (rloc, addend + sym->st_value, reloc_size);
10172 #ifdef SUPPORT_DISASSEMBLY
10174 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10176 printf (_("\nAssembly dump of section %s\n"),
10177 SECTION_NAME (section));
10179 /* XXX -- to be done --- XXX */
10185 /* Reads in the contents of SECTION from FILE, returning a pointer
10186 to a malloc'ed buffer or NULL if something went wrong. */
10189 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10191 bfd_size_type num_bytes;
10193 num_bytes = section->sh_size;
10195 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10197 printf (_("\nSection '%s' has no data to dump.\n"),
10198 SECTION_NAME (section));
10202 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10203 _("section contents"));
10208 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10210 Elf_Internal_Shdr * relsec;
10211 bfd_size_type num_bytes;
10215 char * name = SECTION_NAME (section);
10216 bfd_boolean some_strings_shown;
10218 start = get_section_contents (section, file);
10222 printf (_("\nString dump of section '%s':\n"), name);
10224 /* If the section being dumped has relocations against it the user might
10225 be expecting these relocations to have been applied. Check for this
10226 case and issue a warning message in order to avoid confusion.
10227 FIXME: Maybe we ought to have an option that dumps a section with
10228 relocs applied ? */
10229 for (relsec = section_headers;
10230 relsec < section_headers + elf_header.e_shnum;
10233 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10234 || relsec->sh_info >= elf_header.e_shnum
10235 || section_headers + relsec->sh_info != section
10236 || relsec->sh_size == 0
10237 || relsec->sh_link >= elf_header.e_shnum)
10240 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10244 num_bytes = section->sh_size;
10246 end = start + num_bytes;
10247 some_strings_shown = FALSE;
10251 while (!ISPRINT (* data))
10252 if (++ data >= end)
10258 /* PR 11128: Use two separate invocations in order to work
10259 around bugs in the Solaris 8 implementation of printf. */
10260 printf (" [%6tx] ", data - start);
10261 printf ("%s\n", data);
10263 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
10265 data += strlen (data);
10266 some_strings_shown = TRUE;
10270 if (! some_strings_shown)
10271 printf (_(" No strings found in this section."));
10279 dump_section_as_bytes (Elf_Internal_Shdr * section,
10281 bfd_boolean relocate)
10283 Elf_Internal_Shdr * relsec;
10284 bfd_size_type bytes;
10286 unsigned char * data;
10287 unsigned char * start;
10289 start = (unsigned char *) get_section_contents (section, file);
10293 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10297 apply_relocations (file, section, start);
10301 /* If the section being dumped has relocations against it the user might
10302 be expecting these relocations to have been applied. Check for this
10303 case and issue a warning message in order to avoid confusion.
10304 FIXME: Maybe we ought to have an option that dumps a section with
10305 relocs applied ? */
10306 for (relsec = section_headers;
10307 relsec < section_headers + elf_header.e_shnum;
10310 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10311 || relsec->sh_info >= elf_header.e_shnum
10312 || section_headers + relsec->sh_info != section
10313 || relsec->sh_size == 0
10314 || relsec->sh_link >= elf_header.e_shnum)
10317 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10322 addr = section->sh_addr;
10323 bytes = section->sh_size;
10332 lbytes = (bytes > 16 ? 16 : bytes);
10334 printf (" 0x%8.8lx ", (unsigned long) addr);
10336 for (j = 0; j < 16; j++)
10339 printf ("%2.2x", data[j]);
10347 for (j = 0; j < lbytes; j++)
10350 if (k >= ' ' && k < 0x7f)
10368 /* Uncompresses a section that was compressed using zlib, in place. */
10371 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10372 dwarf_size_type *size ATTRIBUTE_UNUSED)
10374 #ifndef HAVE_ZLIB_H
10377 dwarf_size_type compressed_size = *size;
10378 unsigned char * compressed_buffer = *buffer;
10379 dwarf_size_type uncompressed_size;
10380 unsigned char * uncompressed_buffer;
10383 dwarf_size_type header_size = 12;
10385 /* Read the zlib header. In this case, it should be "ZLIB" followed
10386 by the uncompressed section size, 8 bytes in big-endian order. */
10387 if (compressed_size < header_size
10388 || ! streq ((char *) compressed_buffer, "ZLIB"))
10391 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10392 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10393 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10394 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10395 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10396 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10397 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10398 uncompressed_size += compressed_buffer[11];
10400 /* It is possible the section consists of several compressed
10401 buffers concatenated together, so we uncompress in a loop. */
10402 strm.zalloc = NULL;
10404 strm.opaque = NULL;
10405 strm.avail_in = compressed_size - header_size;
10406 strm.next_in = (Bytef *) compressed_buffer + header_size;
10407 strm.avail_out = uncompressed_size;
10408 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10410 rc = inflateInit (& strm);
10411 while (strm.avail_in > 0)
10415 strm.next_out = ((Bytef *) uncompressed_buffer
10416 + (uncompressed_size - strm.avail_out));
10417 rc = inflate (&strm, Z_FINISH);
10418 if (rc != Z_STREAM_END)
10420 rc = inflateReset (& strm);
10422 rc = inflateEnd (& strm);
10424 || strm.avail_out != 0)
10427 free (compressed_buffer);
10428 *buffer = uncompressed_buffer;
10429 *size = uncompressed_size;
10433 free (uncompressed_buffer);
10434 /* Indicate decompression failure. */
10437 #endif /* HAVE_ZLIB_H */
10441 load_specific_debug_section (enum dwarf_section_display_enum debug,
10442 Elf_Internal_Shdr * sec, void * file)
10444 struct dwarf_section * section = &debug_displays [debug].section;
10447 /* If it is already loaded, do nothing. */
10448 if (section->start != NULL)
10451 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10452 section->address = sec->sh_addr;
10453 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10455 sec->sh_size, buf);
10456 if (section->start == NULL)
10460 section->size = sec->sh_size;
10461 if (uncompress_section_contents (§ion->start, §ion->size))
10462 sec->sh_size = section->size;
10465 if (section->start == NULL)
10468 if (debug_displays [debug].relocate)
10469 apply_relocations ((FILE *) file, sec, section->start);
10475 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10477 struct dwarf_section * section = &debug_displays [debug].section;
10478 Elf_Internal_Shdr * sec;
10480 /* Locate the debug section. */
10481 sec = find_section (section->uncompressed_name);
10483 section->name = section->uncompressed_name;
10486 sec = find_section (section->compressed_name);
10488 section->name = section->compressed_name;
10493 return load_specific_debug_section (debug, sec, (FILE *) file);
10497 free_debug_section (enum dwarf_section_display_enum debug)
10499 struct dwarf_section * section = &debug_displays [debug].section;
10501 if (section->start == NULL)
10504 free ((char *) section->start);
10505 section->start = NULL;
10506 section->address = 0;
10511 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10513 char * name = SECTION_NAME (section);
10514 bfd_size_type length;
10518 length = section->sh_size;
10521 printf (_("\nSection '%s' has no debugging data.\n"), name);
10524 if (section->sh_type == SHT_NOBITS)
10526 /* There is no point in dumping the contents of a debugging section
10527 which has the NOBITS type - the bits in the file will be random.
10528 This can happen when a file containing a .eh_frame section is
10529 stripped with the --only-keep-debug command line option. */
10530 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10534 if (const_strneq (name, ".gnu.linkonce.wi."))
10535 name = ".debug_info";
10537 /* See if we know how to display the contents of this section. */
10538 for (i = 0; i < max; i++)
10539 if (streq (debug_displays[i].section.uncompressed_name, name)
10540 || streq (debug_displays[i].section.compressed_name, name))
10542 struct dwarf_section * sec = &debug_displays [i].section;
10543 int secondary = (section != find_section (name));
10546 free_debug_section ((enum dwarf_section_display_enum) i);
10548 if (streq (sec->uncompressed_name, name))
10549 sec->name = sec->uncompressed_name;
10551 sec->name = sec->compressed_name;
10552 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10555 result &= debug_displays[i].display (sec, file);
10557 if (secondary || (i != info && i != abbrev))
10558 free_debug_section ((enum dwarf_section_display_enum) i);
10566 printf (_("Unrecognized debug section: %s\n"), name);
10573 /* Set DUMP_SECTS for all sections where dumps were requested
10574 based on section name. */
10577 initialise_dumps_byname (void)
10579 struct dump_list_entry * cur;
10581 for (cur = dump_sects_byname; cur; cur = cur->next)
10586 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10587 if (streq (SECTION_NAME (section_headers + i), cur->name))
10589 request_dump_bynumber (i, cur->type);
10594 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10600 process_section_contents (FILE * file)
10602 Elf_Internal_Shdr * section;
10608 initialise_dumps_byname ();
10610 for (i = 0, section = section_headers;
10611 i < elf_header.e_shnum && i < num_dump_sects;
10614 #ifdef SUPPORT_DISASSEMBLY
10615 if (dump_sects[i] & DISASS_DUMP)
10616 disassemble_section (section, file);
10618 if (dump_sects[i] & HEX_DUMP)
10619 dump_section_as_bytes (section, file, FALSE);
10621 if (dump_sects[i] & RELOC_DUMP)
10622 dump_section_as_bytes (section, file, TRUE);
10624 if (dump_sects[i] & STRING_DUMP)
10625 dump_section_as_strings (section, file);
10627 if (dump_sects[i] & DEBUG_DUMP)
10628 display_debug_section (section, file);
10631 /* Check to see if the user requested a
10632 dump of a section that does not exist. */
10633 while (i++ < num_dump_sects)
10635 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10639 process_mips_fpe_exception (int mask)
10644 if (mask & OEX_FPU_INEX)
10645 fputs ("INEX", stdout), first = 0;
10646 if (mask & OEX_FPU_UFLO)
10647 printf ("%sUFLO", first ? "" : "|"), first = 0;
10648 if (mask & OEX_FPU_OFLO)
10649 printf ("%sOFLO", first ? "" : "|"), first = 0;
10650 if (mask & OEX_FPU_DIV0)
10651 printf ("%sDIV0", first ? "" : "|"), first = 0;
10652 if (mask & OEX_FPU_INVAL)
10653 printf ("%sINVAL", first ? "" : "|");
10656 fputs ("0", stdout);
10659 /* ARM EABI attributes section. */
10664 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10666 const char ** table;
10667 } arm_attr_public_tag;
10669 static const char * arm_attr_tag_CPU_arch[] =
10670 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10671 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10672 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10673 static const char * arm_attr_tag_THUMB_ISA_use[] =
10674 {"No", "Thumb-1", "Thumb-2"};
10675 static const char * arm_attr_tag_FP_arch[] =
10676 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10677 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10678 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10679 {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10680 static const char * arm_attr_tag_PCS_config[] =
10681 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10682 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10683 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10684 {"V6", "SB", "TLS", "Unused"};
10685 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10686 {"Absolute", "PC-relative", "SB-relative", "None"};
10687 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10688 {"Absolute", "PC-relative", "None"};
10689 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10690 {"None", "direct", "GOT-indirect"};
10691 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10692 {"None", "??? 1", "2", "??? 3", "4"};
10693 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10694 static const char * arm_attr_tag_ABI_FP_denormal[] =
10695 {"Unused", "Needed", "Sign only"};
10696 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10697 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10698 static const char * arm_attr_tag_ABI_FP_number_model[] =
10699 {"Unused", "Finite", "RTABI", "IEEE 754"};
10700 static const char * arm_attr_tag_ABI_enum_size[] =
10701 {"Unused", "small", "int", "forced to int"};
10702 static const char * arm_attr_tag_ABI_HardFP_use[] =
10703 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10704 static const char * arm_attr_tag_ABI_VFP_args[] =
10705 {"AAPCS", "VFP registers", "custom"};
10706 static const char * arm_attr_tag_ABI_WMMX_args[] =
10707 {"AAPCS", "WMMX registers", "custom"};
10708 static const char * arm_attr_tag_ABI_optimization_goals[] =
10709 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10710 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10711 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10712 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10713 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10714 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10715 static const char * arm_attr_tag_FP_HP_extension[] =
10716 {"Not Allowed", "Allowed"};
10717 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10718 {"None", "IEEE 754", "Alternative Format"};
10719 static const char * arm_attr_tag_MPextension_use[] =
10720 {"Not Allowed", "Allowed"};
10721 static const char * arm_attr_tag_DIV_use[] =
10722 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10723 "Allowed in v7-A with integer division extension"};
10724 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10725 static const char * arm_attr_tag_Virtualization_use[] =
10726 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10727 "TrustZone and Virtualization Extensions"};
10728 static const char * arm_attr_tag_MPextension_use_legacy[] =
10729 {"Not Allowed", "Allowed"};
10731 #define LOOKUP(id, name) \
10732 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10733 static arm_attr_public_tag arm_attr_public_tags[] =
10735 {4, "CPU_raw_name", 1, NULL},
10736 {5, "CPU_name", 1, NULL},
10737 LOOKUP(6, CPU_arch),
10738 {7, "CPU_arch_profile", 0, NULL},
10739 LOOKUP(8, ARM_ISA_use),
10740 LOOKUP(9, THUMB_ISA_use),
10741 LOOKUP(10, FP_arch),
10742 LOOKUP(11, WMMX_arch),
10743 LOOKUP(12, Advanced_SIMD_arch),
10744 LOOKUP(13, PCS_config),
10745 LOOKUP(14, ABI_PCS_R9_use),
10746 LOOKUP(15, ABI_PCS_RW_data),
10747 LOOKUP(16, ABI_PCS_RO_data),
10748 LOOKUP(17, ABI_PCS_GOT_use),
10749 LOOKUP(18, ABI_PCS_wchar_t),
10750 LOOKUP(19, ABI_FP_rounding),
10751 LOOKUP(20, ABI_FP_denormal),
10752 LOOKUP(21, ABI_FP_exceptions),
10753 LOOKUP(22, ABI_FP_user_exceptions),
10754 LOOKUP(23, ABI_FP_number_model),
10755 {24, "ABI_align_needed", 0, NULL},
10756 {25, "ABI_align_preserved", 0, NULL},
10757 LOOKUP(26, ABI_enum_size),
10758 LOOKUP(27, ABI_HardFP_use),
10759 LOOKUP(28, ABI_VFP_args),
10760 LOOKUP(29, ABI_WMMX_args),
10761 LOOKUP(30, ABI_optimization_goals),
10762 LOOKUP(31, ABI_FP_optimization_goals),
10763 {32, "compatibility", 0, NULL},
10764 LOOKUP(34, CPU_unaligned_access),
10765 LOOKUP(36, FP_HP_extension),
10766 LOOKUP(38, ABI_FP_16bit_format),
10767 LOOKUP(42, MPextension_use),
10768 LOOKUP(44, DIV_use),
10769 {64, "nodefaults", 0, NULL},
10770 {65, "also_compatible_with", 0, NULL},
10771 LOOKUP(66, T2EE_use),
10772 {67, "conformance", 1, NULL},
10773 LOOKUP(68, Virtualization_use),
10774 LOOKUP(70, MPextension_use_legacy)
10778 static unsigned char *
10779 display_arm_attribute (unsigned char * p)
10784 arm_attr_public_tag * attr;
10788 tag = read_uleb128 (p, &len);
10791 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10793 if (arm_attr_public_tags[i].tag == tag)
10795 attr = &arm_attr_public_tags[i];
10802 printf (" Tag_%s: ", attr->name);
10803 switch (attr->type)
10808 case 7: /* Tag_CPU_arch_profile. */
10809 val = read_uleb128 (p, &len);
10813 case 0: printf (_("None\n")); break;
10814 case 'A': printf (_("Application\n")); break;
10815 case 'R': printf (_("Realtime\n")); break;
10816 case 'M': printf (_("Microcontroller\n")); break;
10817 case 'S': printf (_("Application or Realtime\n")); break;
10818 default: printf ("??? (%d)\n", val); break;
10822 case 24: /* Tag_align_needed. */
10823 val = read_uleb128 (p, &len);
10827 case 0: printf (_("None\n")); break;
10828 case 1: printf (_("8-byte\n")); break;
10829 case 2: printf (_("4-byte\n")); break;
10830 case 3: printf ("??? 3\n"); break;
10833 printf (_("8-byte and up to %d-byte extended\n"),
10836 printf ("??? (%d)\n", val);
10841 case 25: /* Tag_align_preserved. */
10842 val = read_uleb128 (p, &len);
10846 case 0: printf (_("None\n")); break;
10847 case 1: printf (_("8-byte, except leaf SP\n")); break;
10848 case 2: printf (_("8-byte\n")); break;
10849 case 3: printf ("??? 3\n"); break;
10852 printf (_("8-byte and up to %d-byte extended\n"),
10855 printf ("??? (%d)\n", val);
10860 case 32: /* Tag_compatibility. */
10861 val = read_uleb128 (p, &len);
10863 printf (_("flag = %d, vendor = %s\n"), val, p);
10864 p += strlen ((char *) p) + 1;
10867 case 64: /* Tag_nodefaults. */
10869 printf (_("True\n"));
10872 case 65: /* Tag_also_compatible_with. */
10873 val = read_uleb128 (p, &len);
10875 if (val == 6 /* Tag_CPU_arch. */)
10877 val = read_uleb128 (p, &len);
10879 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10880 printf ("??? (%d)\n", val);
10882 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10886 while (*(p++) != '\0' /* NUL terminator. */);
10900 assert (attr->type & 0x80);
10901 val = read_uleb128 (p, &len);
10903 type = attr->type & 0x7f;
10905 printf ("??? (%d)\n", val);
10907 printf ("%s\n", attr->table[val]);
10914 type = 1; /* String. */
10916 type = 2; /* uleb128. */
10917 printf (" Tag_unknown_%d: ", tag);
10922 printf ("\"%s\"\n", p);
10923 p += strlen ((char *) p) + 1;
10927 val = read_uleb128 (p, &len);
10929 printf ("%d (0x%x)\n", val, val);
10935 static unsigned char *
10936 display_gnu_attribute (unsigned char * p,
10937 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10944 tag = read_uleb128 (p, &len);
10947 /* Tag_compatibility is the only generic GNU attribute defined at
10951 val = read_uleb128 (p, &len);
10953 printf (_("flag = %d, vendor = %s\n"), val, p);
10954 p += strlen ((char *) p) + 1;
10958 if ((tag & 2) == 0 && display_proc_gnu_attribute)
10959 return display_proc_gnu_attribute (p, tag);
10962 type = 1; /* String. */
10964 type = 2; /* uleb128. */
10965 printf (" Tag_unknown_%d: ", tag);
10969 printf ("\"%s\"\n", p);
10970 p += strlen ((char *) p) + 1;
10974 val = read_uleb128 (p, &len);
10976 printf ("%d (0x%x)\n", val, val);
10982 static unsigned char *
10983 display_power_gnu_attribute (unsigned char * p, int tag)
10989 if (tag == Tag_GNU_Power_ABI_FP)
10991 val = read_uleb128 (p, &len);
10993 printf (" Tag_GNU_Power_ABI_FP: ");
10998 printf (_("Hard or soft float\n"));
11001 printf (_("Hard float\n"));
11004 printf (_("Soft float\n"));
11007 printf (_("Single-precision hard float\n"));
11010 printf ("??? (%d)\n", val);
11016 if (tag == Tag_GNU_Power_ABI_Vector)
11018 val = read_uleb128 (p, &len);
11020 printf (" Tag_GNU_Power_ABI_Vector: ");
11024 printf (_("Any\n"));
11027 printf (_("Generic\n"));
11030 printf ("AltiVec\n");
11036 printf ("??? (%d)\n", val);
11042 if (tag == Tag_GNU_Power_ABI_Struct_Return)
11044 val = read_uleb128 (p, &len);
11046 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
11050 printf (_("Any\n"));
11053 printf ("r3/r4\n");
11056 printf (_("Memory\n"));
11059 printf ("??? (%d)\n", val);
11066 type = 1; /* String. */
11068 type = 2; /* uleb128. */
11069 printf (" Tag_unknown_%d: ", tag);
11073 printf ("\"%s\"\n", p);
11074 p += strlen ((char *) p) + 1;
11078 val = read_uleb128 (p, &len);
11080 printf ("%d (0x%x)\n", val, val);
11086 static unsigned char *
11087 display_mips_gnu_attribute (unsigned char * p, int tag)
11093 if (tag == Tag_GNU_MIPS_ABI_FP)
11095 val = read_uleb128 (p, &len);
11097 printf (" Tag_GNU_MIPS_ABI_FP: ");
11102 printf (_("Hard or soft float\n"));
11105 printf (_("Hard float (double precision)\n"));
11108 printf (_("Hard float (single precision)\n"));
11111 printf (_("Soft float\n"));
11114 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11117 printf ("??? (%d)\n", val);
11124 type = 1; /* String. */
11126 type = 2; /* uleb128. */
11127 printf (" Tag_unknown_%d: ", tag);
11131 printf ("\"%s\"\n", p);
11132 p += strlen ((char *) p) + 1;
11136 val = read_uleb128 (p, &len);
11138 printf ("%d (0x%x)\n", val, val);
11144 static unsigned char *
11145 display_tic6x_attribute (unsigned char * p)
11151 tag = read_uleb128 (p, &len);
11157 val = read_uleb128 (p, &len);
11159 printf (" Tag_ISA: ");
11163 case C6XABI_Tag_ISA_none:
11164 printf (_("None\n"));
11166 case C6XABI_Tag_ISA_C62X:
11169 case C6XABI_Tag_ISA_C67X:
11172 case C6XABI_Tag_ISA_C67XP:
11173 printf ("C67x+\n");
11175 case C6XABI_Tag_ISA_C64X:
11178 case C6XABI_Tag_ISA_C64XP:
11179 printf ("C64x+\n");
11181 case C6XABI_Tag_ISA_C674X:
11182 printf ("C674x\n");
11185 printf ("??? (%d)\n", val);
11190 case Tag_ABI_wchar_t:
11191 val = read_uleb128 (p, &len);
11193 printf (" Tag_ABI_wchar_t: ");
11197 printf (_("Not used\n"));
11200 printf (_("2 bytes\n"));
11203 printf (_("4 bytes\n"));
11206 printf ("??? (%d)\n", val);
11211 case Tag_ABI_stack_align_needed:
11212 val = read_uleb128 (p, &len);
11214 printf (" Tag_ABI_stack_align_needed: ");
11218 printf (_("8-byte\n"));
11221 printf (_("16-byte\n"));
11224 printf ("??? (%d)\n", val);
11229 case Tag_ABI_stack_align_preserved:
11230 val = read_uleb128 (p, &len);
11232 printf (" Tag_ABI_stack_align_preserved: ");
11236 printf (_("8-byte\n"));
11239 printf (_("16-byte\n"));
11242 printf ("??? (%d)\n", val);
11248 val = read_uleb128 (p, &len);
11250 printf (" Tag_ABI_DSBT: ");
11254 printf (_("DSBT addressing not used\n"));
11257 printf (_("DSBT addressing used\n"));
11260 printf ("??? (%d)\n", val);
11266 val = read_uleb128 (p, &len);
11268 printf (" Tag_ABI_PID: ");
11272 printf (_("Data addressing position-dependent\n"));
11275 printf (_("Data addressing position-independent, GOT near DP\n"));
11278 printf (_("Data addressing position-independent, GOT far from DP\n"));
11281 printf ("??? (%d)\n", val);
11287 val = read_uleb128 (p, &len);
11289 printf (" Tag_ABI_PIC: ");
11293 printf (_("Code addressing position-dependent\n"));
11296 printf (_("Code addressing position-independent\n"));
11299 printf ("??? (%d)\n", val);
11304 case Tag_ABI_array_object_alignment:
11305 val = read_uleb128 (p, &len);
11307 printf (" Tag_ABI_array_object_alignment: ");
11311 printf (_("8-byte\n"));
11314 printf (_("4-byte\n"));
11317 printf (_("16-byte\n"));
11320 printf ("??? (%d)\n", val);
11325 case Tag_ABI_array_object_align_expected:
11326 val = read_uleb128 (p, &len);
11328 printf (" Tag_ABI_array_object_align_expected: ");
11332 printf (_("8-byte\n"));
11335 printf (_("4-byte\n"));
11338 printf (_("16-byte\n"));
11341 printf ("??? (%d)\n", val);
11346 case Tag_ABI_compatibility:
11347 val = read_uleb128 (p, &len);
11349 printf (" Tag_ABI_compatibility: ");
11350 printf (_("flag = %d, vendor = %s\n"), val, p);
11351 p += strlen ((char *) p) + 1;
11354 case Tag_ABI_conformance:
11355 printf (" Tag_ABI_conformance: ");
11356 printf ("\"%s\"\n", p);
11357 p += strlen ((char *) p) + 1;
11361 printf (" Tag_unknown_%d: ", tag);
11365 printf ("\"%s\"\n", p);
11366 p += strlen ((char *) p) + 1;
11370 val = read_uleb128 (p, &len);
11372 printf ("%d (0x%x)\n", val, val);
11379 process_attributes (FILE * file,
11380 const char * public_name,
11381 unsigned int proc_type,
11382 unsigned char * (* display_pub_attribute) (unsigned char *),
11383 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11385 Elf_Internal_Shdr * sect;
11386 unsigned char * contents;
11388 unsigned char * end;
11389 bfd_vma section_len;
11393 /* Find the section header so that we get the size. */
11394 for (i = 0, sect = section_headers;
11395 i < elf_header.e_shnum;
11398 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11401 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11402 sect->sh_size, _("attributes"));
11403 if (contents == NULL)
11409 len = sect->sh_size - 1;
11415 bfd_boolean public_section;
11416 bfd_boolean gnu_section;
11418 section_len = byte_get (p, 4);
11421 if (section_len > len)
11423 printf (_("ERROR: Bad section length (%d > %d)\n"),
11424 (int) section_len, (int) len);
11428 len -= section_len;
11429 printf (_("Attribute Section: %s\n"), p);
11431 if (public_name && streq ((char *) p, public_name))
11432 public_section = TRUE;
11434 public_section = FALSE;
11436 if (streq ((char *) p, "gnu"))
11437 gnu_section = TRUE;
11439 gnu_section = FALSE;
11441 namelen = strlen ((char *) p) + 1;
11443 section_len -= namelen + 4;
11445 while (section_len > 0)
11451 size = byte_get (p, 4);
11452 if (size > section_len)
11454 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11455 (int) size, (int) section_len);
11456 size = section_len;
11459 section_len -= size;
11460 end = p + size - 1;
11466 printf (_("File Attributes\n"));
11469 printf (_("Section Attributes:"));
11472 printf (_("Symbol Attributes:"));
11478 val = read_uleb128 (p, &j);
11482 printf (" %d", val);
11487 printf (_("Unknown tag: %d\n"), tag);
11488 public_section = FALSE;
11492 if (public_section)
11495 p = display_pub_attribute (p);
11497 else if (gnu_section)
11500 p = display_gnu_attribute (p,
11501 display_proc_gnu_attribute);
11505 /* ??? Do something sensible, like dump hex. */
11506 printf (_(" Unknown section contexts\n"));
11513 printf (_("Unknown format '%c'\n"), *p);
11521 process_arm_specific (FILE * file)
11523 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11524 display_arm_attribute, NULL);
11528 process_power_specific (FILE * file)
11530 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11531 display_power_gnu_attribute);
11535 process_tic6x_specific (FILE * file)
11537 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11538 display_tic6x_attribute, NULL);
11541 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11542 Print the Address, Access and Initial fields of an entry at VMA ADDR
11543 and return the VMA of the next entry. */
11546 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11549 print_vma (addr, LONG_HEX);
11551 if (addr < pltgot + 0xfff0)
11552 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11554 printf ("%10s", "");
11557 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11562 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11563 print_vma (entry, LONG_HEX);
11565 return addr + (is_32bit_elf ? 4 : 8);
11568 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11569 PLTGOT. Print the Address and Initial fields of an entry at VMA
11570 ADDR and return the VMA of the next entry. */
11573 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11576 print_vma (addr, LONG_HEX);
11579 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11584 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11585 print_vma (entry, LONG_HEX);
11587 return addr + (is_32bit_elf ? 4 : 8);
11591 process_mips_specific (FILE * file)
11593 Elf_Internal_Dyn * entry;
11594 size_t liblist_offset = 0;
11595 size_t liblistno = 0;
11596 size_t conflictsno = 0;
11597 size_t options_offset = 0;
11598 size_t conflicts_offset = 0;
11599 size_t pltrelsz = 0;
11601 bfd_vma pltgot = 0;
11602 bfd_vma mips_pltgot = 0;
11603 bfd_vma jmprel = 0;
11604 bfd_vma local_gotno = 0;
11605 bfd_vma gotsym = 0;
11606 bfd_vma symtabno = 0;
11608 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11609 display_mips_gnu_attribute);
11611 /* We have a lot of special sections. Thanks SGI! */
11612 if (dynamic_section == NULL)
11613 /* No information available. */
11616 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11617 switch (entry->d_tag)
11619 case DT_MIPS_LIBLIST:
11621 = offset_from_vma (file, entry->d_un.d_val,
11622 liblistno * sizeof (Elf32_External_Lib));
11624 case DT_MIPS_LIBLISTNO:
11625 liblistno = entry->d_un.d_val;
11627 case DT_MIPS_OPTIONS:
11628 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11630 case DT_MIPS_CONFLICT:
11632 = offset_from_vma (file, entry->d_un.d_val,
11633 conflictsno * sizeof (Elf32_External_Conflict));
11635 case DT_MIPS_CONFLICTNO:
11636 conflictsno = entry->d_un.d_val;
11639 pltgot = entry->d_un.d_ptr;
11641 case DT_MIPS_LOCAL_GOTNO:
11642 local_gotno = entry->d_un.d_val;
11644 case DT_MIPS_GOTSYM:
11645 gotsym = entry->d_un.d_val;
11647 case DT_MIPS_SYMTABNO:
11648 symtabno = entry->d_un.d_val;
11650 case DT_MIPS_PLTGOT:
11651 mips_pltgot = entry->d_un.d_ptr;
11654 pltrel = entry->d_un.d_val;
11657 pltrelsz = entry->d_un.d_val;
11660 jmprel = entry->d_un.d_ptr;
11666 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11668 Elf32_External_Lib * elib;
11671 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11673 sizeof (Elf32_External_Lib),
11677 printf (_("\nSection '.liblist' contains %lu entries:\n"),
11678 (unsigned long) liblistno);
11679 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
11682 for (cnt = 0; cnt < liblistno; ++cnt)
11689 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11690 atime = BYTE_GET (elib[cnt].l_time_stamp);
11691 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11692 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11693 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11695 tmp = gmtime (&atime);
11696 snprintf (timebuf, sizeof (timebuf),
11697 "%04u-%02u-%02uT%02u:%02u:%02u",
11698 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11699 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11701 printf ("%3lu: ", (unsigned long) cnt);
11702 if (VALID_DYNAMIC_NAME (liblist.l_name))
11703 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11705 printf (_("<corrupt: %9ld>"), liblist.l_name);
11706 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11707 liblist.l_version);
11709 if (liblist.l_flags == 0)
11713 static const struct
11720 { " EXACT_MATCH", LL_EXACT_MATCH },
11721 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11722 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11723 { " EXPORTS", LL_EXPORTS },
11724 { " DELAY_LOAD", LL_DELAY_LOAD },
11725 { " DELTA", LL_DELTA }
11727 int flags = liblist.l_flags;
11730 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11731 if ((flags & l_flags_vals[fcnt].bit) != 0)
11733 fputs (l_flags_vals[fcnt].name, stdout);
11734 flags ^= l_flags_vals[fcnt].bit;
11737 printf (" %#x", (unsigned int) flags);
11747 if (options_offset != 0)
11749 Elf_External_Options * eopt;
11750 Elf_Internal_Shdr * sect = section_headers;
11751 Elf_Internal_Options * iopt;
11752 Elf_Internal_Options * option;
11756 /* Find the section header so that we get the size. */
11757 while (sect->sh_type != SHT_MIPS_OPTIONS)
11760 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11761 sect->sh_size, _("options"));
11764 iopt = (Elf_Internal_Options *)
11765 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11768 error (_("Out of memory\n"));
11775 while (offset < sect->sh_size)
11777 Elf_External_Options * eoption;
11779 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11781 option->kind = BYTE_GET (eoption->kind);
11782 option->size = BYTE_GET (eoption->size);
11783 option->section = BYTE_GET (eoption->section);
11784 option->info = BYTE_GET (eoption->info);
11786 offset += option->size;
11792 printf (_("\nSection '%s' contains %d entries:\n"),
11793 SECTION_NAME (sect), cnt);
11801 switch (option->kind)
11804 /* This shouldn't happen. */
11805 printf (" NULL %d %lx", option->section, option->info);
11808 printf (" REGINFO ");
11809 if (elf_header.e_machine == EM_MIPS)
11812 Elf32_External_RegInfo * ereg;
11813 Elf32_RegInfo reginfo;
11815 ereg = (Elf32_External_RegInfo *) (option + 1);
11816 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11817 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11818 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11819 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11820 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11821 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11823 printf ("GPR %08lx GP 0x%lx\n",
11824 reginfo.ri_gprmask,
11825 (unsigned long) reginfo.ri_gp_value);
11826 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11827 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11828 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11833 Elf64_External_RegInfo * ereg;
11834 Elf64_Internal_RegInfo reginfo;
11836 ereg = (Elf64_External_RegInfo *) (option + 1);
11837 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11838 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11839 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11840 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11841 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11842 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11844 printf ("GPR %08lx GP 0x",
11845 reginfo.ri_gprmask);
11846 printf_vma (reginfo.ri_gp_value);
11849 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11850 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11851 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11855 case ODK_EXCEPTIONS:
11856 fputs (" EXCEPTIONS fpe_min(", stdout);
11857 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11858 fputs (") fpe_max(", stdout);
11859 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11860 fputs (")", stdout);
11862 if (option->info & OEX_PAGE0)
11863 fputs (" PAGE0", stdout);
11864 if (option->info & OEX_SMM)
11865 fputs (" SMM", stdout);
11866 if (option->info & OEX_FPDBUG)
11867 fputs (" FPDBUG", stdout);
11868 if (option->info & OEX_DISMISS)
11869 fputs (" DISMISS", stdout);
11872 fputs (" PAD ", stdout);
11873 if (option->info & OPAD_PREFIX)
11874 fputs (" PREFIX", stdout);
11875 if (option->info & OPAD_POSTFIX)
11876 fputs (" POSTFIX", stdout);
11877 if (option->info & OPAD_SYMBOL)
11878 fputs (" SYMBOL", stdout);
11881 fputs (" HWPATCH ", stdout);
11882 if (option->info & OHW_R4KEOP)
11883 fputs (" R4KEOP", stdout);
11884 if (option->info & OHW_R8KPFETCH)
11885 fputs (" R8KPFETCH", stdout);
11886 if (option->info & OHW_R5KEOP)
11887 fputs (" R5KEOP", stdout);
11888 if (option->info & OHW_R5KCVTL)
11889 fputs (" R5KCVTL", stdout);
11892 fputs (" FILL ", stdout);
11893 /* XXX Print content of info word? */
11896 fputs (" TAGS ", stdout);
11897 /* XXX Print content of info word? */
11900 fputs (" HWAND ", stdout);
11901 if (option->info & OHWA0_R4KEOP_CHECKED)
11902 fputs (" R4KEOP_CHECKED", stdout);
11903 if (option->info & OHWA0_R4KEOP_CLEAN)
11904 fputs (" R4KEOP_CLEAN", stdout);
11907 fputs (" HWOR ", stdout);
11908 if (option->info & OHWA0_R4KEOP_CHECKED)
11909 fputs (" R4KEOP_CHECKED", stdout);
11910 if (option->info & OHWA0_R4KEOP_CLEAN)
11911 fputs (" R4KEOP_CLEAN", stdout);
11914 printf (" GP_GROUP %#06lx self-contained %#06lx",
11915 option->info & OGP_GROUP,
11916 (option->info & OGP_SELF) >> 16);
11919 printf (" IDENT %#06lx self-contained %#06lx",
11920 option->info & OGP_GROUP,
11921 (option->info & OGP_SELF) >> 16);
11924 /* This shouldn't happen. */
11925 printf (" %3d ??? %d %lx",
11926 option->kind, option->section, option->info);
11930 len = sizeof (* eopt);
11931 while (len < option->size)
11932 if (((char *) option)[len] >= ' '
11933 && ((char *) option)[len] < 0x7f)
11934 printf ("%c", ((char *) option)[len++]);
11936 printf ("\\%03o", ((char *) option)[len++]);
11938 fputs ("\n", stdout);
11946 if (conflicts_offset != 0 && conflictsno != 0)
11948 Elf32_Conflict * iconf;
11951 if (dynamic_symbols == NULL)
11953 error (_("conflict list found without a dynamic symbol table\n"));
11957 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
11960 error (_("Out of memory\n"));
11966 Elf32_External_Conflict * econf32;
11968 econf32 = (Elf32_External_Conflict *)
11969 get_data (NULL, file, conflicts_offset, conflictsno,
11970 sizeof (* econf32), _("conflict"));
11974 for (cnt = 0; cnt < conflictsno; ++cnt)
11975 iconf[cnt] = BYTE_GET (econf32[cnt]);
11981 Elf64_External_Conflict * econf64;
11983 econf64 = (Elf64_External_Conflict *)
11984 get_data (NULL, file, conflicts_offset, conflictsno,
11985 sizeof (* econf64), _("conflict"));
11989 for (cnt = 0; cnt < conflictsno; ++cnt)
11990 iconf[cnt] = BYTE_GET (econf64[cnt]);
11995 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11996 (unsigned long) conflictsno);
11997 puts (_(" Num: Index Value Name"));
11999 for (cnt = 0; cnt < conflictsno; ++cnt)
12001 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12003 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
12004 print_vma (psym->st_value, FULL_HEX);
12006 if (VALID_DYNAMIC_NAME (psym->st_name))
12007 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12009 printf (_("<corrupt: %14ld>"), psym->st_name);
12016 if (pltgot != 0 && local_gotno != 0)
12018 bfd_vma ent, local_end, global_end;
12020 unsigned char * data;
12024 addr_size = (is_32bit_elf ? 4 : 8);
12025 local_end = pltgot + local_gotno * addr_size;
12026 global_end = local_end + (symtabno - gotsym) * addr_size;
12028 offset = offset_from_vma (file, pltgot, global_end - pltgot);
12029 data = (unsigned char *) get_data (NULL, file, offset,
12030 global_end - pltgot, 1, _("GOT"));
12034 printf (_("\nPrimary GOT:\n"));
12035 printf (_(" Canonical gp value: "));
12036 print_vma (pltgot + 0x7ff0, LONG_HEX);
12039 printf (_(" Reserved entries:\n"));
12040 printf (_(" %*s %10s %*s Purpose\n"),
12041 addr_size * 2, _("Address"), _("Access"),
12042 addr_size * 2, _("Initial"));
12043 ent = print_mips_got_entry (data, pltgot, ent);
12044 printf (_(" Lazy resolver\n"));
12046 && (byte_get (data + ent - pltgot, addr_size)
12047 >> (addr_size * 8 - 1)) != 0)
12049 ent = print_mips_got_entry (data, pltgot, ent);
12050 printf (_(" Module pointer (GNU extension)\n"));
12054 if (ent < local_end)
12056 printf (_(" Local entries:\n"));
12057 printf (" %*s %10s %*s\n",
12058 addr_size * 2, _("Address"), _("Access"),
12059 addr_size * 2, _("Initial"));
12060 while (ent < local_end)
12062 ent = print_mips_got_entry (data, pltgot, ent);
12068 if (gotsym < symtabno)
12072 printf (_(" Global entries:\n"));
12073 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
12074 addr_size * 2, _("Address"), _("Access"),
12075 addr_size * 2, _("Initial"),
12076 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12077 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12078 for (i = gotsym; i < symtabno; i++)
12080 Elf_Internal_Sym * psym;
12082 psym = dynamic_symbols + i;
12083 ent = print_mips_got_entry (data, pltgot, ent);
12085 print_vma (psym->st_value, LONG_HEX);
12086 printf (" %-7s %3s ",
12087 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12088 get_symbol_index_type (psym->st_shndx));
12089 if (VALID_DYNAMIC_NAME (psym->st_name))
12090 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12092 printf (_("<corrupt: %14ld>"), psym->st_name);
12102 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12105 size_t offset, rel_offset;
12106 unsigned long count, i;
12107 unsigned char * data;
12108 int addr_size, sym_width;
12109 Elf_Internal_Rela * rels;
12111 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12112 if (pltrel == DT_RELA)
12114 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12119 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12124 addr_size = (is_32bit_elf ? 4 : 8);
12125 end = mips_pltgot + (2 + count) * addr_size;
12127 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12128 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12133 printf (_("\nPLT GOT:\n\n"));
12134 printf (_(" Reserved entries:\n"));
12135 printf (_(" %*s %*s Purpose\n"),
12136 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12137 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12138 printf (_(" PLT lazy resolver\n"));
12139 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12140 printf (_(" Module pointer\n"));
12143 printf (_(" Entries:\n"));
12144 printf (" %*s %*s %*s %-7s %3s %s\n",
12145 addr_size * 2, _("Address"),
12146 addr_size * 2, _("Initial"),
12147 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12148 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12149 for (i = 0; i < count; i++)
12151 Elf_Internal_Sym * psym;
12153 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12154 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12156 print_vma (psym->st_value, LONG_HEX);
12157 printf (" %-7s %3s ",
12158 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12159 get_symbol_index_type (psym->st_shndx));
12160 if (VALID_DYNAMIC_NAME (psym->st_name))
12161 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12163 printf (_("<corrupt: %14ld>"), psym->st_name);
12177 process_gnu_liblist (FILE * file)
12179 Elf_Internal_Shdr * section;
12180 Elf_Internal_Shdr * string_sec;
12181 Elf32_External_Lib * elib;
12183 size_t strtab_size;
12190 for (i = 0, section = section_headers;
12191 i < elf_header.e_shnum;
12194 switch (section->sh_type)
12196 case SHT_GNU_LIBLIST:
12197 if (section->sh_link >= elf_header.e_shnum)
12200 elib = (Elf32_External_Lib *)
12201 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12206 string_sec = section_headers + section->sh_link;
12208 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12209 string_sec->sh_size,
12210 _("liblist string table"));
12212 || section->sh_entsize != sizeof (Elf32_External_Lib))
12218 strtab_size = string_sec->sh_size;
12220 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12221 SECTION_NAME (section),
12222 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12224 puts (_(" Library Time Stamp Checksum Version Flags"));
12226 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12234 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12235 atime = BYTE_GET (elib[cnt].l_time_stamp);
12236 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12237 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12238 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12240 tmp = gmtime (&atime);
12241 snprintf (timebuf, sizeof (timebuf),
12242 "%04u-%02u-%02uT%02u:%02u:%02u",
12243 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12244 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12246 printf ("%3lu: ", (unsigned long) cnt);
12248 printf ("%-20s", liblist.l_name < strtab_size
12249 ? strtab + liblist.l_name : _("<corrupt>"));
12251 printf ("%-20.20s", liblist.l_name < strtab_size
12252 ? strtab + liblist.l_name : _("<corrupt>"));
12253 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
12254 liblist.l_version, liblist.l_flags);
12265 static const char *
12266 get_note_type (unsigned e_type)
12268 static char buff[64];
12270 if (elf_header.e_type == ET_CORE)
12274 return _("NT_AUXV (auxiliary vector)");
12276 return _("NT_PRSTATUS (prstatus structure)");
12278 return _("NT_FPREGSET (floating point registers)");
12280 return _("NT_PRPSINFO (prpsinfo structure)");
12281 case NT_TASKSTRUCT:
12282 return _("NT_TASKSTRUCT (task structure)");
12284 return _("NT_PRXFPREG (user_xfpregs structure)");
12286 return _("NT_PPC_VMX (ppc Altivec registers)");
12288 return _("NT_PPC_VSX (ppc VSX registers)");
12289 case NT_X86_XSTATE:
12290 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
12291 case NT_S390_HIGH_GPRS:
12292 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
12293 case NT_S390_TIMER:
12294 return _("NT_S390_TIMER (s390 timer register)");
12295 case NT_S390_TODCMP:
12296 return _("NT_S390_TODCMP (s390 TOD comparator register)");
12297 case NT_S390_TODPREG:
12298 return _("NT_S390_TODPREG (s390 TOD programmable register)");
12300 return _("NT_S390_CTRS (s390 control registers)");
12301 case NT_S390_PREFIX:
12302 return _("NT_S390_PREFIX (s390 prefix register)");
12304 return _("NT_ARM_VFP (arm VFP registers)");
12306 return _("NT_PSTATUS (pstatus structure)");
12308 return _("NT_FPREGS (floating point registers)");
12310 return _("NT_PSINFO (psinfo structure)");
12312 return _("NT_LWPSTATUS (lwpstatus_t structure)");
12314 return _("NT_LWPSINFO (lwpsinfo_t structure)");
12315 case NT_WIN32PSTATUS:
12316 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
12324 return _("NT_VERSION (version)");
12326 return _("NT_ARCH (architecture)");
12331 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12335 static const char *
12336 get_gnu_elf_note_type (unsigned e_type)
12338 static char buff[64];
12342 case NT_GNU_ABI_TAG:
12343 return _("NT_GNU_ABI_TAG (ABI version tag)");
12345 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
12346 case NT_GNU_BUILD_ID:
12347 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
12348 case NT_GNU_GOLD_VERSION:
12349 return _("NT_GNU_GOLD_VERSION (gold version)");
12354 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12359 print_gnu_note (Elf_Internal_Note *pnote)
12361 switch (pnote->type)
12363 case NT_GNU_BUILD_ID:
12367 printf (_(" Build ID: "));
12368 for (i = 0; i < pnote->descsz; ++i)
12369 printf ("%02x", pnote->descdata[i] & 0xff);
12374 case NT_GNU_ABI_TAG:
12376 unsigned long os, major, minor, subminor;
12377 const char *osname;
12379 os = byte_get ((unsigned char *) pnote->descdata, 4);
12380 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
12381 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
12382 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
12386 case GNU_ABI_TAG_LINUX:
12389 case GNU_ABI_TAG_HURD:
12392 case GNU_ABI_TAG_SOLARIS:
12393 osname = "Solaris";
12395 case GNU_ABI_TAG_FREEBSD:
12396 osname = "FreeBSD";
12398 case GNU_ABI_TAG_NETBSD:
12402 osname = "Unknown";
12406 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
12407 major, minor, subminor);
12415 static const char *
12416 get_netbsd_elfcore_note_type (unsigned e_type)
12418 static char buff[64];
12420 if (e_type == NT_NETBSDCORE_PROCINFO)
12422 /* NetBSD core "procinfo" structure. */
12423 return _("NetBSD procinfo structure");
12426 /* As of Jan 2002 there are no other machine-independent notes
12427 defined for NetBSD core files. If the note type is less
12428 than the start of the machine-dependent note types, we don't
12431 if (e_type < NT_NETBSDCORE_FIRSTMACH)
12433 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12437 switch (elf_header.e_machine)
12439 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
12440 and PT_GETFPREGS == mach+2. */
12445 case EM_SPARC32PLUS:
12449 case NT_NETBSDCORE_FIRSTMACH + 0:
12450 return _("PT_GETREGS (reg structure)");
12451 case NT_NETBSDCORE_FIRSTMACH + 2:
12452 return _("PT_GETFPREGS (fpreg structure)");
12458 /* On all other arch's, PT_GETREGS == mach+1 and
12459 PT_GETFPREGS == mach+3. */
12463 case NT_NETBSDCORE_FIRSTMACH + 1:
12464 return _("PT_GETREGS (reg structure)");
12465 case NT_NETBSDCORE_FIRSTMACH + 3:
12466 return _("PT_GETFPREGS (fpreg structure)");
12472 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
12473 e_type - NT_NETBSDCORE_FIRSTMACH);
12477 static const char *
12478 get_stapsdt_note_type (unsigned e_type)
12480 static char buff[64];
12485 return _("NT_STAPSDT (SystemTap probe descriptors)");
12491 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12496 print_stapsdt_note (Elf_Internal_Note *pnote)
12498 int addr_size = is_32bit_elf ? 4 : 8;
12499 char *data = pnote->descdata;
12500 char *data_end = pnote->descdata + pnote->descsz;
12501 bfd_vma pc, base_addr, semaphore;
12502 char *provider, *probe, *arg_fmt;
12504 pc = byte_get ((unsigned char *) data, addr_size);
12506 base_addr = byte_get ((unsigned char *) data, addr_size);
12508 semaphore = byte_get ((unsigned char *) data, addr_size);
12512 data += strlen (data) + 1;
12514 data += strlen (data) + 1;
12516 data += strlen (data) + 1;
12518 printf (_(" Provider: %s\n"), provider);
12519 printf (_(" Name: %s\n"), probe);
12520 printf (_(" Location: "));
12521 print_vma (pc, FULL_HEX);
12522 printf (_(", Base: "));
12523 print_vma (base_addr, FULL_HEX);
12524 printf (_(", Semaphore: "));
12525 print_vma (semaphore, FULL_HEX);
12527 printf (_(" Arguments: %s\n"), arg_fmt);
12529 return data == data_end;
12532 static const char *
12533 get_ia64_vms_note_type (unsigned e_type)
12535 static char buff[64];
12540 return _("NT_VMS_MHD (module header)");
12542 return _("NT_VMS_LNM (language name)");
12544 return _("NT_VMS_SRC (source files)");
12546 return _("NT_VMS_TITLE");
12548 return _("NT_VMS_EIDC (consistency check)");
12549 case NT_VMS_FPMODE:
12550 return _("NT_VMS_FPMODE (FP mode)");
12551 case NT_VMS_LINKTIME:
12552 return _("NT_VMS_LINKTIME");
12553 case NT_VMS_IMGNAM:
12554 return _("NT_VMS_IMGNAM (image name)");
12556 return _("NT_VMS_IMGID (image id)");
12557 case NT_VMS_LINKID:
12558 return _("NT_VMS_LINKID (link id)");
12559 case NT_VMS_IMGBID:
12560 return _("NT_VMS_IMGBID (build id)");
12561 case NT_VMS_GSTNAM:
12562 return _("NT_VMS_GSTNAM (sym table name)");
12563 case NT_VMS_ORIG_DYN:
12564 return _("NT_VMS_ORIG_DYN");
12565 case NT_VMS_PATCHTIME:
12566 return _("NT_VMS_PATCHTIME");
12568 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12574 print_ia64_vms_note (Elf_Internal_Note * pnote)
12576 switch (pnote->type)
12579 if (pnote->descsz > 36)
12581 size_t l = strlen (pnote->descdata + 34);
12582 printf (_(" Creation date : %.17s\n"), pnote->descdata);
12583 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
12584 printf (_(" Module name : %s\n"), pnote->descdata + 34);
12585 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
12588 printf (_(" Invalid size\n"));
12591 printf (_(" Language: %s\n"), pnote->descdata);
12594 case NT_VMS_FPMODE:
12595 printf (_(" FP mode: 0x%016" BFD_VMA_FMT "x\n"),
12596 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
12598 case NT_VMS_LINKTIME:
12599 printf (_(" Link time: "));
12601 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12604 case NT_VMS_PATCHTIME:
12605 printf (_(" Patch time: "));
12607 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
12610 case NT_VMS_ORIG_DYN:
12611 printf (_(" Major id: %u, minor id: %u\n"),
12612 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
12613 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
12614 printf (_(" Manip date : "));
12616 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
12618 " Link flags : 0x%016" BFD_VMA_FMT "x\n"),
12619 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
12620 printf (_(" Header flags: 0x%08x\n"),
12621 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
12622 printf (_(" Image id : %s\n"), pnote->descdata + 32);
12625 case NT_VMS_IMGNAM:
12626 printf (_(" Image name: %s\n"), pnote->descdata);
12628 case NT_VMS_GSTNAM:
12629 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
12632 printf (_(" Image id: %s\n"), pnote->descdata);
12634 case NT_VMS_LINKID:
12635 printf (_(" Linker id: %s\n"), pnote->descdata);
12643 /* Note that by the ELF standard, the name field is already null byte
12644 terminated, and namesz includes the terminating null byte.
12645 I.E. the value of namesz for the name "FSF" is 4.
12647 If the value of namesz is zero, there is no name present. */
12649 process_note (Elf_Internal_Note * pnote)
12651 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
12654 if (pnote->namesz == 0)
12655 /* If there is no note name, then use the default set of
12656 note type strings. */
12657 nt = get_note_type (pnote->type);
12659 else if (const_strneq (pnote->namedata, "GNU"))
12660 /* GNU-specific object file notes. */
12661 nt = get_gnu_elf_note_type (pnote->type);
12663 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
12664 /* NetBSD-specific core file notes. */
12665 nt = get_netbsd_elfcore_note_type (pnote->type);
12667 else if (strneq (pnote->namedata, "SPU/", 4))
12669 /* SPU-specific core file notes. */
12670 nt = pnote->namedata + 4;
12674 else if (const_strneq (pnote->namedata, "IPF/VMS"))
12675 /* VMS/ia64-specific file notes. */
12676 nt = get_ia64_vms_note_type (pnote->type);
12678 else if (const_strneq (pnote->namedata, "stapsdt"))
12679 nt = get_stapsdt_note_type (pnote->type);
12682 /* Don't recognize this note name; just use the default set of
12683 note type strings. */
12684 nt = get_note_type (pnote->type);
12686 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
12688 if (const_strneq (pnote->namedata, "IPF/VMS"))
12689 return print_ia64_vms_note (pnote);
12690 else if (const_strneq (pnote->namedata, "GNU"))
12691 return print_gnu_note (pnote);
12692 else if (const_strneq (pnote->namedata, "stapsdt"))
12693 return print_stapsdt_note (pnote);
12700 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
12702 Elf_External_Note * pnotes;
12703 Elf_External_Note * external;
12709 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
12711 if (pnotes == NULL)
12716 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
12717 (unsigned long) offset, (unsigned long) length);
12718 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
12720 while (external < (Elf_External_Note *) ((char *) pnotes + length))
12722 Elf_External_Note * next;
12723 Elf_Internal_Note inote;
12724 char * temp = NULL;
12726 if (!is_ia64_vms ())
12728 inote.type = BYTE_GET (external->type);
12729 inote.namesz = BYTE_GET (external->namesz);
12730 inote.namedata = external->name;
12731 inote.descsz = BYTE_GET (external->descsz);
12732 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
12733 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12735 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
12739 Elf64_External_VMS_Note *vms_external;
12741 vms_external = (Elf64_External_VMS_Note *)external;
12742 inote.type = BYTE_GET (vms_external->type);
12743 inote.namesz = BYTE_GET (vms_external->namesz);
12744 inote.namedata = vms_external->name;
12745 inote.descsz = BYTE_GET (vms_external->descsz);
12746 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
12747 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12749 next = (Elf_External_Note *)
12750 (inote.descdata + align_power (inote.descsz, 3));
12753 if ( ((char *) next > ((char *) pnotes) + length)
12754 || ((char *) next < (char *) pnotes))
12756 warn (_("corrupt note found at offset %lx into core notes\n"),
12757 (unsigned long) ((char *) external - (char *) pnotes));
12758 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12759 inote.type, inote.namesz, inote.descsz);
12765 /* Prevent out-of-bounds indexing. */
12766 if (inote.namedata + inote.namesz >= (char *) pnotes + length
12767 || inote.namedata + inote.namesz < inote.namedata)
12769 warn (_("corrupt note found at offset %lx into core notes\n"),
12770 (unsigned long) ((char *) external - (char *) pnotes));
12771 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12772 inote.type, inote.namesz, inote.descsz);
12776 /* Verify that name is null terminated. It appears that at least
12777 one version of Linux (RedHat 6.0) generates corefiles that don't
12778 comply with the ELF spec by failing to include the null byte in
12780 if (inote.namedata[inote.namesz] != '\0')
12782 temp = (char *) malloc (inote.namesz + 1);
12786 error (_("Out of memory\n"));
12791 strncpy (temp, inote.namedata, inote.namesz);
12792 temp[inote.namesz] = 0;
12794 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
12795 inote.namedata = temp;
12798 res &= process_note (& inote);
12813 process_corefile_note_segments (FILE * file)
12815 Elf_Internal_Phdr * segment;
12819 if (! get_program_headers (file))
12822 for (i = 0, segment = program_headers;
12823 i < elf_header.e_phnum;
12826 if (segment->p_type == PT_NOTE)
12827 res &= process_corefile_note_segment (file,
12828 (bfd_vma) segment->p_offset,
12829 (bfd_vma) segment->p_filesz);
12836 process_note_sections (FILE * file)
12838 Elf_Internal_Shdr * section;
12842 for (i = 0, section = section_headers;
12843 i < elf_header.e_shnum;
12845 if (section->sh_type == SHT_NOTE)
12846 res &= process_corefile_note_segment (file,
12847 (bfd_vma) section->sh_offset,
12848 (bfd_vma) section->sh_size);
12854 process_notes (FILE * file)
12856 /* If we have not been asked to display the notes then do nothing. */
12860 if (elf_header.e_type != ET_CORE)
12861 return process_note_sections (file);
12863 /* No program headers means no NOTE segment. */
12864 if (elf_header.e_phnum > 0)
12865 return process_corefile_note_segments (file);
12867 printf (_("No note segments present in the core file.\n"));
12872 process_arch_specific (FILE * file)
12877 switch (elf_header.e_machine)
12880 return process_arm_specific (file);
12882 case EM_MIPS_RS3_LE:
12883 return process_mips_specific (file);
12886 return process_power_specific (file);
12889 return process_tic6x_specific (file);
12898 get_file_header (FILE * file)
12900 /* Read in the identity array. */
12901 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
12904 /* Determine how to read the rest of the header. */
12905 switch (elf_header.e_ident[EI_DATA])
12907 default: /* fall through */
12908 case ELFDATANONE: /* fall through */
12910 byte_get = byte_get_little_endian;
12911 byte_put = byte_put_little_endian;
12914 byte_get = byte_get_big_endian;
12915 byte_put = byte_put_big_endian;
12919 /* For now we only support 32 bit and 64 bit ELF files. */
12920 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
12922 /* Read in the rest of the header. */
12925 Elf32_External_Ehdr ehdr32;
12927 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
12930 elf_header.e_type = BYTE_GET (ehdr32.e_type);
12931 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
12932 elf_header.e_version = BYTE_GET (ehdr32.e_version);
12933 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
12934 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
12935 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
12936 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
12937 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
12938 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
12939 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
12940 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
12941 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
12942 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
12946 Elf64_External_Ehdr ehdr64;
12948 /* If we have been compiled with sizeof (bfd_vma) == 4, then
12949 we will not be able to cope with the 64bit data found in
12950 64 ELF files. Detect this now and abort before we start
12951 overwriting things. */
12952 if (sizeof (bfd_vma) < 8)
12954 error (_("This instance of readelf has been built without support for a\n\
12955 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12959 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12962 elf_header.e_type = BYTE_GET (ehdr64.e_type);
12963 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
12964 elf_header.e_version = BYTE_GET (ehdr64.e_version);
12965 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
12966 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
12967 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
12968 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
12969 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
12970 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12971 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
12972 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12973 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
12974 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
12977 if (elf_header.e_shoff)
12979 /* There may be some extensions in the first section header. Don't
12980 bomb if we can't read it. */
12982 get_32bit_section_headers (file, 1);
12984 get_64bit_section_headers (file, 1);
12990 /* Process one ELF object file according to the command line options.
12991 This file may actually be stored in an archive. The file is
12992 positioned at the start of the ELF object. */
12995 process_object (char * file_name, FILE * file)
12999 if (! get_file_header (file))
13001 error (_("%s: Failed to read file header\n"), file_name);
13005 /* Initialise per file variables. */
13006 for (i = ARRAY_SIZE (version_info); i--;)
13007 version_info[i] = 0;
13009 for (i = ARRAY_SIZE (dynamic_info); i--;)
13010 dynamic_info[i] = 0;
13011 dynamic_info_DT_GNU_HASH = 0;
13013 /* Process the file. */
13015 printf (_("\nFile: %s\n"), file_name);
13017 /* Initialise the dump_sects array from the cmdline_dump_sects array.
13018 Note we do this even if cmdline_dump_sects is empty because we
13019 must make sure that the dump_sets array is zeroed out before each
13020 object file is processed. */
13021 if (num_dump_sects > num_cmdline_dump_sects)
13022 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13024 if (num_cmdline_dump_sects > 0)
13026 if (num_dump_sects == 0)
13027 /* A sneaky way of allocating the dump_sects array. */
13028 request_dump_bynumber (num_cmdline_dump_sects, 0);
13030 assert (num_dump_sects >= num_cmdline_dump_sects);
13031 memcpy (dump_sects, cmdline_dump_sects,
13032 num_cmdline_dump_sects * sizeof (* dump_sects));
13035 if (! process_file_header ())
13038 if (! process_section_headers (file))
13040 /* Without loaded section headers we cannot process lots of
13042 do_unwind = do_version = do_dump = do_arch = 0;
13044 if (! do_using_dynamic)
13045 do_syms = do_dyn_syms = do_reloc = 0;
13048 if (! process_section_groups (file))
13050 /* Without loaded section groups we cannot process unwind. */
13054 if (process_program_headers (file))
13055 process_dynamic_section (file);
13057 process_relocs (file);
13059 process_unwind (file);
13061 process_symbol_table (file);
13063 process_syminfo (file);
13065 process_version_sections (file);
13067 process_section_contents (file);
13069 process_notes (file);
13071 process_gnu_liblist (file);
13073 process_arch_specific (file);
13075 if (program_headers)
13077 free (program_headers);
13078 program_headers = NULL;
13081 if (section_headers)
13083 free (section_headers);
13084 section_headers = NULL;
13089 free (string_table);
13090 string_table = NULL;
13091 string_table_length = 0;
13094 if (dynamic_strings)
13096 free (dynamic_strings);
13097 dynamic_strings = NULL;
13098 dynamic_strings_length = 0;
13101 if (dynamic_symbols)
13103 free (dynamic_symbols);
13104 dynamic_symbols = NULL;
13105 num_dynamic_syms = 0;
13108 if (dynamic_syminfo)
13110 free (dynamic_syminfo);
13111 dynamic_syminfo = NULL;
13114 if (dynamic_section)
13116 free (dynamic_section);
13117 dynamic_section = NULL;
13120 if (section_headers_groups)
13122 free (section_headers_groups);
13123 section_headers_groups = NULL;
13126 if (section_groups)
13128 struct group_list * g;
13129 struct group_list * next;
13131 for (i = 0; i < group_count; i++)
13133 for (g = section_groups [i].root; g != NULL; g = next)
13140 free (section_groups);
13141 section_groups = NULL;
13144 free_debug_memory ();
13149 /* Process an ELF archive.
13150 On entry the file is positioned just after the ARMAG string. */
13153 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
13155 struct archive_info arch;
13156 struct archive_info nested_arch;
13162 /* The ARCH structure is used to hold information about this archive. */
13163 arch.file_name = NULL;
13165 arch.index_array = NULL;
13166 arch.sym_table = NULL;
13167 arch.longnames = NULL;
13169 /* The NESTED_ARCH structure is used as a single-item cache of information
13170 about a nested archive (when members of a thin archive reside within
13171 another regular archive file). */
13172 nested_arch.file_name = NULL;
13173 nested_arch.file = NULL;
13174 nested_arch.index_array = NULL;
13175 nested_arch.sym_table = NULL;
13176 nested_arch.longnames = NULL;
13178 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
13184 if (do_archive_index)
13186 if (arch.sym_table == NULL)
13187 error (_("%s: unable to dump the index as none was found\n"), file_name);
13191 unsigned long current_pos;
13193 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
13194 file_name, arch.index_num, arch.sym_size);
13195 current_pos = ftell (file);
13197 for (i = l = 0; i < arch.index_num; i++)
13199 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
13201 char * member_name;
13203 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
13205 if (member_name != NULL)
13207 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
13209 if (qualified_name != NULL)
13211 printf (_("Binary %s contains:\n"), qualified_name);
13212 free (qualified_name);
13217 if (l >= arch.sym_size)
13219 error (_("%s: end of the symbol table reached before the end of the index\n"),
13223 printf ("\t%s\n", arch.sym_table + l);
13224 l += strlen (arch.sym_table + l) + 1;
13229 if (l < arch.sym_size)
13230 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
13233 if (fseek (file, current_pos, SEEK_SET) != 0)
13235 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
13241 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
13242 && !do_segments && !do_header && !do_dump && !do_version
13243 && !do_histogram && !do_debugging && !do_arch && !do_notes
13244 && !do_section_groups && !do_dyn_syms)
13246 ret = 0; /* Archive index only. */
13257 char * qualified_name;
13259 /* Read the next archive header. */
13260 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13262 error (_("%s: failed to seek to next archive header\n"), file_name);
13265 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13266 if (got != sizeof arch.arhdr)
13270 error (_("%s: failed to read archive header\n"), file_name);
13274 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13276 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13281 arch.next_arhdr_offset += sizeof arch.arhdr;
13283 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13284 if (archive_file_size & 01)
13285 ++archive_file_size;
13287 name = get_archive_member_name (&arch, &nested_arch);
13290 error (_("%s: bad archive file name\n"), file_name);
13294 namelen = strlen (name);
13296 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13297 if (qualified_name == NULL)
13299 error (_("%s: bad archive file name\n"), file_name);
13304 if (is_thin_archive && arch.nested_member_origin == 0)
13306 /* This is a proxy for an external member of a thin archive. */
13307 FILE * member_file;
13308 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13309 if (member_file_name == NULL)
13315 member_file = fopen (member_file_name, "rb");
13316 if (member_file == NULL)
13318 error (_("Input file '%s' is not readable.\n"), member_file_name);
13319 free (member_file_name);
13324 archive_file_offset = arch.nested_member_origin;
13326 ret |= process_object (qualified_name, member_file);
13328 fclose (member_file);
13329 free (member_file_name);
13331 else if (is_thin_archive)
13333 /* This is a proxy for a member of a nested archive. */
13334 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13336 /* The nested archive file will have been opened and setup by
13337 get_archive_member_name. */
13338 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13340 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13345 ret |= process_object (qualified_name, nested_arch.file);
13349 archive_file_offset = arch.next_arhdr_offset;
13350 arch.next_arhdr_offset += archive_file_size;
13352 ret |= process_object (qualified_name, file);
13355 if (dump_sects != NULL)
13359 num_dump_sects = 0;
13362 free (qualified_name);
13366 if (nested_arch.file != NULL)
13367 fclose (nested_arch.file);
13368 release_archive (&nested_arch);
13369 release_archive (&arch);
13375 process_file (char * file_name)
13378 struct stat statbuf;
13379 char armag[SARMAG];
13382 if (stat (file_name, &statbuf) < 0)
13384 if (errno == ENOENT)
13385 error (_("'%s': No such file\n"), file_name);
13387 error (_("Could not locate '%s'. System error message: %s\n"),
13388 file_name, strerror (errno));
13392 if (! S_ISREG (statbuf.st_mode))
13394 error (_("'%s' is not an ordinary file\n"), file_name);
13398 file = fopen (file_name, "rb");
13401 error (_("Input file '%s' is not readable.\n"), file_name);
13405 if (fread (armag, SARMAG, 1, file) != 1)
13407 error (_("%s: Failed to read file's magic number\n"), file_name);
13412 if (memcmp (armag, ARMAG, SARMAG) == 0)
13413 ret = process_archive (file_name, file, FALSE);
13414 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13415 ret = process_archive (file_name, file, TRUE);
13418 if (do_archive_index)
13419 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13423 archive_file_size = archive_file_offset = 0;
13424 ret = process_object (file_name, file);
13432 #ifdef SUPPORT_DISASSEMBLY
13433 /* Needed by the i386 disassembler. For extra credit, someone could
13434 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13438 print_address (unsigned int addr, FILE * outfile)
13440 fprintf (outfile,"0x%8.8x", addr);
13443 /* Needed by the i386 disassembler. */
13445 db_task_printsym (unsigned int addr)
13447 print_address (addr, stderr);
13452 main (int argc, char ** argv)
13456 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13457 setlocale (LC_MESSAGES, "");
13459 #if defined (HAVE_SETLOCALE)
13460 setlocale (LC_CTYPE, "");
13462 bindtextdomain (PACKAGE, LOCALEDIR);
13463 textdomain (PACKAGE);
13465 expandargv (&argc, &argv);
13467 parse_args (argc, argv);
13469 if (num_dump_sects > 0)
13471 /* Make a copy of the dump_sects array. */
13472 cmdline_dump_sects = (dump_type *)
13473 malloc (num_dump_sects * sizeof (* dump_sects));
13474 if (cmdline_dump_sects == NULL)
13475 error (_("Out of memory allocating dump request table.\n"));
13478 memcpy (cmdline_dump_sects, dump_sects,
13479 num_dump_sects * sizeof (* dump_sects));
13480 num_cmdline_dump_sects = num_dump_sects;
13484 if (optind < (argc - 1))
13488 while (optind < argc)
13489 err |= process_file (argv[optind++]);
13491 if (dump_sects != NULL)
13493 if (cmdline_dump_sects != NULL)
13494 free (cmdline_dump_sects);