1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009, 2010, 2011, 2012
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. */
54 /* Define BFD64 here, even if our default architecture is 32 bit ELF
55 as this will allow us to read in and parse 64bit and 32bit ELF files.
56 Only do this if we believe that the compiler can support a 64 bit
57 data type. For now we only rely on GCC being able to do this. */
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72 we can obtain the H8 reloc numbers. We need these for the
73 get_reloc_size() function. We include h8.h again after defining
74 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
79 /* Undo the effects of #including reloc-macros.h. */
81 #undef START_RELOC_NUMBERS
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
88 /* The following headers use the elf/reloc-macros.h file to
89 automatically generate relocation recognition functions
90 such as elf_mips_reloc_type() */
92 #define RELOC_MACROS_GEN_FUNC
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/mcore.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
132 #include "elf/msp430.h"
133 #include "elf/or32.h"
136 #include "elf/ppc64.h"
137 #include "elf/rl78.h"
139 #include "elf/s390.h"
140 #include "elf/score.h"
142 #include "elf/sparc.h"
144 #include "elf/tic6x.h"
145 #include "elf/tilegx.h"
146 #include "elf/tilepro.h"
147 #include "elf/v850.h"
149 #include "elf/x86-64.h"
150 #include "elf/xc16x.h"
151 #include "elf/xgate.h"
152 #include "elf/xstormy16.h"
153 #include "elf/xtensa.h"
156 #include "libiberty.h"
157 #include "safe-ctype.h"
158 #include "filenames.h"
160 char * program_name = "readelf";
161 static long archive_file_offset;
162 static unsigned long archive_file_size;
163 static unsigned long dynamic_addr;
164 static bfd_size_type dynamic_size;
165 static unsigned int dynamic_nent;
166 static char * dynamic_strings;
167 static unsigned long dynamic_strings_length;
168 static char * string_table;
169 static unsigned long string_table_length;
170 static unsigned long num_dynamic_syms;
171 static Elf_Internal_Sym * dynamic_symbols;
172 static Elf_Internal_Syminfo * dynamic_syminfo;
173 static unsigned long dynamic_syminfo_offset;
174 static unsigned int dynamic_syminfo_nent;
175 static char program_interpreter[PATH_MAX];
176 static bfd_vma dynamic_info[DT_ENCODING];
177 static bfd_vma dynamic_info_DT_GNU_HASH;
178 static bfd_vma version_info[16];
179 static Elf_Internal_Ehdr elf_header;
180 static Elf_Internal_Shdr * section_headers;
181 static Elf_Internal_Phdr * program_headers;
182 static Elf_Internal_Dyn * dynamic_section;
183 static Elf_Internal_Shdr * symtab_shndx_hdr;
184 static int show_name;
185 static int do_dynamic;
187 static int do_dyn_syms;
189 static int do_sections;
190 static int do_section_groups;
191 static int do_section_details;
192 static int do_segments;
193 static int do_unwind;
194 static int do_using_dynamic;
195 static int do_header;
197 static int do_version;
198 static int do_histogram;
199 static int do_debugging;
202 static int do_archive_index;
203 static int is_32bit_elf;
207 struct group_list * next;
208 unsigned int section_index;
213 struct group_list * root;
214 unsigned int group_index;
217 static size_t group_count;
218 static struct group * section_groups;
219 static struct group ** section_headers_groups;
222 /* Flag bits indicating particular types of dump. */
223 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
224 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
225 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
226 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
227 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
229 typedef unsigned char dump_type;
231 /* A linked list of the section names for which dumps were requested. */
232 struct dump_list_entry
236 struct dump_list_entry * next;
238 static struct dump_list_entry * dump_sects_byname;
240 /* A dynamic array of flags indicating for which sections a dump
241 has been requested via command line switches. */
242 static dump_type * cmdline_dump_sects = NULL;
243 static unsigned int num_cmdline_dump_sects = 0;
245 /* A dynamic array of flags indicating for which sections a dump of
246 some kind has been requested. It is reset on a per-object file
247 basis and then initialised from the cmdline_dump_sects array,
248 the results of interpreting the -w switch, and the
249 dump_sects_byname list. */
250 static dump_type * dump_sects = NULL;
251 static unsigned int num_dump_sects = 0;
254 /* How to print a vma value. */
255 typedef enum print_mode
269 #define SECTION_NAME(X) \
270 ((X) == NULL ? _("<none>") \
271 : string_table == NULL ? _("<no-name>") \
272 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
273 : string_table + (X)->sh_name))
275 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
277 #define GET_ELF_SYMBOLS(file, section, sym_count) \
278 (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count) \
279 : get_64bit_elf_symbols (file, section, sym_count))
281 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
282 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
283 already been called and verified that the string exists. */
284 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
286 #define REMOVE_ARCH_BITS(ADDR) \
289 if (elf_header.e_machine == EM_ARM) \
294 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET.
295 Put the retrieved data into VAR, if it is not NULL. Otherwise allocate a buffer
296 using malloc and fill that. In either case return the pointer to the start of
297 the retrieved data or NULL if something went wrong. If something does go wrong
298 emit an error message using REASON as part of the context. */
301 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
306 if (size == 0 || nmemb == 0)
309 if (fseek (file, archive_file_offset + offset, SEEK_SET))
311 error (_("Unable to seek to 0x%lx for %s\n"),
312 (unsigned long) archive_file_offset + offset, reason);
319 /* Check for overflow. */
320 if (nmemb < (~(size_t) 0 - 1) / size)
321 /* + 1 so that we can '\0' terminate invalid string table sections. */
322 mvar = malloc (size * nmemb + 1);
326 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
327 (unsigned long)(size * nmemb), reason);
331 ((char *) mvar)[size * nmemb] = '\0';
334 if (fread (mvar, size, nmemb, file) != nmemb)
336 error (_("Unable to read in 0x%lx bytes of %s\n"),
337 (unsigned long)(size * nmemb), reason);
346 /* Print a VMA value. */
349 print_vma (bfd_vma vma, print_mode mode)
362 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
369 return printf ("%5" BFD_VMA_FMT "d", vma);
377 return nc + printf ("%" BFD_VMA_FMT "x", vma);
380 return printf ("%" BFD_VMA_FMT "d", vma);
383 return printf ("%" BFD_VMA_FMT "u", vma);
388 /* Display a symbol on stdout. Handles the display of control characters and
391 Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
393 If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
394 padding as necessary.
396 Returns the number of emitted characters. */
399 print_symbol (int width, const char *symbol)
401 bfd_boolean extra_padding = FALSE;
408 /* Keep the width positive. This also helps. */
410 extra_padding = TRUE;
414 /* Set the remaining width to a very large value.
415 This simplifies the code below. */
416 width_remaining = INT_MAX;
418 width_remaining = width;
420 /* Initialise the multibyte conversion state. */
421 memset (& state, 0, sizeof (state));
423 while (width_remaining)
427 const char c = *symbol++;
432 /* Do not print control characters directly as they can affect terminal
433 settings. Such characters usually appear in the names generated
434 by the assembler for local labels. */
437 if (width_remaining < 2)
440 printf ("^%c", c + 0x40);
441 width_remaining -= 2;
444 else if (ISPRINT (c))
452 /* Let printf do the hard work of displaying multibyte characters. */
453 printf ("%.1s", symbol - 1);
457 /* Try to find out how many bytes made up the character that was
458 just printed. Advance the symbol pointer past the bytes that
460 n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
461 if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
466 if (extra_padding && num_printed < width)
468 /* Fill in the remaining spaces. */
469 printf ("%-*s", width - num_printed, " ");
476 /* Return a pointer to section NAME, or NULL if no such section exists. */
478 static Elf_Internal_Shdr *
479 find_section (const char * name)
483 for (i = 0; i < elf_header.e_shnum; i++)
484 if (streq (SECTION_NAME (section_headers + i), name))
485 return section_headers + i;
490 /* Return a pointer to a section containing ADDR, or NULL if no such
493 static Elf_Internal_Shdr *
494 find_section_by_address (bfd_vma addr)
498 for (i = 0; i < elf_header.e_shnum; i++)
500 Elf_Internal_Shdr *sec = section_headers + i;
501 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
508 /* Return a pointer to section NAME, or NULL if no such section exists,
509 restricted to the list of sections given in SET. */
511 static Elf_Internal_Shdr *
512 find_section_in_set (const char * name, unsigned int * set)
518 while ((i = *set++) > 0)
519 if (streq (SECTION_NAME (section_headers + i), name))
520 return section_headers + i;
523 return find_section (name);
526 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
530 read_uleb128 (unsigned char *data, unsigned int *length_return)
532 return read_leb128 (data, length_return, 0);
535 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
536 This OS has so many departures from the ELF standard that we test it at
542 return elf_header.e_machine == EM_IA_64
543 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
546 /* Guess the relocation size commonly used by the specific machines. */
549 guess_is_rela (unsigned int e_machine)
553 /* Targets that use REL relocations. */
570 /* Targets that use RELA relocations. */
574 case EM_ADAPTEVA_EPIPHANY:
576 case EM_ALTERA_NIOS2:
595 case EM_LATTICEMICO32:
603 case EM_CYGNUS_MN10200:
605 case EM_CYGNUS_MN10300:
635 case EM_MICROBLAZE_OLD:
656 warn (_("Don't know about relocations on this machine architecture\n"));
662 slurp_rela_relocs (FILE * file,
663 unsigned long rel_offset,
664 unsigned long rel_size,
665 Elf_Internal_Rela ** relasp,
666 unsigned long * nrelasp)
668 Elf_Internal_Rela * relas;
669 unsigned long nrelas;
674 Elf32_External_Rela * erelas;
676 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
677 rel_size, _("32-bit relocation data"));
681 nrelas = rel_size / sizeof (Elf32_External_Rela);
683 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
684 sizeof (Elf_Internal_Rela));
689 error (_("out of memory parsing relocs\n"));
693 for (i = 0; i < nrelas; i++)
695 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
696 relas[i].r_info = BYTE_GET (erelas[i].r_info);
697 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
704 Elf64_External_Rela * erelas;
706 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
707 rel_size, _("64-bit relocation data"));
711 nrelas = rel_size / sizeof (Elf64_External_Rela);
713 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
714 sizeof (Elf_Internal_Rela));
719 error (_("out of memory parsing relocs\n"));
723 for (i = 0; i < nrelas; i++)
725 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
726 relas[i].r_info = BYTE_GET (erelas[i].r_info);
727 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
729 /* The #ifdef BFD64 below is to prevent a compile time
730 warning. We know that if we do not have a 64 bit data
731 type that we will never execute this code anyway. */
733 if (elf_header.e_machine == EM_MIPS
734 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
736 /* In little-endian objects, r_info isn't really a
737 64-bit little-endian value: it has a 32-bit
738 little-endian symbol index followed by four
739 individual byte fields. Reorder INFO
741 bfd_vma inf = relas[i].r_info;
742 inf = (((inf & 0xffffffff) << 32)
743 | ((inf >> 56) & 0xff)
744 | ((inf >> 40) & 0xff00)
745 | ((inf >> 24) & 0xff0000)
746 | ((inf >> 8) & 0xff000000));
747 relas[i].r_info = inf;
760 slurp_rel_relocs (FILE * file,
761 unsigned long rel_offset,
762 unsigned long rel_size,
763 Elf_Internal_Rela ** relsp,
764 unsigned long * nrelsp)
766 Elf_Internal_Rela * rels;
772 Elf32_External_Rel * erels;
774 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
775 rel_size, _("32-bit relocation data"));
779 nrels = rel_size / sizeof (Elf32_External_Rel);
781 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
786 error (_("out of memory parsing relocs\n"));
790 for (i = 0; i < nrels; i++)
792 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
793 rels[i].r_info = BYTE_GET (erels[i].r_info);
794 rels[i].r_addend = 0;
801 Elf64_External_Rel * erels;
803 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
804 rel_size, _("64-bit relocation data"));
808 nrels = rel_size / sizeof (Elf64_External_Rel);
810 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
815 error (_("out of memory parsing relocs\n"));
819 for (i = 0; i < nrels; i++)
821 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
822 rels[i].r_info = BYTE_GET (erels[i].r_info);
823 rels[i].r_addend = 0;
825 /* The #ifdef BFD64 below is to prevent a compile time
826 warning. We know that if we do not have a 64 bit data
827 type that we will never execute this code anyway. */
829 if (elf_header.e_machine == EM_MIPS
830 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
832 /* In little-endian objects, r_info isn't really a
833 64-bit little-endian value: it has a 32-bit
834 little-endian symbol index followed by four
835 individual byte fields. Reorder INFO
837 bfd_vma inf = rels[i].r_info;
838 inf = (((inf & 0xffffffff) << 32)
839 | ((inf >> 56) & 0xff)
840 | ((inf >> 40) & 0xff00)
841 | ((inf >> 24) & 0xff0000)
842 | ((inf >> 8) & 0xff000000));
843 rels[i].r_info = inf;
855 /* Returns the reloc type extracted from the reloc info field. */
858 get_reloc_type (bfd_vma reloc_info)
861 return ELF32_R_TYPE (reloc_info);
863 switch (elf_header.e_machine)
866 /* Note: We assume that reloc_info has already been adjusted for us. */
867 return ELF64_MIPS_R_TYPE (reloc_info);
870 return ELF64_R_TYPE_ID (reloc_info);
873 return ELF64_R_TYPE (reloc_info);
877 /* Return the symbol index extracted from the reloc info field. */
880 get_reloc_symindex (bfd_vma reloc_info)
882 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
885 /* Display the contents of the relocation data found at the specified
889 dump_relocations (FILE * file,
890 unsigned long rel_offset,
891 unsigned long rel_size,
892 Elf_Internal_Sym * symtab,
895 unsigned long strtablen,
899 Elf_Internal_Rela * rels;
901 if (is_rela == UNKNOWN)
902 is_rela = guess_is_rela (elf_header.e_machine);
906 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
911 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
920 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
922 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
927 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
929 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
937 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
939 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
944 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
946 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
950 for (i = 0; i < rel_size; i++)
955 bfd_vma symtab_index;
958 offset = rels[i].r_offset;
959 inf = rels[i].r_info;
961 type = get_reloc_type (inf);
962 symtab_index = get_reloc_symindex (inf);
966 printf ("%8.8lx %8.8lx ",
967 (unsigned long) offset & 0xffffffff,
968 (unsigned long) inf & 0xffffffff);
972 #if BFD_HOST_64BIT_LONG
974 ? "%16.16lx %16.16lx "
975 : "%12.12lx %12.12lx ",
977 #elif BFD_HOST_64BIT_LONG_LONG
980 ? "%16.16llx %16.16llx "
981 : "%12.12llx %12.12llx ",
985 ? "%16.16I64x %16.16I64x "
986 : "%12.12I64x %12.12I64x ",
991 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
992 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
993 _bfd_int64_high (offset),
994 _bfd_int64_low (offset),
995 _bfd_int64_high (inf),
996 _bfd_int64_low (inf));
1000 switch (elf_header.e_machine)
1007 rtype = elf_aarch64_reloc_type (type);
1011 case EM_CYGNUS_M32R:
1012 rtype = elf_m32r_reloc_type (type);
1017 rtype = elf_i386_reloc_type (type);
1022 rtype = elf_m68hc11_reloc_type (type);
1026 rtype = elf_m68k_reloc_type (type);
1030 rtype = elf_i960_reloc_type (type);
1035 rtype = elf_avr_reloc_type (type);
1038 case EM_OLD_SPARCV9:
1039 case EM_SPARC32PLUS:
1042 rtype = elf_sparc_reloc_type (type);
1046 rtype = elf_spu_reloc_type (type);
1050 case EM_CYGNUS_V850:
1051 rtype = v850_reloc_type (type);
1055 case EM_CYGNUS_D10V:
1056 rtype = elf_d10v_reloc_type (type);
1060 case EM_CYGNUS_D30V:
1061 rtype = elf_d30v_reloc_type (type);
1065 rtype = elf_dlx_reloc_type (type);
1069 rtype = elf_sh_reloc_type (type);
1073 case EM_CYGNUS_MN10300:
1074 rtype = elf_mn10300_reloc_type (type);
1078 case EM_CYGNUS_MN10200:
1079 rtype = elf_mn10200_reloc_type (type);
1083 case EM_CYGNUS_FR30:
1084 rtype = elf_fr30_reloc_type (type);
1088 rtype = elf_frv_reloc_type (type);
1092 rtype = elf_mcore_reloc_type (type);
1096 rtype = elf_mmix_reloc_type (type);
1100 rtype = elf_moxie_reloc_type (type);
1105 rtype = elf_msp430_reloc_type (type);
1109 rtype = elf_ppc_reloc_type (type);
1113 rtype = elf_ppc64_reloc_type (type);
1117 case EM_MIPS_RS3_LE:
1118 rtype = elf_mips_reloc_type (type);
1122 rtype = elf_alpha_reloc_type (type);
1126 rtype = elf_arm_reloc_type (type);
1130 rtype = elf_arc_reloc_type (type);
1134 rtype = elf_hppa_reloc_type (type);
1140 rtype = elf_h8_reloc_type (type);
1145 rtype = elf_or32_reloc_type (type);
1150 rtype = elf_pj_reloc_type (type);
1153 rtype = elf_ia64_reloc_type (type);
1157 rtype = elf_cris_reloc_type (type);
1161 rtype = elf_i860_reloc_type (type);
1167 rtype = elf_x86_64_reloc_type (type);
1171 rtype = i370_reloc_type (type);
1176 rtype = elf_s390_reloc_type (type);
1180 rtype = elf_score_reloc_type (type);
1184 rtype = elf_xstormy16_reloc_type (type);
1188 rtype = elf_crx_reloc_type (type);
1192 rtype = elf_vax_reloc_type (type);
1195 case EM_ADAPTEVA_EPIPHANY:
1196 rtype = elf_epiphany_reloc_type (type);
1201 rtype = elf_ip2k_reloc_type (type);
1205 rtype = elf_iq2000_reloc_type (type);
1210 rtype = elf_xtensa_reloc_type (type);
1213 case EM_LATTICEMICO32:
1214 rtype = elf_lm32_reloc_type (type);
1219 rtype = elf_m32c_reloc_type (type);
1223 rtype = elf_mt_reloc_type (type);
1227 rtype = elf_bfin_reloc_type (type);
1231 rtype = elf_mep_reloc_type (type);
1235 rtype = elf_cr16_reloc_type (type);
1239 case EM_MICROBLAZE_OLD:
1240 rtype = elf_microblaze_reloc_type (type);
1244 rtype = elf_rl78_reloc_type (type);
1248 rtype = elf_rx_reloc_type (type);
1253 rtype = elf_xc16x_reloc_type (type);
1257 rtype = elf_tic6x_reloc_type (type);
1261 rtype = elf_tilegx_reloc_type (type);
1265 rtype = elf_tilepro_reloc_type (type);
1269 rtype = elf_xgate_reloc_type (type);
1274 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1276 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1278 if (elf_header.e_machine == EM_ALPHA
1280 && streq (rtype, "R_ALPHA_LITUSE")
1283 switch (rels[i].r_addend)
1285 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1286 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1287 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1288 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1289 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1290 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1291 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1292 default: rtype = NULL;
1295 printf (" (%s)", rtype);
1299 printf (_("<unknown addend: %lx>"),
1300 (unsigned long) rels[i].r_addend);
1303 else if (symtab_index)
1305 if (symtab == NULL || symtab_index >= nsyms)
1306 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1309 Elf_Internal_Sym * psym;
1311 psym = symtab + symtab_index;
1315 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1319 unsigned int width = is_32bit_elf ? 8 : 14;
1321 /* Relocations against GNU_IFUNC symbols do not use the value
1322 of the symbol as the address to relocate against. Instead
1323 they invoke the function named by the symbol and use its
1324 result as the address for relocation.
1326 To indicate this to the user, do not display the value of
1327 the symbol in the "Symbols's Value" field. Instead show
1328 its name followed by () as a hint that the symbol is
1332 || psym->st_name == 0
1333 || psym->st_name >= strtablen)
1336 name = strtab + psym->st_name;
1338 len = print_symbol (width, name);
1339 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1343 print_vma (psym->st_value, LONG_HEX);
1345 printf (is_32bit_elf ? " " : " ");
1348 if (psym->st_name == 0)
1350 const char * sec_name = "<null>";
1353 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1355 if (psym->st_shndx < elf_header.e_shnum)
1357 = SECTION_NAME (section_headers + psym->st_shndx);
1358 else if (psym->st_shndx == SHN_ABS)
1360 else if (psym->st_shndx == SHN_COMMON)
1361 sec_name = "COMMON";
1362 else if ((elf_header.e_machine == EM_MIPS
1363 && psym->st_shndx == SHN_MIPS_SCOMMON)
1364 || (elf_header.e_machine == EM_TI_C6000
1365 && psym->st_shndx == SHN_TIC6X_SCOMMON))
1366 sec_name = "SCOMMON";
1367 else if (elf_header.e_machine == EM_MIPS
1368 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1369 sec_name = "SUNDEF";
1370 else if ((elf_header.e_machine == EM_X86_64
1371 || elf_header.e_machine == EM_L1OM
1372 || elf_header.e_machine == EM_K1OM)
1373 && psym->st_shndx == SHN_X86_64_LCOMMON)
1374 sec_name = "LARGE_COMMON";
1375 else if (elf_header.e_machine == EM_IA_64
1376 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1377 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1378 sec_name = "ANSI_COM";
1379 else if (is_ia64_vms ()
1380 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1381 sec_name = "VMS_SYMVEC";
1384 sprintf (name_buf, "<section 0x%x>",
1385 (unsigned int) psym->st_shndx);
1386 sec_name = name_buf;
1389 print_symbol (22, sec_name);
1391 else if (strtab == NULL)
1392 printf (_("<string table index: %3ld>"), psym->st_name);
1393 else if (psym->st_name >= strtablen)
1394 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1396 print_symbol (22, strtab + psym->st_name);
1400 bfd_signed_vma off = rels[i].r_addend;
1403 printf (" - %" BFD_VMA_FMT "x", - off);
1405 printf (" + %" BFD_VMA_FMT "x", off);
1411 bfd_signed_vma off = rels[i].r_addend;
1413 printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1415 printf ("-%" BFD_VMA_FMT "x", - off);
1417 printf ("%" BFD_VMA_FMT "x", off);
1420 if (elf_header.e_machine == EM_SPARCV9
1422 && streq (rtype, "R_SPARC_OLO10"))
1423 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1428 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1430 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1431 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1432 const char * rtype2 = elf_mips_reloc_type (type2);
1433 const char * rtype3 = elf_mips_reloc_type (type3);
1435 printf (" Type2: ");
1438 printf (_("unrecognized: %-7lx"),
1439 (unsigned long) type2 & 0xffffffff);
1441 printf ("%-17.17s", rtype2);
1443 printf ("\n Type3: ");
1446 printf (_("unrecognized: %-7lx"),
1447 (unsigned long) type3 & 0xffffffff);
1449 printf ("%-17.17s", rtype3);
1460 get_mips_dynamic_type (unsigned long type)
1464 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1465 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1466 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1467 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1468 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1469 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1470 case DT_MIPS_MSYM: return "MIPS_MSYM";
1471 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1472 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1473 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1474 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1475 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1476 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1477 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1478 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1479 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1480 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1481 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1482 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1483 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1484 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1485 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1486 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1487 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1488 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1489 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1490 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1491 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1492 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1493 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1494 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1495 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1496 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1497 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1498 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1499 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1500 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1501 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1502 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1503 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1504 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1505 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1506 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1507 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1508 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1515 get_sparc64_dynamic_type (unsigned long type)
1519 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1526 get_ppc_dynamic_type (unsigned long type)
1530 case DT_PPC_GOT: return "PPC_GOT";
1531 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1538 get_ppc64_dynamic_type (unsigned long type)
1542 case DT_PPC64_GLINK: return "PPC64_GLINK";
1543 case DT_PPC64_OPD: return "PPC64_OPD";
1544 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1545 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1552 get_parisc_dynamic_type (unsigned long type)
1556 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1557 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1558 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1559 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1560 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1561 case DT_HP_PREINIT: return "HP_PREINIT";
1562 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1563 case DT_HP_NEEDED: return "HP_NEEDED";
1564 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1565 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1566 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1567 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1568 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1569 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1570 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1571 case DT_HP_FILTERED: return "HP_FILTERED";
1572 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1573 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1574 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1575 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1576 case DT_PLT: return "PLT";
1577 case DT_PLT_SIZE: return "PLT_SIZE";
1578 case DT_DLT: return "DLT";
1579 case DT_DLT_SIZE: return "DLT_SIZE";
1586 get_ia64_dynamic_type (unsigned long type)
1590 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1591 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1592 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1593 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1594 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1595 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1596 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1597 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1598 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1599 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1600 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1601 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1602 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1603 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1604 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1605 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1606 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1607 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1608 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1609 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1610 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1611 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1612 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1613 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1614 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1615 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1616 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1617 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1618 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1619 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1620 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1627 get_alpha_dynamic_type (unsigned long type)
1631 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1638 get_score_dynamic_type (unsigned long type)
1642 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1643 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1644 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1645 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1646 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1647 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1654 get_tic6x_dynamic_type (unsigned long type)
1658 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1659 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1660 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1661 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1662 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1663 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1670 get_dynamic_type (unsigned long type)
1672 static char buff[64];
1676 case DT_NULL: return "NULL";
1677 case DT_NEEDED: return "NEEDED";
1678 case DT_PLTRELSZ: return "PLTRELSZ";
1679 case DT_PLTGOT: return "PLTGOT";
1680 case DT_HASH: return "HASH";
1681 case DT_STRTAB: return "STRTAB";
1682 case DT_SYMTAB: return "SYMTAB";
1683 case DT_RELA: return "RELA";
1684 case DT_RELASZ: return "RELASZ";
1685 case DT_RELAENT: return "RELAENT";
1686 case DT_STRSZ: return "STRSZ";
1687 case DT_SYMENT: return "SYMENT";
1688 case DT_INIT: return "INIT";
1689 case DT_FINI: return "FINI";
1690 case DT_SONAME: return "SONAME";
1691 case DT_RPATH: return "RPATH";
1692 case DT_SYMBOLIC: return "SYMBOLIC";
1693 case DT_REL: return "REL";
1694 case DT_RELSZ: return "RELSZ";
1695 case DT_RELENT: return "RELENT";
1696 case DT_PLTREL: return "PLTREL";
1697 case DT_DEBUG: return "DEBUG";
1698 case DT_TEXTREL: return "TEXTREL";
1699 case DT_JMPREL: return "JMPREL";
1700 case DT_BIND_NOW: return "BIND_NOW";
1701 case DT_INIT_ARRAY: return "INIT_ARRAY";
1702 case DT_FINI_ARRAY: return "FINI_ARRAY";
1703 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1704 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1705 case DT_RUNPATH: return "RUNPATH";
1706 case DT_FLAGS: return "FLAGS";
1708 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1709 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1711 case DT_CHECKSUM: return "CHECKSUM";
1712 case DT_PLTPADSZ: return "PLTPADSZ";
1713 case DT_MOVEENT: return "MOVEENT";
1714 case DT_MOVESZ: return "MOVESZ";
1715 case DT_FEATURE: return "FEATURE";
1716 case DT_POSFLAG_1: return "POSFLAG_1";
1717 case DT_SYMINSZ: return "SYMINSZ";
1718 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1720 case DT_ADDRRNGLO: return "ADDRRNGLO";
1721 case DT_CONFIG: return "CONFIG";
1722 case DT_DEPAUDIT: return "DEPAUDIT";
1723 case DT_AUDIT: return "AUDIT";
1724 case DT_PLTPAD: return "PLTPAD";
1725 case DT_MOVETAB: return "MOVETAB";
1726 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1728 case DT_VERSYM: return "VERSYM";
1730 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1731 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1732 case DT_RELACOUNT: return "RELACOUNT";
1733 case DT_RELCOUNT: return "RELCOUNT";
1734 case DT_FLAGS_1: return "FLAGS_1";
1735 case DT_VERDEF: return "VERDEF";
1736 case DT_VERDEFNUM: return "VERDEFNUM";
1737 case DT_VERNEED: return "VERNEED";
1738 case DT_VERNEEDNUM: return "VERNEEDNUM";
1740 case DT_AUXILIARY: return "AUXILIARY";
1741 case DT_USED: return "USED";
1742 case DT_FILTER: return "FILTER";
1744 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1745 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1746 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1747 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1748 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1749 case DT_GNU_HASH: return "GNU_HASH";
1752 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1754 const char * result;
1756 switch (elf_header.e_machine)
1759 case EM_MIPS_RS3_LE:
1760 result = get_mips_dynamic_type (type);
1763 result = get_sparc64_dynamic_type (type);
1766 result = get_ppc_dynamic_type (type);
1769 result = get_ppc64_dynamic_type (type);
1772 result = get_ia64_dynamic_type (type);
1775 result = get_alpha_dynamic_type (type);
1778 result = get_score_dynamic_type (type);
1781 result = get_tic6x_dynamic_type (type);
1791 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1793 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1794 || (elf_header.e_machine == EM_PARISC
1795 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1797 const char * result;
1799 switch (elf_header.e_machine)
1802 result = get_parisc_dynamic_type (type);
1805 result = get_ia64_dynamic_type (type);
1815 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1819 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1826 get_file_type (unsigned e_type)
1828 static char buff[32];
1832 case ET_NONE: return _("NONE (None)");
1833 case ET_REL: return _("REL (Relocatable file)");
1834 case ET_EXEC: return _("EXEC (Executable file)");
1835 case ET_DYN: return _("DYN (Shared object file)");
1836 case ET_CORE: return _("CORE (Core file)");
1839 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1840 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1841 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1842 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1844 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1850 get_machine_name (unsigned e_machine)
1852 static char buff[64]; /* XXX */
1856 case EM_NONE: return _("None");
1857 case EM_AARCH64: return "AArch64";
1858 case EM_M32: return "WE32100";
1859 case EM_SPARC: return "Sparc";
1860 case EM_SPU: return "SPU";
1861 case EM_386: return "Intel 80386";
1862 case EM_68K: return "MC68000";
1863 case EM_88K: return "MC88000";
1864 case EM_486: return "Intel 80486";
1865 case EM_860: return "Intel 80860";
1866 case EM_MIPS: return "MIPS R3000";
1867 case EM_S370: return "IBM System/370";
1868 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1869 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1870 case EM_PARISC: return "HPPA";
1871 case EM_PPC_OLD: return "Power PC (old)";
1872 case EM_SPARC32PLUS: return "Sparc v8+" ;
1873 case EM_960: return "Intel 90860";
1874 case EM_PPC: return "PowerPC";
1875 case EM_PPC64: return "PowerPC64";
1876 case EM_V800: return "NEC V800";
1877 case EM_FR20: return "Fujitsu FR20";
1878 case EM_RH32: return "TRW RH32";
1879 case EM_MCORE: return "MCORE";
1880 case EM_ARM: return "ARM";
1881 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1882 case EM_SH: return "Renesas / SuperH SH";
1883 case EM_SPARCV9: return "Sparc v9";
1884 case EM_TRICORE: return "Siemens Tricore";
1885 case EM_ARC: return "ARC";
1886 case EM_H8_300: return "Renesas H8/300";
1887 case EM_H8_300H: return "Renesas H8/300H";
1888 case EM_H8S: return "Renesas H8S";
1889 case EM_H8_500: return "Renesas H8/500";
1890 case EM_IA_64: return "Intel IA-64";
1891 case EM_MIPS_X: return "Stanford MIPS-X";
1892 case EM_COLDFIRE: return "Motorola Coldfire";
1893 case EM_ALPHA: return "Alpha";
1894 case EM_CYGNUS_D10V:
1895 case EM_D10V: return "d10v";
1896 case EM_CYGNUS_D30V:
1897 case EM_D30V: return "d30v";
1898 case EM_CYGNUS_M32R:
1899 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1900 case EM_CYGNUS_V850:
1901 case EM_V850: return "Renesas V850";
1902 case EM_CYGNUS_MN10300:
1903 case EM_MN10300: return "mn10300";
1904 case EM_CYGNUS_MN10200:
1905 case EM_MN10200: return "mn10200";
1906 case EM_MOXIE: return "Moxie";
1907 case EM_CYGNUS_FR30:
1908 case EM_FR30: return "Fujitsu FR30";
1909 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1911 case EM_PJ: return "picoJava";
1912 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1913 case EM_PCP: return "Siemens PCP";
1914 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1915 case EM_NDR1: return "Denso NDR1 microprocesspr";
1916 case EM_STARCORE: return "Motorola Star*Core processor";
1917 case EM_ME16: return "Toyota ME16 processor";
1918 case EM_ST100: return "STMicroelectronics ST100 processor";
1919 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1920 case EM_PDSP: return "Sony DSP processor";
1921 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1922 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1923 case EM_FX66: return "Siemens FX66 microcontroller";
1924 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1925 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1926 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1927 case EM_68HC12: return "Motorola MC68HC12 Microcontroller";
1928 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1929 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1930 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1931 case EM_SVX: return "Silicon Graphics SVx";
1932 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1933 case EM_VAX: return "Digital VAX";
1935 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1936 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1937 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1938 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1939 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1940 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1941 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1942 case EM_PRISM: return "Vitesse Prism";
1943 case EM_X86_64: return "Advanced Micro Devices X86-64";
1944 case EM_L1OM: return "Intel L1OM";
1945 case EM_K1OM: return "Intel K1OM";
1947 case EM_S390: return "IBM S/390";
1948 case EM_SCORE: return "SUNPLUS S+Core";
1949 case EM_XSTORMY16: return "Sanyo XStormy16 CPU core";
1951 case EM_OR32: return "OpenRISC";
1952 case EM_ARC_A5: return "ARC International ARCompact processor";
1953 case EM_CRX: return "National Semiconductor CRX microprocessor";
1954 case EM_ADAPTEVA_EPIPHANY: return "Adapteva EPIPHANY";
1955 case EM_DLX: return "OpenDLX";
1957 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1958 case EM_IQ2000: return "Vitesse IQ2000";
1960 case EM_XTENSA: return "Tensilica Xtensa Processor";
1961 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
1962 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
1963 case EM_NS32K: return "National Semiconductor 32000 series";
1964 case EM_TPC: return "Tenor Network TPC processor";
1965 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
1966 case EM_MAX: return "MAX Processor";
1967 case EM_CR: return "National Semiconductor CompactRISC";
1968 case EM_F2MC16: return "Fujitsu F2MC16";
1969 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
1970 case EM_LATTICEMICO32: return "Lattice Mico32";
1972 case EM_M32C: return "Renesas M32c";
1973 case EM_MT: return "Morpho Techologies MT processor";
1974 case EM_BLACKFIN: return "Analog Devices Blackfin";
1975 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
1976 case EM_SEP: return "Sharp embedded microprocessor";
1977 case EM_ARCA: return "Arca RISC microprocessor";
1978 case EM_UNICORE: return "Unicore";
1979 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
1980 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
1981 case EM_NIOS32: return "Altera Nios";
1982 case EM_ALTERA_NIOS2: return "Altera Nios II";
1984 case EM_XC16X: return "Infineon Technologies xc16x";
1985 case EM_M16C: return "Renesas M16C series microprocessors";
1986 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
1987 case EM_CE: return "Freescale Communication Engine RISC core";
1988 case EM_TSK3000: return "Altium TSK3000 core";
1989 case EM_RS08: return "Freescale RS08 embedded processor";
1990 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
1991 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
1992 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
1993 case EM_SE_C17: return "Seiko Epson C17 family";
1994 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
1995 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
1996 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
1997 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
1998 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
1999 case EM_R32C: return "Renesas R32C series microprocessors";
2000 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2001 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2002 case EM_8051: return "Intel 8051 and variants";
2003 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2004 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2005 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2006 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2007 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2008 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2009 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2010 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2013 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2014 case EM_RL78: return "Renesas RL78";
2015 case EM_RX: return "Renesas RX";
2016 case EM_METAG: return "Imagination Technologies META processor architecture";
2017 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2018 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2019 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2020 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2021 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2022 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2023 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2024 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2025 case EM_TILEGX: return "Tilera TILE-Gx multicore architecture family";
2026 case EM_CUDA: return "NVIDIA CUDA architecture";
2027 case EM_XGATE: return "Motorola XGATE embedded processor";
2029 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2035 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2040 eabi = EF_ARM_EABI_VERSION (e_flags);
2041 e_flags &= ~ EF_ARM_EABIMASK;
2043 /* Handle "generic" ARM flags. */
2044 if (e_flags & EF_ARM_RELEXEC)
2046 strcat (buf, ", relocatable executable");
2047 e_flags &= ~ EF_ARM_RELEXEC;
2050 if (e_flags & EF_ARM_HASENTRY)
2052 strcat (buf, ", has entry point");
2053 e_flags &= ~ EF_ARM_HASENTRY;
2056 /* Now handle EABI specific flags. */
2060 strcat (buf, ", <unrecognized EABI>");
2065 case EF_ARM_EABI_VER1:
2066 strcat (buf, ", Version1 EABI");
2071 /* Process flags one bit at a time. */
2072 flag = e_flags & - e_flags;
2077 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2078 strcat (buf, ", sorted symbol tables");
2088 case EF_ARM_EABI_VER2:
2089 strcat (buf, ", Version2 EABI");
2094 /* Process flags one bit at a time. */
2095 flag = e_flags & - e_flags;
2100 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2101 strcat (buf, ", sorted symbol tables");
2104 case EF_ARM_DYNSYMSUSESEGIDX:
2105 strcat (buf, ", dynamic symbols use segment index");
2108 case EF_ARM_MAPSYMSFIRST:
2109 strcat (buf, ", mapping symbols precede others");
2119 case EF_ARM_EABI_VER3:
2120 strcat (buf, ", Version3 EABI");
2123 case EF_ARM_EABI_VER4:
2124 strcat (buf, ", Version4 EABI");
2127 case EF_ARM_EABI_VER5:
2128 strcat (buf, ", Version5 EABI");
2134 /* Process flags one bit at a time. */
2135 flag = e_flags & - e_flags;
2141 strcat (buf, ", BE8");
2145 strcat (buf, ", LE8");
2155 case EF_ARM_EABI_UNKNOWN:
2156 strcat (buf, ", GNU EABI");
2161 /* Process flags one bit at a time. */
2162 flag = e_flags & - e_flags;
2167 case EF_ARM_INTERWORK:
2168 strcat (buf, ", interworking enabled");
2171 case EF_ARM_APCS_26:
2172 strcat (buf, ", uses APCS/26");
2175 case EF_ARM_APCS_FLOAT:
2176 strcat (buf, ", uses APCS/float");
2180 strcat (buf, ", position independent");
2184 strcat (buf, ", 8 bit structure alignment");
2187 case EF_ARM_NEW_ABI:
2188 strcat (buf, ", uses new ABI");
2191 case EF_ARM_OLD_ABI:
2192 strcat (buf, ", uses old ABI");
2195 case EF_ARM_SOFT_FLOAT:
2196 strcat (buf, ", software FP");
2199 case EF_ARM_VFP_FLOAT:
2200 strcat (buf, ", VFP");
2203 case EF_ARM_MAVERICK_FLOAT:
2204 strcat (buf, ", Maverick FP");
2215 strcat (buf,_(", <unknown>"));
2219 get_machine_flags (unsigned e_flags, unsigned e_machine)
2221 static char buf[1024];
2233 decode_ARM_machine_flags (e_flags, buf);
2237 if (e_flags & EF_BFIN_PIC)
2238 strcat (buf, ", PIC");
2240 if (e_flags & EF_BFIN_FDPIC)
2241 strcat (buf, ", FDPIC");
2243 if (e_flags & EF_BFIN_CODE_IN_L1)
2244 strcat (buf, ", code in L1");
2246 if (e_flags & EF_BFIN_DATA_IN_L1)
2247 strcat (buf, ", data in L1");
2252 switch (e_flags & EF_FRV_CPU_MASK)
2254 case EF_FRV_CPU_GENERIC:
2258 strcat (buf, ", fr???");
2261 case EF_FRV_CPU_FR300:
2262 strcat (buf, ", fr300");
2265 case EF_FRV_CPU_FR400:
2266 strcat (buf, ", fr400");
2268 case EF_FRV_CPU_FR405:
2269 strcat (buf, ", fr405");
2272 case EF_FRV_CPU_FR450:
2273 strcat (buf, ", fr450");
2276 case EF_FRV_CPU_FR500:
2277 strcat (buf, ", fr500");
2279 case EF_FRV_CPU_FR550:
2280 strcat (buf, ", fr550");
2283 case EF_FRV_CPU_SIMPLE:
2284 strcat (buf, ", simple");
2286 case EF_FRV_CPU_TOMCAT:
2287 strcat (buf, ", tomcat");
2293 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2294 strcat (buf, ", m68000");
2295 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2296 strcat (buf, ", cpu32");
2297 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2298 strcat (buf, ", fido_a");
2301 char const * isa = _("unknown");
2302 char const * mac = _("unknown mac");
2303 char const * additional = NULL;
2305 switch (e_flags & EF_M68K_CF_ISA_MASK)
2307 case EF_M68K_CF_ISA_A_NODIV:
2309 additional = ", nodiv";
2311 case EF_M68K_CF_ISA_A:
2314 case EF_M68K_CF_ISA_A_PLUS:
2317 case EF_M68K_CF_ISA_B_NOUSP:
2319 additional = ", nousp";
2321 case EF_M68K_CF_ISA_B:
2324 case EF_M68K_CF_ISA_C:
2327 case EF_M68K_CF_ISA_C_NODIV:
2329 additional = ", nodiv";
2332 strcat (buf, ", cf, isa ");
2335 strcat (buf, additional);
2336 if (e_flags & EF_M68K_CF_FLOAT)
2337 strcat (buf, ", float");
2338 switch (e_flags & EF_M68K_CF_MAC_MASK)
2343 case EF_M68K_CF_MAC:
2346 case EF_M68K_CF_EMAC:
2349 case EF_M68K_CF_EMAC_B:
2362 if (e_flags & EF_PPC_EMB)
2363 strcat (buf, ", emb");
2365 if (e_flags & EF_PPC_RELOCATABLE)
2366 strcat (buf, _(", relocatable"));
2368 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2369 strcat (buf, _(", relocatable-lib"));
2373 case EM_CYGNUS_V850:
2374 switch (e_flags & EF_V850_ARCH)
2376 case E_V850E2V3_ARCH:
2377 strcat (buf, ", v850e2v3");
2380 strcat (buf, ", v850e2");
2383 strcat (buf, ", v850e1");
2386 strcat (buf, ", v850e");
2389 strcat (buf, ", v850");
2392 strcat (buf, _(", unknown v850 architecture variant"));
2398 case EM_CYGNUS_M32R:
2399 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2400 strcat (buf, ", m32r");
2404 case EM_MIPS_RS3_LE:
2405 if (e_flags & EF_MIPS_NOREORDER)
2406 strcat (buf, ", noreorder");
2408 if (e_flags & EF_MIPS_PIC)
2409 strcat (buf, ", pic");
2411 if (e_flags & EF_MIPS_CPIC)
2412 strcat (buf, ", cpic");
2414 if (e_flags & EF_MIPS_UCODE)
2415 strcat (buf, ", ugen_reserved");
2417 if (e_flags & EF_MIPS_ABI2)
2418 strcat (buf, ", abi2");
2420 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2421 strcat (buf, ", odk first");
2423 if (e_flags & EF_MIPS_32BITMODE)
2424 strcat (buf, ", 32bitmode");
2426 switch ((e_flags & EF_MIPS_MACH))
2428 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2429 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2430 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2431 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2432 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2433 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2434 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2435 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2436 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2437 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2438 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2439 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2440 case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
2441 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2442 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2443 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2445 /* We simply ignore the field in this case to avoid confusion:
2446 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2449 default: strcat (buf, _(", unknown CPU")); break;
2452 switch ((e_flags & EF_MIPS_ABI))
2454 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2455 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2456 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2457 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2459 /* We simply ignore the field in this case to avoid confusion:
2460 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2461 This means it is likely to be an o32 file, but not for
2464 default: strcat (buf, _(", unknown ABI")); break;
2467 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2468 strcat (buf, ", mdmx");
2470 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2471 strcat (buf, ", mips16");
2473 if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
2474 strcat (buf, ", micromips");
2476 switch ((e_flags & EF_MIPS_ARCH))
2478 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2479 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2480 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2481 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2482 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2483 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2484 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2485 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2486 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2487 default: strcat (buf, _(", unknown ISA")); break;
2490 if (e_flags & EF_SH_PIC)
2491 strcat (buf, ", pic");
2493 if (e_flags & EF_SH_FDPIC)
2494 strcat (buf, ", fdpic");
2498 switch ((e_flags & EF_SH_MACH_MASK))
2500 case EF_SH1: strcat (buf, ", sh1"); break;
2501 case EF_SH2: strcat (buf, ", sh2"); break;
2502 case EF_SH3: strcat (buf, ", sh3"); break;
2503 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2504 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2505 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2506 case EF_SH3E: strcat (buf, ", sh3e"); break;
2507 case EF_SH4: strcat (buf, ", sh4"); break;
2508 case EF_SH5: strcat (buf, ", sh5"); break;
2509 case EF_SH2E: strcat (buf, ", sh2e"); break;
2510 case EF_SH4A: strcat (buf, ", sh4a"); break;
2511 case EF_SH2A: strcat (buf, ", sh2a"); break;
2512 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2513 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2514 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2515 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2516 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2517 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2518 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2519 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2520 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2521 default: strcat (buf, _(", unknown ISA")); break;
2527 if (e_flags & EF_SPARC_32PLUS)
2528 strcat (buf, ", v8+");
2530 if (e_flags & EF_SPARC_SUN_US1)
2531 strcat (buf, ", ultrasparcI");
2533 if (e_flags & EF_SPARC_SUN_US3)
2534 strcat (buf, ", ultrasparcIII");
2536 if (e_flags & EF_SPARC_HAL_R1)
2537 strcat (buf, ", halr1");
2539 if (e_flags & EF_SPARC_LEDATA)
2540 strcat (buf, ", ledata");
2542 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2543 strcat (buf, ", tso");
2545 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2546 strcat (buf, ", pso");
2548 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2549 strcat (buf, ", rmo");
2553 switch (e_flags & EF_PARISC_ARCH)
2555 case EFA_PARISC_1_0:
2556 strcpy (buf, ", PA-RISC 1.0");
2558 case EFA_PARISC_1_1:
2559 strcpy (buf, ", PA-RISC 1.1");
2561 case EFA_PARISC_2_0:
2562 strcpy (buf, ", PA-RISC 2.0");
2567 if (e_flags & EF_PARISC_TRAPNIL)
2568 strcat (buf, ", trapnil");
2569 if (e_flags & EF_PARISC_EXT)
2570 strcat (buf, ", ext");
2571 if (e_flags & EF_PARISC_LSB)
2572 strcat (buf, ", lsb");
2573 if (e_flags & EF_PARISC_WIDE)
2574 strcat (buf, ", wide");
2575 if (e_flags & EF_PARISC_NO_KABP)
2576 strcat (buf, ", no kabp");
2577 if (e_flags & EF_PARISC_LAZYSWAP)
2578 strcat (buf, ", lazyswap");
2583 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2584 strcat (buf, ", new calling convention");
2586 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2587 strcat (buf, ", gnu calling convention");
2591 if ((e_flags & EF_IA_64_ABI64))
2592 strcat (buf, ", 64-bit");
2594 strcat (buf, ", 32-bit");
2595 if ((e_flags & EF_IA_64_REDUCEDFP))
2596 strcat (buf, ", reduced fp model");
2597 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2598 strcat (buf, ", no function descriptors, constant gp");
2599 else if ((e_flags & EF_IA_64_CONS_GP))
2600 strcat (buf, ", constant gp");
2601 if ((e_flags & EF_IA_64_ABSOLUTE))
2602 strcat (buf, ", absolute");
2603 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2605 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2606 strcat (buf, ", vms_linkages");
2607 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2609 case EF_IA_64_VMS_COMCOD_SUCCESS:
2611 case EF_IA_64_VMS_COMCOD_WARNING:
2612 strcat (buf, ", warning");
2614 case EF_IA_64_VMS_COMCOD_ERROR:
2615 strcat (buf, ", error");
2617 case EF_IA_64_VMS_COMCOD_ABORT:
2618 strcat (buf, ", abort");
2627 if ((e_flags & EF_VAX_NONPIC))
2628 strcat (buf, ", non-PIC");
2629 if ((e_flags & EF_VAX_DFLOAT))
2630 strcat (buf, ", D-Float");
2631 if ((e_flags & EF_VAX_GFLOAT))
2632 strcat (buf, ", G-Float");
2636 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2637 strcat (buf, ", 64-bit doubles");
2638 if (e_flags & E_FLAG_RX_DSP)
2639 strcat (buf, ", dsp");
2640 if (e_flags & E_FLAG_RX_PID)
2641 strcat (buf, ", pid");
2645 if (e_flags & EF_S390_HIGH_GPRS)
2646 strcat (buf, ", highgprs");
2650 if ((e_flags & EF_C6000_REL))
2651 strcat (buf, ", relocatable module");
2660 get_osabi_name (unsigned int osabi)
2662 static char buff[32];
2666 case ELFOSABI_NONE: return "UNIX - System V";
2667 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2668 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2669 case ELFOSABI_GNU: return "UNIX - GNU";
2670 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2671 case ELFOSABI_AIX: return "UNIX - AIX";
2672 case ELFOSABI_IRIX: return "UNIX - IRIX";
2673 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2674 case ELFOSABI_TRU64: return "UNIX - TRU64";
2675 case ELFOSABI_MODESTO: return "Novell - Modesto";
2676 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2677 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2678 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2679 case ELFOSABI_AROS: return "AROS";
2680 case ELFOSABI_FENIXOS: return "FenixOS";
2683 switch (elf_header.e_machine)
2688 case ELFOSABI_ARM: return "ARM";
2698 case ELFOSABI_STANDALONE: return _("Standalone App");
2707 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2708 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2717 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2723 get_aarch64_segment_type (unsigned long type)
2727 case PT_AARCH64_ARCHEXT:
2728 return "AARCH64_ARCHEXT";
2737 get_arm_segment_type (unsigned long type)
2751 get_mips_segment_type (unsigned long type)
2755 case PT_MIPS_REGINFO:
2757 case PT_MIPS_RTPROC:
2759 case PT_MIPS_OPTIONS:
2769 get_parisc_segment_type (unsigned long type)
2773 case PT_HP_TLS: return "HP_TLS";
2774 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2775 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2776 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2777 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2778 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2779 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2780 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2781 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2782 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2783 case PT_HP_PARALLEL: return "HP_PARALLEL";
2784 case PT_HP_FASTBIND: return "HP_FASTBIND";
2785 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2786 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2787 case PT_HP_STACK: return "HP_STACK";
2788 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2789 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2790 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2791 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2800 get_ia64_segment_type (unsigned long type)
2804 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2805 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2806 case PT_HP_TLS: return "HP_TLS";
2807 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2808 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2809 case PT_IA_64_HP_STACK: return "HP_STACK";
2818 get_tic6x_segment_type (unsigned long type)
2822 case PT_C6000_PHATTR: return "C6000_PHATTR";
2831 get_segment_type (unsigned long p_type)
2833 static char buff[32];
2837 case PT_NULL: return "NULL";
2838 case PT_LOAD: return "LOAD";
2839 case PT_DYNAMIC: return "DYNAMIC";
2840 case PT_INTERP: return "INTERP";
2841 case PT_NOTE: return "NOTE";
2842 case PT_SHLIB: return "SHLIB";
2843 case PT_PHDR: return "PHDR";
2844 case PT_TLS: return "TLS";
2846 case PT_GNU_EH_FRAME:
2847 return "GNU_EH_FRAME";
2848 case PT_GNU_STACK: return "GNU_STACK";
2849 case PT_GNU_RELRO: return "GNU_RELRO";
2852 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2854 const char * result;
2856 switch (elf_header.e_machine)
2859 result = get_aarch64_segment_type (p_type);
2862 result = get_arm_segment_type (p_type);
2865 case EM_MIPS_RS3_LE:
2866 result = get_mips_segment_type (p_type);
2869 result = get_parisc_segment_type (p_type);
2872 result = get_ia64_segment_type (p_type);
2875 result = get_tic6x_segment_type (p_type);
2885 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2887 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2889 const char * result;
2891 switch (elf_header.e_machine)
2894 result = get_parisc_segment_type (p_type);
2897 result = get_ia64_segment_type (p_type);
2907 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2910 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2917 get_mips_section_type_name (unsigned int sh_type)
2921 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2922 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2923 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2924 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2925 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2926 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2927 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2928 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2929 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2930 case SHT_MIPS_RELD: return "MIPS_RELD";
2931 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2932 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2933 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2934 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2935 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2936 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2937 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2938 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2939 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2940 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2941 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2942 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2943 case SHT_MIPS_LINE: return "MIPS_LINE";
2944 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2945 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2946 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2947 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2948 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2949 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2950 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2951 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2952 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2953 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2954 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2955 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2956 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2957 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2958 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2959 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2967 get_parisc_section_type_name (unsigned int sh_type)
2971 case SHT_PARISC_EXT: return "PARISC_EXT";
2972 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2973 case SHT_PARISC_DOC: return "PARISC_DOC";
2974 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2975 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2976 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2977 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2985 get_ia64_section_type_name (unsigned int sh_type)
2987 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2988 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2989 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2993 case SHT_IA_64_EXT: return "IA_64_EXT";
2994 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2995 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2996 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2997 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2998 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2999 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
3000 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
3001 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
3002 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
3010 get_x86_64_section_type_name (unsigned int sh_type)
3014 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
3022 get_aarch64_section_type_name (unsigned int sh_type)
3026 case SHT_AARCH64_ATTRIBUTES:
3027 return "AARCH64_ATTRIBUTES";
3035 get_arm_section_type_name (unsigned int sh_type)
3039 case SHT_ARM_EXIDX: return "ARM_EXIDX";
3040 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
3041 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
3042 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
3043 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3051 get_tic6x_section_type_name (unsigned int sh_type)
3055 case SHT_C6000_UNWIND:
3056 return "C6000_UNWIND";
3057 case SHT_C6000_PREEMPTMAP:
3058 return "C6000_PREEMPTMAP";
3059 case SHT_C6000_ATTRIBUTES:
3060 return "C6000_ATTRIBUTES";
3065 case SHT_TI_HANDLER:
3066 return "TI_HANDLER";
3067 case SHT_TI_INITINFO:
3068 return "TI_INITINFO";
3069 case SHT_TI_PHATTRS:
3070 return "TI_PHATTRS";
3078 get_section_type_name (unsigned int sh_type)
3080 static char buff[32];
3084 case SHT_NULL: return "NULL";
3085 case SHT_PROGBITS: return "PROGBITS";
3086 case SHT_SYMTAB: return "SYMTAB";
3087 case SHT_STRTAB: return "STRTAB";
3088 case SHT_RELA: return "RELA";
3089 case SHT_HASH: return "HASH";
3090 case SHT_DYNAMIC: return "DYNAMIC";
3091 case SHT_NOTE: return "NOTE";
3092 case SHT_NOBITS: return "NOBITS";
3093 case SHT_REL: return "REL";
3094 case SHT_SHLIB: return "SHLIB";
3095 case SHT_DYNSYM: return "DYNSYM";
3096 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3097 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3098 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3099 case SHT_GNU_HASH: return "GNU_HASH";
3100 case SHT_GROUP: return "GROUP";
3101 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3102 case SHT_GNU_verdef: return "VERDEF";
3103 case SHT_GNU_verneed: return "VERNEED";
3104 case SHT_GNU_versym: return "VERSYM";
3105 case 0x6ffffff0: return "VERSYM";
3106 case 0x6ffffffc: return "VERDEF";
3107 case 0x7ffffffd: return "AUXILIARY";
3108 case 0x7fffffff: return "FILTER";
3109 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3112 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3114 const char * result;
3116 switch (elf_header.e_machine)
3119 case EM_MIPS_RS3_LE:
3120 result = get_mips_section_type_name (sh_type);
3123 result = get_parisc_section_type_name (sh_type);
3126 result = get_ia64_section_type_name (sh_type);
3131 result = get_x86_64_section_type_name (sh_type);
3134 result = get_aarch64_section_type_name (sh_type);
3137 result = get_arm_section_type_name (sh_type);
3140 result = get_tic6x_section_type_name (sh_type);
3150 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3152 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3154 const char * result;
3156 switch (elf_header.e_machine)
3159 result = get_ia64_section_type_name (sh_type);
3169 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3171 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3172 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3174 /* This message is probably going to be displayed in a 15
3175 character wide field, so put the hex value first. */
3176 snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
3182 #define OPTION_DEBUG_DUMP 512
3183 #define OPTION_DYN_SYMS 513
3184 #define OPTION_DWARF_DEPTH 514
3185 #define OPTION_DWARF_START 515
3186 #define OPTION_DWARF_CHECK 516
3188 static struct option options[] =
3190 {"all", no_argument, 0, 'a'},
3191 {"file-header", no_argument, 0, 'h'},
3192 {"program-headers", no_argument, 0, 'l'},
3193 {"headers", no_argument, 0, 'e'},
3194 {"histogram", no_argument, 0, 'I'},
3195 {"segments", no_argument, 0, 'l'},
3196 {"sections", no_argument, 0, 'S'},
3197 {"section-headers", no_argument, 0, 'S'},
3198 {"section-groups", no_argument, 0, 'g'},
3199 {"section-details", no_argument, 0, 't'},
3200 {"full-section-name",no_argument, 0, 'N'},
3201 {"symbols", no_argument, 0, 's'},
3202 {"syms", no_argument, 0, 's'},
3203 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3204 {"relocs", no_argument, 0, 'r'},
3205 {"notes", no_argument, 0, 'n'},
3206 {"dynamic", no_argument, 0, 'd'},
3207 {"arch-specific", no_argument, 0, 'A'},
3208 {"version-info", no_argument, 0, 'V'},
3209 {"use-dynamic", no_argument, 0, 'D'},
3210 {"unwind", no_argument, 0, 'u'},
3211 {"archive-index", no_argument, 0, 'c'},
3212 {"hex-dump", required_argument, 0, 'x'},
3213 {"relocated-dump", required_argument, 0, 'R'},
3214 {"string-dump", required_argument, 0, 'p'},
3215 #ifdef SUPPORT_DISASSEMBLY
3216 {"instruction-dump", required_argument, 0, 'i'},
3218 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3220 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
3221 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
3222 {"dwarf-check", no_argument, 0, OPTION_DWARF_CHECK},
3224 {"version", no_argument, 0, 'v'},
3225 {"wide", no_argument, 0, 'W'},
3226 {"help", no_argument, 0, 'H'},
3227 {0, no_argument, 0, 0}
3231 usage (FILE * stream)
3233 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3234 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3235 fprintf (stream, _(" Options are:\n\
3236 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3237 -h --file-header Display the ELF file header\n\
3238 -l --program-headers Display the program headers\n\
3239 --segments An alias for --program-headers\n\
3240 -S --section-headers Display the sections' header\n\
3241 --sections An alias for --section-headers\n\
3242 -g --section-groups Display the section groups\n\
3243 -t --section-details Display the section details\n\
3244 -e --headers Equivalent to: -h -l -S\n\
3245 -s --syms Display the symbol table\n\
3246 --symbols An alias for --syms\n\
3247 --dyn-syms Display the dynamic symbol table\n\
3248 -n --notes Display the core notes (if present)\n\
3249 -r --relocs Display the relocations (if present)\n\
3250 -u --unwind Display the unwind info (if present)\n\
3251 -d --dynamic Display the dynamic section (if present)\n\
3252 -V --version-info Display the version sections (if present)\n\
3253 -A --arch-specific Display architecture specific information (if any)\n\
3254 -c --archive-index Display the symbol/file index in an archive\n\
3255 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3256 -x --hex-dump=<number|name>\n\
3257 Dump the contents of section <number|name> as bytes\n\
3258 -p --string-dump=<number|name>\n\
3259 Dump the contents of section <number|name> as strings\n\
3260 -R --relocated-dump=<number|name>\n\
3261 Dump the contents of section <number|name> as relocated bytes\n\
3262 -w[lLiaprmfFsoRt] or\n\
3263 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3264 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3265 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
3267 Display the contents of DWARF2 debug sections\n"));
3268 fprintf (stream, _("\
3269 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
3270 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
3272 #ifdef SUPPORT_DISASSEMBLY
3273 fprintf (stream, _("\
3274 -i --instruction-dump=<number|name>\n\
3275 Disassemble the contents of section <number|name>\n"));
3277 fprintf (stream, _("\
3278 -I --histogram Display histogram of bucket list lengths\n\
3279 -W --wide Allow output width to exceed 80 characters\n\
3280 @<file> Read options from <file>\n\
3281 -H --help Display this information\n\
3282 -v --version Display the version number of readelf\n"));
3284 if (REPORT_BUGS_TO[0] && stream == stdout)
3285 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3287 exit (stream == stdout ? 0 : 1);
3290 /* Record the fact that the user wants the contents of section number
3291 SECTION to be displayed using the method(s) encoded as flags bits
3292 in TYPE. Note, TYPE can be zero if we are creating the array for
3296 request_dump_bynumber (unsigned int section, dump_type type)
3298 if (section >= num_dump_sects)
3300 dump_type * new_dump_sects;
3302 new_dump_sects = (dump_type *) calloc (section + 1,
3303 sizeof (* dump_sects));
3305 if (new_dump_sects == NULL)
3306 error (_("Out of memory allocating dump request table.\n"));
3309 /* Copy current flag settings. */
3310 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3314 dump_sects = new_dump_sects;
3315 num_dump_sects = section + 1;
3320 dump_sects[section] |= type;
3325 /* Request a dump by section name. */
3328 request_dump_byname (const char * section, dump_type type)
3330 struct dump_list_entry * new_request;
3332 new_request = (struct dump_list_entry *)
3333 malloc (sizeof (struct dump_list_entry));
3335 error (_("Out of memory allocating dump request table.\n"));
3337 new_request->name = strdup (section);
3338 if (!new_request->name)
3339 error (_("Out of memory allocating dump request table.\n"));
3341 new_request->type = type;
3343 new_request->next = dump_sects_byname;
3344 dump_sects_byname = new_request;
3348 request_dump (dump_type type)
3354 section = strtoul (optarg, & cp, 0);
3356 if (! *cp && section >= 0)
3357 request_dump_bynumber (section, type);
3359 request_dump_byname (optarg, type);
3364 parse_args (int argc, char ** argv)
3371 while ((c = getopt_long
3372 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3390 do_section_groups++;
3398 do_section_groups++;
3403 do_section_details++;
3447 request_dump (HEX_DUMP);
3450 request_dump (STRING_DUMP);
3453 request_dump (RELOC_DUMP);
3460 dwarf_select_sections_all ();
3465 dwarf_select_sections_by_letters (optarg);
3468 case OPTION_DEBUG_DUMP:
3475 dwarf_select_sections_by_names (optarg);
3478 case OPTION_DWARF_DEPTH:
3482 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3485 case OPTION_DWARF_START:
3489 dwarf_start_die = strtoul (optarg, & cp, 0);
3492 case OPTION_DWARF_CHECK:
3495 case OPTION_DYN_SYMS:
3498 #ifdef SUPPORT_DISASSEMBLY
3500 request_dump (DISASS_DUMP);
3504 print_version (program_name);
3513 /* xgettext:c-format */
3514 error (_("Invalid option '-%c'\n"), c);
3521 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3522 && !do_segments && !do_header && !do_dump && !do_version
3523 && !do_histogram && !do_debugging && !do_arch && !do_notes
3524 && !do_section_groups && !do_archive_index
3529 warn (_("Nothing to do.\n"));
3535 get_elf_class (unsigned int elf_class)
3537 static char buff[32];
3541 case ELFCLASSNONE: return _("none");
3542 case ELFCLASS32: return "ELF32";
3543 case ELFCLASS64: return "ELF64";
3545 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3551 get_data_encoding (unsigned int encoding)
3553 static char buff[32];
3557 case ELFDATANONE: return _("none");
3558 case ELFDATA2LSB: return _("2's complement, little endian");
3559 case ELFDATA2MSB: return _("2's complement, big endian");
3561 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3566 /* Decode the data held in 'elf_header'. */
3569 process_file_header (void)
3571 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3572 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3573 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3574 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3577 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3581 init_dwarf_regnames (elf_header.e_machine);
3587 printf (_("ELF Header:\n"));
3588 printf (_(" Magic: "));
3589 for (i = 0; i < EI_NIDENT; i++)
3590 printf ("%2.2x ", elf_header.e_ident[i]);
3592 printf (_(" Class: %s\n"),
3593 get_elf_class (elf_header.e_ident[EI_CLASS]));
3594 printf (_(" Data: %s\n"),
3595 get_data_encoding (elf_header.e_ident[EI_DATA]));
3596 printf (_(" Version: %d %s\n"),
3597 elf_header.e_ident[EI_VERSION],
3598 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3600 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3601 ? _("<unknown: %lx>")
3603 printf (_(" OS/ABI: %s\n"),
3604 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3605 printf (_(" ABI Version: %d\n"),
3606 elf_header.e_ident[EI_ABIVERSION]);
3607 printf (_(" Type: %s\n"),
3608 get_file_type (elf_header.e_type));
3609 printf (_(" Machine: %s\n"),
3610 get_machine_name (elf_header.e_machine));
3611 printf (_(" Version: 0x%lx\n"),
3612 (unsigned long) elf_header.e_version);
3614 printf (_(" Entry point address: "));
3615 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3616 printf (_("\n Start of program headers: "));
3617 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3618 printf (_(" (bytes into file)\n Start of section headers: "));
3619 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3620 printf (_(" (bytes into file)\n"));
3622 printf (_(" Flags: 0x%lx%s\n"),
3623 (unsigned long) elf_header.e_flags,
3624 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3625 printf (_(" Size of this header: %ld (bytes)\n"),
3626 (long) elf_header.e_ehsize);
3627 printf (_(" Size of program headers: %ld (bytes)\n"),
3628 (long) elf_header.e_phentsize);
3629 printf (_(" Number of program headers: %ld"),
3630 (long) elf_header.e_phnum);
3631 if (section_headers != NULL
3632 && elf_header.e_phnum == PN_XNUM
3633 && section_headers[0].sh_info != 0)
3634 printf (" (%ld)", (long) section_headers[0].sh_info);
3635 putc ('\n', stdout);
3636 printf (_(" Size of section headers: %ld (bytes)\n"),
3637 (long) elf_header.e_shentsize);
3638 printf (_(" Number of section headers: %ld"),
3639 (long) elf_header.e_shnum);
3640 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3641 printf (" (%ld)", (long) section_headers[0].sh_size);
3642 putc ('\n', stdout);
3643 printf (_(" Section header string table index: %ld"),
3644 (long) elf_header.e_shstrndx);
3645 if (section_headers != NULL
3646 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3647 printf (" (%u)", section_headers[0].sh_link);
3648 else if (elf_header.e_shstrndx != SHN_UNDEF
3649 && elf_header.e_shstrndx >= elf_header.e_shnum)
3650 printf (_(" <corrupt: out of range>"));
3651 putc ('\n', stdout);
3654 if (section_headers != NULL)
3656 if (elf_header.e_phnum == PN_XNUM
3657 && section_headers[0].sh_info != 0)
3658 elf_header.e_phnum = section_headers[0].sh_info;
3659 if (elf_header.e_shnum == SHN_UNDEF)
3660 elf_header.e_shnum = section_headers[0].sh_size;
3661 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3662 elf_header.e_shstrndx = section_headers[0].sh_link;
3663 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3664 elf_header.e_shstrndx = SHN_UNDEF;
3665 free (section_headers);
3666 section_headers = NULL;
3674 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3676 Elf32_External_Phdr * phdrs;
3677 Elf32_External_Phdr * external;
3678 Elf_Internal_Phdr * internal;
3681 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3682 elf_header.e_phentsize,
3684 _("program headers"));
3688 for (i = 0, internal = pheaders, external = phdrs;
3689 i < elf_header.e_phnum;
3690 i++, internal++, external++)
3692 internal->p_type = BYTE_GET (external->p_type);
3693 internal->p_offset = BYTE_GET (external->p_offset);
3694 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3695 internal->p_paddr = BYTE_GET (external->p_paddr);
3696 internal->p_filesz = BYTE_GET (external->p_filesz);
3697 internal->p_memsz = BYTE_GET (external->p_memsz);
3698 internal->p_flags = BYTE_GET (external->p_flags);
3699 internal->p_align = BYTE_GET (external->p_align);
3708 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3710 Elf64_External_Phdr * phdrs;
3711 Elf64_External_Phdr * external;
3712 Elf_Internal_Phdr * internal;
3715 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3716 elf_header.e_phentsize,
3718 _("program headers"));
3722 for (i = 0, internal = pheaders, external = phdrs;
3723 i < elf_header.e_phnum;
3724 i++, internal++, external++)
3726 internal->p_type = BYTE_GET (external->p_type);
3727 internal->p_flags = BYTE_GET (external->p_flags);
3728 internal->p_offset = BYTE_GET (external->p_offset);
3729 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3730 internal->p_paddr = BYTE_GET (external->p_paddr);
3731 internal->p_filesz = BYTE_GET (external->p_filesz);
3732 internal->p_memsz = BYTE_GET (external->p_memsz);
3733 internal->p_align = BYTE_GET (external->p_align);
3741 /* Returns 1 if the program headers were read into `program_headers'. */
3744 get_program_headers (FILE * file)
3746 Elf_Internal_Phdr * phdrs;
3748 /* Check cache of prior read. */
3749 if (program_headers != NULL)
3752 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3753 sizeof (Elf_Internal_Phdr));
3757 error (_("Out of memory\n"));
3762 ? get_32bit_program_headers (file, phdrs)
3763 : get_64bit_program_headers (file, phdrs))
3765 program_headers = phdrs;
3773 /* Returns 1 if the program headers were loaded. */
3776 process_program_headers (FILE * file)
3778 Elf_Internal_Phdr * segment;
3781 if (elf_header.e_phnum == 0)
3783 /* PR binutils/12467. */
3784 if (elf_header.e_phoff != 0)
3785 warn (_("possibly corrupt ELF header - it has a non-zero program"
3786 " header offset, but no program headers"));
3787 else if (do_segments)
3788 printf (_("\nThere are no program headers in this file.\n"));
3792 if (do_segments && !do_header)
3794 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3795 printf (_("Entry point "));
3796 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3797 printf (_("\nThere are %d program headers, starting at offset "),
3798 elf_header.e_phnum);
3799 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3803 if (! get_program_headers (file))
3808 if (elf_header.e_phnum > 1)
3809 printf (_("\nProgram Headers:\n"));
3811 printf (_("\nProgram Headers:\n"));
3815 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3818 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3822 (_(" Type Offset VirtAddr PhysAddr\n"));
3824 (_(" FileSiz MemSiz Flags Align\n"));
3831 for (i = 0, segment = program_headers;
3832 i < elf_header.e_phnum;
3837 printf (" %-14.14s ", get_segment_type (segment->p_type));
3841 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3842 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3843 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3844 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3845 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3847 (segment->p_flags & PF_R ? 'R' : ' '),
3848 (segment->p_flags & PF_W ? 'W' : ' '),
3849 (segment->p_flags & PF_X ? 'E' : ' '));
3850 printf ("%#lx", (unsigned long) segment->p_align);
3854 if ((unsigned long) segment->p_offset == segment->p_offset)
3855 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3858 print_vma (segment->p_offset, FULL_HEX);
3862 print_vma (segment->p_vaddr, FULL_HEX);
3864 print_vma (segment->p_paddr, FULL_HEX);
3867 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3868 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3871 print_vma (segment->p_filesz, FULL_HEX);
3875 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3876 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3879 print_vma (segment->p_memsz, FULL_HEX);
3883 (segment->p_flags & PF_R ? 'R' : ' '),
3884 (segment->p_flags & PF_W ? 'W' : ' '),
3885 (segment->p_flags & PF_X ? 'E' : ' '));
3887 if ((unsigned long) segment->p_align == segment->p_align)
3888 printf ("%#lx", (unsigned long) segment->p_align);
3891 print_vma (segment->p_align, PREFIX_HEX);
3896 print_vma (segment->p_offset, FULL_HEX);
3898 print_vma (segment->p_vaddr, FULL_HEX);
3900 print_vma (segment->p_paddr, FULL_HEX);
3902 print_vma (segment->p_filesz, FULL_HEX);
3904 print_vma (segment->p_memsz, FULL_HEX);
3906 (segment->p_flags & PF_R ? 'R' : ' '),
3907 (segment->p_flags & PF_W ? 'W' : ' '),
3908 (segment->p_flags & PF_X ? 'E' : ' '));
3909 print_vma (segment->p_align, HEX);
3913 switch (segment->p_type)
3917 error (_("more than one dynamic segment\n"));
3919 /* By default, assume that the .dynamic section is the first
3920 section in the DYNAMIC segment. */
3921 dynamic_addr = segment->p_offset;
3922 dynamic_size = segment->p_filesz;
3924 /* Try to locate the .dynamic section. If there is
3925 a section header table, we can easily locate it. */
3926 if (section_headers != NULL)
3928 Elf_Internal_Shdr * sec;
3930 sec = find_section (".dynamic");
3931 if (sec == NULL || sec->sh_size == 0)
3933 /* A corresponding .dynamic section is expected, but on
3934 IA-64/OpenVMS it is OK for it to be missing. */
3935 if (!is_ia64_vms ())
3936 error (_("no .dynamic section in the dynamic segment\n"));
3940 if (sec->sh_type == SHT_NOBITS)
3946 dynamic_addr = sec->sh_offset;
3947 dynamic_size = sec->sh_size;
3949 if (dynamic_addr < segment->p_offset
3950 || dynamic_addr > segment->p_offset + segment->p_filesz)
3951 warn (_("the .dynamic section is not contained"
3952 " within the dynamic segment\n"));
3953 else if (dynamic_addr > segment->p_offset)
3954 warn (_("the .dynamic section is not the first section"
3955 " in the dynamic segment.\n"));
3960 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3962 error (_("Unable to find program interpreter name\n"));
3966 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3968 if (ret >= (int) sizeof (fmt) || ret < 0)
3969 error (_("Internal error: failed to create format string to display program interpreter\n"));
3971 program_interpreter[0] = 0;
3972 if (fscanf (file, fmt, program_interpreter) <= 0)
3973 error (_("Unable to read program interpreter name\n"));
3976 printf (_("\n [Requesting program interpreter: %s]"),
3977 program_interpreter);
3983 putc ('\n', stdout);
3986 if (do_segments && section_headers != NULL && string_table != NULL)
3988 printf (_("\n Section to Segment mapping:\n"));
3989 printf (_(" Segment Sections...\n"));
3991 for (i = 0; i < elf_header.e_phnum; i++)
3994 Elf_Internal_Shdr * section;
3996 segment = program_headers + i;
3997 section = section_headers + 1;
3999 printf (" %2.2d ", i);
4001 for (j = 1; j < elf_header.e_shnum; j++, section++)
4003 if (!ELF_TBSS_SPECIAL (section, segment)
4004 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4005 printf ("%s ", SECTION_NAME (section));
4016 /* Find the file offset corresponding to VMA by using the program headers. */
4019 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4021 Elf_Internal_Phdr * seg;
4023 if (! get_program_headers (file))
4025 warn (_("Cannot interpret virtual addresses without program headers.\n"));
4029 for (seg = program_headers;
4030 seg < program_headers + elf_header.e_phnum;
4033 if (seg->p_type != PT_LOAD)
4036 if (vma >= (seg->p_vaddr & -seg->p_align)
4037 && vma + size <= seg->p_vaddr + seg->p_filesz)
4038 return vma - seg->p_vaddr + seg->p_offset;
4041 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4042 (unsigned long) vma);
4048 get_32bit_section_headers (FILE * file, unsigned int num)
4050 Elf32_External_Shdr * shdrs;
4051 Elf_Internal_Shdr * internal;
4054 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4055 elf_header.e_shentsize, num,
4056 _("section headers"));
4060 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4061 sizeof (Elf_Internal_Shdr));
4063 if (section_headers == NULL)
4065 error (_("Out of memory\n"));
4069 for (i = 0, internal = section_headers;
4073 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4074 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4075 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4076 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4077 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4078 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4079 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4080 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4081 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4082 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4091 get_64bit_section_headers (FILE * file, unsigned int num)
4093 Elf64_External_Shdr * shdrs;
4094 Elf_Internal_Shdr * internal;
4097 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4098 elf_header.e_shentsize, num,
4099 _("section headers"));
4103 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4104 sizeof (Elf_Internal_Shdr));
4106 if (section_headers == NULL)
4108 error (_("Out of memory\n"));
4112 for (i = 0, internal = section_headers;
4116 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4117 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4118 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4119 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4120 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4121 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4122 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4123 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4124 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4125 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4133 static Elf_Internal_Sym *
4134 get_32bit_elf_symbols (FILE * file,
4135 Elf_Internal_Shdr * section,
4136 unsigned long * num_syms_return)
4138 unsigned long number = 0;
4139 Elf32_External_Sym * esyms = NULL;
4140 Elf_External_Sym_Shndx * shndx = NULL;
4141 Elf_Internal_Sym * isyms = NULL;
4142 Elf_Internal_Sym * psym;
4145 /* Run some sanity checks first. */
4146 if (section->sh_entsize == 0)
4148 error (_("sh_entsize is zero\n"));
4152 number = section->sh_size / section->sh_entsize;
4154 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4156 error (_("Invalid sh_entsize\n"));
4160 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4161 section->sh_size, _("symbols"));
4166 if (symtab_shndx_hdr != NULL
4167 && (symtab_shndx_hdr->sh_link
4168 == (unsigned long) (section - section_headers)))
4170 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4171 symtab_shndx_hdr->sh_offset,
4172 1, symtab_shndx_hdr->sh_size,
4173 _("symbol table section indicies"));
4178 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4182 error (_("Out of memory\n"));
4186 for (j = 0, psym = isyms; j < number; j++, psym++)
4188 psym->st_name = BYTE_GET (esyms[j].st_name);
4189 psym->st_value = BYTE_GET (esyms[j].st_value);
4190 psym->st_size = BYTE_GET (esyms[j].st_size);
4191 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4192 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4194 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4195 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4196 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4197 psym->st_info = BYTE_GET (esyms[j].st_info);
4198 psym->st_other = BYTE_GET (esyms[j].st_other);
4207 if (num_syms_return != NULL)
4208 * num_syms_return = isyms == NULL ? 0 : number;
4213 static Elf_Internal_Sym *
4214 get_64bit_elf_symbols (FILE * file,
4215 Elf_Internal_Shdr * section,
4216 unsigned long * num_syms_return)
4218 unsigned long number = 0;
4219 Elf64_External_Sym * esyms = NULL;
4220 Elf_External_Sym_Shndx * shndx = NULL;
4221 Elf_Internal_Sym * isyms = NULL;
4222 Elf_Internal_Sym * psym;
4225 /* Run some sanity checks first. */
4226 if (section->sh_entsize == 0)
4228 error (_("sh_entsize is zero\n"));
4232 number = section->sh_size / section->sh_entsize;
4234 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4236 error (_("Invalid sh_entsize\n"));
4240 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4241 section->sh_size, _("symbols"));
4245 if (symtab_shndx_hdr != NULL
4246 && (symtab_shndx_hdr->sh_link
4247 == (unsigned long) (section - section_headers)))
4249 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4250 symtab_shndx_hdr->sh_offset,
4251 1, symtab_shndx_hdr->sh_size,
4252 _("symbol table section indicies"));
4257 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4261 error (_("Out of memory\n"));
4265 for (j = 0, psym = isyms; j < number; j++, psym++)
4267 psym->st_name = BYTE_GET (esyms[j].st_name);
4268 psym->st_info = BYTE_GET (esyms[j].st_info);
4269 psym->st_other = BYTE_GET (esyms[j].st_other);
4270 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4272 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4274 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4275 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4276 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4278 psym->st_value = BYTE_GET (esyms[j].st_value);
4279 psym->st_size = BYTE_GET (esyms[j].st_size);
4288 if (num_syms_return != NULL)
4289 * num_syms_return = isyms == NULL ? 0 : number;
4295 get_elf_section_flags (bfd_vma sh_flags)
4297 static char buff[1024];
4299 int field_size = is_32bit_elf ? 8 : 16;
4301 int size = sizeof (buff) - (field_size + 4 + 1);
4302 bfd_vma os_flags = 0;
4303 bfd_vma proc_flags = 0;
4304 bfd_vma unknown_flags = 0;
4312 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4313 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4314 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4315 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4316 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4317 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4318 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4319 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4320 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4321 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4322 /* IA-64 specific. */
4323 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4324 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4325 /* IA-64 OpenVMS specific. */
4326 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4327 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4328 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4329 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4330 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4331 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4333 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4334 /* SPARC specific. */
4335 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4338 if (do_section_details)
4340 sprintf (buff, "[%*.*lx]: ",
4341 field_size, field_size, (unsigned long) sh_flags);
4342 p += field_size + 4;
4349 flag = sh_flags & - sh_flags;
4352 if (do_section_details)
4356 case SHF_WRITE: sindex = 0; break;
4357 case SHF_ALLOC: sindex = 1; break;
4358 case SHF_EXECINSTR: sindex = 2; break;
4359 case SHF_MERGE: sindex = 3; break;
4360 case SHF_STRINGS: sindex = 4; break;
4361 case SHF_INFO_LINK: sindex = 5; break;
4362 case SHF_LINK_ORDER: sindex = 6; break;
4363 case SHF_OS_NONCONFORMING: sindex = 7; break;
4364 case SHF_GROUP: sindex = 8; break;
4365 case SHF_TLS: sindex = 9; break;
4366 case SHF_EXCLUDE: sindex = 18; break;
4370 switch (elf_header.e_machine)
4373 if (flag == SHF_IA_64_SHORT)
4375 else if (flag == SHF_IA_64_NORECOV)
4378 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4381 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4382 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4383 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4384 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4385 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4386 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4397 case EM_OLD_SPARCV9:
4398 case EM_SPARC32PLUS:
4401 if (flag == SHF_ORDERED)
4411 if (p != buff + field_size + 4)
4413 if (size < (10 + 2))
4420 size -= flags [sindex].len;
4421 p = stpcpy (p, flags [sindex].str);
4423 else if (flag & SHF_MASKOS)
4425 else if (flag & SHF_MASKPROC)
4428 unknown_flags |= flag;
4434 case SHF_WRITE: *p = 'W'; break;
4435 case SHF_ALLOC: *p = 'A'; break;
4436 case SHF_EXECINSTR: *p = 'X'; break;
4437 case SHF_MERGE: *p = 'M'; break;
4438 case SHF_STRINGS: *p = 'S'; break;
4439 case SHF_INFO_LINK: *p = 'I'; break;
4440 case SHF_LINK_ORDER: *p = 'L'; break;
4441 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4442 case SHF_GROUP: *p = 'G'; break;
4443 case SHF_TLS: *p = 'T'; break;
4444 case SHF_EXCLUDE: *p = 'E'; break;
4447 if ((elf_header.e_machine == EM_X86_64
4448 || elf_header.e_machine == EM_L1OM
4449 || elf_header.e_machine == EM_K1OM)
4450 && flag == SHF_X86_64_LARGE)
4452 else if (flag & SHF_MASKOS)
4455 sh_flags &= ~ SHF_MASKOS;
4457 else if (flag & SHF_MASKPROC)
4460 sh_flags &= ~ SHF_MASKPROC;
4470 if (do_section_details)
4474 size -= 5 + field_size;
4475 if (p != buff + field_size + 4)
4483 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4484 (unsigned long) os_flags);
4485 p += 5 + field_size;
4489 size -= 7 + field_size;
4490 if (p != buff + field_size + 4)
4498 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4499 (unsigned long) proc_flags);
4500 p += 7 + field_size;
4504 size -= 10 + field_size;
4505 if (p != buff + field_size + 4)
4513 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4514 (unsigned long) unknown_flags);
4515 p += 10 + field_size;
4524 process_section_headers (FILE * file)
4526 Elf_Internal_Shdr * section;
4529 section_headers = NULL;
4531 if (elf_header.e_shnum == 0)
4533 /* PR binutils/12467. */
4534 if (elf_header.e_shoff != 0)
4535 warn (_("possibly corrupt ELF file header - it has a non-zero"
4536 " section header offset, but no section headers\n"));
4537 else if (do_sections)
4538 printf (_("\nThere are no sections in this file.\n"));
4543 if (do_sections && !do_header)
4544 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4545 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4549 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4552 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4555 /* Read in the string table, so that we have names to display. */
4556 if (elf_header.e_shstrndx != SHN_UNDEF
4557 && elf_header.e_shstrndx < elf_header.e_shnum)
4559 section = section_headers + elf_header.e_shstrndx;
4561 if (section->sh_size != 0)
4563 string_table = (char *) get_data (NULL, file, section->sh_offset,
4564 1, section->sh_size,
4567 string_table_length = string_table != NULL ? section->sh_size : 0;
4571 /* Scan the sections for the dynamic symbol table
4572 and dynamic string table and debug sections. */
4573 dynamic_symbols = NULL;
4574 dynamic_strings = NULL;
4575 dynamic_syminfo = NULL;
4576 symtab_shndx_hdr = NULL;
4578 eh_addr_size = is_32bit_elf ? 4 : 8;
4579 switch (elf_header.e_machine)
4582 case EM_MIPS_RS3_LE:
4583 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4584 FDE addresses. However, the ABI also has a semi-official ILP32
4585 variant for which the normal FDE address size rules apply.
4587 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4588 section, where XX is the size of longs in bits. Unfortunately,
4589 earlier compilers provided no way of distinguishing ILP32 objects
4590 from LP64 objects, so if there's any doubt, we should assume that
4591 the official LP64 form is being used. */
4592 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4593 && find_section (".gcc_compiled_long32") == NULL)
4599 switch (elf_header.e_flags & EF_H8_MACH)
4601 case E_H8_MACH_H8300:
4602 case E_H8_MACH_H8300HN:
4603 case E_H8_MACH_H8300SN:
4604 case E_H8_MACH_H8300SXN:
4607 case E_H8_MACH_H8300H:
4608 case E_H8_MACH_H8300S:
4609 case E_H8_MACH_H8300SX:
4617 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4619 case EF_M32C_CPU_M16C:
4626 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4629 size_t expected_entsize \
4630 = is_32bit_elf ? size32 : size64; \
4631 if (section->sh_entsize != expected_entsize) \
4632 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4633 i, (unsigned long int) section->sh_entsize, \
4634 (unsigned long int) expected_entsize); \
4635 section->sh_entsize = expected_entsize; \
4638 #define CHECK_ENTSIZE(section, i, type) \
4639 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4640 sizeof (Elf64_External_##type))
4642 for (i = 0, section = section_headers;
4643 i < elf_header.e_shnum;
4646 char * name = SECTION_NAME (section);
4648 if (section->sh_type == SHT_DYNSYM)
4650 if (dynamic_symbols != NULL)
4652 error (_("File contains multiple dynamic symbol tables\n"));
4656 CHECK_ENTSIZE (section, i, Sym);
4657 dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
4659 else if (section->sh_type == SHT_STRTAB
4660 && streq (name, ".dynstr"))
4662 if (dynamic_strings != NULL)
4664 error (_("File contains multiple dynamic string tables\n"));
4668 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4669 1, section->sh_size,
4670 _("dynamic strings"));
4671 dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
4673 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4675 if (symtab_shndx_hdr != NULL)
4677 error (_("File contains multiple symtab shndx tables\n"));
4680 symtab_shndx_hdr = section;
4682 else if (section->sh_type == SHT_SYMTAB)
4683 CHECK_ENTSIZE (section, i, Sym);
4684 else if (section->sh_type == SHT_GROUP)
4685 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4686 else if (section->sh_type == SHT_REL)
4687 CHECK_ENTSIZE (section, i, Rel);
4688 else if (section->sh_type == SHT_RELA)
4689 CHECK_ENTSIZE (section, i, Rela);
4690 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4691 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4692 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4693 || do_debug_str || do_debug_loc || do_debug_ranges
4694 || do_debug_addr || do_debug_cu_index)
4695 && (const_strneq (name, ".debug_")
4696 || const_strneq (name, ".zdebug_")))
4699 name += sizeof (".zdebug_") - 1;
4701 name += sizeof (".debug_") - 1;
4704 || (do_debug_info && const_strneq (name, "info"))
4705 || (do_debug_info && const_strneq (name, "types"))
4706 || (do_debug_abbrevs && const_strneq (name, "abbrev"))
4707 || (do_debug_lines && const_strneq (name, "line"))
4708 || (do_debug_pubnames && const_strneq (name, "pubnames"))
4709 || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
4710 || (do_debug_aranges && const_strneq (name, "aranges"))
4711 || (do_debug_ranges && const_strneq (name, "ranges"))
4712 || (do_debug_frames && const_strneq (name, "frame"))
4713 || (do_debug_macinfo && const_strneq (name, "macinfo"))
4714 || (do_debug_macinfo && const_strneq (name, "macro"))
4715 || (do_debug_str && const_strneq (name, "str"))
4716 || (do_debug_loc && const_strneq (name, "loc"))
4717 || (do_debug_addr && const_strneq (name, "addr"))
4718 || (do_debug_cu_index && const_strneq (name, "cu_index"))
4719 || (do_debug_cu_index && const_strneq (name, "tu_index"))
4721 request_dump_bynumber (i, DEBUG_DUMP);
4723 /* Linkonce section to be combined with .debug_info at link time. */
4724 else if ((do_debugging || do_debug_info)
4725 && const_strneq (name, ".gnu.linkonce.wi."))
4726 request_dump_bynumber (i, DEBUG_DUMP);
4727 else if (do_debug_frames && streq (name, ".eh_frame"))
4728 request_dump_bynumber (i, DEBUG_DUMP);
4729 else if (do_gdb_index && streq (name, ".gdb_index"))
4730 request_dump_bynumber (i, DEBUG_DUMP);
4731 /* Trace sections for Itanium VMS. */
4732 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4733 || do_trace_aranges)
4734 && const_strneq (name, ".trace_"))
4736 name += sizeof (".trace_") - 1;
4739 || (do_trace_info && streq (name, "info"))
4740 || (do_trace_abbrevs && streq (name, "abbrev"))
4741 || (do_trace_aranges && streq (name, "aranges"))
4743 request_dump_bynumber (i, DEBUG_DUMP);
4751 if (elf_header.e_shnum > 1)
4752 printf (_("\nSection Headers:\n"));
4754 printf (_("\nSection Header:\n"));
4758 if (do_section_details)
4760 printf (_(" [Nr] Name\n"));
4761 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4765 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4769 if (do_section_details)
4771 printf (_(" [Nr] Name\n"));
4772 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4776 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4780 if (do_section_details)
4782 printf (_(" [Nr] Name\n"));
4783 printf (_(" Type Address Offset Link\n"));
4784 printf (_(" Size EntSize Info Align\n"));
4788 printf (_(" [Nr] Name Type Address Offset\n"));
4789 printf (_(" Size EntSize Flags Link Info Align\n"));
4793 if (do_section_details)
4794 printf (_(" Flags\n"));
4796 for (i = 0, section = section_headers;
4797 i < elf_header.e_shnum;
4800 printf (" [%2u] ", i);
4801 if (do_section_details)
4803 print_symbol (INT_MAX, SECTION_NAME (section));
4808 print_symbol (-17, SECTION_NAME (section));
4811 printf (do_wide ? " %-15s " : " %-15.15s ",
4812 get_section_type_name (section->sh_type));
4816 const char * link_too_big = NULL;
4818 print_vma (section->sh_addr, LONG_HEX);
4820 printf ( " %6.6lx %6.6lx %2.2lx",
4821 (unsigned long) section->sh_offset,
4822 (unsigned long) section->sh_size,
4823 (unsigned long) section->sh_entsize);
4825 if (do_section_details)
4826 fputs (" ", stdout);
4828 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4830 if (section->sh_link >= elf_header.e_shnum)
4833 /* The sh_link value is out of range. Normally this indicates
4834 an error but it can have special values in Solaris binaries. */
4835 switch (elf_header.e_machine)
4842 case EM_OLD_SPARCV9:
4843 case EM_SPARC32PLUS:
4846 if (section->sh_link == (SHN_BEFORE & 0xffff))
4847 link_too_big = "BEFORE";
4848 else if (section->sh_link == (SHN_AFTER & 0xffff))
4849 link_too_big = "AFTER";
4856 if (do_section_details)
4858 if (link_too_big != NULL && * link_too_big)
4859 printf ("<%s> ", link_too_big);
4861 printf ("%2u ", section->sh_link);
4862 printf ("%3u %2lu\n", section->sh_info,
4863 (unsigned long) section->sh_addralign);
4866 printf ("%2u %3u %2lu\n",
4869 (unsigned long) section->sh_addralign);
4871 if (link_too_big && ! * link_too_big)
4872 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4873 i, section->sh_link);
4877 print_vma (section->sh_addr, LONG_HEX);
4879 if ((long) section->sh_offset == section->sh_offset)
4880 printf (" %6.6lx", (unsigned long) section->sh_offset);
4884 print_vma (section->sh_offset, LONG_HEX);
4887 if ((unsigned long) section->sh_size == section->sh_size)
4888 printf (" %6.6lx", (unsigned long) section->sh_size);
4892 print_vma (section->sh_size, LONG_HEX);
4895 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4896 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4900 print_vma (section->sh_entsize, LONG_HEX);
4903 if (do_section_details)
4904 fputs (" ", stdout);
4906 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4908 printf ("%2u %3u ", section->sh_link, section->sh_info);
4910 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4911 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4914 print_vma (section->sh_addralign, DEC);
4918 else if (do_section_details)
4920 printf (" %-15.15s ",
4921 get_section_type_name (section->sh_type));
4922 print_vma (section->sh_addr, LONG_HEX);
4923 if ((long) section->sh_offset == section->sh_offset)
4924 printf (" %16.16lx", (unsigned long) section->sh_offset);
4928 print_vma (section->sh_offset, LONG_HEX);
4930 printf (" %u\n ", section->sh_link);
4931 print_vma (section->sh_size, LONG_HEX);
4933 print_vma (section->sh_entsize, LONG_HEX);
4935 printf (" %-16u %lu\n",
4937 (unsigned long) section->sh_addralign);
4942 print_vma (section->sh_addr, LONG_HEX);
4943 if ((long) section->sh_offset == section->sh_offset)
4944 printf (" %8.8lx", (unsigned long) section->sh_offset);
4948 print_vma (section->sh_offset, LONG_HEX);
4951 print_vma (section->sh_size, LONG_HEX);
4953 print_vma (section->sh_entsize, LONG_HEX);
4955 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4957 printf (" %2u %3u %lu\n",
4960 (unsigned long) section->sh_addralign);
4963 if (do_section_details)
4964 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4967 if (!do_section_details)
4969 if (elf_header.e_machine == EM_X86_64
4970 || elf_header.e_machine == EM_L1OM
4971 || elf_header.e_machine == EM_K1OM)
4972 printf (_("Key to Flags:\n\
4973 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4974 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4975 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4977 printf (_("Key to Flags:\n\
4978 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4979 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4980 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4987 get_group_flags (unsigned int flags)
4989 static char buff[32];
4999 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
5006 process_section_groups (FILE * file)
5008 Elf_Internal_Shdr * section;
5010 struct group * group;
5011 Elf_Internal_Shdr * symtab_sec;
5012 Elf_Internal_Shdr * strtab_sec;
5013 Elf_Internal_Sym * symtab;
5014 unsigned long num_syms;
5018 /* Don't process section groups unless needed. */
5019 if (!do_unwind && !do_section_groups)
5022 if (elf_header.e_shnum == 0)
5024 if (do_section_groups)
5025 printf (_("\nThere are no sections to group in this file.\n"));
5030 if (section_headers == NULL)
5032 error (_("Section headers are not available!\n"));
5033 /* PR 13622: This can happen with a corrupt ELF header. */
5037 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
5038 sizeof (struct group *));
5040 if (section_headers_groups == NULL)
5042 error (_("Out of memory\n"));
5046 /* Scan the sections for the group section. */
5048 for (i = 0, section = section_headers;
5049 i < elf_header.e_shnum;
5051 if (section->sh_type == SHT_GROUP)
5054 if (group_count == 0)
5056 if (do_section_groups)
5057 printf (_("\nThere are no section groups in this file.\n"));
5062 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
5064 if (section_groups == NULL)
5066 error (_("Out of memory\n"));
5076 for (i = 0, section = section_headers, group = section_groups;
5077 i < elf_header.e_shnum;
5080 if (section->sh_type == SHT_GROUP)
5082 char * name = SECTION_NAME (section);
5084 unsigned char * start;
5085 unsigned char * indices;
5086 unsigned int entry, j, size;
5087 Elf_Internal_Shdr * sec;
5088 Elf_Internal_Sym * sym;
5090 /* Get the symbol table. */
5091 if (section->sh_link >= elf_header.e_shnum
5092 || ((sec = section_headers + section->sh_link)->sh_type
5095 error (_("Bad sh_link in group section `%s'\n"), name);
5099 if (symtab_sec != sec)
5104 symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
5109 error (_("Corrupt header in group section `%s'\n"), name);
5113 if (section->sh_info >= num_syms)
5115 error (_("Bad sh_info in group section `%s'\n"), name);
5119 sym = symtab + section->sh_info;
5121 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5123 if (sym->st_shndx == 0
5124 || sym->st_shndx >= elf_header.e_shnum)
5126 error (_("Bad sh_info in group section `%s'\n"), name);
5130 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5139 /* Get the string table. */
5140 if (symtab_sec->sh_link >= elf_header.e_shnum)
5149 != (sec = section_headers + symtab_sec->sh_link))
5154 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5155 1, strtab_sec->sh_size,
5157 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5159 group_name = sym->st_name < strtab_size
5160 ? strtab + sym->st_name : _("<corrupt>");
5163 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5164 1, section->sh_size,
5170 size = (section->sh_size / section->sh_entsize) - 1;
5171 entry = byte_get (indices, 4);
5174 if (do_section_groups)
5176 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5177 get_group_flags (entry), i, name, group_name, size);
5179 printf (_(" [Index] Name\n"));
5182 group->group_index = i;
5184 for (j = 0; j < size; j++)
5186 struct group_list * g;
5188 entry = byte_get (indices, 4);
5191 if (entry >= elf_header.e_shnum)
5193 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5194 entry, i, elf_header.e_shnum - 1);
5198 if (section_headers_groups [entry] != NULL)
5202 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5204 section_headers_groups [entry]->group_index);
5209 /* Intel C/C++ compiler may put section 0 in a
5210 section group. We just warn it the first time
5211 and ignore it afterwards. */
5212 static int warned = 0;
5215 error (_("section 0 in group section [%5u]\n"),
5216 section_headers_groups [entry]->group_index);
5222 section_headers_groups [entry] = group;
5224 if (do_section_groups)
5226 sec = section_headers + entry;
5227 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5230 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5231 g->section_index = entry;
5232 g->next = group->root;
5250 /* Data used to display dynamic fixups. */
5252 struct ia64_vms_dynfixup
5254 bfd_vma needed_ident; /* Library ident number. */
5255 bfd_vma needed; /* Index in the dstrtab of the library name. */
5256 bfd_vma fixup_needed; /* Index of the library. */
5257 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5258 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5261 /* Data used to display dynamic relocations. */
5263 struct ia64_vms_dynimgrela
5265 bfd_vma img_rela_cnt; /* Number of relocations. */
5266 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5269 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5273 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5274 const char *strtab, unsigned int strtab_sz)
5276 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5278 const char *lib_name;
5280 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5281 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5282 _("dynamic section image fixups"));
5286 if (fixup->needed < strtab_sz)
5287 lib_name = strtab + fixup->needed;
5290 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5291 (unsigned long) fixup->needed);
5294 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5295 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5297 (_("Seg Offset Type SymVec DataType\n"));
5299 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5304 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5305 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5306 type = BYTE_GET (imfs [i].type);
5307 rtype = elf_ia64_reloc_type (type);
5309 printf (" 0x%08x ", type);
5311 printf (" %-32s ", rtype);
5312 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5313 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5319 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5322 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5324 Elf64_External_VMS_IMAGE_RELA *imrs;
5327 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5328 1, imgrela->img_rela_cnt * sizeof (*imrs),
5329 _("dynamic section image relocations"));
5333 printf (_("\nImage relocs\n"));
5335 (_("Seg Offset Type Addend Seg Sym Off\n"));
5337 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5342 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5343 printf ("%08" BFD_VMA_FMT "x ",
5344 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5345 type = BYTE_GET (imrs [i].type);
5346 rtype = elf_ia64_reloc_type (type);
5348 printf ("0x%08x ", type);
5350 printf ("%-31s ", rtype);
5351 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5352 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5353 printf ("%08" BFD_VMA_FMT "x\n",
5354 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5360 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5363 process_ia64_vms_dynamic_relocs (FILE *file)
5365 struct ia64_vms_dynfixup fixup;
5366 struct ia64_vms_dynimgrela imgrela;
5367 Elf_Internal_Dyn *entry;
5369 bfd_vma strtab_off = 0;
5370 bfd_vma strtab_sz = 0;
5371 char *strtab = NULL;
5373 memset (&fixup, 0, sizeof (fixup));
5374 memset (&imgrela, 0, sizeof (imgrela));
5376 /* Note: the order of the entries is specified by the OpenVMS specs. */
5377 for (entry = dynamic_section;
5378 entry < dynamic_section + dynamic_nent;
5381 switch (entry->d_tag)
5383 case DT_IA_64_VMS_STRTAB_OFFSET:
5384 strtab_off = entry->d_un.d_val;
5387 strtab_sz = entry->d_un.d_val;
5389 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5390 1, strtab_sz, _("dynamic string section"));
5393 case DT_IA_64_VMS_NEEDED_IDENT:
5394 fixup.needed_ident = entry->d_un.d_val;
5397 fixup.needed = entry->d_un.d_val;
5399 case DT_IA_64_VMS_FIXUP_NEEDED:
5400 fixup.fixup_needed = entry->d_un.d_val;
5402 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5403 fixup.fixup_rela_cnt = entry->d_un.d_val;
5405 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5406 fixup.fixup_rela_off = entry->d_un.d_val;
5408 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5411 case DT_IA_64_VMS_IMG_RELA_CNT:
5412 imgrela.img_rela_cnt = entry->d_un.d_val;
5414 case DT_IA_64_VMS_IMG_RELA_OFF:
5415 imgrela.img_rela_off = entry->d_un.d_val;
5417 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5437 } dynamic_relocations [] =
5439 { "REL", DT_REL, DT_RELSZ, FALSE },
5440 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5441 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5444 /* Process the reloc section. */
5447 process_relocs (FILE * file)
5449 unsigned long rel_size;
5450 unsigned long rel_offset;
5456 if (do_using_dynamic)
5460 int has_dynamic_reloc;
5463 has_dynamic_reloc = 0;
5465 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5467 is_rela = dynamic_relocations [i].rela;
5468 name = dynamic_relocations [i].name;
5469 rel_size = dynamic_info [dynamic_relocations [i].size];
5470 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5472 has_dynamic_reloc |= rel_size;
5474 if (is_rela == UNKNOWN)
5476 if (dynamic_relocations [i].reloc == DT_JMPREL)
5477 switch (dynamic_info[DT_PLTREL])
5491 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5492 name, rel_offset, rel_size);
5494 dump_relocations (file,
5495 offset_from_vma (file, rel_offset, rel_size),
5497 dynamic_symbols, num_dynamic_syms,
5498 dynamic_strings, dynamic_strings_length, is_rela);
5503 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5505 if (! has_dynamic_reloc)
5506 printf (_("\nThere are no dynamic relocations in this file.\n"));
5510 Elf_Internal_Shdr * section;
5514 for (i = 0, section = section_headers;
5515 i < elf_header.e_shnum;
5518 if ( section->sh_type != SHT_RELA
5519 && section->sh_type != SHT_REL)
5522 rel_offset = section->sh_offset;
5523 rel_size = section->sh_size;
5527 Elf_Internal_Shdr * strsec;
5530 printf (_("\nRelocation section "));
5532 if (string_table == NULL)
5533 printf ("%d", section->sh_name);
5535 printf ("'%s'", SECTION_NAME (section));
5537 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5538 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5540 is_rela = section->sh_type == SHT_RELA;
5542 if (section->sh_link != 0
5543 && section->sh_link < elf_header.e_shnum)
5545 Elf_Internal_Shdr * symsec;
5546 Elf_Internal_Sym * symtab;
5547 unsigned long nsyms;
5548 unsigned long strtablen = 0;
5549 char * strtab = NULL;
5551 symsec = section_headers + section->sh_link;
5552 if (symsec->sh_type != SHT_SYMTAB
5553 && symsec->sh_type != SHT_DYNSYM)
5556 symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
5561 if (symsec->sh_link != 0
5562 && symsec->sh_link < elf_header.e_shnum)
5564 strsec = section_headers + symsec->sh_link;
5566 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5569 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5572 dump_relocations (file, rel_offset, rel_size,
5573 symtab, nsyms, strtab, strtablen, is_rela);
5579 dump_relocations (file, rel_offset, rel_size,
5580 NULL, 0, NULL, 0, is_rela);
5587 printf (_("\nThere are no relocations in this file.\n"));
5593 /* Process the unwind section. */
5595 #include "unwind-ia64.h"
5597 /* An absolute address consists of a section and an offset. If the
5598 section is NULL, the offset itself is the address, otherwise, the
5599 address equals to LOAD_ADDRESS(section) + offset. */
5603 unsigned short section;
5607 #define ABSADDR(a) \
5609 ? section_headers [(a).section].sh_addr + (a).offset \
5612 struct ia64_unw_table_entry
5614 struct absaddr start;
5616 struct absaddr info;
5619 struct ia64_unw_aux_info
5622 struct ia64_unw_table_entry *table; /* Unwind table. */
5623 unsigned long table_len; /* Length of unwind table. */
5624 unsigned char * info; /* Unwind info. */
5625 unsigned long info_size; /* Size of unwind info. */
5626 bfd_vma info_addr; /* starting address of unwind info. */
5627 bfd_vma seg_base; /* Starting address of segment. */
5628 Elf_Internal_Sym * symtab; /* The symbol table. */
5629 unsigned long nsyms; /* Number of symbols. */
5630 char * strtab; /* The string table. */
5631 unsigned long strtab_size; /* Size of string table. */
5635 find_symbol_for_address (Elf_Internal_Sym * symtab,
5636 unsigned long nsyms,
5637 const char * strtab,
5638 unsigned long strtab_size,
5639 struct absaddr addr,
5640 const char ** symname,
5643 bfd_vma dist = 0x100000;
5644 Elf_Internal_Sym * sym;
5645 Elf_Internal_Sym * best = NULL;
5648 REMOVE_ARCH_BITS (addr.offset);
5650 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5652 bfd_vma value = sym->st_value;
5654 REMOVE_ARCH_BITS (value);
5656 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5657 && sym->st_name != 0
5658 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5659 && addr.offset >= value
5660 && addr.offset - value < dist)
5663 dist = addr.offset - value;
5671 *symname = (best->st_name >= strtab_size
5672 ? _("<corrupt>") : strtab + best->st_name);
5678 *offset = addr.offset;
5682 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5684 struct ia64_unw_table_entry * tp;
5687 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5691 const unsigned char * dp;
5692 const unsigned char * head;
5693 const char * procname;
5695 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5696 aux->strtab_size, tp->start, &procname, &offset);
5698 fputs ("\n<", stdout);
5702 fputs (procname, stdout);
5705 printf ("+%lx", (unsigned long) offset);
5708 fputs (">: [", stdout);
5709 print_vma (tp->start.offset, PREFIX_HEX);
5710 fputc ('-', stdout);
5711 print_vma (tp->end.offset, PREFIX_HEX);
5712 printf ("], info at +0x%lx\n",
5713 (unsigned long) (tp->info.offset - aux->seg_base));
5715 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5716 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5718 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5719 (unsigned) UNW_VER (stamp),
5720 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5721 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5722 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5723 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5725 if (UNW_VER (stamp) != 1)
5727 printf (_("\tUnknown version.\n"));
5732 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5733 dp = unw_decode (dp, in_body, & in_body);
5738 slurp_ia64_unwind_table (FILE * file,
5739 struct ia64_unw_aux_info * aux,
5740 Elf_Internal_Shdr * sec)
5742 unsigned long size, nrelas, i;
5743 Elf_Internal_Phdr * seg;
5744 struct ia64_unw_table_entry * tep;
5745 Elf_Internal_Shdr * relsec;
5746 Elf_Internal_Rela * rela;
5747 Elf_Internal_Rela * rp;
5748 unsigned char * table;
5750 Elf_Internal_Sym * sym;
5751 const char * relname;
5753 /* First, find the starting address of the segment that includes
5756 if (elf_header.e_phnum)
5758 if (! get_program_headers (file))
5761 for (seg = program_headers;
5762 seg < program_headers + elf_header.e_phnum;
5765 if (seg->p_type != PT_LOAD)
5768 if (sec->sh_addr >= seg->p_vaddr
5769 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5771 aux->seg_base = seg->p_vaddr;
5777 /* Second, build the unwind table from the contents of the unwind section: */
5778 size = sec->sh_size;
5779 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5784 aux->table = (struct ia64_unw_table_entry *)
5785 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5787 for (tp = table; tp < table + size; ++tep)
5789 tep->start.section = SHN_UNDEF;
5790 tep->end.section = SHN_UNDEF;
5791 tep->info.section = SHN_UNDEF;
5792 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5793 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5794 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5795 tep->start.offset += aux->seg_base;
5796 tep->end.offset += aux->seg_base;
5797 tep->info.offset += aux->seg_base;
5801 /* Third, apply any relocations to the unwind table: */
5802 for (relsec = section_headers;
5803 relsec < section_headers + elf_header.e_shnum;
5806 if (relsec->sh_type != SHT_RELA
5807 || relsec->sh_info >= elf_header.e_shnum
5808 || section_headers + relsec->sh_info != sec)
5811 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5815 for (rp = rela; rp < rela + nrelas; ++rp)
5817 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5818 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5820 if (! const_strneq (relname, "R_IA64_SEGREL"))
5822 warn (_("Skipping unexpected relocation type %s\n"), relname);
5826 i = rp->r_offset / (3 * eh_addr_size);
5828 switch (rp->r_offset/eh_addr_size % 3)
5831 aux->table[i].start.section = sym->st_shndx;
5832 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5835 aux->table[i].end.section = sym->st_shndx;
5836 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5839 aux->table[i].info.section = sym->st_shndx;
5840 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5850 aux->table_len = size / (3 * eh_addr_size);
5855 ia64_process_unwind (FILE * file)
5857 Elf_Internal_Shdr * sec;
5858 Elf_Internal_Shdr * unwsec = NULL;
5859 Elf_Internal_Shdr * strsec;
5860 unsigned long i, unwcount = 0, unwstart = 0;
5861 struct ia64_unw_aux_info aux;
5863 memset (& aux, 0, sizeof (aux));
5865 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5867 if (sec->sh_type == SHT_SYMTAB
5868 && sec->sh_link < elf_header.e_shnum)
5870 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
5872 strsec = section_headers + sec->sh_link;
5873 assert (aux.strtab == NULL);
5874 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5877 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5879 else if (sec->sh_type == SHT_IA_64_UNWIND)
5884 printf (_("\nThere are no unwind sections in this file.\n"));
5886 while (unwcount-- > 0)
5891 for (i = unwstart, sec = section_headers + unwstart;
5892 i < elf_header.e_shnum; ++i, ++sec)
5893 if (sec->sh_type == SHT_IA_64_UNWIND)
5900 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5902 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5904 /* We need to find which section group it is in. */
5905 struct group_list * g = section_headers_groups [i]->root;
5907 for (; g != NULL; g = g->next)
5909 sec = section_headers + g->section_index;
5911 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5916 i = elf_header.e_shnum;
5918 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5920 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5921 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5922 suffix = SECTION_NAME (unwsec) + len;
5923 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5925 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5926 && streq (SECTION_NAME (sec) + len2, suffix))
5931 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5932 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5933 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5934 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5936 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5937 suffix = SECTION_NAME (unwsec) + len;
5938 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5940 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5941 && streq (SECTION_NAME (sec) + len2, suffix))
5945 if (i == elf_header.e_shnum)
5947 printf (_("\nCould not find unwind info section for "));
5949 if (string_table == NULL)
5950 printf ("%d", unwsec->sh_name);
5952 printf (_("'%s'"), SECTION_NAME (unwsec));
5956 aux.info_addr = sec->sh_addr;
5957 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5960 aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
5962 printf (_("\nUnwind section "));
5964 if (string_table == NULL)
5965 printf ("%d", unwsec->sh_name);
5967 printf (_("'%s'"), SECTION_NAME (unwsec));
5969 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5970 (unsigned long) unwsec->sh_offset,
5971 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5973 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5975 if (aux.table_len > 0)
5976 dump_ia64_unwind (& aux);
5979 free ((char *) aux.table);
5981 free ((char *) aux.info);
5990 free ((char *) aux.strtab);
5993 struct hppa_unw_table_entry
5995 struct absaddr start;
5997 unsigned int Cannot_unwind:1; /* 0 */
5998 unsigned int Millicode:1; /* 1 */
5999 unsigned int Millicode_save_sr0:1; /* 2 */
6000 unsigned int Region_description:2; /* 3..4 */
6001 unsigned int reserved1:1; /* 5 */
6002 unsigned int Entry_SR:1; /* 6 */
6003 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
6004 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
6005 unsigned int Args_stored:1; /* 16 */
6006 unsigned int Variable_Frame:1; /* 17 */
6007 unsigned int Separate_Package_Body:1; /* 18 */
6008 unsigned int Frame_Extension_Millicode:1; /* 19 */
6009 unsigned int Stack_Overflow_Check:1; /* 20 */
6010 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
6011 unsigned int Ada_Region:1; /* 22 */
6012 unsigned int cxx_info:1; /* 23 */
6013 unsigned int cxx_try_catch:1; /* 24 */
6014 unsigned int sched_entry_seq:1; /* 25 */
6015 unsigned int reserved2:1; /* 26 */
6016 unsigned int Save_SP:1; /* 27 */
6017 unsigned int Save_RP:1; /* 28 */
6018 unsigned int Save_MRP_in_frame:1; /* 29 */
6019 unsigned int extn_ptr_defined:1; /* 30 */
6020 unsigned int Cleanup_defined:1; /* 31 */
6022 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
6023 unsigned int HP_UX_interrupt_marker:1; /* 1 */
6024 unsigned int Large_frame:1; /* 2 */
6025 unsigned int Pseudo_SP_Set:1; /* 3 */
6026 unsigned int reserved4:1; /* 4 */
6027 unsigned int Total_frame_size:27; /* 5..31 */
6030 struct hppa_unw_aux_info
6032 struct hppa_unw_table_entry *table; /* Unwind table. */
6033 unsigned long table_len; /* Length of unwind table. */
6034 bfd_vma seg_base; /* Starting address of segment. */
6035 Elf_Internal_Sym * symtab; /* The symbol table. */
6036 unsigned long nsyms; /* Number of symbols. */
6037 char * strtab; /* The string table. */
6038 unsigned long strtab_size; /* Size of string table. */
6042 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
6044 struct hppa_unw_table_entry * tp;
6046 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6049 const char * procname;
6051 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6052 aux->strtab_size, tp->start, &procname,
6055 fputs ("\n<", stdout);
6059 fputs (procname, stdout);
6062 printf ("+%lx", (unsigned long) offset);
6065 fputs (">: [", stdout);
6066 print_vma (tp->start.offset, PREFIX_HEX);
6067 fputc ('-', stdout);
6068 print_vma (tp->end.offset, PREFIX_HEX);
6071 #define PF(_m) if (tp->_m) printf (#_m " ");
6072 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
6075 PF(Millicode_save_sr0);
6076 /* PV(Region_description); */
6082 PF(Separate_Package_Body);
6083 PF(Frame_Extension_Millicode);
6084 PF(Stack_Overflow_Check);
6085 PF(Two_Instruction_SP_Increment);
6089 PF(sched_entry_seq);
6092 PF(Save_MRP_in_frame);
6093 PF(extn_ptr_defined);
6094 PF(Cleanup_defined);
6095 PF(MPE_XL_interrupt_marker);
6096 PF(HP_UX_interrupt_marker);
6099 PV(Total_frame_size);
6108 slurp_hppa_unwind_table (FILE * file,
6109 struct hppa_unw_aux_info * aux,
6110 Elf_Internal_Shdr * sec)
6112 unsigned long size, unw_ent_size, nentries, nrelas, i;
6113 Elf_Internal_Phdr * seg;
6114 struct hppa_unw_table_entry * tep;
6115 Elf_Internal_Shdr * relsec;
6116 Elf_Internal_Rela * rela;
6117 Elf_Internal_Rela * rp;
6118 unsigned char * table;
6120 Elf_Internal_Sym * sym;
6121 const char * relname;
6123 /* First, find the starting address of the segment that includes
6126 if (elf_header.e_phnum)
6128 if (! get_program_headers (file))
6131 for (seg = program_headers;
6132 seg < program_headers + elf_header.e_phnum;
6135 if (seg->p_type != PT_LOAD)
6138 if (sec->sh_addr >= seg->p_vaddr
6139 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6141 aux->seg_base = seg->p_vaddr;
6147 /* Second, build the unwind table from the contents of the unwind
6149 size = sec->sh_size;
6150 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6156 nentries = size / unw_ent_size;
6157 size = unw_ent_size * nentries;
6159 tep = aux->table = (struct hppa_unw_table_entry *)
6160 xcmalloc (nentries, sizeof (aux->table[0]));
6162 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6164 unsigned int tmp1, tmp2;
6166 tep->start.section = SHN_UNDEF;
6167 tep->end.section = SHN_UNDEF;
6169 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6170 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6171 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6172 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6174 tep->start.offset += aux->seg_base;
6175 tep->end.offset += aux->seg_base;
6177 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6178 tep->Millicode = (tmp1 >> 30) & 0x1;
6179 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6180 tep->Region_description = (tmp1 >> 27) & 0x3;
6181 tep->reserved1 = (tmp1 >> 26) & 0x1;
6182 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6183 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6184 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6185 tep->Args_stored = (tmp1 >> 15) & 0x1;
6186 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6187 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6188 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6189 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6190 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6191 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6192 tep->cxx_info = (tmp1 >> 8) & 0x1;
6193 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6194 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6195 tep->reserved2 = (tmp1 >> 5) & 0x1;
6196 tep->Save_SP = (tmp1 >> 4) & 0x1;
6197 tep->Save_RP = (tmp1 >> 3) & 0x1;
6198 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6199 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6200 tep->Cleanup_defined = tmp1 & 0x1;
6202 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6203 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6204 tep->Large_frame = (tmp2 >> 29) & 0x1;
6205 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6206 tep->reserved4 = (tmp2 >> 27) & 0x1;
6207 tep->Total_frame_size = tmp2 & 0x7ffffff;
6211 /* Third, apply any relocations to the unwind table. */
6212 for (relsec = section_headers;
6213 relsec < section_headers + elf_header.e_shnum;
6216 if (relsec->sh_type != SHT_RELA
6217 || relsec->sh_info >= elf_header.e_shnum
6218 || section_headers + relsec->sh_info != sec)
6221 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6225 for (rp = rela; rp < rela + nrelas; ++rp)
6227 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6228 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6230 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6231 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6233 warn (_("Skipping unexpected relocation type %s\n"), relname);
6237 i = rp->r_offset / unw_ent_size;
6239 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6242 aux->table[i].start.section = sym->st_shndx;
6243 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6246 aux->table[i].end.section = sym->st_shndx;
6247 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6257 aux->table_len = nentries;
6263 hppa_process_unwind (FILE * file)
6265 struct hppa_unw_aux_info aux;
6266 Elf_Internal_Shdr * unwsec = NULL;
6267 Elf_Internal_Shdr * strsec;
6268 Elf_Internal_Shdr * sec;
6271 if (string_table == NULL)
6274 memset (& aux, 0, sizeof (aux));
6276 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6278 if (sec->sh_type == SHT_SYMTAB
6279 && sec->sh_link < elf_header.e_shnum)
6281 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
6283 strsec = section_headers + sec->sh_link;
6284 assert (aux.strtab == NULL);
6285 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6288 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6290 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6295 printf (_("\nThere are no unwind sections in this file.\n"));
6297 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6299 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6301 printf (_("\nUnwind section "));
6302 printf (_("'%s'"), SECTION_NAME (sec));
6304 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6305 (unsigned long) sec->sh_offset,
6306 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6308 slurp_hppa_unwind_table (file, &aux, sec);
6309 if (aux.table_len > 0)
6310 dump_hppa_unwind (&aux);
6313 free ((char *) aux.table);
6321 free ((char *) aux.strtab);
6326 unsigned char * data; /* The unwind data. */
6327 Elf_Internal_Shdr * sec; /* The cached unwind section header. */
6328 Elf_Internal_Rela * rela; /* The cached relocations for this section. */
6329 unsigned long nrelas; /* The number of relocations. */
6330 unsigned int rel_type; /* REL or RELA ? */
6331 Elf_Internal_Rela * next_rela; /* Cyclic pointer to the next reloc to process. */
6334 struct arm_unw_aux_info
6336 FILE * file; /* The file containing the unwind sections. */
6337 Elf_Internal_Sym * symtab; /* The file's symbol table. */
6338 unsigned long nsyms; /* Number of symbols. */
6339 char * strtab; /* The file's string table. */
6340 unsigned long strtab_size; /* Size of string table. */
6344 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6345 bfd_vma fn, struct absaddr addr)
6347 const char *procname;
6350 if (addr.section == SHN_UNDEF)
6353 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6354 aux->strtab_size, addr, &procname,
6357 print_vma (fn, PREFIX_HEX);
6361 fputs (" <", stdout);
6362 fputs (procname, stdout);
6365 printf ("+0x%lx", (unsigned long) sym_offset);
6366 fputc ('>', stdout);
6373 arm_free_section (struct arm_section *arm_sec)
6375 if (arm_sec->data != NULL)
6376 free (arm_sec->data);
6378 if (arm_sec->rela != NULL)
6379 free (arm_sec->rela);
6382 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
6383 cached section and install SEC instead.
6384 2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
6385 and return its valued in * WORDP, relocating if necessary.
6386 3) Update the NEXT_RELA field in ARM_SEC and store the section index and
6387 relocation's offset in ADDR.
6388 4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
6389 into the string table of the symbol associated with the reloc. If no
6390 reloc was applied store -1 there.
6391 5) Return TRUE upon success, FALSE otherwise. */
6394 get_unwind_section_word (struct arm_unw_aux_info * aux,
6395 struct arm_section * arm_sec,
6396 Elf_Internal_Shdr * sec,
6397 bfd_vma word_offset,
6398 unsigned int * wordp,
6399 struct absaddr * addr,
6402 Elf_Internal_Rela *rp;
6403 Elf_Internal_Sym *sym;
6404 const char * relname;
6406 bfd_boolean wrapped;
6408 addr->section = SHN_UNDEF;
6411 if (sym_name != NULL)
6412 *sym_name = (bfd_vma) -1;
6414 /* If necessary, update the section cache. */
6415 if (sec != arm_sec->sec)
6417 Elf_Internal_Shdr *relsec;
6419 arm_free_section (arm_sec);
6422 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6423 sec->sh_size, _("unwind data"));
6424 arm_sec->rela = NULL;
6425 arm_sec->nrelas = 0;
6427 for (relsec = section_headers;
6428 relsec < section_headers + elf_header.e_shnum;
6431 if (relsec->sh_info >= elf_header.e_shnum
6432 || section_headers + relsec->sh_info != sec)
6435 arm_sec->rel_type = relsec->sh_type;
6436 if (relsec->sh_type == SHT_REL)
6438 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6440 & arm_sec->rela, & arm_sec->nrelas))
6444 else if (relsec->sh_type == SHT_RELA)
6446 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6448 & arm_sec->rela, & arm_sec->nrelas))
6453 warn (_("unexpected relocation type (%d) for section %d"),
6454 relsec->sh_type, relsec->sh_info);
6457 arm_sec->next_rela = arm_sec->rela;
6460 /* If there is no unwind data we can do nothing. */
6461 if (arm_sec->data == NULL)
6464 /* Get the word at the required offset. */
6465 word = byte_get (arm_sec->data + word_offset, 4);
6467 /* Look through the relocs to find the one that applies to the provided offset. */
6469 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6471 bfd_vma prelval, offset;
6473 if (rp->r_offset > word_offset && !wrapped)
6478 if (rp->r_offset > word_offset)
6481 if (rp->r_offset & 3)
6483 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6484 (unsigned long) rp->r_offset);
6488 if (rp->r_offset < word_offset)
6491 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6493 if (arm_sec->rel_type == SHT_REL)
6495 offset = word & 0x7fffffff;
6496 if (offset & 0x40000000)
6497 offset |= ~ (bfd_vma) 0x7fffffff;
6499 else if (arm_sec->rel_type == SHT_RELA)
6500 offset = rp->r_addend;
6504 offset += sym->st_value;
6505 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6507 /* Check that we are processing the expected reloc type. */
6508 if (elf_header.e_machine == EM_ARM)
6510 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6512 if (streq (relname, "R_ARM_NONE"))
6515 if (! streq (relname, "R_ARM_PREL31"))
6517 warn (_("Skipping unexpected relocation type %s\n"), relname);
6521 else if (elf_header.e_machine == EM_TI_C6000)
6523 relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
6525 if (streq (relname, "R_C6000_NONE"))
6528 if (! streq (relname, "R_C6000_PREL31"))
6530 warn (_("Skipping unexpected relocation type %s\n"), relname);
6537 /* This function currently only supports ARM and TI unwinders. */
6540 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6541 addr->section = sym->st_shndx;
6542 addr->offset = offset;
6544 * sym_name = sym->st_name;
6549 arm_sec->next_rela = rp;
6554 static const char *tic6x_unwind_regnames[16] =
6556 "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
6557 "A14", "A13", "A12", "A11", "A10",
6558 "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
6562 decode_tic6x_unwind_regmask (unsigned int mask)
6566 for (i = 12; mask; mask >>= 1, i--)
6570 fputs (tic6x_unwind_regnames[i], stdout);
6572 fputs (", ", stdout);
6578 if (remaining == 0 && more_words) \
6581 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, \
6582 data_offset, & word, & addr, NULL)) \
6588 #define GET_OP(OP) \
6593 (OP) = word >> 24; \
6598 printf (_("[Truncated opcode]\n")); \
6601 printf ("0x%02x ", OP)
6604 decode_arm_unwind_bytecode (struct arm_unw_aux_info *aux,
6605 unsigned int word, unsigned int remaining,
6606 unsigned int more_words,
6607 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6608 struct arm_section *data_arm_sec)
6610 struct absaddr addr;
6612 /* Decode the unwinding instructions. */
6615 unsigned int op, op2;
6624 printf (" 0x%02x ", op);
6626 if ((op & 0xc0) == 0x00)
6628 int offset = ((op & 0x3f) << 2) + 4;
6630 printf (" vsp = vsp + %d", offset);
6632 else if ((op & 0xc0) == 0x40)
6634 int offset = ((op & 0x3f) << 2) + 4;
6636 printf (" vsp = vsp - %d", offset);
6638 else if ((op & 0xf0) == 0x80)
6641 if (op == 0x80 && op2 == 0)
6642 printf (_("Refuse to unwind"));
6645 unsigned int mask = ((op & 0x0f) << 8) | op2;
6650 for (i = 0; i < 12; i++)
6651 if (mask & (1 << i))
6657 printf ("r%d", 4 + i);
6662 else if ((op & 0xf0) == 0x90)
6664 if (op == 0x9d || op == 0x9f)
6665 printf (_(" [Reserved]"));
6667 printf (" vsp = r%d", op & 0x0f);
6669 else if ((op & 0xf0) == 0xa0)
6671 int end = 4 + (op & 0x07);
6676 for (i = 4; i <= end; i++)
6692 else if (op == 0xb0)
6693 printf (_(" finish"));
6694 else if (op == 0xb1)
6697 if (op2 == 0 || (op2 & 0xf0) != 0)
6698 printf (_("[Spare]"));
6701 unsigned int mask = op2 & 0x0f;
6706 for (i = 0; i < 12; i++)
6707 if (mask & (1 << i))
6718 else if (op == 0xb2)
6720 unsigned char buf[9];
6721 unsigned int i, len;
6722 unsigned long offset;
6724 for (i = 0; i < sizeof (buf); i++)
6727 if ((buf[i] & 0x80) == 0)
6730 assert (i < sizeof (buf));
6731 offset = read_uleb128 (buf, &len);
6732 assert (len == i + 1);
6733 offset = offset * 4 + 0x204;
6734 printf ("vsp = vsp + %ld", offset);
6736 else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
6738 unsigned int first, last;
6745 printf ("pop {D%d", first);
6747 printf ("-D%d", first + last);
6750 else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
6752 unsigned int count = op & 0x07;
6756 printf ("-D%d", 8 + count);
6759 else if (op >= 0xc0 && op <= 0xc5)
6761 unsigned int count = op & 0x07;
6763 printf (" pop {wR10");
6765 printf ("-wR%d", 10 + count);
6768 else if (op == 0xc6)
6770 unsigned int first, last;
6775 printf ("pop {wR%d", first);
6777 printf ("-wR%d", first + last);
6780 else if (op == 0xc7)
6783 if (op2 == 0 || (op2 & 0xf0) != 0)
6784 printf (_("[Spare]"));
6787 unsigned int mask = op2 & 0x0f;
6792 for (i = 0; i < 4; i++)
6793 if (mask & (1 << i))
6799 printf ("wCGR%d", i);
6805 printf (_(" [unsupported opcode]"));
6811 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *aux,
6812 unsigned int word, unsigned int remaining,
6813 unsigned int more_words,
6814 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6815 struct arm_section *data_arm_sec)
6817 struct absaddr addr;
6819 /* Decode the unwinding instructions. */
6822 unsigned int op, op2;
6831 printf (" 0x%02x ", op);
6833 if ((op & 0xc0) == 0x00)
6835 int offset = ((op & 0x3f) << 3) + 8;
6836 printf (" sp = sp + %d", offset);
6838 else if ((op & 0xc0) == 0x80)
6841 if (op == 0x80 && op2 == 0)
6842 printf (_("Refuse to unwind"));
6845 unsigned int mask = ((op & 0x1f) << 8) | op2;
6847 printf ("pop compact {");
6851 decode_tic6x_unwind_regmask (mask);
6855 else if ((op & 0xf0) == 0xc0)
6863 unsigned int offset;
6867 /* Scan entire instruction first so that GET_OP output is not
6868 interleaved with disassembly. */
6870 for (i = 0; nregs < (op & 0xf); i++)
6876 regpos[nregs].offset = i * 2;
6877 regpos[nregs].reg = reg;
6884 regpos[nregs].offset = i * 2 + 1;
6885 regpos[nregs].reg = reg;
6890 printf (_("pop frame {"));
6892 for (i = i * 2; i > 0; i--)
6894 if (regpos[reg].offset == i - 1)
6896 name = tic6x_unwind_regnames[regpos[reg].reg];
6903 fputs (name, stdout);
6910 else if (op == 0xd0)
6911 printf (" MOV FP, SP");
6912 else if (op == 0xd1)
6913 printf (" __c6xabi_pop_rts");
6914 else if (op == 0xd2)
6916 unsigned char buf[9];
6917 unsigned int i, len;
6918 unsigned long offset;
6920 for (i = 0; i < sizeof (buf); i++)
6923 if ((buf[i] & 0x80) == 0)
6926 assert (i < sizeof (buf));
6927 offset = read_uleb128 (buf, &len);
6928 assert (len == i + 1);
6929 offset = offset * 8 + 0x408;
6930 printf (_("sp = sp + %ld"), offset);
6932 else if ((op & 0xf0) == 0xe0)
6934 if ((op & 0x0f) == 7)
6937 printf (" MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
6941 printf (_(" [unsupported opcode]"));
6948 arm_expand_prel31 (bfd_vma word, bfd_vma where)
6952 offset = word & 0x7fffffff;
6953 if (offset & 0x40000000)
6954 offset |= ~ (bfd_vma) 0x7fffffff;
6956 if (elf_header.e_machine == EM_TI_C6000)
6959 return offset + where;
6963 decode_arm_unwind (struct arm_unw_aux_info * aux,
6965 unsigned int remaining,
6966 bfd_vma data_offset,
6967 Elf_Internal_Shdr * data_sec,
6968 struct arm_section * data_arm_sec)
6971 unsigned int more_words = 0;
6972 struct absaddr addr;
6973 bfd_vma sym_name = (bfd_vma) -1;
6977 /* Fetch the first word.
6978 Note - when decoding an object file the address extracted
6979 here will always be 0. So we also pass in the sym_name
6980 parameter so that we can find the symbol associated with
6981 the personality routine. */
6982 if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
6983 & word, & addr, & sym_name))
6989 if ((word & 0x80000000) == 0)
6991 /* Expand prel31 for personality routine. */
6993 const char *procname;
6995 fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
6996 printf (_(" Personality routine: "));
6998 && addr.section == SHN_UNDEF && addr.offset == 0
6999 && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
7001 procname = aux->strtab + sym_name;
7002 print_vma (fn, PREFIX_HEX);
7005 fputs (" <", stdout);
7006 fputs (procname, stdout);
7007 fputc ('>', stdout);
7011 procname = arm_print_vma_and_name (aux, fn, addr);
7012 fputc ('\n', stdout);
7014 /* The GCC personality routines use the standard compact
7015 encoding, starting with one byte giving the number of
7017 if (procname != NULL
7018 && (const_strneq (procname, "__gcc_personality_v0")
7019 || const_strneq (procname, "__gxx_personality_v0")
7020 || const_strneq (procname, "__gcj_personality_v0")
7021 || const_strneq (procname, "__gnu_objc_personality_v0")))
7028 printf (_(" [Truncated data]\n"));
7031 more_words = word >> 24;
7041 /* ARM EHABI Section 6.3:
7043 An exception-handling table entry for the compact model looks like:
7047 1 0 index Data for personalityRoutine[index] */
7049 if (elf_header.e_machine == EM_ARM
7050 && (word & 0x70000000))
7051 warn (_("Corrupt ARM compact model table entry: %x \n"), word);
7053 per_index = (word >> 24) & 0x7f;
7054 printf (_(" Compact model index: %d\n"), per_index);
7061 else if (per_index < 3)
7063 more_words = (word >> 16) & 0xff;
7069 switch (elf_header.e_machine)
7074 decode_arm_unwind_bytecode (aux, word, remaining, more_words,
7075 data_offset, data_sec, data_arm_sec);
7079 warn (_("Unknown ARM compact model index encountered\n"));
7080 printf (_(" [reserved]\n"));
7087 decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
7088 data_offset, data_sec, data_arm_sec);
7090 else if (per_index < 5)
7092 if (((word >> 17) & 0x7f) == 0x7f)
7093 printf (_(" Restore stack from frame pointer\n"));
7095 printf (_(" Stack increment %d\n"), (word >> 14) & 0x1fc);
7096 printf (_(" Registers restored: "));
7098 printf (" (compact) ");
7099 decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
7101 printf (_(" Return register: %s\n"),
7102 tic6x_unwind_regnames[word & 0xf]);
7105 printf (_(" [reserved (%d)]\n"), per_index);
7109 error (_("Unsupported architecture type %d encountered when decoding unwind table"),
7110 elf_header.e_machine);
7113 /* Decode the descriptors. Not implemented. */
7117 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
7119 struct arm_section exidx_arm_sec, extab_arm_sec;
7120 unsigned int i, exidx_len;
7122 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
7123 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
7124 exidx_len = exidx_sec->sh_size / 8;
7126 for (i = 0; i < exidx_len; i++)
7128 unsigned int exidx_fn, exidx_entry;
7129 struct absaddr fn_addr, entry_addr;
7132 fputc ('\n', stdout);
7134 if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7135 8 * i, & exidx_fn, & fn_addr, NULL)
7136 || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
7137 8 * i + 4, & exidx_entry, & entry_addr, NULL))
7139 arm_free_section (& exidx_arm_sec);
7140 arm_free_section (& extab_arm_sec);
7144 /* ARM EHABI, Section 5:
7145 An index table entry consists of 2 words.
7146 The first word contains a prel31 offset to the start of a function, with bit 31 clear. */
7147 if (exidx_fn & 0x80000000)
7148 warn (_("corrupt index table entry: %x\n"), exidx_fn);
7150 fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
7152 arm_print_vma_and_name (aux, fn, fn_addr);
7153 fputs (": ", stdout);
7155 if (exidx_entry == 1)
7157 print_vma (exidx_entry, PREFIX_HEX);
7158 fputs (" [cantunwind]\n", stdout);
7160 else if (exidx_entry & 0x80000000)
7162 print_vma (exidx_entry, PREFIX_HEX);
7163 fputc ('\n', stdout);
7164 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
7168 bfd_vma table, table_offset = 0;
7169 Elf_Internal_Shdr *table_sec;
7171 fputs ("@", stdout);
7172 table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
7173 print_vma (table, PREFIX_HEX);
7176 /* Locate the matching .ARM.extab. */
7177 if (entry_addr.section != SHN_UNDEF
7178 && entry_addr.section < elf_header.e_shnum)
7180 table_sec = section_headers + entry_addr.section;
7181 table_offset = entry_addr.offset;
7185 table_sec = find_section_by_address (table);
7186 if (table_sec != NULL)
7187 table_offset = table - table_sec->sh_addr;
7189 if (table_sec == NULL)
7191 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
7192 (unsigned long) table);
7195 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
7202 arm_free_section (&exidx_arm_sec);
7203 arm_free_section (&extab_arm_sec);
7206 /* Used for both ARM and C6X unwinding tables. */
7209 arm_process_unwind (FILE *file)
7211 struct arm_unw_aux_info aux;
7212 Elf_Internal_Shdr *unwsec = NULL;
7213 Elf_Internal_Shdr *strsec;
7214 Elf_Internal_Shdr *sec;
7216 unsigned int sec_type;
7218 switch (elf_header.e_machine)
7221 sec_type = SHT_ARM_EXIDX;
7225 sec_type = SHT_C6000_UNWIND;
7229 error (_("Unsupported architecture type %d encountered when processing unwind table"),
7230 elf_header.e_machine);
7234 if (string_table == NULL)
7237 memset (& aux, 0, sizeof (aux));
7240 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7242 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
7244 aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7246 strsec = section_headers + sec->sh_link;
7247 assert (aux.strtab == NULL);
7248 aux.strtab = get_data (NULL, file, strsec->sh_offset,
7249 1, strsec->sh_size, _("string table"));
7250 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7252 else if (sec->sh_type == sec_type)
7257 printf (_("\nThere are no unwind sections in this file.\n"));
7259 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7261 if (sec->sh_type == sec_type)
7263 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
7265 (unsigned long) sec->sh_offset,
7266 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
7268 dump_arm_unwind (&aux, sec);
7275 free ((char *) aux.strtab);
7279 process_unwind (FILE * file)
7281 struct unwind_handler
7284 void (* handler)(FILE *);
7287 { EM_ARM, arm_process_unwind },
7288 { EM_IA_64, ia64_process_unwind },
7289 { EM_PARISC, hppa_process_unwind },
7290 { EM_TI_C6000, arm_process_unwind },
7298 for (i = 0; handlers[i].handler != NULL; i++)
7299 if (elf_header.e_machine == handlers[i].machtype)
7300 return handlers[i].handler (file);
7302 printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
7303 get_machine_name (elf_header.e_machine));
7307 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
7309 switch (entry->d_tag)
7312 if (entry->d_un.d_val == 0)
7316 static const char * opts[] =
7318 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
7319 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
7320 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
7321 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
7327 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
7328 if (entry->d_un.d_val & (1 << cnt))
7330 printf ("%s%s", first ? "" : " ", opts[cnt]);
7336 case DT_MIPS_IVERSION:
7337 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7338 printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
7340 printf (_("<corrupt: %" BFD_VMA_FMT "d>"), entry->d_un.d_ptr);
7343 case DT_MIPS_TIME_STAMP:
7348 time_t atime = entry->d_un.d_val;
7349 tmp = gmtime (&atime);
7350 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
7351 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7352 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7353 printf (_("Time Stamp: %s"), timebuf);
7357 case DT_MIPS_RLD_VERSION:
7358 case DT_MIPS_LOCAL_GOTNO:
7359 case DT_MIPS_CONFLICTNO:
7360 case DT_MIPS_LIBLISTNO:
7361 case DT_MIPS_SYMTABNO:
7362 case DT_MIPS_UNREFEXTNO:
7363 case DT_MIPS_HIPAGENO:
7364 case DT_MIPS_DELTA_CLASS_NO:
7365 case DT_MIPS_DELTA_INSTANCE_NO:
7366 case DT_MIPS_DELTA_RELOC_NO:
7367 case DT_MIPS_DELTA_SYM_NO:
7368 case DT_MIPS_DELTA_CLASSSYM_NO:
7369 case DT_MIPS_COMPACT_SIZE:
7370 print_vma (entry->d_un.d_ptr, DEC);
7374 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7380 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
7382 switch (entry->d_tag)
7384 case DT_HP_DLD_FLAGS:
7393 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
7394 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
7395 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
7396 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
7397 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
7398 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
7399 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
7400 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
7401 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
7402 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
7403 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
7404 { DT_HP_GST, "HP_GST" },
7405 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
7406 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
7407 { DT_HP_NODELETE, "HP_NODELETE" },
7408 { DT_HP_GROUP, "HP_GROUP" },
7409 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
7413 bfd_vma val = entry->d_un.d_val;
7415 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
7416 if (val & flags[cnt].bit)
7420 fputs (flags[cnt].str, stdout);
7422 val ^= flags[cnt].bit;
7425 if (val != 0 || first)
7429 print_vma (val, HEX);
7435 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7443 /* VMS vs Unix time offset and factor. */
7445 #define VMS_EPOCH_OFFSET 35067168000000000LL
7446 #define VMS_GRANULARITY_FACTOR 10000000
7448 /* Display a VMS time in a human readable format. */
7451 print_vms_time (bfd_int64_t vmstime)
7456 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
7457 tm = gmtime (&unxtime);
7458 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
7459 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
7460 tm->tm_hour, tm->tm_min, tm->tm_sec);
7465 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
7467 switch (entry->d_tag)
7469 case DT_IA_64_PLT_RESERVE:
7470 /* First 3 slots reserved. */
7471 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7473 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
7476 case DT_IA_64_VMS_LINKTIME:
7478 print_vms_time (entry->d_un.d_val);
7482 case DT_IA_64_VMS_LNKFLAGS:
7483 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7484 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
7485 printf (" CALL_DEBUG");
7486 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
7487 printf (" NOP0BUFS");
7488 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
7489 printf (" P0IMAGE");
7490 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
7491 printf (" MKTHREADS");
7492 if (entry->d_un.d_val & VMS_LF_UPCALLS)
7493 printf (" UPCALLS");
7494 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7496 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7497 printf (" INITIALIZE");
7498 if (entry->d_un.d_val & VMS_LF_MAIN)
7500 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7501 printf (" EXE_INIT");
7502 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7503 printf (" TBK_IN_IMG");
7504 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7505 printf (" DBG_IN_IMG");
7506 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7507 printf (" TBK_IN_DSF");
7508 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7509 printf (" DBG_IN_DSF");
7510 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7511 printf (" SIGNATURES");
7512 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7513 printf (" REL_SEG_OFF");
7517 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7524 get_32bit_dynamic_section (FILE * file)
7526 Elf32_External_Dyn * edyn;
7527 Elf32_External_Dyn * ext;
7528 Elf_Internal_Dyn * entry;
7530 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7531 dynamic_size, _("dynamic section"));
7535 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7536 might not have the luxury of section headers. Look for the DT_NULL
7537 terminator to determine the number of entries. */
7538 for (ext = edyn, dynamic_nent = 0;
7539 (char *) ext < (char *) edyn + dynamic_size;
7543 if (BYTE_GET (ext->d_tag) == DT_NULL)
7547 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7549 if (dynamic_section == NULL)
7551 error (_("Out of memory\n"));
7556 for (ext = edyn, entry = dynamic_section;
7557 entry < dynamic_section + dynamic_nent;
7560 entry->d_tag = BYTE_GET (ext->d_tag);
7561 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7570 get_64bit_dynamic_section (FILE * file)
7572 Elf64_External_Dyn * edyn;
7573 Elf64_External_Dyn * ext;
7574 Elf_Internal_Dyn * entry;
7576 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7577 dynamic_size, _("dynamic section"));
7581 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7582 might not have the luxury of section headers. Look for the DT_NULL
7583 terminator to determine the number of entries. */
7584 for (ext = edyn, dynamic_nent = 0;
7585 (char *) ext < (char *) edyn + dynamic_size;
7589 if (BYTE_GET (ext->d_tag) == DT_NULL)
7593 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7595 if (dynamic_section == NULL)
7597 error (_("Out of memory\n"));
7602 for (ext = edyn, entry = dynamic_section;
7603 entry < dynamic_section + dynamic_nent;
7606 entry->d_tag = BYTE_GET (ext->d_tag);
7607 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7616 print_dynamic_flags (bfd_vma flags)
7624 flag = flags & - flags;
7634 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7635 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7636 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7637 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7638 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7639 default: fputs (_("unknown"), stdout); break;
7645 /* Parse and display the contents of the dynamic section. */
7648 process_dynamic_section (FILE * file)
7650 Elf_Internal_Dyn * entry;
7652 if (dynamic_size == 0)
7655 printf (_("\nThere is no dynamic section in this file.\n"));
7662 if (! get_32bit_dynamic_section (file))
7665 else if (! get_64bit_dynamic_section (file))
7668 /* Find the appropriate symbol table. */
7669 if (dynamic_symbols == NULL)
7671 for (entry = dynamic_section;
7672 entry < dynamic_section + dynamic_nent;
7675 Elf_Internal_Shdr section;
7677 if (entry->d_tag != DT_SYMTAB)
7680 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7682 /* Since we do not know how big the symbol table is,
7683 we default to reading in the entire file (!) and
7684 processing that. This is overkill, I know, but it
7686 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7688 if (archive_file_offset != 0)
7689 section.sh_size = archive_file_size - section.sh_offset;
7692 if (fseek (file, 0, SEEK_END))
7693 error (_("Unable to seek to end of file!\n"));
7695 section.sh_size = ftell (file) - section.sh_offset;
7699 section.sh_entsize = sizeof (Elf32_External_Sym);
7701 section.sh_entsize = sizeof (Elf64_External_Sym);
7703 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion, & num_dynamic_syms);
7704 if (num_dynamic_syms < 1)
7706 error (_("Unable to determine the number of symbols to load\n"));
7712 /* Similarly find a string table. */
7713 if (dynamic_strings == NULL)
7715 for (entry = dynamic_section;
7716 entry < dynamic_section + dynamic_nent;
7719 unsigned long offset;
7722 if (entry->d_tag != DT_STRTAB)
7725 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7727 /* Since we do not know how big the string table is,
7728 we default to reading in the entire file (!) and
7729 processing that. This is overkill, I know, but it
7732 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7734 if (archive_file_offset != 0)
7735 str_tab_len = archive_file_size - offset;
7738 if (fseek (file, 0, SEEK_END))
7739 error (_("Unable to seek to end of file\n"));
7740 str_tab_len = ftell (file) - offset;
7743 if (str_tab_len < 1)
7746 (_("Unable to determine the length of the dynamic string table\n"));
7750 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7752 _("dynamic string table"));
7753 dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
7758 /* And find the syminfo section if available. */
7759 if (dynamic_syminfo == NULL)
7761 unsigned long syminsz = 0;
7763 for (entry = dynamic_section;
7764 entry < dynamic_section + dynamic_nent;
7767 if (entry->d_tag == DT_SYMINENT)
7769 /* Note: these braces are necessary to avoid a syntax
7770 error from the SunOS4 C compiler. */
7771 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7773 else if (entry->d_tag == DT_SYMINSZ)
7774 syminsz = entry->d_un.d_val;
7775 else if (entry->d_tag == DT_SYMINFO)
7776 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7780 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7782 Elf_External_Syminfo * extsyminfo;
7783 Elf_External_Syminfo * extsym;
7784 Elf_Internal_Syminfo * syminfo;
7786 /* There is a syminfo section. Read the data. */
7787 extsyminfo = (Elf_External_Syminfo *)
7788 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7789 _("symbol information"));
7793 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7794 if (dynamic_syminfo == NULL)
7796 error (_("Out of memory\n"));
7800 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7801 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7802 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7803 ++syminfo, ++extsym)
7805 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7806 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7813 if (do_dynamic && dynamic_addr)
7814 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7815 dynamic_addr, dynamic_nent);
7817 printf (_(" Tag Type Name/Value\n"));
7819 for (entry = dynamic_section;
7820 entry < dynamic_section + dynamic_nent;
7828 print_vma (entry->d_tag, FULL_HEX);
7829 dtype = get_dynamic_type (entry->d_tag);
7830 printf (" (%s)%*s", dtype,
7831 ((is_32bit_elf ? 27 : 19)
7832 - (int) strlen (dtype)),
7836 switch (entry->d_tag)
7840 print_dynamic_flags (entry->d_un.d_val);
7850 switch (entry->d_tag)
7853 printf (_("Auxiliary library"));
7857 printf (_("Filter library"));
7861 printf (_("Configuration file"));
7865 printf (_("Dependency audit library"));
7869 printf (_("Audit library"));
7873 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7874 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7878 print_vma (entry->d_un.d_val, PREFIX_HEX);
7887 printf (_("Flags:"));
7889 if (entry->d_un.d_val == 0)
7890 printf (_(" None\n"));
7893 unsigned long int val = entry->d_un.d_val;
7895 if (val & DTF_1_PARINIT)
7897 printf (" PARINIT");
7898 val ^= DTF_1_PARINIT;
7900 if (val & DTF_1_CONFEXP)
7902 printf (" CONFEXP");
7903 val ^= DTF_1_CONFEXP;
7906 printf (" %lx", val);
7915 printf (_("Flags:"));
7917 if (entry->d_un.d_val == 0)
7918 printf (_(" None\n"));
7921 unsigned long int val = entry->d_un.d_val;
7923 if (val & DF_P1_LAZYLOAD)
7925 printf (" LAZYLOAD");
7926 val ^= DF_P1_LAZYLOAD;
7928 if (val & DF_P1_GROUPPERM)
7930 printf (" GROUPPERM");
7931 val ^= DF_P1_GROUPPERM;
7934 printf (" %lx", val);
7943 printf (_("Flags:"));
7944 if (entry->d_un.d_val == 0)
7945 printf (_(" None\n"));
7948 unsigned long int val = entry->d_un.d_val;
7955 if (val & DF_1_GLOBAL)
7960 if (val & DF_1_GROUP)
7965 if (val & DF_1_NODELETE)
7967 printf (" NODELETE");
7968 val ^= DF_1_NODELETE;
7970 if (val & DF_1_LOADFLTR)
7972 printf (" LOADFLTR");
7973 val ^= DF_1_LOADFLTR;
7975 if (val & DF_1_INITFIRST)
7977 printf (" INITFIRST");
7978 val ^= DF_1_INITFIRST;
7980 if (val & DF_1_NOOPEN)
7985 if (val & DF_1_ORIGIN)
7990 if (val & DF_1_DIRECT)
7995 if (val & DF_1_TRANS)
8000 if (val & DF_1_INTERPOSE)
8002 printf (" INTERPOSE");
8003 val ^= DF_1_INTERPOSE;
8005 if (val & DF_1_NODEFLIB)
8007 printf (" NODEFLIB");
8008 val ^= DF_1_NODEFLIB;
8010 if (val & DF_1_NODUMP)
8015 if (val & DF_1_CONLFAT)
8017 printf (" CONLFAT");
8018 val ^= DF_1_CONLFAT;
8021 printf (" %lx", val);
8028 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8030 puts (get_dynamic_type (entry->d_un.d_val));
8050 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8056 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8057 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8063 switch (entry->d_tag)
8066 printf (_("Shared library: [%s]"), name);
8068 if (streq (name, program_interpreter))
8069 printf (_(" program interpreter"));
8073 printf (_("Library soname: [%s]"), name);
8077 printf (_("Library rpath: [%s]"), name);
8081 printf (_("Library runpath: [%s]"), name);
8085 print_vma (entry->d_un.d_val, PREFIX_HEX);
8090 print_vma (entry->d_un.d_val, PREFIX_HEX);
8103 dynamic_info[entry->d_tag] = entry->d_un.d_val;
8107 case DT_INIT_ARRAYSZ:
8108 case DT_FINI_ARRAYSZ:
8109 case DT_GNU_CONFLICTSZ:
8110 case DT_GNU_LIBLISTSZ:
8113 print_vma (entry->d_un.d_val, UNSIGNED);
8114 printf (_(" (bytes)\n"));
8124 print_vma (entry->d_un.d_val, UNSIGNED);
8137 if (entry->d_tag == DT_USED
8138 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
8140 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
8144 printf (_("Not needed object: [%s]\n"), name);
8149 print_vma (entry->d_un.d_val, PREFIX_HEX);
8155 /* The value of this entry is ignored. */
8160 case DT_GNU_PRELINKED:
8164 time_t atime = entry->d_un.d_val;
8166 tmp = gmtime (&atime);
8167 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
8168 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8169 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8175 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
8178 print_vma (entry->d_un.d_val, PREFIX_HEX);
8184 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
8185 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
8190 switch (elf_header.e_machine)
8193 case EM_MIPS_RS3_LE:
8194 dynamic_section_mips_val (entry);
8197 dynamic_section_parisc_val (entry);
8200 dynamic_section_ia64_val (entry);
8203 print_vma (entry->d_un.d_val, PREFIX_HEX);
8215 get_ver_flags (unsigned int flags)
8217 static char buff[32];
8224 if (flags & VER_FLG_BASE)
8225 strcat (buff, "BASE ");
8227 if (flags & VER_FLG_WEAK)
8229 if (flags & VER_FLG_BASE)
8230 strcat (buff, "| ");
8232 strcat (buff, "WEAK ");
8235 if (flags & VER_FLG_INFO)
8237 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
8238 strcat (buff, "| ");
8240 strcat (buff, "INFO ");
8243 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
8244 strcat (buff, _("| <unknown>"));
8249 /* Display the contents of the version sections. */
8252 process_version_sections (FILE * file)
8254 Elf_Internal_Shdr * section;
8261 for (i = 0, section = section_headers;
8262 i < elf_header.e_shnum;
8265 switch (section->sh_type)
8267 case SHT_GNU_verdef:
8269 Elf_External_Verdef * edefs;
8277 (_("\nVersion definition section '%s' contains %u entries:\n"),
8278 SECTION_NAME (section), section->sh_info);
8280 printf (_(" Addr: 0x"));
8281 printf_vma (section->sh_addr);
8282 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8283 (unsigned long) section->sh_offset, section->sh_link,
8284 section->sh_link < elf_header.e_shnum
8285 ? SECTION_NAME (section_headers + section->sh_link)
8288 edefs = (Elf_External_Verdef *)
8289 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
8290 _("version definition section"));
8293 endbuf = (char *) edefs + section->sh_size;
8295 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8298 Elf_External_Verdef * edef;
8299 Elf_Internal_Verdef ent;
8300 Elf_External_Verdaux * eaux;
8301 Elf_Internal_Verdaux aux;
8305 /* Check for negative or very large indicies. */
8306 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
8309 vstart = ((char *) edefs) + idx;
8310 if (vstart + sizeof (*edef) > endbuf)
8313 edef = (Elf_External_Verdef *) vstart;
8315 ent.vd_version = BYTE_GET (edef->vd_version);
8316 ent.vd_flags = BYTE_GET (edef->vd_flags);
8317 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
8318 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
8319 ent.vd_hash = BYTE_GET (edef->vd_hash);
8320 ent.vd_aux = BYTE_GET (edef->vd_aux);
8321 ent.vd_next = BYTE_GET (edef->vd_next);
8323 printf (_(" %#06x: Rev: %d Flags: %s"),
8324 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
8326 printf (_(" Index: %d Cnt: %d "),
8327 ent.vd_ndx, ent.vd_cnt);
8329 /* Check for overflow. */
8330 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
8331 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
8334 vstart += ent.vd_aux;
8336 eaux = (Elf_External_Verdaux *) vstart;
8338 aux.vda_name = BYTE_GET (eaux->vda_name);
8339 aux.vda_next = BYTE_GET (eaux->vda_next);
8341 if (VALID_DYNAMIC_NAME (aux.vda_name))
8342 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
8344 printf (_("Name index: %ld\n"), aux.vda_name);
8346 isum = idx + ent.vd_aux;
8348 for (j = 1; j < ent.vd_cnt; j++)
8350 /* Check for overflow. */
8351 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
8352 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
8355 isum += aux.vda_next;
8356 vstart += aux.vda_next;
8358 eaux = (Elf_External_Verdaux *) vstart;
8359 if (vstart + sizeof (*eaux) > endbuf)
8362 aux.vda_name = BYTE_GET (eaux->vda_name);
8363 aux.vda_next = BYTE_GET (eaux->vda_next);
8365 if (VALID_DYNAMIC_NAME (aux.vda_name))
8366 printf (_(" %#06x: Parent %d: %s\n"),
8367 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
8369 printf (_(" %#06x: Parent %d, name index: %ld\n"),
8370 isum, j, aux.vda_name);
8374 printf (_(" Version def aux past end of section\n"));
8379 if (cnt < section->sh_info)
8380 printf (_(" Version definition past end of section\n"));
8386 case SHT_GNU_verneed:
8388 Elf_External_Verneed * eneed;
8395 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
8396 SECTION_NAME (section), section->sh_info);
8398 printf (_(" Addr: 0x"));
8399 printf_vma (section->sh_addr);
8400 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8401 (unsigned long) section->sh_offset, section->sh_link,
8402 section->sh_link < elf_header.e_shnum
8403 ? SECTION_NAME (section_headers + section->sh_link)
8406 eneed = (Elf_External_Verneed *) get_data (NULL, file,
8407 section->sh_offset, 1,
8409 _("Version Needs section"));
8412 endbuf = (char *) eneed + section->sh_size;
8414 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
8416 Elf_External_Verneed * entry;
8417 Elf_Internal_Verneed ent;
8422 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
8425 vstart = ((char *) eneed) + idx;
8426 if (vstart + sizeof (*entry) > endbuf)
8429 entry = (Elf_External_Verneed *) vstart;
8431 ent.vn_version = BYTE_GET (entry->vn_version);
8432 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
8433 ent.vn_file = BYTE_GET (entry->vn_file);
8434 ent.vn_aux = BYTE_GET (entry->vn_aux);
8435 ent.vn_next = BYTE_GET (entry->vn_next);
8437 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
8439 if (VALID_DYNAMIC_NAME (ent.vn_file))
8440 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
8442 printf (_(" File: %lx"), ent.vn_file);
8444 printf (_(" Cnt: %d\n"), ent.vn_cnt);
8446 /* Check for overflow. */
8447 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
8448 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
8451 vstart += ent.vn_aux;
8453 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
8455 Elf_External_Vernaux * eaux;
8456 Elf_Internal_Vernaux aux;
8458 if (vstart + sizeof (*eaux) > endbuf)
8460 eaux = (Elf_External_Vernaux *) vstart;
8462 aux.vna_hash = BYTE_GET (eaux->vna_hash);
8463 aux.vna_flags = BYTE_GET (eaux->vna_flags);
8464 aux.vna_other = BYTE_GET (eaux->vna_other);
8465 aux.vna_name = BYTE_GET (eaux->vna_name);
8466 aux.vna_next = BYTE_GET (eaux->vna_next);
8468 if (VALID_DYNAMIC_NAME (aux.vna_name))
8469 printf (_(" %#06x: Name: %s"),
8470 isum, GET_DYNAMIC_NAME (aux.vna_name));
8472 printf (_(" %#06x: Name index: %lx"),
8473 isum, aux.vna_name);
8475 printf (_(" Flags: %s Version: %d\n"),
8476 get_ver_flags (aux.vna_flags), aux.vna_other);
8478 /* Check for overflow. */
8479 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
8480 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
8483 isum += aux.vna_next;
8484 vstart += aux.vna_next;
8488 warn (_("Missing Version Needs auxillary information\n"));
8493 if (cnt < section->sh_info)
8494 warn (_("Missing Version Needs information\n"));
8500 case SHT_GNU_versym:
8502 Elf_Internal_Shdr * link_section;
8505 unsigned char * edata;
8506 unsigned short * data;
8508 Elf_Internal_Sym * symbols;
8509 Elf_Internal_Shdr * string_sec;
8510 unsigned long num_syms;
8513 if (section->sh_link >= elf_header.e_shnum)
8516 link_section = section_headers + section->sh_link;
8517 total = section->sh_size / sizeof (Elf_External_Versym);
8519 if (link_section->sh_link >= elf_header.e_shnum)
8524 symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
8525 if (symbols == NULL)
8528 string_sec = section_headers + link_section->sh_link;
8530 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8531 string_sec->sh_size,
8532 _("version string table"));
8539 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8540 SECTION_NAME (section), total);
8542 printf (_(" Addr: "));
8543 printf_vma (section->sh_addr);
8544 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8545 (unsigned long) section->sh_offset, section->sh_link,
8546 SECTION_NAME (link_section));
8548 off = offset_from_vma (file,
8549 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8550 total * sizeof (short));
8551 edata = (unsigned char *) get_data (NULL, file, off, total,
8553 _("version symbol data"));
8561 data = (short unsigned int *) cmalloc (total, sizeof (short));
8563 for (cnt = total; cnt --;)
8564 data[cnt] = byte_get (edata + cnt * sizeof (short),
8569 for (cnt = 0; cnt < total; cnt += 4)
8572 int check_def, check_need;
8575 printf (" %03x:", cnt);
8577 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8578 switch (data[cnt + j])
8581 fputs (_(" 0 (*local*) "), stdout);
8585 fputs (_(" 1 (*global*) "), stdout);
8589 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8590 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8592 /* If this index value is greater than the size of the symbols
8593 array, break to avoid an out-of-bounds read. */
8594 if ((unsigned long)(cnt + j) >= num_syms)
8596 warn (_("invalid index into symbol array\n"));
8602 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8603 || section_headers[symbols[cnt + j].st_shndx].sh_type
8606 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8613 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8615 Elf_Internal_Verneed ivn;
8616 unsigned long offset;
8618 offset = offset_from_vma
8619 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8620 sizeof (Elf_External_Verneed));
8624 Elf_Internal_Vernaux ivna;
8625 Elf_External_Verneed evn;
8626 Elf_External_Vernaux evna;
8627 unsigned long a_off;
8629 if (get_data (&evn, file, offset, sizeof (evn), 1,
8630 _("version need")) == NULL)
8633 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8634 ivn.vn_next = BYTE_GET (evn.vn_next);
8636 a_off = offset + ivn.vn_aux;
8640 if (get_data (&evna, file, a_off, sizeof (evna),
8641 1, _("version need aux (2)")) == NULL)
8648 ivna.vna_next = BYTE_GET (evna.vna_next);
8649 ivna.vna_other = BYTE_GET (evna.vna_other);
8652 a_off += ivna.vna_next;
8654 while (ivna.vna_other != data[cnt + j]
8655 && ivna.vna_next != 0);
8657 if (ivna.vna_other == data[cnt + j])
8659 ivna.vna_name = BYTE_GET (evna.vna_name);
8661 if (ivna.vna_name >= string_sec->sh_size)
8662 name = _("*invalid*");
8664 name = strtab + ivna.vna_name;
8665 nn += printf ("(%s%-*s",
8667 12 - (int) strlen (name),
8673 offset += ivn.vn_next;
8675 while (ivn.vn_next);
8678 if (check_def && data[cnt + j] != 0x8001
8679 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8681 Elf_Internal_Verdef ivd;
8682 Elf_External_Verdef evd;
8683 unsigned long offset;
8685 offset = offset_from_vma
8686 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8691 if (get_data (&evd, file, offset, sizeof (evd), 1,
8692 _("version def")) == NULL)
8699 ivd.vd_next = BYTE_GET (evd.vd_next);
8700 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8703 offset += ivd.vd_next;
8705 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8706 && ivd.vd_next != 0);
8708 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8710 Elf_External_Verdaux evda;
8711 Elf_Internal_Verdaux ivda;
8713 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8715 if (get_data (&evda, file,
8716 offset - ivd.vd_next + ivd.vd_aux,
8718 _("version def aux")) == NULL)
8721 ivda.vda_name = BYTE_GET (evda.vda_name);
8723 if (ivda.vda_name >= string_sec->sh_size)
8724 name = _("*invalid*");
8726 name = strtab + ivda.vda_name;
8727 nn += printf ("(%s%-*s",
8729 12 - (int) strlen (name),
8735 printf ("%*c", 18 - nn, ' ');
8753 printf (_("\nNo version information found in this file.\n"));
8759 get_symbol_binding (unsigned int binding)
8761 static char buff[32];
8765 case STB_LOCAL: return "LOCAL";
8766 case STB_GLOBAL: return "GLOBAL";
8767 case STB_WEAK: return "WEAK";
8769 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8770 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8772 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8774 if (binding == STB_GNU_UNIQUE
8775 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8776 /* GNU is still using the default value 0. */
8777 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8779 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8782 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8788 get_symbol_type (unsigned int type)
8790 static char buff[32];
8794 case STT_NOTYPE: return "NOTYPE";
8795 case STT_OBJECT: return "OBJECT";
8796 case STT_FUNC: return "FUNC";
8797 case STT_SECTION: return "SECTION";
8798 case STT_FILE: return "FILE";
8799 case STT_COMMON: return "COMMON";
8800 case STT_TLS: return "TLS";
8801 case STT_RELC: return "RELC";
8802 case STT_SRELC: return "SRELC";
8804 if (type >= STT_LOPROC && type <= STT_HIPROC)
8806 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8807 return "THUMB_FUNC";
8809 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8812 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8813 return "PARISC_MILLI";
8815 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8817 else if (type >= STT_LOOS && type <= STT_HIOS)
8819 if (elf_header.e_machine == EM_PARISC)
8821 if (type == STT_HP_OPAQUE)
8823 if (type == STT_HP_STUB)
8827 if (type == STT_GNU_IFUNC
8828 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
8829 || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
8830 /* GNU is still using the default value 0. */
8831 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8834 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8837 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8843 get_symbol_visibility (unsigned int visibility)
8847 case STV_DEFAULT: return "DEFAULT";
8848 case STV_INTERNAL: return "INTERNAL";
8849 case STV_HIDDEN: return "HIDDEN";
8850 case STV_PROTECTED: return "PROTECTED";
8856 get_mips_symbol_other (unsigned int other)
8868 case STO_MICROMIPS | STO_MIPS_PIC:
8869 return "MICROMIPS, MIPS PIC";
8878 get_ia64_symbol_other (unsigned int other)
8882 static char res[32];
8886 /* Function types is for images and .STB files only. */
8887 switch (elf_header.e_type)
8891 switch (VMS_ST_FUNC_TYPE (other))
8893 case VMS_SFT_CODE_ADDR:
8894 strcat (res, " CA");
8896 case VMS_SFT_SYMV_IDX:
8897 strcat (res, " VEC");
8900 strcat (res, " FD");
8902 case VMS_SFT_RESERVE:
8903 strcat (res, " RSV");
8912 switch (VMS_ST_LINKAGE (other))
8914 case VMS_STL_IGNORE:
8915 strcat (res, " IGN");
8917 case VMS_STL_RESERVE:
8918 strcat (res, " RSV");
8921 strcat (res, " STD");
8924 strcat (res, " LNK");
8939 get_symbol_other (unsigned int other)
8941 const char * result = NULL;
8942 static char buff [32];
8947 switch (elf_header.e_machine)
8950 result = get_mips_symbol_other (other);
8953 result = get_ia64_symbol_other (other);
8962 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8967 get_symbol_index_type (unsigned int type)
8969 static char buff[32];
8973 case SHN_UNDEF: return "UND";
8974 case SHN_ABS: return "ABS";
8975 case SHN_COMMON: return "COM";
8977 if (type == SHN_IA_64_ANSI_COMMON
8978 && elf_header.e_machine == EM_IA_64
8979 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8981 else if ((elf_header.e_machine == EM_X86_64
8982 || elf_header.e_machine == EM_L1OM
8983 || elf_header.e_machine == EM_K1OM)
8984 && type == SHN_X86_64_LCOMMON)
8986 else if ((type == SHN_MIPS_SCOMMON
8987 && elf_header.e_machine == EM_MIPS)
8988 || (type == SHN_TIC6X_SCOMMON
8989 && elf_header.e_machine == EM_TI_C6000))
8991 else if (type == SHN_MIPS_SUNDEFINED
8992 && elf_header.e_machine == EM_MIPS)
8994 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8995 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8996 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8997 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8998 else if (type >= SHN_LORESERVE)
8999 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
9000 else if (type >= elf_header.e_shnum)
9001 sprintf (buff, "bad section index[%3d]", type);
9003 sprintf (buff, "%3d", type);
9011 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
9013 unsigned char * e_data;
9016 e_data = (unsigned char *) cmalloc (number, ent_size);
9020 error (_("Out of memory\n"));
9024 if (fread (e_data, ent_size, number, file) != number)
9026 error (_("Unable to read in dynamic data\n"));
9030 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
9034 error (_("Out of memory\n"));
9040 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
9048 print_dynamic_symbol (bfd_vma si, unsigned long hn)
9050 Elf_Internal_Sym * psym;
9053 psym = dynamic_symbols + si;
9055 n = print_vma (si, DEC_5);
9057 fputs (" " + n, stdout);
9058 printf (" %3lu: ", hn);
9059 print_vma (psym->st_value, LONG_HEX);
9061 print_vma (psym->st_size, DEC_5);
9063 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9064 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9065 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9066 /* Check to see if any other bits in the st_other field are set.
9067 Note - displaying this information disrupts the layout of the
9068 table being generated, but for the moment this case is very
9070 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9071 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9072 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
9073 if (VALID_DYNAMIC_NAME (psym->st_name))
9074 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
9076 printf (_(" <corrupt: %14ld>"), psym->st_name);
9080 /* Dump the symbol table. */
9082 process_symbol_table (FILE * file)
9084 Elf_Internal_Shdr * section;
9085 bfd_vma nbuckets = 0;
9086 bfd_vma nchains = 0;
9087 bfd_vma * buckets = NULL;
9088 bfd_vma * chains = NULL;
9089 bfd_vma ngnubuckets = 0;
9090 bfd_vma * gnubuckets = NULL;
9091 bfd_vma * gnuchains = NULL;
9092 bfd_vma gnusymidx = 0;
9094 if (!do_syms && !do_dyn_syms && !do_histogram)
9097 if (dynamic_info[DT_HASH]
9099 || (do_using_dynamic
9101 && dynamic_strings != NULL)))
9103 unsigned char nb[8];
9104 unsigned char nc[8];
9105 int hash_ent_size = 4;
9107 if ((elf_header.e_machine == EM_ALPHA
9108 || elf_header.e_machine == EM_S390
9109 || elf_header.e_machine == EM_S390_OLD)
9110 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
9114 (archive_file_offset
9115 + offset_from_vma (file, dynamic_info[DT_HASH],
9116 sizeof nb + sizeof nc)),
9119 error (_("Unable to seek to start of dynamic information\n"));
9123 if (fread (nb, hash_ent_size, 1, file) != 1)
9125 error (_("Failed to read in number of buckets\n"));
9129 if (fread (nc, hash_ent_size, 1, file) != 1)
9131 error (_("Failed to read in number of chains\n"));
9135 nbuckets = byte_get (nb, hash_ent_size);
9136 nchains = byte_get (nc, hash_ent_size);
9138 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
9139 chains = get_dynamic_data (file, nchains, hash_ent_size);
9142 if (buckets == NULL || chains == NULL)
9144 if (do_using_dynamic)
9155 if (dynamic_info_DT_GNU_HASH
9157 || (do_using_dynamic
9159 && dynamic_strings != NULL)))
9161 unsigned char nb[16];
9162 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
9163 bfd_vma buckets_vma;
9166 (archive_file_offset
9167 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
9171 error (_("Unable to seek to start of dynamic information\n"));
9175 if (fread (nb, 16, 1, file) != 1)
9177 error (_("Failed to read in number of buckets\n"));
9181 ngnubuckets = byte_get (nb, 4);
9182 gnusymidx = byte_get (nb + 4, 4);
9183 bitmaskwords = byte_get (nb + 8, 4);
9184 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
9186 buckets_vma += bitmaskwords * 4;
9188 buckets_vma += bitmaskwords * 8;
9191 (archive_file_offset
9192 + offset_from_vma (file, buckets_vma, 4)),
9195 error (_("Unable to seek to start of dynamic information\n"));
9199 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
9201 if (gnubuckets == NULL)
9204 for (i = 0; i < ngnubuckets; i++)
9205 if (gnubuckets[i] != 0)
9207 if (gnubuckets[i] < gnusymidx)
9210 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
9211 maxchain = gnubuckets[i];
9214 if (maxchain == 0xffffffff)
9217 maxchain -= gnusymidx;
9220 (archive_file_offset
9221 + offset_from_vma (file, buckets_vma
9222 + 4 * (ngnubuckets + maxchain), 4)),
9225 error (_("Unable to seek to start of dynamic information\n"));
9231 if (fread (nb, 4, 1, file) != 1)
9233 error (_("Failed to determine last chain length\n"));
9237 if (maxchain + 1 == 0)
9242 while ((byte_get (nb, 4) & 1) == 0);
9245 (archive_file_offset
9246 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
9249 error (_("Unable to seek to start of dynamic information\n"));
9253 gnuchains = get_dynamic_data (file, maxchain, 4);
9256 if (gnuchains == NULL)
9261 if (do_using_dynamic)
9266 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
9269 && dynamic_strings != NULL)
9273 if (dynamic_info[DT_HASH])
9277 printf (_("\nSymbol table for image:\n"));
9279 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9281 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9283 for (hn = 0; hn < nbuckets; hn++)
9288 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
9289 print_dynamic_symbol (si, hn);
9293 if (dynamic_info_DT_GNU_HASH)
9295 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
9297 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9299 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
9301 for (hn = 0; hn < ngnubuckets; ++hn)
9302 if (gnubuckets[hn] != 0)
9304 bfd_vma si = gnubuckets[hn];
9305 bfd_vma off = si - gnusymidx;
9309 print_dynamic_symbol (si, hn);
9312 while ((gnuchains[off++] & 1) == 0);
9316 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
9320 for (i = 0, section = section_headers;
9321 i < elf_header.e_shnum;
9325 char * strtab = NULL;
9326 unsigned long int strtab_size = 0;
9327 Elf_Internal_Sym * symtab;
9328 Elf_Internal_Sym * psym;
9329 unsigned long num_syms;
9331 if ((section->sh_type != SHT_SYMTAB
9332 && section->sh_type != SHT_DYNSYM)
9334 && section->sh_type == SHT_SYMTAB))
9337 if (section->sh_entsize == 0)
9339 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
9340 SECTION_NAME (section));
9344 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
9345 SECTION_NAME (section),
9346 (unsigned long) (section->sh_size / section->sh_entsize));
9349 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9351 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
9353 symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
9357 if (section->sh_link == elf_header.e_shstrndx)
9359 strtab = string_table;
9360 strtab_size = string_table_length;
9362 else if (section->sh_link < elf_header.e_shnum)
9364 Elf_Internal_Shdr * string_sec;
9366 string_sec = section_headers + section->sh_link;
9368 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9369 1, string_sec->sh_size,
9371 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
9374 for (si = 0, psym = symtab; si < num_syms; si++, psym++)
9376 printf ("%6d: ", si);
9377 print_vma (psym->st_value, LONG_HEX);
9379 print_vma (psym->st_size, DEC_5);
9380 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
9381 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
9382 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
9383 /* Check to see if any other bits in the st_other field are set.
9384 Note - displaying this information disrupts the layout of the
9385 table being generated, but for the moment this case is very rare. */
9386 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
9387 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
9388 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
9389 print_symbol (25, psym->st_name < strtab_size
9390 ? strtab + psym->st_name : _("<corrupt>"));
9392 if (section->sh_type == SHT_DYNSYM
9393 && version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
9395 unsigned char data[2];
9396 unsigned short vers_data;
9397 unsigned long offset;
9401 offset = offset_from_vma
9402 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
9403 sizeof data + si * sizeof (vers_data));
9405 if (get_data (&data, file, offset + si * sizeof (vers_data),
9406 sizeof (data), 1, _("version data")) == NULL)
9409 vers_data = byte_get (data, 2);
9411 is_nobits = (psym->st_shndx < elf_header.e_shnum
9412 && section_headers[psym->st_shndx].sh_type
9415 check_def = (psym->st_shndx != SHN_UNDEF);
9417 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
9419 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
9420 && (is_nobits || ! check_def))
9422 Elf_External_Verneed evn;
9423 Elf_Internal_Verneed ivn;
9424 Elf_Internal_Vernaux ivna;
9426 /* We must test both. */
9427 offset = offset_from_vma
9428 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
9433 unsigned long vna_off;
9435 if (get_data (&evn, file, offset, sizeof (evn), 1,
9436 _("version need")) == NULL)
9444 ivn.vn_aux = BYTE_GET (evn.vn_aux);
9445 ivn.vn_next = BYTE_GET (evn.vn_next);
9447 vna_off = offset + ivn.vn_aux;
9451 Elf_External_Vernaux evna;
9453 if (get_data (&evna, file, vna_off,
9455 _("version need aux (3)")) == NULL)
9463 ivna.vna_other = BYTE_GET (evna.vna_other);
9464 ivna.vna_next = BYTE_GET (evna.vna_next);
9465 ivna.vna_name = BYTE_GET (evna.vna_name);
9468 vna_off += ivna.vna_next;
9470 while (ivna.vna_other != vers_data
9471 && ivna.vna_next != 0);
9473 if (ivna.vna_other == vers_data)
9476 offset += ivn.vn_next;
9478 while (ivn.vn_next != 0);
9480 if (ivna.vna_other == vers_data)
9483 ivna.vna_name < strtab_size
9484 ? strtab + ivna.vna_name : _("<corrupt>"),
9488 else if (! is_nobits)
9489 error (_("bad dynamic symbol\n"));
9496 if (vers_data != 0x8001
9497 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
9499 Elf_Internal_Verdef ivd;
9500 Elf_Internal_Verdaux ivda;
9501 Elf_External_Verdaux evda;
9504 off = offset_from_vma
9506 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
9507 sizeof (Elf_External_Verdef));
9511 Elf_External_Verdef evd;
9513 if (get_data (&evd, file, off, sizeof (evd),
9514 1, _("version def")) == NULL)
9522 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
9523 ivd.vd_aux = BYTE_GET (evd.vd_aux);
9524 ivd.vd_next = BYTE_GET (evd.vd_next);
9529 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
9530 && ivd.vd_next != 0);
9535 if (get_data (&evda, file, off, sizeof (evda),
9536 1, _("version def aux")) == NULL)
9539 ivda.vda_name = BYTE_GET (evda.vda_name);
9541 if (psym->st_name != ivda.vda_name)
9542 printf ((vers_data & VERSYM_HIDDEN)
9544 ivda.vda_name < strtab_size
9545 ? strtab + ivda.vda_name : _("<corrupt>"));
9555 if (strtab != string_table)
9561 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9563 if (do_histogram && buckets != NULL)
9565 unsigned long * lengths;
9566 unsigned long * counts;
9569 unsigned long maxlength = 0;
9570 unsigned long nzero_counts = 0;
9571 unsigned long nsyms = 0;
9573 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9574 (unsigned long) nbuckets);
9575 printf (_(" Length Number %% of total Coverage\n"));
9577 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9578 if (lengths == NULL)
9580 error (_("Out of memory\n"));
9583 for (hn = 0; hn < nbuckets; ++hn)
9585 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9588 if (maxlength < ++lengths[hn])
9593 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9596 error (_("Out of memory\n"));
9600 for (hn = 0; hn < nbuckets; ++hn)
9601 ++counts[lengths[hn]];
9606 printf (" 0 %-10lu (%5.1f%%)\n",
9607 counts[0], (counts[0] * 100.0) / nbuckets);
9608 for (i = 1; i <= maxlength; ++i)
9610 nzero_counts += counts[i] * i;
9611 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9612 i, counts[i], (counts[i] * 100.0) / nbuckets,
9613 (nzero_counts * 100.0) / nsyms);
9621 if (buckets != NULL)
9627 if (do_histogram && gnubuckets != NULL)
9629 unsigned long * lengths;
9630 unsigned long * counts;
9632 unsigned long maxlength = 0;
9633 unsigned long nzero_counts = 0;
9634 unsigned long nsyms = 0;
9636 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9637 if (lengths == NULL)
9639 error (_("Out of memory\n"));
9643 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9644 (unsigned long) ngnubuckets);
9645 printf (_(" Length Number %% of total Coverage\n"));
9647 for (hn = 0; hn < ngnubuckets; ++hn)
9648 if (gnubuckets[hn] != 0)
9650 bfd_vma off, length = 1;
9652 for (off = gnubuckets[hn] - gnusymidx;
9653 (gnuchains[off] & 1) == 0; ++off)
9655 lengths[hn] = length;
9656 if (length > maxlength)
9661 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9664 error (_("Out of memory\n"));
9668 for (hn = 0; hn < ngnubuckets; ++hn)
9669 ++counts[lengths[hn]];
9671 if (ngnubuckets > 0)
9674 printf (" 0 %-10lu (%5.1f%%)\n",
9675 counts[0], (counts[0] * 100.0) / ngnubuckets);
9676 for (j = 1; j <= maxlength; ++j)
9678 nzero_counts += counts[j] * j;
9679 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9680 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9681 (nzero_counts * 100.0) / nsyms);
9695 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9699 if (dynamic_syminfo == NULL
9701 /* No syminfo, this is ok. */
9704 /* There better should be a dynamic symbol section. */
9705 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9709 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9710 dynamic_syminfo_offset, dynamic_syminfo_nent);
9712 printf (_(" Num: Name BoundTo Flags\n"));
9713 for (i = 0; i < dynamic_syminfo_nent; ++i)
9715 unsigned short int flags = dynamic_syminfo[i].si_flags;
9717 printf ("%4d: ", i);
9718 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9719 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9721 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9724 switch (dynamic_syminfo[i].si_boundto)
9726 case SYMINFO_BT_SELF:
9727 fputs ("SELF ", stdout);
9729 case SYMINFO_BT_PARENT:
9730 fputs ("PARENT ", stdout);
9733 if (dynamic_syminfo[i].si_boundto > 0
9734 && dynamic_syminfo[i].si_boundto < dynamic_nent
9735 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9737 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9741 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9745 if (flags & SYMINFO_FLG_DIRECT)
9747 if (flags & SYMINFO_FLG_PASSTHRU)
9748 printf (" PASSTHRU");
9749 if (flags & SYMINFO_FLG_COPY)
9751 if (flags & SYMINFO_FLG_LAZYLOAD)
9752 printf (" LAZYLOAD");
9760 /* Check to see if the given reloc needs to be handled in a target specific
9761 manner. If so then process the reloc and return TRUE otherwise return
9765 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9766 unsigned char * start,
9767 Elf_Internal_Sym * symtab)
9769 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9771 switch (elf_header.e_machine)
9774 case EM_CYGNUS_MN10300:
9776 static Elf_Internal_Sym * saved_sym = NULL;
9780 case 34: /* R_MN10300_ALIGN */
9782 case 33: /* R_MN10300_SYM_DIFF */
9783 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9785 case 1: /* R_MN10300_32 */
9786 case 2: /* R_MN10300_16 */
9787 if (saved_sym != NULL)
9791 value = reloc->r_addend
9792 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9793 - saved_sym->st_value);
9795 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9802 if (saved_sym != NULL)
9803 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9813 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9814 DWARF debug sections. This is a target specific test. Note - we do not
9815 go through the whole including-target-headers-multiple-times route, (as
9816 we have already done with <elf/h8.h>) because this would become very
9817 messy and even then this function would have to contain target specific
9818 information (the names of the relocs instead of their numeric values).
9819 FIXME: This is not the correct way to solve this problem. The proper way
9820 is to have target specific reloc sizing and typing functions created by
9821 the reloc-macros.h header, in the same way that it already creates the
9822 reloc naming functions. */
9825 is_32bit_abs_reloc (unsigned int reloc_type)
9827 switch (elf_header.e_machine)
9831 return reloc_type == 1; /* R_386_32. */
9833 return reloc_type == 1; /* R_68K_32. */
9835 return reloc_type == 1; /* R_860_32. */
9837 return reloc_type == 2; /* R_960_32. */
9839 return reloc_type == 258; /* R_AARCH64_ABS32 */
9841 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9843 return reloc_type == 1; /* R_ARC_32. */
9845 return reloc_type == 2; /* R_ARM_ABS32 */
9848 return reloc_type == 1;
9849 case EM_ADAPTEVA_EPIPHANY:
9850 return reloc_type == 3;
9852 return reloc_type == 0x12; /* R_byte4_data. */
9854 return reloc_type == 3; /* R_CRIS_32. */
9856 return reloc_type == 3; /* R_CR16_NUM32. */
9858 return reloc_type == 15; /* R_CRX_NUM32. */
9860 return reloc_type == 1;
9861 case EM_CYGNUS_D10V:
9863 return reloc_type == 6; /* R_D10V_32. */
9864 case EM_CYGNUS_D30V:
9866 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9868 return reloc_type == 3; /* R_DLX_RELOC_32. */
9869 case EM_CYGNUS_FR30:
9871 return reloc_type == 3; /* R_FR30_32. */
9875 return reloc_type == 1; /* R_H8_DIR32. */
9877 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9880 return reloc_type == 2; /* R_IP2K_32. */
9882 return reloc_type == 2; /* R_IQ2000_32. */
9883 case EM_LATTICEMICO32:
9884 return reloc_type == 3; /* R_LM32_32. */
9887 return reloc_type == 3; /* R_M32C_32. */
9889 return reloc_type == 34; /* R_M32R_32_RELA. */
9891 return reloc_type == 1; /* R_MCORE_ADDR32. */
9893 return reloc_type == 4; /* R_MEP_32. */
9895 return reloc_type == 1; /* R_MICROBLAZE_32. */
9897 return reloc_type == 2; /* R_MIPS_32. */
9899 return reloc_type == 4; /* R_MMIX_32. */
9900 case EM_CYGNUS_MN10200:
9902 return reloc_type == 1; /* R_MN10200_32. */
9903 case EM_CYGNUS_MN10300:
9905 return reloc_type == 1; /* R_MN10300_32. */
9907 return reloc_type == 1; /* R_MOXIE_32. */
9910 return reloc_type == 1; /* R_MSP43_32. */
9912 return reloc_type == 2; /* R_MT_32. */
9913 case EM_ALTERA_NIOS2:
9915 return reloc_type == 1; /* R_NIOS_32. */
9918 return reloc_type == 1; /* R_OR32_32. */
9920 return (reloc_type == 1 /* R_PARISC_DIR32. */
9921 || reloc_type == 41); /* R_PARISC_SECREL32. */
9924 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9926 return reloc_type == 1; /* R_PPC64_ADDR32. */
9928 return reloc_type == 1; /* R_PPC_ADDR32. */
9930 return reloc_type == 1; /* R_RL78_DIR32. */
9932 return reloc_type == 1; /* R_RX_DIR32. */
9934 return reloc_type == 1; /* R_I370_ADDR31. */
9937 return reloc_type == 4; /* R_S390_32. */
9939 return reloc_type == 8; /* R_SCORE_ABS32. */
9941 return reloc_type == 1; /* R_SH_DIR32. */
9942 case EM_SPARC32PLUS:
9945 return reloc_type == 3 /* R_SPARC_32. */
9946 || reloc_type == 23; /* R_SPARC_UA32. */
9948 return reloc_type == 6; /* R_SPU_ADDR32 */
9950 return reloc_type == 1; /* R_C6000_ABS32. */
9952 return reloc_type == 2; /* R_TILEGX_32. */
9954 return reloc_type == 1; /* R_TILEPRO_32. */
9955 case EM_CYGNUS_V850:
9957 return reloc_type == 6; /* R_V850_ABS32. */
9959 return reloc_type == 1; /* R_VAX_32. */
9963 return reloc_type == 10; /* R_X86_64_32. */
9966 return reloc_type == 3; /* R_XC16C_ABS_32. */
9968 return reloc_type == 4; /* R_XGATE_32. */
9970 return reloc_type == 1; /* R_XSTROMY16_32. */
9973 return reloc_type == 1; /* R_XTENSA_32. */
9975 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9976 elf_header.e_machine);
9981 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9982 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9985 is_32bit_pcrel_reloc (unsigned int reloc_type)
9987 switch (elf_header.e_machine)
9991 return reloc_type == 2; /* R_386_PC32. */
9993 return reloc_type == 4; /* R_68K_PC32. */
9995 return reloc_type == 261; /* R_AARCH64_PREL32 */
9996 case EM_ADAPTEVA_EPIPHANY:
9997 return reloc_type == 6;
9999 return reloc_type == 10; /* R_ALPHA_SREL32. */
10001 return reloc_type == 3; /* R_ARM_REL32 */
10002 case EM_MICROBLAZE:
10003 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
10005 return reloc_type == 9; /* R_PARISC_PCREL32. */
10007 return reloc_type == 26; /* R_PPC_REL32. */
10009 return reloc_type == 26; /* R_PPC64_REL32. */
10012 return reloc_type == 5; /* R_390_PC32. */
10014 return reloc_type == 2; /* R_SH_REL32. */
10015 case EM_SPARC32PLUS:
10018 return reloc_type == 6; /* R_SPARC_DISP32. */
10020 return reloc_type == 13; /* R_SPU_REL32. */
10022 return reloc_type == 6; /* R_TILEGX_32_PCREL. */
10024 return reloc_type == 4; /* R_TILEPRO_32_PCREL. */
10028 return reloc_type == 2; /* R_X86_64_PC32. */
10029 case EM_XTENSA_OLD:
10031 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
10033 /* Do not abort or issue an error message here. Not all targets use
10034 pc-relative 32-bit relocs in their DWARF debug information and we
10035 have already tested for target coverage in is_32bit_abs_reloc. A
10036 more helpful warning message will be generated by apply_relocations
10037 anyway, so just return. */
10042 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10043 a 64-bit absolute RELA relocation used in DWARF debug sections. */
10046 is_64bit_abs_reloc (unsigned int reloc_type)
10048 switch (elf_header.e_machine)
10051 return reloc_type == 257; /* R_AARCH64_ABS64. */
10053 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
10055 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
10057 return reloc_type == 80; /* R_PARISC_DIR64. */
10059 return reloc_type == 38; /* R_PPC64_ADDR64. */
10060 case EM_SPARC32PLUS:
10063 return reloc_type == 54; /* R_SPARC_UA64. */
10067 return reloc_type == 1; /* R_X86_64_64. */
10070 return reloc_type == 22; /* R_S390_64. */
10072 return reloc_type == 1; /* R_TILEGX_64. */
10074 return reloc_type == 18; /* R_MIPS_64. */
10080 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
10081 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
10084 is_64bit_pcrel_reloc (unsigned int reloc_type)
10086 switch (elf_header.e_machine)
10089 return reloc_type == 260; /* R_AARCH64_PREL64. */
10091 return reloc_type == 11; /* R_ALPHA_SREL64. */
10093 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB. */
10095 return reloc_type == 72; /* R_PARISC_PCREL64. */
10097 return reloc_type == 44; /* R_PPC64_REL64. */
10098 case EM_SPARC32PLUS:
10101 return reloc_type == 46; /* R_SPARC_DISP64. */
10105 return reloc_type == 24; /* R_X86_64_PC64. */
10108 return reloc_type == 23; /* R_S390_PC64. */
10110 return reloc_type == 5; /* R_TILEGX_64_PCREL. */
10116 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10117 a 24-bit absolute RELA relocation used in DWARF debug sections. */
10120 is_24bit_abs_reloc (unsigned int reloc_type)
10122 switch (elf_header.e_machine)
10124 case EM_CYGNUS_MN10200:
10126 return reloc_type == 4; /* R_MN10200_24. */
10132 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
10133 a 16-bit absolute RELA relocation used in DWARF debug sections. */
10136 is_16bit_abs_reloc (unsigned int reloc_type)
10138 switch (elf_header.e_machine)
10142 return reloc_type == 4; /* R_AVR_16. */
10143 case EM_ADAPTEVA_EPIPHANY:
10144 return reloc_type == 5;
10145 case EM_CYGNUS_D10V:
10147 return reloc_type == 3; /* R_D10V_16. */
10151 return reloc_type == R_H8_DIR16;
10154 return reloc_type == 1; /* R_IP2K_16. */
10157 return reloc_type == 1; /* R_M32C_16 */
10158 case EM_MSP430_OLD:
10160 return reloc_type == 5; /* R_MSP430_16_BYTE. */
10161 case EM_ALTERA_NIOS2:
10163 return reloc_type == 9; /* R_NIOS_16. */
10165 return reloc_type == 2; /* R_C6000_ABS16. */
10168 return reloc_type == 2; /* R_XC16C_ABS_16. */
10169 case EM_CYGNUS_MN10200:
10171 return reloc_type == 2; /* R_MN10200_16. */
10172 case EM_CYGNUS_MN10300:
10174 return reloc_type == 2; /* R_MN10300_16. */
10176 return reloc_type == 3; /* R_XGATE_16. */
10182 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
10183 relocation entries (possibly formerly used for SHT_GROUP sections). */
10186 is_none_reloc (unsigned int reloc_type)
10188 switch (elf_header.e_machine)
10190 case EM_68K: /* R_68K_NONE. */
10191 case EM_386: /* R_386_NONE. */
10192 case EM_SPARC32PLUS:
10194 case EM_SPARC: /* R_SPARC_NONE. */
10195 case EM_MIPS: /* R_MIPS_NONE. */
10196 case EM_PARISC: /* R_PARISC_NONE. */
10197 case EM_ALPHA: /* R_ALPHA_NONE. */
10198 case EM_ADAPTEVA_EPIPHANY:
10199 case EM_PPC: /* R_PPC_NONE. */
10200 case EM_PPC64: /* R_PPC64_NONE. */
10201 case EM_ARM: /* R_ARM_NONE. */
10202 case EM_IA_64: /* R_IA64_NONE. */
10203 case EM_SH: /* R_SH_NONE. */
10205 case EM_S390: /* R_390_NONE. */
10206 case EM_CRIS: /* R_CRIS_NONE. */
10207 case EM_X86_64: /* R_X86_64_NONE. */
10208 case EM_L1OM: /* R_X86_64_NONE. */
10209 case EM_K1OM: /* R_X86_64_NONE. */
10210 case EM_MN10300: /* R_MN10300_NONE. */
10211 case EM_MOXIE: /* R_MOXIE_NONE. */
10212 case EM_M32R: /* R_M32R_NONE. */
10213 case EM_TI_C6000:/* R_C6000_NONE. */
10214 case EM_TILEGX: /* R_TILEGX_NONE. */
10215 case EM_TILEPRO: /* R_TILEPRO_NONE. */
10217 case EM_C166: /* R_XC16X_NONE. */
10218 return reloc_type == 0;
10220 return reloc_type == 0 || reloc_type == 256;
10221 case EM_XTENSA_OLD:
10223 return (reloc_type == 0 /* R_XTENSA_NONE. */
10224 || reloc_type == 17 /* R_XTENSA_DIFF8. */
10225 || reloc_type == 18 /* R_XTENSA_DIFF16. */
10226 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
10231 /* Apply relocations to a section.
10232 Note: So far support has been added only for those relocations
10233 which can be found in debug sections.
10234 FIXME: Add support for more relocations ? */
10237 apply_relocations (void * file,
10238 Elf_Internal_Shdr * section,
10239 unsigned char * start)
10241 Elf_Internal_Shdr * relsec;
10242 unsigned char * end = start + section->sh_size;
10244 if (elf_header.e_type != ET_REL)
10247 /* Find the reloc section associated with the section. */
10248 for (relsec = section_headers;
10249 relsec < section_headers + elf_header.e_shnum;
10252 bfd_boolean is_rela;
10253 unsigned long num_relocs;
10254 Elf_Internal_Rela * relocs;
10255 Elf_Internal_Rela * rp;
10256 Elf_Internal_Shdr * symsec;
10257 Elf_Internal_Sym * symtab;
10258 unsigned long num_syms;
10259 Elf_Internal_Sym * sym;
10261 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10262 || relsec->sh_info >= elf_header.e_shnum
10263 || section_headers + relsec->sh_info != section
10264 || relsec->sh_size == 0
10265 || relsec->sh_link >= elf_header.e_shnum)
10268 is_rela = relsec->sh_type == SHT_RELA;
10272 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
10273 relsec->sh_size, & relocs, & num_relocs))
10278 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
10279 relsec->sh_size, & relocs, & num_relocs))
10283 /* SH uses RELA but uses in place value instead of the addend field. */
10284 if (elf_header.e_machine == EM_SH)
10287 symsec = section_headers + relsec->sh_link;
10288 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
10290 for (rp = relocs; rp < relocs + num_relocs; ++rp)
10293 unsigned int reloc_type;
10294 unsigned int reloc_size;
10295 unsigned char * rloc;
10296 unsigned long sym_index;
10298 reloc_type = get_reloc_type (rp->r_info);
10300 if (target_specific_reloc_handling (rp, start, symtab))
10302 else if (is_none_reloc (reloc_type))
10304 else if (is_32bit_abs_reloc (reloc_type)
10305 || is_32bit_pcrel_reloc (reloc_type))
10307 else if (is_64bit_abs_reloc (reloc_type)
10308 || is_64bit_pcrel_reloc (reloc_type))
10310 else if (is_24bit_abs_reloc (reloc_type))
10312 else if (is_16bit_abs_reloc (reloc_type))
10316 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
10317 reloc_type, SECTION_NAME (section));
10321 rloc = start + rp->r_offset;
10322 if ((rloc + reloc_size) > end)
10324 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
10325 (unsigned long) rp->r_offset,
10326 SECTION_NAME (section));
10330 sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
10331 if (sym_index >= num_syms)
10333 warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
10334 sym_index, SECTION_NAME (section));
10337 sym = symtab + sym_index;
10339 /* If the reloc has a symbol associated with it,
10340 make sure that it is of an appropriate type.
10342 Relocations against symbols without type can happen.
10343 Gcc -feliminate-dwarf2-dups may generate symbols
10344 without type for debug info.
10346 Icc generates relocations against function symbols
10347 instead of local labels.
10349 Relocations against object symbols can happen, eg when
10350 referencing a global array. For an example of this see
10351 the _clz.o binary in libgcc.a. */
10353 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
10355 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
10356 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
10357 (long int)(rp - relocs),
10358 SECTION_NAME (relsec));
10364 addend += rp->r_addend;
10365 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
10366 partial_inplace. */
10368 || (elf_header.e_machine == EM_XTENSA
10369 && reloc_type == 1)
10370 || ((elf_header.e_machine == EM_PJ
10371 || elf_header.e_machine == EM_PJ_OLD)
10372 && reloc_type == 1)
10373 || ((elf_header.e_machine == EM_D30V
10374 || elf_header.e_machine == EM_CYGNUS_D30V)
10375 && reloc_type == 12))
10376 addend += byte_get (rloc, reloc_size);
10378 if (is_32bit_pcrel_reloc (reloc_type)
10379 || is_64bit_pcrel_reloc (reloc_type))
10381 /* On HPPA, all pc-relative relocations are biased by 8. */
10382 if (elf_header.e_machine == EM_PARISC)
10384 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
10388 byte_put (rloc, addend + sym->st_value, reloc_size);
10397 #ifdef SUPPORT_DISASSEMBLY
10399 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
10401 printf (_("\nAssembly dump of section %s\n"),
10402 SECTION_NAME (section));
10404 /* XXX -- to be done --- XXX */
10410 /* Reads in the contents of SECTION from FILE, returning a pointer
10411 to a malloc'ed buffer or NULL if something went wrong. */
10414 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
10416 bfd_size_type num_bytes;
10418 num_bytes = section->sh_size;
10420 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
10422 printf (_("\nSection '%s' has no data to dump.\n"),
10423 SECTION_NAME (section));
10427 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
10428 _("section contents"));
10433 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
10435 Elf_Internal_Shdr * relsec;
10436 bfd_size_type num_bytes;
10440 char * name = SECTION_NAME (section);
10441 bfd_boolean some_strings_shown;
10443 start = get_section_contents (section, file);
10447 printf (_("\nString dump of section '%s':\n"), name);
10449 /* If the section being dumped has relocations against it the user might
10450 be expecting these relocations to have been applied. Check for this
10451 case and issue a warning message in order to avoid confusion.
10452 FIXME: Maybe we ought to have an option that dumps a section with
10453 relocs applied ? */
10454 for (relsec = section_headers;
10455 relsec < section_headers + elf_header.e_shnum;
10458 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10459 || relsec->sh_info >= elf_header.e_shnum
10460 || section_headers + relsec->sh_info != section
10461 || relsec->sh_size == 0
10462 || relsec->sh_link >= elf_header.e_shnum)
10465 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10469 num_bytes = section->sh_size;
10471 end = start + num_bytes;
10472 some_strings_shown = FALSE;
10476 while (!ISPRINT (* data))
10477 if (++ data >= end)
10483 /* PR 11128: Use two separate invocations in order to work
10484 around bugs in the Solaris 8 implementation of printf. */
10485 printf (" [%6tx] ", data - start);
10486 printf ("%s\n", data);
10488 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
10490 data += strlen (data);
10491 some_strings_shown = TRUE;
10495 if (! some_strings_shown)
10496 printf (_(" No strings found in this section."));
10504 dump_section_as_bytes (Elf_Internal_Shdr * section,
10506 bfd_boolean relocate)
10508 Elf_Internal_Shdr * relsec;
10509 bfd_size_type bytes;
10511 unsigned char * data;
10512 unsigned char * start;
10514 start = (unsigned char *) get_section_contents (section, file);
10518 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
10522 apply_relocations (file, section, start);
10526 /* If the section being dumped has relocations against it the user might
10527 be expecting these relocations to have been applied. Check for this
10528 case and issue a warning message in order to avoid confusion.
10529 FIXME: Maybe we ought to have an option that dumps a section with
10530 relocs applied ? */
10531 for (relsec = section_headers;
10532 relsec < section_headers + elf_header.e_shnum;
10535 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
10536 || relsec->sh_info >= elf_header.e_shnum
10537 || section_headers + relsec->sh_info != section
10538 || relsec->sh_size == 0
10539 || relsec->sh_link >= elf_header.e_shnum)
10542 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
10547 addr = section->sh_addr;
10548 bytes = section->sh_size;
10557 lbytes = (bytes > 16 ? 16 : bytes);
10559 printf (" 0x%8.8lx ", (unsigned long) addr);
10561 for (j = 0; j < 16; j++)
10564 printf ("%2.2x", data[j]);
10572 for (j = 0; j < lbytes; j++)
10575 if (k >= ' ' && k < 0x7f)
10593 /* Uncompresses a section that was compressed using zlib, in place. */
10596 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
10597 dwarf_size_type *size ATTRIBUTE_UNUSED)
10599 #ifndef HAVE_ZLIB_H
10602 dwarf_size_type compressed_size = *size;
10603 unsigned char * compressed_buffer = *buffer;
10604 dwarf_size_type uncompressed_size;
10605 unsigned char * uncompressed_buffer;
10608 dwarf_size_type header_size = 12;
10610 /* Read the zlib header. In this case, it should be "ZLIB" followed
10611 by the uncompressed section size, 8 bytes in big-endian order. */
10612 if (compressed_size < header_size
10613 || ! streq ((char *) compressed_buffer, "ZLIB"))
10616 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10617 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10618 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10619 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10620 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10621 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10622 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10623 uncompressed_size += compressed_buffer[11];
10625 /* It is possible the section consists of several compressed
10626 buffers concatenated together, so we uncompress in a loop. */
10627 strm.zalloc = NULL;
10629 strm.opaque = NULL;
10630 strm.avail_in = compressed_size - header_size;
10631 strm.next_in = (Bytef *) compressed_buffer + header_size;
10632 strm.avail_out = uncompressed_size;
10633 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10635 rc = inflateInit (& strm);
10636 while (strm.avail_in > 0)
10640 strm.next_out = ((Bytef *) uncompressed_buffer
10641 + (uncompressed_size - strm.avail_out));
10642 rc = inflate (&strm, Z_FINISH);
10643 if (rc != Z_STREAM_END)
10645 rc = inflateReset (& strm);
10647 rc = inflateEnd (& strm);
10649 || strm.avail_out != 0)
10652 free (compressed_buffer);
10653 *buffer = uncompressed_buffer;
10654 *size = uncompressed_size;
10658 free (uncompressed_buffer);
10659 /* Indicate decompression failure. */
10662 #endif /* HAVE_ZLIB_H */
10666 load_specific_debug_section (enum dwarf_section_display_enum debug,
10667 Elf_Internal_Shdr * sec, void * file)
10669 struct dwarf_section * section = &debug_displays [debug].section;
10672 /* If it is already loaded, do nothing. */
10673 if (section->start != NULL)
10676 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10677 section->address = sec->sh_addr;
10678 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10680 sec->sh_size, buf);
10681 if (section->start == NULL)
10685 section->size = sec->sh_size;
10686 if (uncompress_section_contents (§ion->start, §ion->size))
10687 sec->sh_size = section->size;
10690 if (section->start == NULL)
10693 if (debug_displays [debug].relocate)
10694 apply_relocations ((FILE *) file, sec, section->start);
10699 /* If this is not NULL, load_debug_section will only look for sections
10700 within the list of sections given here. */
10701 unsigned int *section_subset = NULL;
10704 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10706 struct dwarf_section * section = &debug_displays [debug].section;
10707 Elf_Internal_Shdr * sec;
10709 /* Locate the debug section. */
10710 sec = find_section_in_set (section->uncompressed_name, section_subset);
10712 section->name = section->uncompressed_name;
10715 sec = find_section_in_set (section->compressed_name, section_subset);
10717 section->name = section->compressed_name;
10722 /* If we're loading from a subset of sections, and we've loaded
10723 a section matching this name before, it's likely that it's a
10725 if (section_subset != NULL)
10726 free_debug_section (debug);
10728 return load_specific_debug_section (debug, sec, (FILE *) file);
10732 free_debug_section (enum dwarf_section_display_enum debug)
10734 struct dwarf_section * section = &debug_displays [debug].section;
10736 if (section->start == NULL)
10739 free ((char *) section->start);
10740 section->start = NULL;
10741 section->address = 0;
10746 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
10748 char * name = SECTION_NAME (section);
10749 bfd_size_type length;
10753 length = section->sh_size;
10756 printf (_("\nSection '%s' has no debugging data.\n"), name);
10759 if (section->sh_type == SHT_NOBITS)
10761 /* There is no point in dumping the contents of a debugging section
10762 which has the NOBITS type - the bits in the file will be random.
10763 This can happen when a file containing a .eh_frame section is
10764 stripped with the --only-keep-debug command line option. */
10765 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10769 if (const_strneq (name, ".gnu.linkonce.wi."))
10770 name = ".debug_info";
10772 /* See if we know how to display the contents of this section. */
10773 for (i = 0; i < max; i++)
10774 if (streq (debug_displays[i].section.uncompressed_name, name)
10775 || streq (debug_displays[i].section.compressed_name, name))
10777 struct dwarf_section * sec = &debug_displays [i].section;
10778 int secondary = (section != find_section (name));
10781 free_debug_section ((enum dwarf_section_display_enum) i);
10783 if (streq (sec->uncompressed_name, name))
10784 sec->name = sec->uncompressed_name;
10786 sec->name = sec->compressed_name;
10787 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10790 /* If this debug section is part of a CU/TU set in a .dwp file,
10791 restrict load_debug_section to the sections in that set. */
10792 section_subset = find_cu_tu_set (file, shndx);
10794 result &= debug_displays[i].display (sec, file);
10796 section_subset = NULL;
10798 if (secondary || (i != info && i != abbrev))
10799 free_debug_section ((enum dwarf_section_display_enum) i);
10807 printf (_("Unrecognized debug section: %s\n"), name);
10814 /* Set DUMP_SECTS for all sections where dumps were requested
10815 based on section name. */
10818 initialise_dumps_byname (void)
10820 struct dump_list_entry * cur;
10822 for (cur = dump_sects_byname; cur; cur = cur->next)
10827 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10828 if (streq (SECTION_NAME (section_headers + i), cur->name))
10830 request_dump_bynumber (i, cur->type);
10835 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10841 process_section_contents (FILE * file)
10843 Elf_Internal_Shdr * section;
10849 initialise_dumps_byname ();
10851 for (i = 0, section = section_headers;
10852 i < elf_header.e_shnum && i < num_dump_sects;
10855 #ifdef SUPPORT_DISASSEMBLY
10856 if (dump_sects[i] & DISASS_DUMP)
10857 disassemble_section (section, file);
10859 if (dump_sects[i] & HEX_DUMP)
10860 dump_section_as_bytes (section, file, FALSE);
10862 if (dump_sects[i] & RELOC_DUMP)
10863 dump_section_as_bytes (section, file, TRUE);
10865 if (dump_sects[i] & STRING_DUMP)
10866 dump_section_as_strings (section, file);
10868 if (dump_sects[i] & DEBUG_DUMP)
10869 display_debug_section (i, section, file);
10872 /* Check to see if the user requested a
10873 dump of a section that does not exist. */
10874 while (i++ < num_dump_sects)
10876 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10880 process_mips_fpe_exception (int mask)
10885 if (mask & OEX_FPU_INEX)
10886 fputs ("INEX", stdout), first = 0;
10887 if (mask & OEX_FPU_UFLO)
10888 printf ("%sUFLO", first ? "" : "|"), first = 0;
10889 if (mask & OEX_FPU_OFLO)
10890 printf ("%sOFLO", first ? "" : "|"), first = 0;
10891 if (mask & OEX_FPU_DIV0)
10892 printf ("%sDIV0", first ? "" : "|"), first = 0;
10893 if (mask & OEX_FPU_INVAL)
10894 printf ("%sINVAL", first ? "" : "|");
10897 fputs ("0", stdout);
10900 /* ARM EABI attributes section. */
10905 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10907 const char ** table;
10908 } arm_attr_public_tag;
10910 static const char * arm_attr_tag_CPU_arch[] =
10911 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10912 "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8"};
10913 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10914 static const char * arm_attr_tag_THUMB_ISA_use[] =
10915 {"No", "Thumb-1", "Thumb-2"};
10916 static const char * arm_attr_tag_FP_arch[] =
10917 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
10919 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10920 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10921 {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8"};
10922 static const char * arm_attr_tag_PCS_config[] =
10923 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10924 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10925 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10926 {"V6", "SB", "TLS", "Unused"};
10927 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10928 {"Absolute", "PC-relative", "SB-relative", "None"};
10929 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10930 {"Absolute", "PC-relative", "None"};
10931 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10932 {"None", "direct", "GOT-indirect"};
10933 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10934 {"None", "??? 1", "2", "??? 3", "4"};
10935 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10936 static const char * arm_attr_tag_ABI_FP_denormal[] =
10937 {"Unused", "Needed", "Sign only"};
10938 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10939 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10940 static const char * arm_attr_tag_ABI_FP_number_model[] =
10941 {"Unused", "Finite", "RTABI", "IEEE 754"};
10942 static const char * arm_attr_tag_ABI_enum_size[] =
10943 {"Unused", "small", "int", "forced to int"};
10944 static const char * arm_attr_tag_ABI_HardFP_use[] =
10945 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10946 static const char * arm_attr_tag_ABI_VFP_args[] =
10947 {"AAPCS", "VFP registers", "custom"};
10948 static const char * arm_attr_tag_ABI_WMMX_args[] =
10949 {"AAPCS", "WMMX registers", "custom"};
10950 static const char * arm_attr_tag_ABI_optimization_goals[] =
10951 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10952 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10953 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10954 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10955 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10956 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10957 static const char * arm_attr_tag_FP_HP_extension[] =
10958 {"Not Allowed", "Allowed"};
10959 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10960 {"None", "IEEE 754", "Alternative Format"};
10961 static const char * arm_attr_tag_MPextension_use[] =
10962 {"Not Allowed", "Allowed"};
10963 static const char * arm_attr_tag_DIV_use[] =
10964 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10965 "Allowed in v7-A with integer division extension"};
10966 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10967 static const char * arm_attr_tag_Virtualization_use[] =
10968 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10969 "TrustZone and Virtualization Extensions"};
10970 static const char * arm_attr_tag_MPextension_use_legacy[] =
10971 {"Not Allowed", "Allowed"};
10973 #define LOOKUP(id, name) \
10974 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10975 static arm_attr_public_tag arm_attr_public_tags[] =
10977 {4, "CPU_raw_name", 1, NULL},
10978 {5, "CPU_name", 1, NULL},
10979 LOOKUP(6, CPU_arch),
10980 {7, "CPU_arch_profile", 0, NULL},
10981 LOOKUP(8, ARM_ISA_use),
10982 LOOKUP(9, THUMB_ISA_use),
10983 LOOKUP(10, FP_arch),
10984 LOOKUP(11, WMMX_arch),
10985 LOOKUP(12, Advanced_SIMD_arch),
10986 LOOKUP(13, PCS_config),
10987 LOOKUP(14, ABI_PCS_R9_use),
10988 LOOKUP(15, ABI_PCS_RW_data),
10989 LOOKUP(16, ABI_PCS_RO_data),
10990 LOOKUP(17, ABI_PCS_GOT_use),
10991 LOOKUP(18, ABI_PCS_wchar_t),
10992 LOOKUP(19, ABI_FP_rounding),
10993 LOOKUP(20, ABI_FP_denormal),
10994 LOOKUP(21, ABI_FP_exceptions),
10995 LOOKUP(22, ABI_FP_user_exceptions),
10996 LOOKUP(23, ABI_FP_number_model),
10997 {24, "ABI_align_needed", 0, NULL},
10998 {25, "ABI_align_preserved", 0, NULL},
10999 LOOKUP(26, ABI_enum_size),
11000 LOOKUP(27, ABI_HardFP_use),
11001 LOOKUP(28, ABI_VFP_args),
11002 LOOKUP(29, ABI_WMMX_args),
11003 LOOKUP(30, ABI_optimization_goals),
11004 LOOKUP(31, ABI_FP_optimization_goals),
11005 {32, "compatibility", 0, NULL},
11006 LOOKUP(34, CPU_unaligned_access),
11007 LOOKUP(36, FP_HP_extension),
11008 LOOKUP(38, ABI_FP_16bit_format),
11009 LOOKUP(42, MPextension_use),
11010 LOOKUP(44, DIV_use),
11011 {64, "nodefaults", 0, NULL},
11012 {65, "also_compatible_with", 0, NULL},
11013 LOOKUP(66, T2EE_use),
11014 {67, "conformance", 1, NULL},
11015 LOOKUP(68, Virtualization_use),
11016 LOOKUP(70, MPextension_use_legacy)
11020 static unsigned char *
11021 display_arm_attribute (unsigned char * p)
11026 arm_attr_public_tag * attr;
11030 tag = read_uleb128 (p, &len);
11033 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
11035 if (arm_attr_public_tags[i].tag == tag)
11037 attr = &arm_attr_public_tags[i];
11044 printf (" Tag_%s: ", attr->name);
11045 switch (attr->type)
11050 case 7: /* Tag_CPU_arch_profile. */
11051 val = read_uleb128 (p, &len);
11055 case 0: printf (_("None\n")); break;
11056 case 'A': printf (_("Application\n")); break;
11057 case 'R': printf (_("Realtime\n")); break;
11058 case 'M': printf (_("Microcontroller\n")); break;
11059 case 'S': printf (_("Application or Realtime\n")); break;
11060 default: printf ("??? (%d)\n", val); break;
11064 case 24: /* Tag_align_needed. */
11065 val = read_uleb128 (p, &len);
11069 case 0: printf (_("None\n")); break;
11070 case 1: printf (_("8-byte\n")); break;
11071 case 2: printf (_("4-byte\n")); break;
11072 case 3: printf ("??? 3\n"); break;
11075 printf (_("8-byte and up to %d-byte extended\n"),
11078 printf ("??? (%d)\n", val);
11083 case 25: /* Tag_align_preserved. */
11084 val = read_uleb128 (p, &len);
11088 case 0: printf (_("None\n")); break;
11089 case 1: printf (_("8-byte, except leaf SP\n")); break;
11090 case 2: printf (_("8-byte\n")); break;
11091 case 3: printf ("??? 3\n"); break;
11094 printf (_("8-byte and up to %d-byte extended\n"),
11097 printf ("??? (%d)\n", val);
11102 case 32: /* Tag_compatibility. */
11103 val = read_uleb128 (p, &len);
11105 printf (_("flag = %d, vendor = %s\n"), val, p);
11106 p += strlen ((char *) p) + 1;
11109 case 64: /* Tag_nodefaults. */
11111 printf (_("True\n"));
11114 case 65: /* Tag_also_compatible_with. */
11115 val = read_uleb128 (p, &len);
11117 if (val == 6 /* Tag_CPU_arch. */)
11119 val = read_uleb128 (p, &len);
11121 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
11122 printf ("??? (%d)\n", val);
11124 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
11128 while (*(p++) != '\0' /* NUL terminator. */);
11142 assert (attr->type & 0x80);
11143 val = read_uleb128 (p, &len);
11145 type = attr->type & 0x7f;
11147 printf ("??? (%d)\n", val);
11149 printf ("%s\n", attr->table[val]);
11156 type = 1; /* String. */
11158 type = 2; /* uleb128. */
11159 printf (" Tag_unknown_%d: ", tag);
11164 printf ("\"%s\"\n", p);
11165 p += strlen ((char *) p) + 1;
11169 val = read_uleb128 (p, &len);
11171 printf ("%d (0x%x)\n", val, val);
11177 static unsigned char *
11178 display_gnu_attribute (unsigned char * p,
11179 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11186 tag = read_uleb128 (p, &len);
11189 /* Tag_compatibility is the only generic GNU attribute defined at
11193 val = read_uleb128 (p, &len);
11195 printf (_("flag = %d, vendor = %s\n"), val, p);
11196 p += strlen ((char *) p) + 1;
11200 if ((tag & 2) == 0 && display_proc_gnu_attribute)
11201 return display_proc_gnu_attribute (p, tag);
11204 type = 1; /* String. */
11206 type = 2; /* uleb128. */
11207 printf (" Tag_unknown_%d: ", tag);
11211 printf ("\"%s\"\n", p);
11212 p += strlen ((char *) p) + 1;
11216 val = read_uleb128 (p, &len);
11218 printf ("%d (0x%x)\n", val, val);
11224 static unsigned char *
11225 display_power_gnu_attribute (unsigned char * p, int tag)
11231 if (tag == Tag_GNU_Power_ABI_FP)
11233 val = read_uleb128 (p, &len);
11235 printf (" Tag_GNU_Power_ABI_FP: ");
11240 printf (_("Hard or soft float\n"));
11243 printf (_("Hard float\n"));
11246 printf (_("Soft float\n"));
11249 printf (_("Single-precision hard float\n"));
11252 printf ("??? (%d)\n", val);
11258 if (tag == Tag_GNU_Power_ABI_Vector)
11260 val = read_uleb128 (p, &len);
11262 printf (" Tag_GNU_Power_ABI_Vector: ");
11266 printf (_("Any\n"));
11269 printf (_("Generic\n"));
11272 printf ("AltiVec\n");
11278 printf ("??? (%d)\n", val);
11284 if (tag == Tag_GNU_Power_ABI_Struct_Return)
11286 val = read_uleb128 (p, &len);
11288 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
11292 printf (_("Any\n"));
11295 printf ("r3/r4\n");
11298 printf (_("Memory\n"));
11301 printf ("??? (%d)\n", val);
11308 type = 1; /* String. */
11310 type = 2; /* uleb128. */
11311 printf (" Tag_unknown_%d: ", tag);
11315 printf ("\"%s\"\n", p);
11316 p += strlen ((char *) p) + 1;
11320 val = read_uleb128 (p, &len);
11322 printf ("%d (0x%x)\n", val, val);
11329 display_sparc_hwcaps (int mask)
11334 if (mask & ELF_SPARC_HWCAP_MUL32)
11335 fputs ("mul32", stdout), first = 0;
11336 if (mask & ELF_SPARC_HWCAP_DIV32)
11337 printf ("%sdiv32", first ? "" : "|"), first = 0;
11338 if (mask & ELF_SPARC_HWCAP_FSMULD)
11339 printf ("%sfsmuld", first ? "" : "|"), first = 0;
11340 if (mask & ELF_SPARC_HWCAP_V8PLUS)
11341 printf ("%sv8plus", first ? "" : "|"), first = 0;
11342 if (mask & ELF_SPARC_HWCAP_POPC)
11343 printf ("%spopc", first ? "" : "|"), first = 0;
11344 if (mask & ELF_SPARC_HWCAP_VIS)
11345 printf ("%svis", first ? "" : "|"), first = 0;
11346 if (mask & ELF_SPARC_HWCAP_VIS2)
11347 printf ("%svis2", first ? "" : "|"), first = 0;
11348 if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
11349 printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
11350 if (mask & ELF_SPARC_HWCAP_FMAF)
11351 printf ("%sfmaf", first ? "" : "|"), first = 0;
11352 if (mask & ELF_SPARC_HWCAP_VIS3)
11353 printf ("%svis3", first ? "" : "|"), first = 0;
11354 if (mask & ELF_SPARC_HWCAP_HPC)
11355 printf ("%shpc", first ? "" : "|"), first = 0;
11356 if (mask & ELF_SPARC_HWCAP_RANDOM)
11357 printf ("%srandom", first ? "" : "|"), first = 0;
11358 if (mask & ELF_SPARC_HWCAP_TRANS)
11359 printf ("%strans", first ? "" : "|"), first = 0;
11360 if (mask & ELF_SPARC_HWCAP_FJFMAU)
11361 printf ("%sfjfmau", first ? "" : "|"), first = 0;
11362 if (mask & ELF_SPARC_HWCAP_IMA)
11363 printf ("%sima", first ? "" : "|"), first = 0;
11364 if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
11365 printf ("%scspare", first ? "" : "|"), first = 0;
11368 fputc('0', stdout);
11369 fputc('\n', stdout);
11372 static unsigned char *
11373 display_sparc_gnu_attribute (unsigned char * p, int tag)
11379 if (tag == Tag_GNU_Sparc_HWCAPS)
11381 val = read_uleb128 (p, &len);
11383 printf (" Tag_GNU_Sparc_HWCAPS: ");
11385 display_sparc_hwcaps (val);
11390 type = 1; /* String. */
11392 type = 2; /* uleb128. */
11393 printf (" Tag_unknown_%d: ", tag);
11397 printf ("\"%s\"\n", p);
11398 p += strlen ((char *) p) + 1;
11402 val = read_uleb128 (p, &len);
11404 printf ("%d (0x%x)\n", val, val);
11410 static unsigned char *
11411 display_mips_gnu_attribute (unsigned char * p, int tag)
11417 if (tag == Tag_GNU_MIPS_ABI_FP)
11419 val = read_uleb128 (p, &len);
11421 printf (" Tag_GNU_MIPS_ABI_FP: ");
11426 printf (_("Hard or soft float\n"));
11429 printf (_("Hard float (double precision)\n"));
11432 printf (_("Hard float (single precision)\n"));
11435 printf (_("Soft float\n"));
11438 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
11441 printf ("??? (%d)\n", val);
11448 type = 1; /* String. */
11450 type = 2; /* uleb128. */
11451 printf (" Tag_unknown_%d: ", tag);
11455 printf ("\"%s\"\n", p);
11456 p += strlen ((char *) p) + 1;
11460 val = read_uleb128 (p, &len);
11462 printf ("%d (0x%x)\n", val, val);
11468 static unsigned char *
11469 display_tic6x_attribute (unsigned char * p)
11475 tag = read_uleb128 (p, &len);
11481 val = read_uleb128 (p, &len);
11483 printf (" Tag_ISA: ");
11487 case C6XABI_Tag_ISA_none:
11488 printf (_("None\n"));
11490 case C6XABI_Tag_ISA_C62X:
11493 case C6XABI_Tag_ISA_C67X:
11496 case C6XABI_Tag_ISA_C67XP:
11497 printf ("C67x+\n");
11499 case C6XABI_Tag_ISA_C64X:
11502 case C6XABI_Tag_ISA_C64XP:
11503 printf ("C64x+\n");
11505 case C6XABI_Tag_ISA_C674X:
11506 printf ("C674x\n");
11509 printf ("??? (%d)\n", val);
11514 case Tag_ABI_wchar_t:
11515 val = read_uleb128 (p, &len);
11517 printf (" Tag_ABI_wchar_t: ");
11521 printf (_("Not used\n"));
11524 printf (_("2 bytes\n"));
11527 printf (_("4 bytes\n"));
11530 printf ("??? (%d)\n", val);
11535 case Tag_ABI_stack_align_needed:
11536 val = read_uleb128 (p, &len);
11538 printf (" Tag_ABI_stack_align_needed: ");
11542 printf (_("8-byte\n"));
11545 printf (_("16-byte\n"));
11548 printf ("??? (%d)\n", val);
11553 case Tag_ABI_stack_align_preserved:
11554 val = read_uleb128 (p, &len);
11556 printf (" Tag_ABI_stack_align_preserved: ");
11560 printf (_("8-byte\n"));
11563 printf (_("16-byte\n"));
11566 printf ("??? (%d)\n", val);
11572 val = read_uleb128 (p, &len);
11574 printf (" Tag_ABI_DSBT: ");
11578 printf (_("DSBT addressing not used\n"));
11581 printf (_("DSBT addressing used\n"));
11584 printf ("??? (%d)\n", val);
11590 val = read_uleb128 (p, &len);
11592 printf (" Tag_ABI_PID: ");
11596 printf (_("Data addressing position-dependent\n"));
11599 printf (_("Data addressing position-independent, GOT near DP\n"));
11602 printf (_("Data addressing position-independent, GOT far from DP\n"));
11605 printf ("??? (%d)\n", val);
11611 val = read_uleb128 (p, &len);
11613 printf (" Tag_ABI_PIC: ");
11617 printf (_("Code addressing position-dependent\n"));
11620 printf (_("Code addressing position-independent\n"));
11623 printf ("??? (%d)\n", val);
11628 case Tag_ABI_array_object_alignment:
11629 val = read_uleb128 (p, &len);
11631 printf (" Tag_ABI_array_object_alignment: ");
11635 printf (_("8-byte\n"));
11638 printf (_("4-byte\n"));
11641 printf (_("16-byte\n"));
11644 printf ("??? (%d)\n", val);
11649 case Tag_ABI_array_object_align_expected:
11650 val = read_uleb128 (p, &len);
11652 printf (" Tag_ABI_array_object_align_expected: ");
11656 printf (_("8-byte\n"));
11659 printf (_("4-byte\n"));
11662 printf (_("16-byte\n"));
11665 printf ("??? (%d)\n", val);
11670 case Tag_ABI_compatibility:
11671 val = read_uleb128 (p, &len);
11673 printf (" Tag_ABI_compatibility: ");
11674 printf (_("flag = %d, vendor = %s\n"), val, p);
11675 p += strlen ((char *) p) + 1;
11678 case Tag_ABI_conformance:
11679 printf (" Tag_ABI_conformance: ");
11680 printf ("\"%s\"\n", p);
11681 p += strlen ((char *) p) + 1;
11685 printf (" Tag_unknown_%d: ", tag);
11689 printf ("\"%s\"\n", p);
11690 p += strlen ((char *) p) + 1;
11694 val = read_uleb128 (p, &len);
11696 printf ("%d (0x%x)\n", val, val);
11703 process_attributes (FILE * file,
11704 const char * public_name,
11705 unsigned int proc_type,
11706 unsigned char * (* display_pub_attribute) (unsigned char *),
11707 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11709 Elf_Internal_Shdr * sect;
11710 unsigned char * contents;
11712 unsigned char * end;
11713 bfd_vma section_len;
11717 /* Find the section header so that we get the size. */
11718 for (i = 0, sect = section_headers;
11719 i < elf_header.e_shnum;
11722 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11725 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11726 sect->sh_size, _("attributes"));
11727 if (contents == NULL)
11733 len = sect->sh_size - 1;
11739 bfd_boolean public_section;
11740 bfd_boolean gnu_section;
11742 section_len = byte_get (p, 4);
11745 if (section_len > len)
11747 printf (_("ERROR: Bad section length (%d > %d)\n"),
11748 (int) section_len, (int) len);
11752 len -= section_len;
11753 printf (_("Attribute Section: %s\n"), p);
11755 if (public_name && streq ((char *) p, public_name))
11756 public_section = TRUE;
11758 public_section = FALSE;
11760 if (streq ((char *) p, "gnu"))
11761 gnu_section = TRUE;
11763 gnu_section = FALSE;
11765 namelen = strlen ((char *) p) + 1;
11767 section_len -= namelen + 4;
11769 while (section_len > 0)
11775 size = byte_get (p, 4);
11776 if (size > section_len)
11778 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11779 (int) size, (int) section_len);
11780 size = section_len;
11783 section_len -= size;
11784 end = p + size - 1;
11790 printf (_("File Attributes\n"));
11793 printf (_("Section Attributes:"));
11796 printf (_("Symbol Attributes:"));
11802 val = read_uleb128 (p, &j);
11806 printf (" %d", val);
11811 printf (_("Unknown tag: %d\n"), tag);
11812 public_section = FALSE;
11816 if (public_section)
11819 p = display_pub_attribute (p);
11821 else if (gnu_section)
11824 p = display_gnu_attribute (p,
11825 display_proc_gnu_attribute);
11829 /* ??? Do something sensible, like dump hex. */
11830 printf (_(" Unknown section contexts\n"));
11837 printf (_("Unknown format '%c'\n"), *p);
11845 process_arm_specific (FILE * file)
11847 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11848 display_arm_attribute, NULL);
11852 process_power_specific (FILE * file)
11854 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11855 display_power_gnu_attribute);
11859 process_sparc_specific (FILE * file)
11861 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11862 display_sparc_gnu_attribute);
11866 process_tic6x_specific (FILE * file)
11868 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11869 display_tic6x_attribute, NULL);
11872 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11873 Print the Address, Access and Initial fields of an entry at VMA ADDR
11874 and return the VMA of the next entry. */
11877 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11880 print_vma (addr, LONG_HEX);
11882 if (addr < pltgot + 0xfff0)
11883 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11885 printf ("%10s", "");
11888 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11893 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11894 print_vma (entry, LONG_HEX);
11896 return addr + (is_32bit_elf ? 4 : 8);
11899 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11900 PLTGOT. Print the Address and Initial fields of an entry at VMA
11901 ADDR and return the VMA of the next entry. */
11904 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11907 print_vma (addr, LONG_HEX);
11910 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11915 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11916 print_vma (entry, LONG_HEX);
11918 return addr + (is_32bit_elf ? 4 : 8);
11922 process_mips_specific (FILE * file)
11924 Elf_Internal_Dyn * entry;
11925 size_t liblist_offset = 0;
11926 size_t liblistno = 0;
11927 size_t conflictsno = 0;
11928 size_t options_offset = 0;
11929 size_t conflicts_offset = 0;
11930 size_t pltrelsz = 0;
11932 bfd_vma pltgot = 0;
11933 bfd_vma mips_pltgot = 0;
11934 bfd_vma jmprel = 0;
11935 bfd_vma local_gotno = 0;
11936 bfd_vma gotsym = 0;
11937 bfd_vma symtabno = 0;
11939 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11940 display_mips_gnu_attribute);
11942 /* We have a lot of special sections. Thanks SGI! */
11943 if (dynamic_section == NULL)
11944 /* No information available. */
11947 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11948 switch (entry->d_tag)
11950 case DT_MIPS_LIBLIST:
11952 = offset_from_vma (file, entry->d_un.d_val,
11953 liblistno * sizeof (Elf32_External_Lib));
11955 case DT_MIPS_LIBLISTNO:
11956 liblistno = entry->d_un.d_val;
11958 case DT_MIPS_OPTIONS:
11959 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11961 case DT_MIPS_CONFLICT:
11963 = offset_from_vma (file, entry->d_un.d_val,
11964 conflictsno * sizeof (Elf32_External_Conflict));
11966 case DT_MIPS_CONFLICTNO:
11967 conflictsno = entry->d_un.d_val;
11970 pltgot = entry->d_un.d_ptr;
11972 case DT_MIPS_LOCAL_GOTNO:
11973 local_gotno = entry->d_un.d_val;
11975 case DT_MIPS_GOTSYM:
11976 gotsym = entry->d_un.d_val;
11978 case DT_MIPS_SYMTABNO:
11979 symtabno = entry->d_un.d_val;
11981 case DT_MIPS_PLTGOT:
11982 mips_pltgot = entry->d_un.d_ptr;
11985 pltrel = entry->d_un.d_val;
11988 pltrelsz = entry->d_un.d_val;
11991 jmprel = entry->d_un.d_ptr;
11997 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11999 Elf32_External_Lib * elib;
12002 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
12004 sizeof (Elf32_External_Lib),
12005 _("liblist section data"));
12008 printf (_("\nSection '.liblist' contains %lu entries:\n"),
12009 (unsigned long) liblistno);
12010 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
12013 for (cnt = 0; cnt < liblistno; ++cnt)
12020 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12021 atime = BYTE_GET (elib[cnt].l_time_stamp);
12022 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12023 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12024 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12026 tmp = gmtime (&atime);
12027 snprintf (timebuf, sizeof (timebuf),
12028 "%04u-%02u-%02uT%02u:%02u:%02u",
12029 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12030 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12032 printf ("%3lu: ", (unsigned long) cnt);
12033 if (VALID_DYNAMIC_NAME (liblist.l_name))
12034 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
12036 printf (_("<corrupt: %9ld>"), liblist.l_name);
12037 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
12038 liblist.l_version);
12040 if (liblist.l_flags == 0)
12044 static const struct
12051 { " EXACT_MATCH", LL_EXACT_MATCH },
12052 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
12053 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
12054 { " EXPORTS", LL_EXPORTS },
12055 { " DELAY_LOAD", LL_DELAY_LOAD },
12056 { " DELTA", LL_DELTA }
12058 int flags = liblist.l_flags;
12061 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
12062 if ((flags & l_flags_vals[fcnt].bit) != 0)
12064 fputs (l_flags_vals[fcnt].name, stdout);
12065 flags ^= l_flags_vals[fcnt].bit;
12068 printf (" %#x", (unsigned int) flags);
12078 if (options_offset != 0)
12080 Elf_External_Options * eopt;
12081 Elf_Internal_Shdr * sect = section_headers;
12082 Elf_Internal_Options * iopt;
12083 Elf_Internal_Options * option;
12087 /* Find the section header so that we get the size. */
12088 while (sect->sh_type != SHT_MIPS_OPTIONS)
12091 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
12092 sect->sh_size, _("options"));
12095 iopt = (Elf_Internal_Options *)
12096 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
12099 error (_("Out of memory\n"));
12106 while (offset < sect->sh_size)
12108 Elf_External_Options * eoption;
12110 eoption = (Elf_External_Options *) ((char *) eopt + offset);
12112 option->kind = BYTE_GET (eoption->kind);
12113 option->size = BYTE_GET (eoption->size);
12114 option->section = BYTE_GET (eoption->section);
12115 option->info = BYTE_GET (eoption->info);
12117 offset += option->size;
12123 printf (_("\nSection '%s' contains %d entries:\n"),
12124 SECTION_NAME (sect), cnt);
12132 switch (option->kind)
12135 /* This shouldn't happen. */
12136 printf (" NULL %d %lx", option->section, option->info);
12139 printf (" REGINFO ");
12140 if (elf_header.e_machine == EM_MIPS)
12143 Elf32_External_RegInfo * ereg;
12144 Elf32_RegInfo reginfo;
12146 ereg = (Elf32_External_RegInfo *) (option + 1);
12147 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12148 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12149 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12150 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12151 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12152 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12154 printf ("GPR %08lx GP 0x%lx\n",
12155 reginfo.ri_gprmask,
12156 (unsigned long) reginfo.ri_gp_value);
12157 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12158 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12159 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12164 Elf64_External_RegInfo * ereg;
12165 Elf64_Internal_RegInfo reginfo;
12167 ereg = (Elf64_External_RegInfo *) (option + 1);
12168 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
12169 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
12170 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
12171 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
12172 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
12173 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
12175 printf ("GPR %08lx GP 0x",
12176 reginfo.ri_gprmask);
12177 printf_vma (reginfo.ri_gp_value);
12180 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
12181 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
12182 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
12186 case ODK_EXCEPTIONS:
12187 fputs (" EXCEPTIONS fpe_min(", stdout);
12188 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
12189 fputs (") fpe_max(", stdout);
12190 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
12191 fputs (")", stdout);
12193 if (option->info & OEX_PAGE0)
12194 fputs (" PAGE0", stdout);
12195 if (option->info & OEX_SMM)
12196 fputs (" SMM", stdout);
12197 if (option->info & OEX_FPDBUG)
12198 fputs (" FPDBUG", stdout);
12199 if (option->info & OEX_DISMISS)
12200 fputs (" DISMISS", stdout);
12203 fputs (" PAD ", stdout);
12204 if (option->info & OPAD_PREFIX)
12205 fputs (" PREFIX", stdout);
12206 if (option->info & OPAD_POSTFIX)
12207 fputs (" POSTFIX", stdout);
12208 if (option->info & OPAD_SYMBOL)
12209 fputs (" SYMBOL", stdout);
12212 fputs (" HWPATCH ", stdout);
12213 if (option->info & OHW_R4KEOP)
12214 fputs (" R4KEOP", stdout);
12215 if (option->info & OHW_R8KPFETCH)
12216 fputs (" R8KPFETCH", stdout);
12217 if (option->info & OHW_R5KEOP)
12218 fputs (" R5KEOP", stdout);
12219 if (option->info & OHW_R5KCVTL)
12220 fputs (" R5KCVTL", stdout);
12223 fputs (" FILL ", stdout);
12224 /* XXX Print content of info word? */
12227 fputs (" TAGS ", stdout);
12228 /* XXX Print content of info word? */
12231 fputs (" HWAND ", stdout);
12232 if (option->info & OHWA0_R4KEOP_CHECKED)
12233 fputs (" R4KEOP_CHECKED", stdout);
12234 if (option->info & OHWA0_R4KEOP_CLEAN)
12235 fputs (" R4KEOP_CLEAN", stdout);
12238 fputs (" HWOR ", stdout);
12239 if (option->info & OHWA0_R4KEOP_CHECKED)
12240 fputs (" R4KEOP_CHECKED", stdout);
12241 if (option->info & OHWA0_R4KEOP_CLEAN)
12242 fputs (" R4KEOP_CLEAN", stdout);
12245 printf (" GP_GROUP %#06lx self-contained %#06lx",
12246 option->info & OGP_GROUP,
12247 (option->info & OGP_SELF) >> 16);
12250 printf (" IDENT %#06lx self-contained %#06lx",
12251 option->info & OGP_GROUP,
12252 (option->info & OGP_SELF) >> 16);
12255 /* This shouldn't happen. */
12256 printf (" %3d ??? %d %lx",
12257 option->kind, option->section, option->info);
12261 len = sizeof (* eopt);
12262 while (len < option->size)
12263 if (((char *) option)[len] >= ' '
12264 && ((char *) option)[len] < 0x7f)
12265 printf ("%c", ((char *) option)[len++]);
12267 printf ("\\%03o", ((char *) option)[len++]);
12269 fputs ("\n", stdout);
12277 if (conflicts_offset != 0 && conflictsno != 0)
12279 Elf32_Conflict * iconf;
12282 if (dynamic_symbols == NULL)
12284 error (_("conflict list found without a dynamic symbol table\n"));
12288 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
12291 error (_("Out of memory\n"));
12297 Elf32_External_Conflict * econf32;
12299 econf32 = (Elf32_External_Conflict *)
12300 get_data (NULL, file, conflicts_offset, conflictsno,
12301 sizeof (* econf32), _("conflict"));
12305 for (cnt = 0; cnt < conflictsno; ++cnt)
12306 iconf[cnt] = BYTE_GET (econf32[cnt]);
12312 Elf64_External_Conflict * econf64;
12314 econf64 = (Elf64_External_Conflict *)
12315 get_data (NULL, file, conflicts_offset, conflictsno,
12316 sizeof (* econf64), _("conflict"));
12320 for (cnt = 0; cnt < conflictsno; ++cnt)
12321 iconf[cnt] = BYTE_GET (econf64[cnt]);
12326 printf (_("\nSection '.conflict' contains %lu entries:\n"),
12327 (unsigned long) conflictsno);
12328 puts (_(" Num: Index Value Name"));
12330 for (cnt = 0; cnt < conflictsno; ++cnt)
12332 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
12334 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
12335 print_vma (psym->st_value, FULL_HEX);
12337 if (VALID_DYNAMIC_NAME (psym->st_name))
12338 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
12340 printf (_("<corrupt: %14ld>"), psym->st_name);
12347 if (pltgot != 0 && local_gotno != 0)
12349 bfd_vma ent, local_end, global_end;
12351 unsigned char * data;
12355 addr_size = (is_32bit_elf ? 4 : 8);
12356 local_end = pltgot + local_gotno * addr_size;
12357 global_end = local_end + (symtabno - gotsym) * addr_size;
12359 offset = offset_from_vma (file, pltgot, global_end - pltgot);
12360 data = (unsigned char *) get_data (NULL, file, offset,
12361 global_end - pltgot, 1,
12362 _("Global Offset Table data"));
12366 printf (_("\nPrimary GOT:\n"));
12367 printf (_(" Canonical gp value: "));
12368 print_vma (pltgot + 0x7ff0, LONG_HEX);
12371 printf (_(" Reserved entries:\n"));
12372 printf (_(" %*s %10s %*s Purpose\n"),
12373 addr_size * 2, _("Address"), _("Access"),
12374 addr_size * 2, _("Initial"));
12375 ent = print_mips_got_entry (data, pltgot, ent);
12376 printf (_(" Lazy resolver\n"));
12378 && (byte_get (data + ent - pltgot, addr_size)
12379 >> (addr_size * 8 - 1)) != 0)
12381 ent = print_mips_got_entry (data, pltgot, ent);
12382 printf (_(" Module pointer (GNU extension)\n"));
12386 if (ent < local_end)
12388 printf (_(" Local entries:\n"));
12389 printf (" %*s %10s %*s\n",
12390 addr_size * 2, _("Address"), _("Access"),
12391 addr_size * 2, _("Initial"));
12392 while (ent < local_end)
12394 ent = print_mips_got_entry (data, pltgot, ent);
12400 if (gotsym < symtabno)
12404 printf (_(" Global entries:\n"));
12405 printf (" %*s %10s %*s %*s %-7s %3s %s\n",
12406 addr_size * 2, _("Address"),
12408 addr_size * 2, _("Initial"),
12409 addr_size * 2, _("Sym.Val."),
12411 /* Note for translators: "Ndx" = abbreviated form of "Index". */
12412 _("Ndx"), _("Name"));
12414 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
12415 for (i = gotsym; i < symtabno; i++)
12417 Elf_Internal_Sym * psym;
12419 psym = dynamic_symbols + i;
12420 ent = print_mips_got_entry (data, pltgot, ent);
12422 print_vma (psym->st_value, LONG_HEX);
12423 printf (" %-7s %3s ",
12424 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12425 get_symbol_index_type (psym->st_shndx));
12426 if (VALID_DYNAMIC_NAME (psym->st_name))
12427 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12429 printf (_("<corrupt: %14ld>"), psym->st_name);
12439 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
12442 size_t offset, rel_offset;
12443 unsigned long count, i;
12444 unsigned char * data;
12445 int addr_size, sym_width;
12446 Elf_Internal_Rela * rels;
12448 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
12449 if (pltrel == DT_RELA)
12451 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
12456 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
12461 addr_size = (is_32bit_elf ? 4 : 8);
12462 end = mips_pltgot + (2 + count) * addr_size;
12464 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
12465 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
12466 1, _("Procedure Linkage Table data"));
12470 printf ("\nPLT GOT:\n\n");
12471 printf (_(" Reserved entries:\n"));
12472 printf (_(" %*s %*s Purpose\n"),
12473 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
12474 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12475 printf (_(" PLT lazy resolver\n"));
12476 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12477 printf (_(" Module pointer\n"));
12480 printf (_(" Entries:\n"));
12481 printf (" %*s %*s %*s %-7s %3s %s\n",
12482 addr_size * 2, _("Address"),
12483 addr_size * 2, _("Initial"),
12484 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
12485 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
12486 for (i = 0; i < count; i++)
12488 Elf_Internal_Sym * psym;
12490 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
12491 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
12493 print_vma (psym->st_value, LONG_HEX);
12494 printf (" %-7s %3s ",
12495 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
12496 get_symbol_index_type (psym->st_shndx));
12497 if (VALID_DYNAMIC_NAME (psym->st_name))
12498 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
12500 printf (_("<corrupt: %14ld>"), psym->st_name);
12514 process_gnu_liblist (FILE * file)
12516 Elf_Internal_Shdr * section;
12517 Elf_Internal_Shdr * string_sec;
12518 Elf32_External_Lib * elib;
12520 size_t strtab_size;
12527 for (i = 0, section = section_headers;
12528 i < elf_header.e_shnum;
12531 switch (section->sh_type)
12533 case SHT_GNU_LIBLIST:
12534 if (section->sh_link >= elf_header.e_shnum)
12537 elib = (Elf32_External_Lib *)
12538 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
12539 _("liblist section data"));
12543 string_sec = section_headers + section->sh_link;
12545 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
12546 string_sec->sh_size,
12547 _("liblist string table"));
12549 || section->sh_entsize != sizeof (Elf32_External_Lib))
12555 strtab_size = string_sec->sh_size;
12557 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
12558 SECTION_NAME (section),
12559 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
12561 puts (_(" Library Time Stamp Checksum Version Flags"));
12563 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
12571 liblist.l_name = BYTE_GET (elib[cnt].l_name);
12572 atime = BYTE_GET (elib[cnt].l_time_stamp);
12573 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
12574 liblist.l_version = BYTE_GET (elib[cnt].l_version);
12575 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
12577 tmp = gmtime (&atime);
12578 snprintf (timebuf, sizeof (timebuf),
12579 "%04u-%02u-%02uT%02u:%02u:%02u",
12580 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
12581 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
12583 printf ("%3lu: ", (unsigned long) cnt);
12585 printf ("%-20s", liblist.l_name < strtab_size
12586 ? strtab + liblist.l_name : _("<corrupt>"));
12588 printf ("%-20.20s", liblist.l_name < strtab_size
12589 ? strtab + liblist.l_name : _("<corrupt>"));
12590 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
12591 liblist.l_version, liblist.l_flags);
12602 static const char *
12603 get_note_type (unsigned e_type)
12605 static char buff[64];
12607 if (elf_header.e_type == ET_CORE)
12611 return _("NT_AUXV (auxiliary vector)");
12613 return _("NT_PRSTATUS (prstatus structure)");
12615 return _("NT_FPREGSET (floating point registers)");
12617 return _("NT_PRPSINFO (prpsinfo structure)");
12618 case NT_TASKSTRUCT:
12619 return _("NT_TASKSTRUCT (task structure)");
12621 return _("NT_PRXFPREG (user_xfpregs structure)");
12623 return _("NT_PPC_VMX (ppc Altivec registers)");
12625 return _("NT_PPC_VSX (ppc VSX registers)");
12626 case NT_X86_XSTATE:
12627 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
12628 case NT_S390_HIGH_GPRS:
12629 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
12630 case NT_S390_TIMER:
12631 return _("NT_S390_TIMER (s390 timer register)");
12632 case NT_S390_TODCMP:
12633 return _("NT_S390_TODCMP (s390 TOD comparator register)");
12634 case NT_S390_TODPREG:
12635 return _("NT_S390_TODPREG (s390 TOD programmable register)");
12637 return _("NT_S390_CTRS (s390 control registers)");
12638 case NT_S390_PREFIX:
12639 return _("NT_S390_PREFIX (s390 prefix register)");
12641 return _("NT_ARM_VFP (arm VFP registers)");
12643 return _("NT_PSTATUS (pstatus structure)");
12645 return _("NT_FPREGS (floating point registers)");
12647 return _("NT_PSINFO (psinfo structure)");
12649 return _("NT_LWPSTATUS (lwpstatus_t structure)");
12651 return _("NT_LWPSINFO (lwpsinfo_t structure)");
12652 case NT_WIN32PSTATUS:
12653 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
12655 return _("NT_SIGINFO (siginfo_t data)");
12657 return _("NT_FILE (mapped files)");
12665 return _("NT_VERSION (version)");
12667 return _("NT_ARCH (architecture)");
12672 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12677 print_core_note (Elf_Internal_Note *pnote)
12679 unsigned int addr_size = is_32bit_elf ? 4 : 8;
12680 bfd_vma count, page_size;
12681 unsigned char *descdata, *filenames, *descend;
12683 if (pnote->type != NT_FILE)
12689 printf (_(" Cannot decode 64-bit note in 32-bit build\n"));
12690 /* Still "successful". */
12695 if (pnote->descsz < 2 * addr_size)
12697 printf (_(" Malformed note - too short for header\n"));
12701 descdata = (unsigned char *) pnote->descdata;
12702 descend = descdata + pnote->descsz;
12704 if (descdata[pnote->descsz - 1] != '\0')
12706 printf (_(" Malformed note - does not end with \\0\n"));
12710 count = byte_get (descdata, addr_size);
12711 descdata += addr_size;
12713 page_size = byte_get (descdata, addr_size);
12714 descdata += addr_size;
12716 if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
12718 printf (_(" Malformed note - too short for supplied file count\n"));
12722 printf (_(" Page size: "));
12723 print_vma (page_size, DEC);
12726 printf (_(" %*s%*s%*s\n"),
12727 (int) (2 + 2 * addr_size), _("Start"),
12728 (int) (4 + 2 * addr_size), _("End"),
12729 (int) (4 + 2 * addr_size), _("Page Offset"));
12730 filenames = descdata + count * 3 * addr_size;
12731 while (--count > 0)
12733 bfd_vma start, end, file_ofs;
12735 if (filenames == descend)
12737 printf (_(" Malformed note - filenames end too early\n"));
12741 start = byte_get (descdata, addr_size);
12742 descdata += addr_size;
12743 end = byte_get (descdata, addr_size);
12744 descdata += addr_size;
12745 file_ofs = byte_get (descdata, addr_size);
12746 descdata += addr_size;
12749 print_vma (start, FULL_HEX);
12751 print_vma (end, FULL_HEX);
12753 print_vma (file_ofs, FULL_HEX);
12754 printf ("\n %s\n", filenames);
12756 filenames += 1 + strlen ((char *) filenames);
12762 static const char *
12763 get_gnu_elf_note_type (unsigned e_type)
12765 static char buff[64];
12769 case NT_GNU_ABI_TAG:
12770 return _("NT_GNU_ABI_TAG (ABI version tag)");
12772 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
12773 case NT_GNU_BUILD_ID:
12774 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
12775 case NT_GNU_GOLD_VERSION:
12776 return _("NT_GNU_GOLD_VERSION (gold version)");
12781 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12786 print_gnu_note (Elf_Internal_Note *pnote)
12788 switch (pnote->type)
12790 case NT_GNU_BUILD_ID:
12794 printf (_(" Build ID: "));
12795 for (i = 0; i < pnote->descsz; ++i)
12796 printf ("%02x", pnote->descdata[i] & 0xff);
12801 case NT_GNU_ABI_TAG:
12803 unsigned long os, major, minor, subminor;
12804 const char *osname;
12806 os = byte_get ((unsigned char *) pnote->descdata, 4);
12807 major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
12808 minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
12809 subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
12813 case GNU_ABI_TAG_LINUX:
12816 case GNU_ABI_TAG_HURD:
12819 case GNU_ABI_TAG_SOLARIS:
12820 osname = "Solaris";
12822 case GNU_ABI_TAG_FREEBSD:
12823 osname = "FreeBSD";
12825 case GNU_ABI_TAG_NETBSD:
12829 osname = "Unknown";
12833 printf (_(" OS: %s, ABI: %ld.%ld.%ld\n"), osname,
12834 major, minor, subminor);
12842 static const char *
12843 get_netbsd_elfcore_note_type (unsigned e_type)
12845 static char buff[64];
12847 if (e_type == NT_NETBSDCORE_PROCINFO)
12849 /* NetBSD core "procinfo" structure. */
12850 return _("NetBSD procinfo structure");
12853 /* As of Jan 2002 there are no other machine-independent notes
12854 defined for NetBSD core files. If the note type is less
12855 than the start of the machine-dependent note types, we don't
12858 if (e_type < NT_NETBSDCORE_FIRSTMACH)
12860 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12864 switch (elf_header.e_machine)
12866 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
12867 and PT_GETFPREGS == mach+2. */
12872 case EM_SPARC32PLUS:
12876 case NT_NETBSDCORE_FIRSTMACH + 0:
12877 return _("PT_GETREGS (reg structure)");
12878 case NT_NETBSDCORE_FIRSTMACH + 2:
12879 return _("PT_GETFPREGS (fpreg structure)");
12885 /* On all other arch's, PT_GETREGS == mach+1 and
12886 PT_GETFPREGS == mach+3. */
12890 case NT_NETBSDCORE_FIRSTMACH + 1:
12891 return _("PT_GETREGS (reg structure)");
12892 case NT_NETBSDCORE_FIRSTMACH + 3:
12893 return _("PT_GETFPREGS (fpreg structure)");
12899 snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
12900 e_type - NT_NETBSDCORE_FIRSTMACH);
12904 static const char *
12905 get_stapsdt_note_type (unsigned e_type)
12907 static char buff[64];
12912 return _("NT_STAPSDT (SystemTap probe descriptors)");
12918 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
12923 print_stapsdt_note (Elf_Internal_Note *pnote)
12925 int addr_size = is_32bit_elf ? 4 : 8;
12926 char *data = pnote->descdata;
12927 char *data_end = pnote->descdata + pnote->descsz;
12928 bfd_vma pc, base_addr, semaphore;
12929 char *provider, *probe, *arg_fmt;
12931 pc = byte_get ((unsigned char *) data, addr_size);
12933 base_addr = byte_get ((unsigned char *) data, addr_size);
12935 semaphore = byte_get ((unsigned char *) data, addr_size);
12939 data += strlen (data) + 1;
12941 data += strlen (data) + 1;
12943 data += strlen (data) + 1;
12945 printf (_(" Provider: %s\n"), provider);
12946 printf (_(" Name: %s\n"), probe);
12947 printf (_(" Location: "));
12948 print_vma (pc, FULL_HEX);
12949 printf (_(", Base: "));
12950 print_vma (base_addr, FULL_HEX);
12951 printf (_(", Semaphore: "));
12952 print_vma (semaphore, FULL_HEX);
12954 printf (_(" Arguments: %s\n"), arg_fmt);
12956 return data == data_end;
12959 static const char *
12960 get_ia64_vms_note_type (unsigned e_type)
12962 static char buff[64];
12967 return _("NT_VMS_MHD (module header)");
12969 return _("NT_VMS_LNM (language name)");
12971 return _("NT_VMS_SRC (source files)");
12973 return "NT_VMS_TITLE";
12975 return _("NT_VMS_EIDC (consistency check)");
12976 case NT_VMS_FPMODE:
12977 return _("NT_VMS_FPMODE (FP mode)");
12978 case NT_VMS_LINKTIME:
12979 return "NT_VMS_LINKTIME";
12980 case NT_VMS_IMGNAM:
12981 return _("NT_VMS_IMGNAM (image name)");
12983 return _("NT_VMS_IMGID (image id)");
12984 case NT_VMS_LINKID:
12985 return _("NT_VMS_LINKID (link id)");
12986 case NT_VMS_IMGBID:
12987 return _("NT_VMS_IMGBID (build id)");
12988 case NT_VMS_GSTNAM:
12989 return _("NT_VMS_GSTNAM (sym table name)");
12990 case NT_VMS_ORIG_DYN:
12991 return "NT_VMS_ORIG_DYN";
12992 case NT_VMS_PATCHTIME:
12993 return "NT_VMS_PATCHTIME";
12995 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
13001 print_ia64_vms_note (Elf_Internal_Note * pnote)
13003 switch (pnote->type)
13006 if (pnote->descsz > 36)
13008 size_t l = strlen (pnote->descdata + 34);
13009 printf (_(" Creation date : %.17s\n"), pnote->descdata);
13010 printf (_(" Last patch date: %.17s\n"), pnote->descdata + 17);
13011 printf (_(" Module name : %s\n"), pnote->descdata + 34);
13012 printf (_(" Module version : %s\n"), pnote->descdata + 34 + l + 1);
13015 printf (_(" Invalid size\n"));
13018 printf (_(" Language: %s\n"), pnote->descdata);
13021 case NT_VMS_FPMODE:
13022 printf (_(" Floating Point mode: "));
13023 printf ("0x%016" BFD_VMA_FMT "x\n",
13024 (bfd_vma)byte_get ((unsigned char *)pnote->descdata, 8));
13026 case NT_VMS_LINKTIME:
13027 printf (_(" Link time: "));
13029 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13032 case NT_VMS_PATCHTIME:
13033 printf (_(" Patch time: "));
13035 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
13038 case NT_VMS_ORIG_DYN:
13039 printf (_(" Major id: %u, minor id: %u\n"),
13040 (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
13041 (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
13042 printf (_(" Last modified : "));
13044 ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
13045 printf (_("\n Link flags : "));
13046 printf ("0x%016" BFD_VMA_FMT "x\n",
13047 (bfd_vma)byte_get ((unsigned char *)pnote->descdata + 16, 8));
13048 printf (_(" Header flags: 0x%08x\n"),
13049 (unsigned)byte_get ((unsigned char *)pnote->descdata + 24, 4));
13050 printf (_(" Image id : %s\n"), pnote->descdata + 32);
13053 case NT_VMS_IMGNAM:
13054 printf (_(" Image name: %s\n"), pnote->descdata);
13056 case NT_VMS_GSTNAM:
13057 printf (_(" Global symbol table name: %s\n"), pnote->descdata);
13060 printf (_(" Image id: %s\n"), pnote->descdata);
13062 case NT_VMS_LINKID:
13063 printf (_(" Linker id: %s\n"), pnote->descdata);
13071 /* Note that by the ELF standard, the name field is already null byte
13072 terminated, and namesz includes the terminating null byte.
13073 I.E. the value of namesz for the name "FSF" is 4.
13075 If the value of namesz is zero, there is no name present. */
13077 process_note (Elf_Internal_Note * pnote)
13079 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
13082 if (pnote->namesz == 0)
13083 /* If there is no note name, then use the default set of
13084 note type strings. */
13085 nt = get_note_type (pnote->type);
13087 else if (const_strneq (pnote->namedata, "GNU"))
13088 /* GNU-specific object file notes. */
13089 nt = get_gnu_elf_note_type (pnote->type);
13091 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
13092 /* NetBSD-specific core file notes. */
13093 nt = get_netbsd_elfcore_note_type (pnote->type);
13095 else if (strneq (pnote->namedata, "SPU/", 4))
13097 /* SPU-specific core file notes. */
13098 nt = pnote->namedata + 4;
13102 else if (const_strneq (pnote->namedata, "IPF/VMS"))
13103 /* VMS/ia64-specific file notes. */
13104 nt = get_ia64_vms_note_type (pnote->type);
13106 else if (const_strneq (pnote->namedata, "stapsdt"))
13107 nt = get_stapsdt_note_type (pnote->type);
13110 /* Don't recognize this note name; just use the default set of
13111 note type strings. */
13112 nt = get_note_type (pnote->type);
13114 printf (" %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
13116 if (const_strneq (pnote->namedata, "IPF/VMS"))
13117 return print_ia64_vms_note (pnote);
13118 else if (const_strneq (pnote->namedata, "GNU"))
13119 return print_gnu_note (pnote);
13120 else if (const_strneq (pnote->namedata, "stapsdt"))
13121 return print_stapsdt_note (pnote);
13122 else if (const_strneq (pnote->namedata, "CORE"))
13123 return print_core_note (pnote);
13130 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
13132 Elf_External_Note * pnotes;
13133 Elf_External_Note * external;
13139 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
13141 if (pnotes == NULL)
13146 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
13147 (unsigned long) offset, (unsigned long) length);
13148 printf (_(" %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
13150 while (external < (Elf_External_Note *) ((char *) pnotes + length))
13152 Elf_External_Note * next;
13153 Elf_Internal_Note inote;
13154 char * temp = NULL;
13156 if (!is_ia64_vms ())
13158 inote.type = BYTE_GET (external->type);
13159 inote.namesz = BYTE_GET (external->namesz);
13160 inote.namedata = external->name;
13161 inote.descsz = BYTE_GET (external->descsz);
13162 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
13163 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13165 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
13169 Elf64_External_VMS_Note *vms_external;
13171 vms_external = (Elf64_External_VMS_Note *)external;
13172 inote.type = BYTE_GET (vms_external->type);
13173 inote.namesz = BYTE_GET (vms_external->namesz);
13174 inote.namedata = vms_external->name;
13175 inote.descsz = BYTE_GET (vms_external->descsz);
13176 inote.descdata = inote.namedata + align_power (inote.namesz, 3);
13177 inote.descpos = offset + (inote.descdata - (char *) pnotes);
13179 next = (Elf_External_Note *)
13180 (inote.descdata + align_power (inote.descsz, 3));
13183 if ( ((char *) next > ((char *) pnotes) + length)
13184 || ((char *) next < (char *) pnotes))
13186 warn (_("corrupt note found at offset %lx into core notes\n"),
13187 (unsigned long) ((char *) external - (char *) pnotes));
13188 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
13189 inote.type, inote.namesz, inote.descsz);
13195 /* Prevent out-of-bounds indexing. */
13196 if (inote.namedata + inote.namesz > (char *) pnotes + length
13197 || inote.namedata + inote.namesz < inote.namedata)
13199 warn (_("corrupt note found at offset %lx into core notes\n"),
13200 (unsigned long) ((char *) external - (char *) pnotes));
13201 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
13202 inote.type, inote.namesz, inote.descsz);
13206 /* Verify that name is null terminated. It appears that at least
13207 one version of Linux (RedHat 6.0) generates corefiles that don't
13208 comply with the ELF spec by failing to include the null byte in
13210 if (inote.namedata[inote.namesz - 1] != '\0')
13212 temp = (char *) malloc (inote.namesz + 1);
13216 error (_("Out of memory\n"));
13221 strncpy (temp, inote.namedata, inote.namesz);
13222 temp[inote.namesz] = 0;
13224 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
13225 inote.namedata = temp;
13228 res &= process_note (& inote);
13243 process_corefile_note_segments (FILE * file)
13245 Elf_Internal_Phdr * segment;
13249 if (! get_program_headers (file))
13252 for (i = 0, segment = program_headers;
13253 i < elf_header.e_phnum;
13256 if (segment->p_type == PT_NOTE)
13257 res &= process_corefile_note_segment (file,
13258 (bfd_vma) segment->p_offset,
13259 (bfd_vma) segment->p_filesz);
13266 process_note_sections (FILE * file)
13268 Elf_Internal_Shdr * section;
13272 for (i = 0, section = section_headers;
13273 i < elf_header.e_shnum && section != NULL;
13275 if (section->sh_type == SHT_NOTE)
13276 res &= process_corefile_note_segment (file,
13277 (bfd_vma) section->sh_offset,
13278 (bfd_vma) section->sh_size);
13284 process_notes (FILE * file)
13286 /* If we have not been asked to display the notes then do nothing. */
13290 if (elf_header.e_type != ET_CORE)
13291 return process_note_sections (file);
13293 /* No program headers means no NOTE segment. */
13294 if (elf_header.e_phnum > 0)
13295 return process_corefile_note_segments (file);
13297 printf (_("No note segments present in the core file.\n"));
13302 process_arch_specific (FILE * file)
13307 switch (elf_header.e_machine)
13310 return process_arm_specific (file);
13312 case EM_MIPS_RS3_LE:
13313 return process_mips_specific (file);
13316 return process_power_specific (file);
13319 case EM_SPARC32PLUS:
13321 return process_sparc_specific (file);
13324 return process_tic6x_specific (file);
13333 get_file_header (FILE * file)
13335 /* Read in the identity array. */
13336 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
13339 /* Determine how to read the rest of the header. */
13340 switch (elf_header.e_ident[EI_DATA])
13342 default: /* fall through */
13343 case ELFDATANONE: /* fall through */
13345 byte_get = byte_get_little_endian;
13346 byte_put = byte_put_little_endian;
13349 byte_get = byte_get_big_endian;
13350 byte_put = byte_put_big_endian;
13354 /* For now we only support 32 bit and 64 bit ELF files. */
13355 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
13357 /* Read in the rest of the header. */
13360 Elf32_External_Ehdr ehdr32;
13362 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
13365 elf_header.e_type = BYTE_GET (ehdr32.e_type);
13366 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
13367 elf_header.e_version = BYTE_GET (ehdr32.e_version);
13368 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
13369 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
13370 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
13371 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
13372 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
13373 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
13374 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
13375 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
13376 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
13377 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
13381 Elf64_External_Ehdr ehdr64;
13383 /* If we have been compiled with sizeof (bfd_vma) == 4, then
13384 we will not be able to cope with the 64bit data found in
13385 64 ELF files. Detect this now and abort before we start
13386 overwriting things. */
13387 if (sizeof (bfd_vma) < 8)
13389 error (_("This instance of readelf has been built without support for a\n\
13390 64 bit data type and so it cannot read 64 bit ELF files.\n"));
13394 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
13397 elf_header.e_type = BYTE_GET (ehdr64.e_type);
13398 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
13399 elf_header.e_version = BYTE_GET (ehdr64.e_version);
13400 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
13401 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
13402 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
13403 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
13404 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
13405 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
13406 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
13407 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
13408 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
13409 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
13412 if (elf_header.e_shoff)
13414 /* There may be some extensions in the first section header. Don't
13415 bomb if we can't read it. */
13417 get_32bit_section_headers (file, 1);
13419 get_64bit_section_headers (file, 1);
13425 /* Process one ELF object file according to the command line options.
13426 This file may actually be stored in an archive. The file is
13427 positioned at the start of the ELF object. */
13430 process_object (char * file_name, FILE * file)
13434 if (! get_file_header (file))
13436 error (_("%s: Failed to read file header\n"), file_name);
13440 /* Initialise per file variables. */
13441 for (i = ARRAY_SIZE (version_info); i--;)
13442 version_info[i] = 0;
13444 for (i = ARRAY_SIZE (dynamic_info); i--;)
13445 dynamic_info[i] = 0;
13446 dynamic_info_DT_GNU_HASH = 0;
13448 /* Process the file. */
13450 printf (_("\nFile: %s\n"), file_name);
13452 /* Initialise the dump_sects array from the cmdline_dump_sects array.
13453 Note we do this even if cmdline_dump_sects is empty because we
13454 must make sure that the dump_sets array is zeroed out before each
13455 object file is processed. */
13456 if (num_dump_sects > num_cmdline_dump_sects)
13457 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
13459 if (num_cmdline_dump_sects > 0)
13461 if (num_dump_sects == 0)
13462 /* A sneaky way of allocating the dump_sects array. */
13463 request_dump_bynumber (num_cmdline_dump_sects, 0);
13465 assert (num_dump_sects >= num_cmdline_dump_sects);
13466 memcpy (dump_sects, cmdline_dump_sects,
13467 num_cmdline_dump_sects * sizeof (* dump_sects));
13470 if (! process_file_header ())
13473 if (! process_section_headers (file))
13475 /* Without loaded section headers we cannot process lots of
13477 do_unwind = do_version = do_dump = do_arch = 0;
13479 if (! do_using_dynamic)
13480 do_syms = do_dyn_syms = do_reloc = 0;
13483 if (! process_section_groups (file))
13485 /* Without loaded section groups we cannot process unwind. */
13489 if (process_program_headers (file))
13490 process_dynamic_section (file);
13492 process_relocs (file);
13494 process_unwind (file);
13496 process_symbol_table (file);
13498 process_syminfo (file);
13500 process_version_sections (file);
13502 process_section_contents (file);
13504 process_notes (file);
13506 process_gnu_liblist (file);
13508 process_arch_specific (file);
13510 if (program_headers)
13512 free (program_headers);
13513 program_headers = NULL;
13516 if (section_headers)
13518 free (section_headers);
13519 section_headers = NULL;
13524 free (string_table);
13525 string_table = NULL;
13526 string_table_length = 0;
13529 if (dynamic_strings)
13531 free (dynamic_strings);
13532 dynamic_strings = NULL;
13533 dynamic_strings_length = 0;
13536 if (dynamic_symbols)
13538 free (dynamic_symbols);
13539 dynamic_symbols = NULL;
13540 num_dynamic_syms = 0;
13543 if (dynamic_syminfo)
13545 free (dynamic_syminfo);
13546 dynamic_syminfo = NULL;
13549 if (dynamic_section)
13551 free (dynamic_section);
13552 dynamic_section = NULL;
13555 if (section_headers_groups)
13557 free (section_headers_groups);
13558 section_headers_groups = NULL;
13561 if (section_groups)
13563 struct group_list * g;
13564 struct group_list * next;
13566 for (i = 0; i < group_count; i++)
13568 for (g = section_groups [i].root; g != NULL; g = next)
13575 free (section_groups);
13576 section_groups = NULL;
13579 free_debug_memory ();
13584 /* Process an ELF archive.
13585 On entry the file is positioned just after the ARMAG string. */
13588 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
13590 struct archive_info arch;
13591 struct archive_info nested_arch;
13597 /* The ARCH structure is used to hold information about this archive. */
13598 arch.file_name = NULL;
13600 arch.index_array = NULL;
13601 arch.sym_table = NULL;
13602 arch.longnames = NULL;
13604 /* The NESTED_ARCH structure is used as a single-item cache of information
13605 about a nested archive (when members of a thin archive reside within
13606 another regular archive file). */
13607 nested_arch.file_name = NULL;
13608 nested_arch.file = NULL;
13609 nested_arch.index_array = NULL;
13610 nested_arch.sym_table = NULL;
13611 nested_arch.longnames = NULL;
13613 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
13619 if (do_archive_index)
13621 if (arch.sym_table == NULL)
13622 error (_("%s: unable to dump the index as none was found\n"), file_name);
13626 unsigned long current_pos;
13628 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
13629 file_name, (long) arch.index_num, arch.sym_size);
13630 current_pos = ftell (file);
13632 for (i = l = 0; i < arch.index_num; i++)
13634 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
13636 char * member_name;
13638 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
13640 if (member_name != NULL)
13642 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
13644 if (qualified_name != NULL)
13646 printf (_("Contents of binary %s at offset "), qualified_name);
13647 (void) print_vma (arch.index_array[i], PREFIX_HEX);
13649 free (qualified_name);
13654 if (l >= arch.sym_size)
13656 error (_("%s: end of the symbol table reached before the end of the index\n"),
13660 printf ("\t%s\n", arch.sym_table + l);
13661 l += strlen (arch.sym_table + l) + 1;
13664 if (arch.uses_64bit_indicies)
13669 if (l < arch.sym_size)
13670 error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
13671 file_name, arch.sym_size - l);
13673 if (fseek (file, current_pos, SEEK_SET) != 0)
13675 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
13681 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
13682 && !do_segments && !do_header && !do_dump && !do_version
13683 && !do_histogram && !do_debugging && !do_arch && !do_notes
13684 && !do_section_groups && !do_dyn_syms)
13686 ret = 0; /* Archive index only. */
13697 char * qualified_name;
13699 /* Read the next archive header. */
13700 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13702 error (_("%s: failed to seek to next archive header\n"), file_name);
13705 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13706 if (got != sizeof arch.arhdr)
13710 error (_("%s: failed to read archive header\n"), file_name);
13714 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13716 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13721 arch.next_arhdr_offset += sizeof arch.arhdr;
13723 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13724 if (archive_file_size & 01)
13725 ++archive_file_size;
13727 name = get_archive_member_name (&arch, &nested_arch);
13730 error (_("%s: bad archive file name\n"), file_name);
13734 namelen = strlen (name);
13736 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13737 if (qualified_name == NULL)
13739 error (_("%s: bad archive file name\n"), file_name);
13744 if (is_thin_archive && arch.nested_member_origin == 0)
13746 /* This is a proxy for an external member of a thin archive. */
13747 FILE * member_file;
13748 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13749 if (member_file_name == NULL)
13755 member_file = fopen (member_file_name, "rb");
13756 if (member_file == NULL)
13758 error (_("Input file '%s' is not readable.\n"), member_file_name);
13759 free (member_file_name);
13764 archive_file_offset = arch.nested_member_origin;
13766 ret |= process_object (qualified_name, member_file);
13768 fclose (member_file);
13769 free (member_file_name);
13771 else if (is_thin_archive)
13773 /* This is a proxy for a member of a nested archive. */
13774 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13776 /* The nested archive file will have been opened and setup by
13777 get_archive_member_name. */
13778 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13780 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13785 ret |= process_object (qualified_name, nested_arch.file);
13789 archive_file_offset = arch.next_arhdr_offset;
13790 arch.next_arhdr_offset += archive_file_size;
13792 ret |= process_object (qualified_name, file);
13795 if (dump_sects != NULL)
13799 num_dump_sects = 0;
13802 free (qualified_name);
13806 if (nested_arch.file != NULL)
13807 fclose (nested_arch.file);
13808 release_archive (&nested_arch);
13809 release_archive (&arch);
13815 process_file (char * file_name)
13818 struct stat statbuf;
13819 char armag[SARMAG];
13822 if (stat (file_name, &statbuf) < 0)
13824 if (errno == ENOENT)
13825 error (_("'%s': No such file\n"), file_name);
13827 error (_("Could not locate '%s'. System error message: %s\n"),
13828 file_name, strerror (errno));
13832 if (! S_ISREG (statbuf.st_mode))
13834 error (_("'%s' is not an ordinary file\n"), file_name);
13838 file = fopen (file_name, "rb");
13841 error (_("Input file '%s' is not readable.\n"), file_name);
13845 if (fread (armag, SARMAG, 1, file) != 1)
13847 error (_("%s: Failed to read file's magic number\n"), file_name);
13852 if (memcmp (armag, ARMAG, SARMAG) == 0)
13853 ret = process_archive (file_name, file, FALSE);
13854 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13855 ret = process_archive (file_name, file, TRUE);
13858 if (do_archive_index)
13859 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13863 archive_file_size = archive_file_offset = 0;
13864 ret = process_object (file_name, file);
13872 #ifdef SUPPORT_DISASSEMBLY
13873 /* Needed by the i386 disassembler. For extra credit, someone could
13874 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13878 print_address (unsigned int addr, FILE * outfile)
13880 fprintf (outfile,"0x%8.8x", addr);
13883 /* Needed by the i386 disassembler. */
13885 db_task_printsym (unsigned int addr)
13887 print_address (addr, stderr);
13892 main (int argc, char ** argv)
13896 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13897 setlocale (LC_MESSAGES, "");
13899 #if defined (HAVE_SETLOCALE)
13900 setlocale (LC_CTYPE, "");
13902 bindtextdomain (PACKAGE, LOCALEDIR);
13903 textdomain (PACKAGE);
13905 expandargv (&argc, &argv);
13907 parse_args (argc, argv);
13909 if (num_dump_sects > 0)
13911 /* Make a copy of the dump_sects array. */
13912 cmdline_dump_sects = (dump_type *)
13913 malloc (num_dump_sects * sizeof (* dump_sects));
13914 if (cmdline_dump_sects == NULL)
13915 error (_("Out of memory allocating dump request table.\n"));
13918 memcpy (cmdline_dump_sects, dump_sects,
13919 num_dump_sects * sizeof (* dump_sects));
13920 num_cmdline_dump_sects = num_dump_sects;
13924 if (optind < (argc - 1))
13928 while (optind < argc)
13929 err |= process_file (argv[optind++]);
13931 if (dump_sects != NULL)
13933 if (cmdline_dump_sects != NULL)
13934 free (cmdline_dump_sects);