1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
4 Free Software Foundation, Inc.
6 Originally developed by Eric Youngdale <eric@andante.jic.com>
7 Modifications by Nick Clifton <nickc@redhat.com>
9 This file is part of GNU Binutils.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
26 /* The difference between readelf and objdump:
28 Both programs are capable of displaying the contents of ELF format files,
29 so why does the binutils project have two file dumpers ?
31 The reason is that objdump sees an ELF file through a BFD filter of the
32 world; if BFD has a bug where, say, it disagrees about a machine constant
33 in e_flags, then the odds are good that it will remain internally
34 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
35 GAS sees it the BFD way. There was need for a tool to go find out what
36 the file actually says.
38 This is why the readelf program does not link against the BFD library - it
39 exists as an independent program to help verify the correct working of BFD.
41 There is also the case that readelf can provide more information about an
42 ELF file than is provided by objdump. In particular it can display DWARF
43 debugging information which (at the moment) objdump cannot. */
55 /* Define BFD64 here, even if our default architecture is 32 bit ELF
56 as this will allow us to read in and parse 64bit and 32bit ELF files.
57 Only do this if we believe that the compiler can support a 64 bit
58 data type. For now we only rely on GCC being able to do this. */
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/alpha.h"
100 #include "elf/cris.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
105 #include "elf/fr30.h"
108 #include "elf/hppa.h"
109 #include "elf/i386.h"
110 #include "elf/i370.h"
111 #include "elf/i860.h"
112 #include "elf/i960.h"
113 #include "elf/ia64.h"
114 #include "elf/ip2k.h"
115 #include "elf/lm32.h"
116 #include "elf/iq2000.h"
117 #include "elf/m32c.h"
118 #include "elf/m32r.h"
119 #include "elf/m68k.h"
120 #include "elf/m68hc11.h"
121 #include "elf/mcore.h"
123 #include "elf/microblaze.h"
124 #include "elf/mips.h"
125 #include "elf/mmix.h"
126 #include "elf/mn10200.h"
127 #include "elf/mn10300.h"
128 #include "elf/moxie.h"
130 #include "elf/msp430.h"
131 #include "elf/or32.h"
134 #include "elf/ppc64.h"
136 #include "elf/s390.h"
137 #include "elf/score.h"
139 #include "elf/sparc.h"
141 #include "elf/tic6x.h"
142 #include "elf/v850.h"
144 #include "elf/x86-64.h"
145 #include "elf/xc16x.h"
146 #include "elf/xstormy16.h"
147 #include "elf/xtensa.h"
152 #include "libiberty.h"
153 #include "safe-ctype.h"
154 #include "filenames.h"
156 char * program_name = "readelf";
157 static long archive_file_offset;
158 static unsigned long archive_file_size;
159 static unsigned long dynamic_addr;
160 static bfd_size_type dynamic_size;
161 static unsigned int dynamic_nent;
162 static char * dynamic_strings;
163 static unsigned long dynamic_strings_length;
164 static char * string_table;
165 static unsigned long string_table_length;
166 static unsigned long num_dynamic_syms;
167 static Elf_Internal_Sym * dynamic_symbols;
168 static Elf_Internal_Syminfo * dynamic_syminfo;
169 static unsigned long dynamic_syminfo_offset;
170 static unsigned int dynamic_syminfo_nent;
171 static char program_interpreter[PATH_MAX];
172 static bfd_vma dynamic_info[DT_ENCODING];
173 static bfd_vma dynamic_info_DT_GNU_HASH;
174 static bfd_vma version_info[16];
175 static Elf_Internal_Ehdr elf_header;
176 static Elf_Internal_Shdr * section_headers;
177 static Elf_Internal_Phdr * program_headers;
178 static Elf_Internal_Dyn * dynamic_section;
179 static Elf_Internal_Shdr * symtab_shndx_hdr;
180 static int show_name;
181 static int do_dynamic;
183 static int do_dyn_syms;
185 static int do_sections;
186 static int do_section_groups;
187 static int do_section_details;
188 static int do_segments;
189 static int do_unwind;
190 static int do_using_dynamic;
191 static int do_header;
193 static int do_version;
194 static int do_histogram;
195 static int do_debugging;
198 static int do_archive_index;
199 static int is_32bit_elf;
203 struct group_list * next;
204 unsigned int section_index;
209 struct group_list * root;
210 unsigned int group_index;
213 static size_t group_count;
214 static struct group * section_groups;
215 static struct group ** section_headers_groups;
218 /* Flag bits indicating particular types of dump. */
219 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
220 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
221 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
222 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
223 #define RELOC_DUMP (1 << 4) /* The -R command line switch. */
225 typedef unsigned char dump_type;
227 /* A linked list of the section names for which dumps were requested. */
228 struct dump_list_entry
232 struct dump_list_entry * next;
234 static struct dump_list_entry * dump_sects_byname;
236 /* A dynamic array of flags indicating for which sections a dump
237 has been requested via command line switches. */
238 static dump_type * cmdline_dump_sects = NULL;
239 static unsigned int num_cmdline_dump_sects = 0;
241 /* A dynamic array of flags indicating for which sections a dump of
242 some kind has been requested. It is reset on a per-object file
243 basis and then initialised from the cmdline_dump_sects array,
244 the results of interpreting the -w switch, and the
245 dump_sects_byname list. */
246 static dump_type * dump_sects = NULL;
247 static unsigned int num_dump_sects = 0;
250 /* How to print a vma value. */
251 typedef enum print_mode
263 static void (* byte_put) (unsigned char *, bfd_vma, int);
267 #define SECTION_NAME(X) \
268 ((X) == NULL ? _("<none>") \
269 : string_table == NULL ? _("<no-name>") \
270 : ((X)->sh_name >= string_table_length ? _("<corrupt>") \
271 : string_table + (X)->sh_name))
273 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
275 #define BYTE_GET(field) byte_get (field, sizeof (field))
276 #define BYTE_GET_SIGNED(field) byte_get_signed (field, sizeof (field))
278 #define GET_ELF_SYMBOLS(file, section) \
279 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
280 : get_64bit_elf_symbols (file, section))
282 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
283 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
284 already been called and verified that the string exists. */
285 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
287 /* This is just a bit of syntatic sugar. */
288 #define streq(a,b) (strcmp ((a), (b)) == 0)
289 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
290 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
292 #define REMOVE_ARCH_BITS(ADDR) do { \
293 if (elf_header.e_machine == EM_ARM) \
298 get_data (void * var, FILE * file, long offset, size_t size, size_t nmemb,
303 if (size == 0 || nmemb == 0)
306 if (fseek (file, archive_file_offset + offset, SEEK_SET))
308 error (_("Unable to seek to 0x%lx for %s\n"),
309 (unsigned long) archive_file_offset + offset, reason);
316 /* Check for overflow. */
317 if (nmemb < (~(size_t) 0 - 1) / size)
318 /* + 1 so that we can '\0' terminate invalid string table sections. */
319 mvar = malloc (size * nmemb + 1);
323 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
324 (unsigned long)(size * nmemb), reason);
328 ((char *) mvar)[size * nmemb] = '\0';
331 if (fread (mvar, size, nmemb, file) != nmemb)
333 error (_("Unable to read in 0x%lx bytes of %s\n"),
334 (unsigned long)(size * nmemb), reason);
344 byte_put_little_endian (unsigned char * field, bfd_vma value, int size)
349 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
350 field[6] = ((value >> 24) >> 24) & 0xff;
351 field[5] = ((value >> 24) >> 16) & 0xff;
352 field[4] = ((value >> 24) >> 8) & 0xff;
355 field[3] = (value >> 24) & 0xff;
358 field[2] = (value >> 16) & 0xff;
361 field[1] = (value >> 8) & 0xff;
364 field[0] = value & 0xff;
368 error (_("Unhandled data length: %d\n"), size);
373 /* Print a VMA value. */
376 print_vma (bfd_vma vma, print_mode mode)
389 return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
396 return printf ("%5" BFD_VMA_FMT "d", vma);
404 return nc + printf ("%" BFD_VMA_FMT "x", vma);
407 return printf ("%" BFD_VMA_FMT "d", vma);
410 return printf ("%" BFD_VMA_FMT "u", vma);
415 /* Display a symbol on stdout. Handles the display of non-printing characters.
417 If DO_WIDE is not true then format the symbol to be at most WIDTH characters,
418 truncating as necessary. If WIDTH is negative then format the string to be
419 exactly - WIDTH characters, truncating or padding as necessary.
421 Returns the number of emitted characters. */
424 print_symbol (int width, const char * symbol)
427 bfd_boolean extra_padding = FALSE;
428 unsigned int num_printed = 0;
432 /* Set the width to a very large value. This simplifies the code below. */
437 /* Keep the width positive. This also helps. */
439 extra_padding = TRUE;
448 /* Look for non-printing symbols inside the symbol's name.
449 This test is triggered in particular by the names generated
450 by the assembler for local labels. */
451 while (ISPRINT (* c))
461 printf ("%.*s", len, symbol);
467 if (* c == 0 || width == 0)
470 /* Now display the non-printing character, if
471 there is room left in which to dipslay it. */
477 printf ("^%c", *c + 0x40);
487 printf ("<0x%.2x>", *c);
496 if (extra_padding && width > 0)
498 /* Fill in the remaining spaces. */
499 printf ("%-*s", width, " ");
507 byte_put_big_endian (unsigned char * field, bfd_vma value, int size)
512 field[7] = value & 0xff;
513 field[6] = (value >> 8) & 0xff;
514 field[5] = (value >> 16) & 0xff;
515 field[4] = (value >> 24) & 0xff;
520 field[3] = value & 0xff;
524 field[2] = value & 0xff;
528 field[1] = value & 0xff;
532 field[0] = value & 0xff;
536 error (_("Unhandled data length: %d\n"), size);
541 /* Return a pointer to section NAME, or NULL if no such section exists. */
543 static Elf_Internal_Shdr *
544 find_section (const char * name)
548 for (i = 0; i < elf_header.e_shnum; i++)
549 if (streq (SECTION_NAME (section_headers + i), name))
550 return section_headers + i;
555 /* Return a pointer to a section containing ADDR, or NULL if no such
558 static Elf_Internal_Shdr *
559 find_section_by_address (bfd_vma addr)
563 for (i = 0; i < elf_header.e_shnum; i++)
565 Elf_Internal_Shdr *sec = section_headers + i;
566 if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
573 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
577 read_uleb128 (unsigned char *data, unsigned int *length_return)
579 return read_leb128 (data, length_return, 0);
582 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
583 This OS has so many departures from the ELF standard that we test it at
589 return elf_header.e_machine == EM_IA_64
590 && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
593 /* Guess the relocation size commonly used by the specific machines. */
596 guess_is_rela (unsigned int e_machine)
600 /* Targets that use REL relocations. */
616 /* Targets that use RELA relocations. */
620 case EM_ALTERA_NIOS2:
640 case EM_LATTICEMICO32:
648 case EM_CYGNUS_MN10200:
650 case EM_CYGNUS_MN10300:
676 case EM_MICROBLAZE_OLD:
697 warn (_("Don't know about relocations on this machine architecture\n"));
703 slurp_rela_relocs (FILE * file,
704 unsigned long rel_offset,
705 unsigned long rel_size,
706 Elf_Internal_Rela ** relasp,
707 unsigned long * nrelasp)
709 Elf_Internal_Rela * relas;
710 unsigned long nrelas;
715 Elf32_External_Rela * erelas;
717 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
718 rel_size, _("relocs"));
722 nrelas = rel_size / sizeof (Elf32_External_Rela);
724 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
725 sizeof (Elf_Internal_Rela));
730 error (_("out of memory parsing relocs\n"));
734 for (i = 0; i < nrelas; i++)
736 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
737 relas[i].r_info = BYTE_GET (erelas[i].r_info);
738 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
745 Elf64_External_Rela * erelas;
747 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
748 rel_size, _("relocs"));
752 nrelas = rel_size / sizeof (Elf64_External_Rela);
754 relas = (Elf_Internal_Rela *) cmalloc (nrelas,
755 sizeof (Elf_Internal_Rela));
760 error (_("out of memory parsing relocs\n"));
764 for (i = 0; i < nrelas; i++)
766 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
767 relas[i].r_info = BYTE_GET (erelas[i].r_info);
768 relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
770 /* The #ifdef BFD64 below is to prevent a compile time
771 warning. We know that if we do not have a 64 bit data
772 type that we will never execute this code anyway. */
774 if (elf_header.e_machine == EM_MIPS
775 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
777 /* In little-endian objects, r_info isn't really a
778 64-bit little-endian value: it has a 32-bit
779 little-endian symbol index followed by four
780 individual byte fields. Reorder INFO
782 bfd_vma inf = relas[i].r_info;
783 inf = (((inf & 0xffffffff) << 32)
784 | ((inf >> 56) & 0xff)
785 | ((inf >> 40) & 0xff00)
786 | ((inf >> 24) & 0xff0000)
787 | ((inf >> 8) & 0xff000000));
788 relas[i].r_info = inf;
801 slurp_rel_relocs (FILE * file,
802 unsigned long rel_offset,
803 unsigned long rel_size,
804 Elf_Internal_Rela ** relsp,
805 unsigned long * nrelsp)
807 Elf_Internal_Rela * rels;
813 Elf32_External_Rel * erels;
815 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
816 rel_size, _("relocs"));
820 nrels = rel_size / sizeof (Elf32_External_Rel);
822 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
827 error (_("out of memory parsing relocs\n"));
831 for (i = 0; i < nrels; i++)
833 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
834 rels[i].r_info = BYTE_GET (erels[i].r_info);
835 rels[i].r_addend = 0;
842 Elf64_External_Rel * erels;
844 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
845 rel_size, _("relocs"));
849 nrels = rel_size / sizeof (Elf64_External_Rel);
851 rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
856 error (_("out of memory parsing relocs\n"));
860 for (i = 0; i < nrels; i++)
862 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
863 rels[i].r_info = BYTE_GET (erels[i].r_info);
864 rels[i].r_addend = 0;
866 /* The #ifdef BFD64 below is to prevent a compile time
867 warning. We know that if we do not have a 64 bit data
868 type that we will never execute this code anyway. */
870 if (elf_header.e_machine == EM_MIPS
871 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
873 /* In little-endian objects, r_info isn't really a
874 64-bit little-endian value: it has a 32-bit
875 little-endian symbol index followed by four
876 individual byte fields. Reorder INFO
878 bfd_vma inf = rels[i].r_info;
879 inf = (((inf & 0xffffffff) << 32)
880 | ((inf >> 56) & 0xff)
881 | ((inf >> 40) & 0xff00)
882 | ((inf >> 24) & 0xff0000)
883 | ((inf >> 8) & 0xff000000));
884 rels[i].r_info = inf;
896 /* Returns the reloc type extracted from the reloc info field. */
899 get_reloc_type (bfd_vma reloc_info)
902 return ELF32_R_TYPE (reloc_info);
904 switch (elf_header.e_machine)
907 /* Note: We assume that reloc_info has already been adjusted for us. */
908 return ELF64_MIPS_R_TYPE (reloc_info);
911 return ELF64_R_TYPE_ID (reloc_info);
914 return ELF64_R_TYPE (reloc_info);
918 /* Return the symbol index extracted from the reloc info field. */
921 get_reloc_symindex (bfd_vma reloc_info)
923 return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
926 /* Display the contents of the relocation data found at the specified
930 dump_relocations (FILE * file,
931 unsigned long rel_offset,
932 unsigned long rel_size,
933 Elf_Internal_Sym * symtab,
936 unsigned long strtablen,
940 Elf_Internal_Rela * rels;
942 if (is_rela == UNKNOWN)
943 is_rela = guess_is_rela (elf_header.e_machine);
947 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
952 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
961 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
963 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
968 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
970 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
978 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
980 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
985 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
987 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
991 for (i = 0; i < rel_size; i++)
996 bfd_vma symtab_index;
999 offset = rels[i].r_offset;
1000 inf = rels[i].r_info;
1002 type = get_reloc_type (inf);
1003 symtab_index = get_reloc_symindex (inf);
1007 printf ("%8.8lx %8.8lx ",
1008 (unsigned long) offset & 0xffffffff,
1009 (unsigned long) inf & 0xffffffff);
1013 #if BFD_HOST_64BIT_LONG
1015 ? "%16.16lx %16.16lx "
1016 : "%12.12lx %12.12lx ",
1018 #elif BFD_HOST_64BIT_LONG_LONG
1021 ? "%16.16llx %16.16llx "
1022 : "%12.12llx %12.12llx ",
1026 ? "%16.16I64x %16.16I64x "
1027 : "%12.12I64x %12.12I64x ",
1032 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1033 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1034 _bfd_int64_high (offset),
1035 _bfd_int64_low (offset),
1036 _bfd_int64_high (inf),
1037 _bfd_int64_low (inf));
1041 switch (elf_header.e_machine)
1048 case EM_CYGNUS_M32R:
1049 rtype = elf_m32r_reloc_type (type);
1054 rtype = elf_i386_reloc_type (type);
1059 rtype = elf_m68hc11_reloc_type (type);
1063 rtype = elf_m68k_reloc_type (type);
1067 rtype = elf_i960_reloc_type (type);
1072 rtype = elf_avr_reloc_type (type);
1075 case EM_OLD_SPARCV9:
1076 case EM_SPARC32PLUS:
1079 rtype = elf_sparc_reloc_type (type);
1083 rtype = elf_spu_reloc_type (type);
1087 case EM_CYGNUS_V850:
1088 rtype = v850_reloc_type (type);
1092 case EM_CYGNUS_D10V:
1093 rtype = elf_d10v_reloc_type (type);
1097 case EM_CYGNUS_D30V:
1098 rtype = elf_d30v_reloc_type (type);
1102 rtype = elf_dlx_reloc_type (type);
1106 rtype = elf_sh_reloc_type (type);
1110 case EM_CYGNUS_MN10300:
1111 rtype = elf_mn10300_reloc_type (type);
1115 case EM_CYGNUS_MN10200:
1116 rtype = elf_mn10200_reloc_type (type);
1120 case EM_CYGNUS_FR30:
1121 rtype = elf_fr30_reloc_type (type);
1125 rtype = elf_frv_reloc_type (type);
1129 rtype = elf_mcore_reloc_type (type);
1133 rtype = elf_mmix_reloc_type (type);
1137 rtype = elf_moxie_reloc_type (type);
1142 rtype = elf_msp430_reloc_type (type);
1146 rtype = elf_ppc_reloc_type (type);
1150 rtype = elf_ppc64_reloc_type (type);
1154 case EM_MIPS_RS3_LE:
1155 rtype = elf_mips_reloc_type (type);
1159 rtype = elf_alpha_reloc_type (type);
1163 rtype = elf_arm_reloc_type (type);
1167 rtype = elf_arc_reloc_type (type);
1171 rtype = elf_hppa_reloc_type (type);
1177 rtype = elf_h8_reloc_type (type);
1182 rtype = elf_or32_reloc_type (type);
1187 rtype = elf_pj_reloc_type (type);
1190 rtype = elf_ia64_reloc_type (type);
1194 rtype = elf_cris_reloc_type (type);
1198 rtype = elf_i860_reloc_type (type);
1203 rtype = elf_x86_64_reloc_type (type);
1207 rtype = i370_reloc_type (type);
1212 rtype = elf_s390_reloc_type (type);
1216 rtype = elf_score_reloc_type (type);
1220 rtype = elf_xstormy16_reloc_type (type);
1224 rtype = elf_crx_reloc_type (type);
1228 rtype = elf_vax_reloc_type (type);
1233 rtype = elf_ip2k_reloc_type (type);
1237 rtype = elf_iq2000_reloc_type (type);
1242 rtype = elf_xtensa_reloc_type (type);
1245 case EM_LATTICEMICO32:
1246 rtype = elf_lm32_reloc_type (type);
1251 rtype = elf_m32c_reloc_type (type);
1255 rtype = elf_mt_reloc_type (type);
1259 rtype = elf_bfin_reloc_type (type);
1263 rtype = elf_mep_reloc_type (type);
1268 rtype = elf_cr16_reloc_type (type);
1272 case EM_MICROBLAZE_OLD:
1273 rtype = elf_microblaze_reloc_type (type);
1277 rtype = elf_rx_reloc_type (type);
1282 rtype = elf_xc16x_reloc_type (type);
1286 rtype = elf_tic6x_reloc_type (type);
1291 printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1293 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1295 if (elf_header.e_machine == EM_ALPHA
1297 && streq (rtype, "R_ALPHA_LITUSE")
1300 switch (rels[i].r_addend)
1302 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1303 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1304 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1305 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1306 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1307 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1308 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1309 default: rtype = NULL;
1312 printf (" (%s)", rtype);
1316 printf (_("<unknown addend: %lx>"),
1317 (unsigned long) rels[i].r_addend);
1320 else if (symtab_index)
1322 if (symtab == NULL || symtab_index >= nsyms)
1323 printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1326 Elf_Internal_Sym * psym;
1328 psym = symtab + symtab_index;
1332 if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1336 unsigned int width = is_32bit_elf ? 8 : 14;
1338 /* Relocations against GNU_IFUNC symbols do not use the value
1339 of the symbol as the address to relocate against. Instead
1340 they invoke the function named by the symbol and use its
1341 result as the address for relocation.
1343 To indicate this to the user, do not display the value of
1344 the symbol in the "Symbols's Value" field. Instead show
1345 its name followed by () as a hint that the symbol is
1349 || psym->st_name == 0
1350 || psym->st_name >= strtablen)
1353 name = strtab + psym->st_name;
1355 len = print_symbol (width, name);
1356 printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1360 print_vma (psym->st_value, LONG_HEX);
1362 printf (is_32bit_elf ? " " : " ");
1365 if (psym->st_name == 0)
1367 const char * sec_name = "<null>";
1370 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1372 if (psym->st_shndx < elf_header.e_shnum)
1374 = SECTION_NAME (section_headers + psym->st_shndx);
1375 else if (psym->st_shndx == SHN_ABS)
1377 else if (psym->st_shndx == SHN_COMMON)
1378 sec_name = "COMMON";
1379 else if (elf_header.e_machine == EM_MIPS
1380 && psym->st_shndx == SHN_MIPS_SCOMMON)
1381 sec_name = "SCOMMON";
1382 else if (elf_header.e_machine == EM_MIPS
1383 && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1384 sec_name = "SUNDEF";
1385 else if ((elf_header.e_machine == EM_X86_64
1386 || elf_header.e_machine == EM_L1OM)
1387 && psym->st_shndx == SHN_X86_64_LCOMMON)
1388 sec_name = "LARGE_COMMON";
1389 else if (elf_header.e_machine == EM_IA_64
1390 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1391 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1392 sec_name = "ANSI_COM";
1393 else if (is_ia64_vms ()
1394 && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1395 sec_name = "VMS_SYMVEC";
1398 sprintf (name_buf, "<section 0x%x>",
1399 (unsigned int) psym->st_shndx);
1400 sec_name = name_buf;
1403 print_symbol (22, sec_name);
1405 else if (strtab == NULL)
1406 printf (_("<string table index: %3ld>"), psym->st_name);
1407 else if (psym->st_name >= strtablen)
1408 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1410 print_symbol (22, strtab + psym->st_name);
1414 bfd_signed_vma off = rels[i].r_addend;
1417 printf (" - %" BFD_VMA_FMT "x", - off);
1419 printf (" + %" BFD_VMA_FMT "x", off);
1425 printf ("%*c", is_32bit_elf ?
1426 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1427 print_vma (rels[i].r_addend, LONG_HEX);
1430 if (elf_header.e_machine == EM_SPARCV9
1432 && streq (rtype, "R_SPARC_OLO10"))
1433 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1438 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1440 bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1441 bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1442 const char * rtype2 = elf_mips_reloc_type (type2);
1443 const char * rtype3 = elf_mips_reloc_type (type3);
1445 printf (" Type2: ");
1448 printf (_("unrecognized: %-7lx"),
1449 (unsigned long) type2 & 0xffffffff);
1451 printf ("%-17.17s", rtype2);
1453 printf ("\n Type3: ");
1456 printf (_("unrecognized: %-7lx"),
1457 (unsigned long) type3 & 0xffffffff);
1459 printf ("%-17.17s", rtype3);
1470 get_mips_dynamic_type (unsigned long type)
1474 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1475 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1476 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1477 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1478 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1479 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1480 case DT_MIPS_MSYM: return "MIPS_MSYM";
1481 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1482 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1483 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1484 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1485 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1486 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1487 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1488 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1489 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1490 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1491 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1492 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1493 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1494 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1495 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1496 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1497 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1498 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1499 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1500 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1501 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1502 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1503 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1504 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1505 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1506 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1507 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1508 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1509 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1510 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1511 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1512 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1513 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1514 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1515 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1516 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1517 case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1518 case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1525 get_sparc64_dynamic_type (unsigned long type)
1529 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1536 get_ppc_dynamic_type (unsigned long type)
1540 case DT_PPC_GOT: return "PPC_GOT";
1541 case DT_PPC_TLSOPT: return "PPC_TLSOPT";
1548 get_ppc64_dynamic_type (unsigned long type)
1552 case DT_PPC64_GLINK: return "PPC64_GLINK";
1553 case DT_PPC64_OPD: return "PPC64_OPD";
1554 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1555 case DT_PPC64_TLSOPT: return "PPC64_TLSOPT";
1562 get_parisc_dynamic_type (unsigned long type)
1566 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1567 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1568 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1569 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1570 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1571 case DT_HP_PREINIT: return "HP_PREINIT";
1572 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1573 case DT_HP_NEEDED: return "HP_NEEDED";
1574 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1575 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1576 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1577 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1578 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1579 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1580 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1581 case DT_HP_FILTERED: return "HP_FILTERED";
1582 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1583 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1584 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1585 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1586 case DT_PLT: return "PLT";
1587 case DT_PLT_SIZE: return "PLT_SIZE";
1588 case DT_DLT: return "DLT";
1589 case DT_DLT_SIZE: return "DLT_SIZE";
1596 get_ia64_dynamic_type (unsigned long type)
1600 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1601 case DT_IA_64_VMS_SUBTYPE: return "VMS_SUBTYPE";
1602 case DT_IA_64_VMS_IMGIOCNT: return "VMS_IMGIOCNT";
1603 case DT_IA_64_VMS_LNKFLAGS: return "VMS_LNKFLAGS";
1604 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1605 case DT_IA_64_VMS_IDENT: return "VMS_IDENT";
1606 case DT_IA_64_VMS_NEEDED_IDENT: return "VMS_NEEDED_IDENT";
1607 case DT_IA_64_VMS_IMG_RELA_CNT: return "VMS_IMG_RELA_CNT";
1608 case DT_IA_64_VMS_SEG_RELA_CNT: return "VMS_SEG_RELA_CNT";
1609 case DT_IA_64_VMS_FIXUP_RELA_CNT: return "VMS_FIXUP_RELA_CNT";
1610 case DT_IA_64_VMS_FIXUP_NEEDED: return "VMS_FIXUP_NEEDED";
1611 case DT_IA_64_VMS_SYMVEC_CNT: return "VMS_SYMVEC_CNT";
1612 case DT_IA_64_VMS_XLATED: return "VMS_XLATED";
1613 case DT_IA_64_VMS_STACKSIZE: return "VMS_STACKSIZE";
1614 case DT_IA_64_VMS_UNWINDSZ: return "VMS_UNWINDSZ";
1615 case DT_IA_64_VMS_UNWIND_CODSEG: return "VMS_UNWIND_CODSEG";
1616 case DT_IA_64_VMS_UNWIND_INFOSEG: return "VMS_UNWIND_INFOSEG";
1617 case DT_IA_64_VMS_LINKTIME: return "VMS_LINKTIME";
1618 case DT_IA_64_VMS_SEG_NO: return "VMS_SEG_NO";
1619 case DT_IA_64_VMS_SYMVEC_OFFSET: return "VMS_SYMVEC_OFFSET";
1620 case DT_IA_64_VMS_SYMVEC_SEG: return "VMS_SYMVEC_SEG";
1621 case DT_IA_64_VMS_UNWIND_OFFSET: return "VMS_UNWIND_OFFSET";
1622 case DT_IA_64_VMS_UNWIND_SEG: return "VMS_UNWIND_SEG";
1623 case DT_IA_64_VMS_STRTAB_OFFSET: return "VMS_STRTAB_OFFSET";
1624 case DT_IA_64_VMS_SYSVER_OFFSET: return "VMS_SYSVER_OFFSET";
1625 case DT_IA_64_VMS_IMG_RELA_OFF: return "VMS_IMG_RELA_OFF";
1626 case DT_IA_64_VMS_SEG_RELA_OFF: return "VMS_SEG_RELA_OFF";
1627 case DT_IA_64_VMS_FIXUP_RELA_OFF: return "VMS_FIXUP_RELA_OFF";
1628 case DT_IA_64_VMS_PLTGOT_OFFSET: return "VMS_PLTGOT_OFFSET";
1629 case DT_IA_64_VMS_PLTGOT_SEG: return "VMS_PLTGOT_SEG";
1630 case DT_IA_64_VMS_FPMODE: return "VMS_FPMODE";
1637 get_alpha_dynamic_type (unsigned long type)
1641 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1648 get_score_dynamic_type (unsigned long type)
1652 case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1653 case DT_SCORE_LOCAL_GOTNO: return "SCORE_LOCAL_GOTNO";
1654 case DT_SCORE_SYMTABNO: return "SCORE_SYMTABNO";
1655 case DT_SCORE_GOTSYM: return "SCORE_GOTSYM";
1656 case DT_SCORE_UNREFEXTNO: return "SCORE_UNREFEXTNO";
1657 case DT_SCORE_HIPAGENO: return "SCORE_HIPAGENO";
1664 get_tic6x_dynamic_type (unsigned long type)
1668 case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1669 case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1670 case DT_C6000_DSBT_BASE: return "C6000_DSBT_BASE";
1671 case DT_C6000_DSBT_SIZE: return "C6000_DSBT_SIZE";
1672 case DT_C6000_PREEMPTMAP: return "C6000_PREEMPTMAP";
1673 case DT_C6000_DSBT_INDEX: return "C6000_DSBT_INDEX";
1680 get_dynamic_type (unsigned long type)
1682 static char buff[64];
1686 case DT_NULL: return "NULL";
1687 case DT_NEEDED: return "NEEDED";
1688 case DT_PLTRELSZ: return "PLTRELSZ";
1689 case DT_PLTGOT: return "PLTGOT";
1690 case DT_HASH: return "HASH";
1691 case DT_STRTAB: return "STRTAB";
1692 case DT_SYMTAB: return "SYMTAB";
1693 case DT_RELA: return "RELA";
1694 case DT_RELASZ: return "RELASZ";
1695 case DT_RELAENT: return "RELAENT";
1696 case DT_STRSZ: return "STRSZ";
1697 case DT_SYMENT: return "SYMENT";
1698 case DT_INIT: return "INIT";
1699 case DT_FINI: return "FINI";
1700 case DT_SONAME: return "SONAME";
1701 case DT_RPATH: return "RPATH";
1702 case DT_SYMBOLIC: return "SYMBOLIC";
1703 case DT_REL: return "REL";
1704 case DT_RELSZ: return "RELSZ";
1705 case DT_RELENT: return "RELENT";
1706 case DT_PLTREL: return "PLTREL";
1707 case DT_DEBUG: return "DEBUG";
1708 case DT_TEXTREL: return "TEXTREL";
1709 case DT_JMPREL: return "JMPREL";
1710 case DT_BIND_NOW: return "BIND_NOW";
1711 case DT_INIT_ARRAY: return "INIT_ARRAY";
1712 case DT_FINI_ARRAY: return "FINI_ARRAY";
1713 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1714 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1715 case DT_RUNPATH: return "RUNPATH";
1716 case DT_FLAGS: return "FLAGS";
1718 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1719 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1721 case DT_CHECKSUM: return "CHECKSUM";
1722 case DT_PLTPADSZ: return "PLTPADSZ";
1723 case DT_MOVEENT: return "MOVEENT";
1724 case DT_MOVESZ: return "MOVESZ";
1725 case DT_FEATURE: return "FEATURE";
1726 case DT_POSFLAG_1: return "POSFLAG_1";
1727 case DT_SYMINSZ: return "SYMINSZ";
1728 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1730 case DT_ADDRRNGLO: return "ADDRRNGLO";
1731 case DT_CONFIG: return "CONFIG";
1732 case DT_DEPAUDIT: return "DEPAUDIT";
1733 case DT_AUDIT: return "AUDIT";
1734 case DT_PLTPAD: return "PLTPAD";
1735 case DT_MOVETAB: return "MOVETAB";
1736 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1738 case DT_VERSYM: return "VERSYM";
1740 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1741 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1742 case DT_RELACOUNT: return "RELACOUNT";
1743 case DT_RELCOUNT: return "RELCOUNT";
1744 case DT_FLAGS_1: return "FLAGS_1";
1745 case DT_VERDEF: return "VERDEF";
1746 case DT_VERDEFNUM: return "VERDEFNUM";
1747 case DT_VERNEED: return "VERNEED";
1748 case DT_VERNEEDNUM: return "VERNEEDNUM";
1750 case DT_AUXILIARY: return "AUXILIARY";
1751 case DT_USED: return "USED";
1752 case DT_FILTER: return "FILTER";
1754 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1755 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1756 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1757 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1758 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1759 case DT_GNU_HASH: return "GNU_HASH";
1762 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1764 const char * result;
1766 switch (elf_header.e_machine)
1769 case EM_MIPS_RS3_LE:
1770 result = get_mips_dynamic_type (type);
1773 result = get_sparc64_dynamic_type (type);
1776 result = get_ppc_dynamic_type (type);
1779 result = get_ppc64_dynamic_type (type);
1782 result = get_ia64_dynamic_type (type);
1785 result = get_alpha_dynamic_type (type);
1788 result = get_score_dynamic_type (type);
1791 result = get_tic6x_dynamic_type (type);
1801 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1803 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1804 || (elf_header.e_machine == EM_PARISC
1805 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1807 const char * result;
1809 switch (elf_header.e_machine)
1812 result = get_parisc_dynamic_type (type);
1815 result = get_ia64_dynamic_type (type);
1825 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1829 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1836 get_file_type (unsigned e_type)
1838 static char buff[32];
1842 case ET_NONE: return _("NONE (None)");
1843 case ET_REL: return _("REL (Relocatable file)");
1844 case ET_EXEC: return _("EXEC (Executable file)");
1845 case ET_DYN: return _("DYN (Shared object file)");
1846 case ET_CORE: return _("CORE (Core file)");
1849 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1850 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1851 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1852 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1854 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1860 get_machine_name (unsigned e_machine)
1862 static char buff[64]; /* XXX */
1866 case EM_NONE: return _("None");
1867 case EM_M32: return "WE32100";
1868 case EM_SPARC: return "Sparc";
1869 case EM_SPU: return "SPU";
1870 case EM_386: return "Intel 80386";
1871 case EM_68K: return "MC68000";
1872 case EM_88K: return "MC88000";
1873 case EM_486: return "Intel 80486";
1874 case EM_860: return "Intel 80860";
1875 case EM_MIPS: return "MIPS R3000";
1876 case EM_S370: return "IBM System/370";
1877 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1878 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1879 case EM_PARISC: return "HPPA";
1880 case EM_PPC_OLD: return "Power PC (old)";
1881 case EM_SPARC32PLUS: return "Sparc v8+" ;
1882 case EM_960: return "Intel 90860";
1883 case EM_PPC: return "PowerPC";
1884 case EM_PPC64: return "PowerPC64";
1885 case EM_V800: return "NEC V800";
1886 case EM_FR20: return "Fujitsu FR20";
1887 case EM_RH32: return "TRW RH32";
1888 case EM_MCORE: return "MCORE";
1889 case EM_ARM: return "ARM";
1890 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1891 case EM_SH: return "Renesas / SuperH SH";
1892 case EM_SPARCV9: return "Sparc v9";
1893 case EM_TRICORE: return "Siemens Tricore";
1894 case EM_ARC: return "ARC";
1895 case EM_H8_300: return "Renesas H8/300";
1896 case EM_H8_300H: return "Renesas H8/300H";
1897 case EM_H8S: return "Renesas H8S";
1898 case EM_H8_500: return "Renesas H8/500";
1899 case EM_IA_64: return "Intel IA-64";
1900 case EM_MIPS_X: return "Stanford MIPS-X";
1901 case EM_COLDFIRE: return "Motorola Coldfire";
1902 case EM_68HC12: return "Motorola M68HC12";
1903 case EM_ALPHA: return "Alpha";
1904 case EM_CYGNUS_D10V:
1905 case EM_D10V: return "d10v";
1906 case EM_CYGNUS_D30V:
1907 case EM_D30V: return "d30v";
1908 case EM_CYGNUS_M32R:
1909 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1910 case EM_CYGNUS_V850:
1911 case EM_V850: return "NEC v850";
1912 case EM_CYGNUS_MN10300:
1913 case EM_MN10300: return "mn10300";
1914 case EM_CYGNUS_MN10200:
1915 case EM_MN10200: return "mn10200";
1916 case EM_MOXIE: return "Moxie";
1917 case EM_CYGNUS_FR30:
1918 case EM_FR30: return "Fujitsu FR30";
1919 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1921 case EM_PJ: return "picoJava";
1922 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1923 case EM_PCP: return "Siemens PCP";
1924 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1925 case EM_NDR1: return "Denso NDR1 microprocesspr";
1926 case EM_STARCORE: return "Motorola Star*Core processor";
1927 case EM_ME16: return "Toyota ME16 processor";
1928 case EM_ST100: return "STMicroelectronics ST100 processor";
1929 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1930 case EM_PDSP: return "Sony DSP processor";
1931 case EM_PDP10: return "Digital Equipment Corp. PDP-10";
1932 case EM_PDP11: return "Digital Equipment Corp. PDP-11";
1933 case EM_FX66: return "Siemens FX66 microcontroller";
1934 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1935 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1936 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1937 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1938 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1939 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1940 case EM_SVX: return "Silicon Graphics SVx";
1941 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1942 case EM_VAX: return "Digital VAX";
1944 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1945 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1946 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1947 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1948 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1949 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1950 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1951 case EM_PRISM: return "Vitesse Prism";
1952 case EM_X86_64: return "Advanced Micro Devices X86-64";
1953 case EM_L1OM: return "Intel L1OM";
1955 case EM_S390: return "IBM S/390";
1956 case EM_SCORE: return "SUNPLUS S+Core";
1957 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1959 case EM_OR32: return "OpenRISC";
1960 case EM_ARC_A5: return "ARC International ARCompact processor";
1961 case EM_CRX: return "National Semiconductor CRX microprocessor";
1962 case EM_DLX: return "OpenDLX";
1964 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1965 case EM_IQ2000: return "Vitesse IQ2000";
1967 case EM_XTENSA: return "Tensilica Xtensa Processor";
1968 case EM_VIDEOCORE: return "Alphamosaic VideoCore processor";
1969 case EM_TMM_GPP: return "Thompson Multimedia General Purpose Processor";
1970 case EM_NS32K: return "National Semiconductor 32000 series";
1971 case EM_TPC: return "Tenor Network TPC processor";
1972 case EM_ST200: return "STMicroelectronics ST200 microcontroller";
1973 case EM_MAX: return "MAX Processor";
1974 case EM_CR: return "National Semiconductor CompactRISC";
1975 case EM_F2MC16: return "Fujitsu F2MC16";
1976 case EM_MSP430: return "Texas Instruments msp430 microcontroller";
1977 case EM_LATTICEMICO32: return "Lattice Mico32";
1979 case EM_M32C: return "Renesas M32c";
1980 case EM_MT: return "Morpho Techologies MT processor";
1981 case EM_BLACKFIN: return "Analog Devices Blackfin";
1982 case EM_SE_C33: return "S1C33 Family of Seiko Epson processors";
1983 case EM_SEP: return "Sharp embedded microprocessor";
1984 case EM_ARCA: return "Arca RISC microprocessor";
1985 case EM_UNICORE: return "Unicore";
1986 case EM_EXCESS: return "eXcess 16/32/64-bit configurable embedded CPU";
1987 case EM_DXP: return "Icera Semiconductor Inc. Deep Execution Processor";
1988 case EM_NIOS32: return "Altera Nios";
1989 case EM_ALTERA_NIOS2: return "Altera Nios II";
1991 case EM_XC16X: return "Infineon Technologies xc16x";
1992 case EM_M16C: return "Renesas M16C series microprocessors";
1993 case EM_DSPIC30F: return "Microchip Technology dsPIC30F Digital Signal Controller";
1994 case EM_CE: return "Freescale Communication Engine RISC core";
1995 case EM_TSK3000: return "Altium TSK3000 core";
1996 case EM_RS08: return "Freescale RS08 embedded processor";
1997 case EM_ECOG2: return "Cyan Technology eCOG2 microprocessor";
1998 case EM_DSP24: return "New Japan Radio (NJR) 24-bit DSP Processor";
1999 case EM_VIDEOCORE3: return "Broadcom VideoCore III processor";
2000 case EM_SE_C17: return "Seiko Epson C17 family";
2001 case EM_TI_C6000: return "Texas Instruments TMS320C6000 DSP family";
2002 case EM_TI_C2000: return "Texas Instruments TMS320C2000 DSP family";
2003 case EM_TI_C5500: return "Texas Instruments TMS320C55x DSP family";
2004 case EM_MMDSP_PLUS: return "STMicroelectronics 64bit VLIW Data Signal Processor";
2005 case EM_CYPRESS_M8C: return "Cypress M8C microprocessor";
2006 case EM_R32C: return "Renesas R32C series microprocessors";
2007 case EM_TRIMEDIA: return "NXP Semiconductors TriMedia architecture family";
2008 case EM_QDSP6: return "QUALCOMM DSP6 Processor";
2009 case EM_8051: return "Intel 8051 and variants";
2010 case EM_STXP7X: return "STMicroelectronics STxP7x family";
2011 case EM_NDS32: return "Andes Technology compact code size embedded RISC processor family";
2012 case EM_ECOG1X: return "Cyan Technology eCOG1X family";
2013 case EM_MAXQ30: return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2014 case EM_XIMO16: return "New Japan Radio (NJR) 16-bit DSP Processor";
2015 case EM_MANIK: return "M2000 Reconfigurable RISC Microprocessor";
2016 case EM_CRAYNV2: return "Cray Inc. NV2 vector architecture";
2017 case EM_CYGNUS_MEP: return "Toshiba MeP Media Engine";
2019 case EM_CR16_OLD: return "National Semiconductor's CR16";
2020 case EM_MICROBLAZE: return "Xilinx MicroBlaze";
2021 case EM_MICROBLAZE_OLD: return "Xilinx MicroBlaze";
2022 case EM_RX: return "Renesas RX";
2023 case EM_METAG: return "Imagination Technologies META processor architecture";
2024 case EM_MCST_ELBRUS: return "MCST Elbrus general purpose hardware architecture";
2025 case EM_ECOG16: return "Cyan Technology eCOG16 family";
2026 case EM_ETPU: return "Freescale Extended Time Processing Unit";
2027 case EM_SLE9X: return "Infineon Technologies SLE9X core";
2028 case EM_AVR32: return "Atmel Corporation 32-bit microprocessor family";
2029 case EM_STM8: return "STMicroeletronics STM8 8-bit microcontroller";
2030 case EM_TILE64: return "Tilera TILE64 multicore architecture family";
2031 case EM_TILEPRO: return "Tilera TILEPro multicore architecture family";
2032 case EM_CUDA: return "NVIDIA CUDA architecture";
2034 snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2040 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2045 eabi = EF_ARM_EABI_VERSION (e_flags);
2046 e_flags &= ~ EF_ARM_EABIMASK;
2048 /* Handle "generic" ARM flags. */
2049 if (e_flags & EF_ARM_RELEXEC)
2051 strcat (buf, ", relocatable executable");
2052 e_flags &= ~ EF_ARM_RELEXEC;
2055 if (e_flags & EF_ARM_HASENTRY)
2057 strcat (buf, ", has entry point");
2058 e_flags &= ~ EF_ARM_HASENTRY;
2061 /* Now handle EABI specific flags. */
2065 strcat (buf, ", <unrecognized EABI>");
2070 case EF_ARM_EABI_VER1:
2071 strcat (buf, ", Version1 EABI");
2076 /* Process flags one bit at a time. */
2077 flag = e_flags & - e_flags;
2082 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2083 strcat (buf, ", sorted symbol tables");
2093 case EF_ARM_EABI_VER2:
2094 strcat (buf, ", Version2 EABI");
2099 /* Process flags one bit at a time. */
2100 flag = e_flags & - e_flags;
2105 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
2106 strcat (buf, ", sorted symbol tables");
2109 case EF_ARM_DYNSYMSUSESEGIDX:
2110 strcat (buf, ", dynamic symbols use segment index");
2113 case EF_ARM_MAPSYMSFIRST:
2114 strcat (buf, ", mapping symbols precede others");
2124 case EF_ARM_EABI_VER3:
2125 strcat (buf, ", Version3 EABI");
2128 case EF_ARM_EABI_VER4:
2129 strcat (buf, ", Version4 EABI");
2132 case EF_ARM_EABI_VER5:
2133 strcat (buf, ", Version5 EABI");
2139 /* Process flags one bit at a time. */
2140 flag = e_flags & - e_flags;
2146 strcat (buf, ", BE8");
2150 strcat (buf, ", LE8");
2160 case EF_ARM_EABI_UNKNOWN:
2161 strcat (buf, ", GNU EABI");
2166 /* Process flags one bit at a time. */
2167 flag = e_flags & - e_flags;
2172 case EF_ARM_INTERWORK:
2173 strcat (buf, ", interworking enabled");
2176 case EF_ARM_APCS_26:
2177 strcat (buf, ", uses APCS/26");
2180 case EF_ARM_APCS_FLOAT:
2181 strcat (buf, ", uses APCS/float");
2185 strcat (buf, ", position independent");
2189 strcat (buf, ", 8 bit structure alignment");
2192 case EF_ARM_NEW_ABI:
2193 strcat (buf, ", uses new ABI");
2196 case EF_ARM_OLD_ABI:
2197 strcat (buf, ", uses old ABI");
2200 case EF_ARM_SOFT_FLOAT:
2201 strcat (buf, ", software FP");
2204 case EF_ARM_VFP_FLOAT:
2205 strcat (buf, ", VFP");
2208 case EF_ARM_MAVERICK_FLOAT:
2209 strcat (buf, ", Maverick FP");
2220 strcat (buf,_(", <unknown>"));
2224 get_machine_flags (unsigned e_flags, unsigned e_machine)
2226 static char buf[1024];
2238 decode_ARM_machine_flags (e_flags, buf);
2242 switch (e_flags & EF_FRV_CPU_MASK)
2244 case EF_FRV_CPU_GENERIC:
2248 strcat (buf, ", fr???");
2251 case EF_FRV_CPU_FR300:
2252 strcat (buf, ", fr300");
2255 case EF_FRV_CPU_FR400:
2256 strcat (buf, ", fr400");
2258 case EF_FRV_CPU_FR405:
2259 strcat (buf, ", fr405");
2262 case EF_FRV_CPU_FR450:
2263 strcat (buf, ", fr450");
2266 case EF_FRV_CPU_FR500:
2267 strcat (buf, ", fr500");
2269 case EF_FRV_CPU_FR550:
2270 strcat (buf, ", fr550");
2273 case EF_FRV_CPU_SIMPLE:
2274 strcat (buf, ", simple");
2276 case EF_FRV_CPU_TOMCAT:
2277 strcat (buf, ", tomcat");
2283 if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2284 strcat (buf, ", m68000");
2285 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2286 strcat (buf, ", cpu32");
2287 else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2288 strcat (buf, ", fido_a");
2291 char const * isa = _("unknown");
2292 char const * mac = _("unknown mac");
2293 char const * additional = NULL;
2295 switch (e_flags & EF_M68K_CF_ISA_MASK)
2297 case EF_M68K_CF_ISA_A_NODIV:
2299 additional = ", nodiv";
2301 case EF_M68K_CF_ISA_A:
2304 case EF_M68K_CF_ISA_A_PLUS:
2307 case EF_M68K_CF_ISA_B_NOUSP:
2309 additional = ", nousp";
2311 case EF_M68K_CF_ISA_B:
2314 case EF_M68K_CF_ISA_C:
2317 case EF_M68K_CF_ISA_C_NODIV:
2319 additional = ", nodiv";
2322 strcat (buf, ", cf, isa ");
2325 strcat (buf, additional);
2326 if (e_flags & EF_M68K_CF_FLOAT)
2327 strcat (buf, ", float");
2328 switch (e_flags & EF_M68K_CF_MAC_MASK)
2333 case EF_M68K_CF_MAC:
2336 case EF_M68K_CF_EMAC:
2339 case EF_M68K_CF_EMAC_B:
2352 if (e_flags & EF_PPC_EMB)
2353 strcat (buf, ", emb");
2355 if (e_flags & EF_PPC_RELOCATABLE)
2356 strcat (buf, _(", relocatable"));
2358 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2359 strcat (buf, _(", relocatable-lib"));
2363 case EM_CYGNUS_V850:
2364 switch (e_flags & EF_V850_ARCH)
2366 case E_V850E2V3_ARCH:
2367 strcat (buf, ", v850e2v3");
2370 strcat (buf, ", v850e2");
2373 strcat (buf, ", v850e1");
2376 strcat (buf, ", v850e");
2379 strcat (buf, ", v850");
2382 strcat (buf, _(", unknown v850 architecture variant"));
2388 case EM_CYGNUS_M32R:
2389 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2390 strcat (buf, ", m32r");
2394 case EM_MIPS_RS3_LE:
2395 if (e_flags & EF_MIPS_NOREORDER)
2396 strcat (buf, ", noreorder");
2398 if (e_flags & EF_MIPS_PIC)
2399 strcat (buf, ", pic");
2401 if (e_flags & EF_MIPS_CPIC)
2402 strcat (buf, ", cpic");
2404 if (e_flags & EF_MIPS_UCODE)
2405 strcat (buf, ", ugen_reserved");
2407 if (e_flags & EF_MIPS_ABI2)
2408 strcat (buf, ", abi2");
2410 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2411 strcat (buf, ", odk first");
2413 if (e_flags & EF_MIPS_32BITMODE)
2414 strcat (buf, ", 32bitmode");
2416 switch ((e_flags & EF_MIPS_MACH))
2418 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2419 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2420 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2421 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2422 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2423 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2424 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2425 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2426 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2427 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2428 case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
2429 case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
2430 case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
2431 case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
2432 case E_MIPS_MACH_XLR: strcat (buf, ", xlr"); break;
2434 /* We simply ignore the field in this case to avoid confusion:
2435 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2438 default: strcat (buf, _(", unknown CPU")); break;
2441 switch ((e_flags & EF_MIPS_ABI))
2443 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2444 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2445 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2446 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2448 /* We simply ignore the field in this case to avoid confusion:
2449 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2450 This means it is likely to be an o32 file, but not for
2453 default: strcat (buf, _(", unknown ABI")); break;
2456 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2457 strcat (buf, ", mdmx");
2459 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2460 strcat (buf, ", mips16");
2462 switch ((e_flags & EF_MIPS_ARCH))
2464 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2465 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2466 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2467 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2468 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2469 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2470 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2471 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2472 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2473 default: strcat (buf, _(", unknown ISA")); break;
2476 if (e_flags & EF_SH_PIC)
2477 strcat (buf, ", pic");
2479 if (e_flags & EF_SH_FDPIC)
2480 strcat (buf, ", fdpic");
2484 switch ((e_flags & EF_SH_MACH_MASK))
2486 case EF_SH1: strcat (buf, ", sh1"); break;
2487 case EF_SH2: strcat (buf, ", sh2"); break;
2488 case EF_SH3: strcat (buf, ", sh3"); break;
2489 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2490 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2491 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2492 case EF_SH3E: strcat (buf, ", sh3e"); break;
2493 case EF_SH4: strcat (buf, ", sh4"); break;
2494 case EF_SH5: strcat (buf, ", sh5"); break;
2495 case EF_SH2E: strcat (buf, ", sh2e"); break;
2496 case EF_SH4A: strcat (buf, ", sh4a"); break;
2497 case EF_SH2A: strcat (buf, ", sh2a"); break;
2498 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2499 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2500 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2501 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2502 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2503 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2504 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2505 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2506 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2507 default: strcat (buf, _(", unknown ISA")); break;
2513 if (e_flags & EF_SPARC_32PLUS)
2514 strcat (buf, ", v8+");
2516 if (e_flags & EF_SPARC_SUN_US1)
2517 strcat (buf, ", ultrasparcI");
2519 if (e_flags & EF_SPARC_SUN_US3)
2520 strcat (buf, ", ultrasparcIII");
2522 if (e_flags & EF_SPARC_HAL_R1)
2523 strcat (buf, ", halr1");
2525 if (e_flags & EF_SPARC_LEDATA)
2526 strcat (buf, ", ledata");
2528 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2529 strcat (buf, ", tso");
2531 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2532 strcat (buf, ", pso");
2534 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2535 strcat (buf, ", rmo");
2539 switch (e_flags & EF_PARISC_ARCH)
2541 case EFA_PARISC_1_0:
2542 strcpy (buf, ", PA-RISC 1.0");
2544 case EFA_PARISC_1_1:
2545 strcpy (buf, ", PA-RISC 1.1");
2547 case EFA_PARISC_2_0:
2548 strcpy (buf, ", PA-RISC 2.0");
2553 if (e_flags & EF_PARISC_TRAPNIL)
2554 strcat (buf, ", trapnil");
2555 if (e_flags & EF_PARISC_EXT)
2556 strcat (buf, ", ext");
2557 if (e_flags & EF_PARISC_LSB)
2558 strcat (buf, ", lsb");
2559 if (e_flags & EF_PARISC_WIDE)
2560 strcat (buf, ", wide");
2561 if (e_flags & EF_PARISC_NO_KABP)
2562 strcat (buf, ", no kabp");
2563 if (e_flags & EF_PARISC_LAZYSWAP)
2564 strcat (buf, ", lazyswap");
2569 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2570 strcat (buf, ", new calling convention");
2572 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2573 strcat (buf, ", gnu calling convention");
2577 if ((e_flags & EF_IA_64_ABI64))
2578 strcat (buf, ", 64-bit");
2580 strcat (buf, ", 32-bit");
2581 if ((e_flags & EF_IA_64_REDUCEDFP))
2582 strcat (buf, ", reduced fp model");
2583 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2584 strcat (buf, ", no function descriptors, constant gp");
2585 else if ((e_flags & EF_IA_64_CONS_GP))
2586 strcat (buf, ", constant gp");
2587 if ((e_flags & EF_IA_64_ABSOLUTE))
2588 strcat (buf, ", absolute");
2589 if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
2591 if ((e_flags & EF_IA_64_VMS_LINKAGES))
2592 strcat (buf, ", vms_linkages");
2593 switch ((e_flags & EF_IA_64_VMS_COMCOD))
2595 case EF_IA_64_VMS_COMCOD_SUCCESS:
2597 case EF_IA_64_VMS_COMCOD_WARNING:
2598 strcat (buf, ", warning");
2600 case EF_IA_64_VMS_COMCOD_ERROR:
2601 strcat (buf, ", error");
2603 case EF_IA_64_VMS_COMCOD_ABORT:
2604 strcat (buf, ", abort");
2613 if ((e_flags & EF_VAX_NONPIC))
2614 strcat (buf, ", non-PIC");
2615 if ((e_flags & EF_VAX_DFLOAT))
2616 strcat (buf, ", D-Float");
2617 if ((e_flags & EF_VAX_GFLOAT))
2618 strcat (buf, ", G-Float");
2622 if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
2623 strcat (buf, ", 64-bit doubles");
2624 if (e_flags & E_FLAG_RX_DSP)
2625 strcat (buf, ", dsp");
2628 if (e_flags & EF_S390_HIGH_GPRS)
2629 strcat (buf, ", highgprs");
2632 if ((e_flags & EF_C6000_REL))
2633 strcat (buf, ", relocatable module");
2641 get_osabi_name (unsigned int osabi)
2643 static char buff[32];
2647 case ELFOSABI_NONE: return "UNIX - System V";
2648 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2649 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2650 case ELFOSABI_LINUX: return "UNIX - Linux";
2651 case ELFOSABI_HURD: return "GNU/Hurd";
2652 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2653 case ELFOSABI_AIX: return "UNIX - AIX";
2654 case ELFOSABI_IRIX: return "UNIX - IRIX";
2655 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2656 case ELFOSABI_TRU64: return "UNIX - TRU64";
2657 case ELFOSABI_MODESTO: return "Novell - Modesto";
2658 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2659 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2660 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2661 case ELFOSABI_AROS: return "AROS";
2662 case ELFOSABI_FENIXOS: return "FenixOS";
2665 switch (elf_header.e_machine)
2670 case ELFOSABI_ARM: return "ARM";
2680 case ELFOSABI_STANDALONE: return _("Standalone App");
2689 case ELFOSABI_C6000_ELFABI: return _("Bare-metal C6000");
2690 case ELFOSABI_C6000_LINUX: return "Linux C6000";
2699 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2705 get_arm_segment_type (unsigned long type)
2719 get_mips_segment_type (unsigned long type)
2723 case PT_MIPS_REGINFO:
2725 case PT_MIPS_RTPROC:
2727 case PT_MIPS_OPTIONS:
2737 get_parisc_segment_type (unsigned long type)
2741 case PT_HP_TLS: return "HP_TLS";
2742 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2743 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2744 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2745 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2746 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2747 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2748 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2749 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2750 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2751 case PT_HP_PARALLEL: return "HP_PARALLEL";
2752 case PT_HP_FASTBIND: return "HP_FASTBIND";
2753 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2754 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2755 case PT_HP_STACK: return "HP_STACK";
2756 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2757 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2758 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2759 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2768 get_ia64_segment_type (unsigned long type)
2772 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2773 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2774 case PT_HP_TLS: return "HP_TLS";
2775 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2776 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2777 case PT_IA_64_HP_STACK: return "HP_STACK";
2786 get_tic6x_segment_type (unsigned long type)
2790 case PT_C6000_PHATTR: return "C6000_PHATTR";
2799 get_segment_type (unsigned long p_type)
2801 static char buff[32];
2805 case PT_NULL: return "NULL";
2806 case PT_LOAD: return "LOAD";
2807 case PT_DYNAMIC: return "DYNAMIC";
2808 case PT_INTERP: return "INTERP";
2809 case PT_NOTE: return "NOTE";
2810 case PT_SHLIB: return "SHLIB";
2811 case PT_PHDR: return "PHDR";
2812 case PT_TLS: return "TLS";
2814 case PT_GNU_EH_FRAME:
2815 return "GNU_EH_FRAME";
2816 case PT_GNU_STACK: return "GNU_STACK";
2817 case PT_GNU_RELRO: return "GNU_RELRO";
2820 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2822 const char * result;
2824 switch (elf_header.e_machine)
2827 result = get_arm_segment_type (p_type);
2830 case EM_MIPS_RS3_LE:
2831 result = get_mips_segment_type (p_type);
2834 result = get_parisc_segment_type (p_type);
2837 result = get_ia64_segment_type (p_type);
2840 result = get_tic6x_segment_type (p_type);
2850 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2852 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2854 const char * result;
2856 switch (elf_header.e_machine)
2859 result = get_parisc_segment_type (p_type);
2862 result = get_ia64_segment_type (p_type);
2872 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2875 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2882 get_mips_section_type_name (unsigned int sh_type)
2886 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2887 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2888 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2889 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2890 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2891 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2892 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2893 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2894 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2895 case SHT_MIPS_RELD: return "MIPS_RELD";
2896 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2897 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2898 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2899 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2900 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2901 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2902 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2903 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2904 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2905 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2906 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2907 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2908 case SHT_MIPS_LINE: return "MIPS_LINE";
2909 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2910 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2911 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2912 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2913 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2914 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2915 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2916 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2917 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2918 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2919 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2920 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2921 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2922 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2923 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2924 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2932 get_parisc_section_type_name (unsigned int sh_type)
2936 case SHT_PARISC_EXT: return "PARISC_EXT";
2937 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2938 case SHT_PARISC_DOC: return "PARISC_DOC";
2939 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2940 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2941 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2942 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2950 get_ia64_section_type_name (unsigned int sh_type)
2952 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2953 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2954 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2958 case SHT_IA_64_EXT: return "IA_64_EXT";
2959 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2960 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2961 case SHT_IA_64_VMS_TRACE: return "VMS_TRACE";
2962 case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
2963 case SHT_IA_64_VMS_DEBUG: return "VMS_DEBUG";
2964 case SHT_IA_64_VMS_DEBUG_STR: return "VMS_DEBUG_STR";
2965 case SHT_IA_64_VMS_LINKAGES: return "VMS_LINKAGES";
2966 case SHT_IA_64_VMS_SYMBOL_VECTOR: return "VMS_SYMBOL_VECTOR";
2967 case SHT_IA_64_VMS_FIXUP: return "VMS_FIXUP";
2975 get_x86_64_section_type_name (unsigned int sh_type)
2979 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2987 get_arm_section_type_name (unsigned int sh_type)
2991 case SHT_ARM_EXIDX: return "ARM_EXIDX";
2992 case SHT_ARM_PREEMPTMAP: return "ARM_PREEMPTMAP";
2993 case SHT_ARM_ATTRIBUTES: return "ARM_ATTRIBUTES";
2994 case SHT_ARM_DEBUGOVERLAY: return "ARM_DEBUGOVERLAY";
2995 case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION";
3003 get_tic6x_section_type_name (unsigned int sh_type)
3007 case SHT_C6000_UNWIND:
3008 return "C6000_UNWIND";
3009 case SHT_C6000_PREEMPTMAP:
3010 return "C6000_PREEMPTMAP";
3011 case SHT_C6000_ATTRIBUTES:
3012 return "C6000_ATTRIBUTES";
3017 case SHT_TI_HANDLER:
3018 return "TI_HANDLER";
3019 case SHT_TI_INITINFO:
3020 return "TI_INITINFO";
3021 case SHT_TI_PHATTRS:
3022 return "TI_PHATTRS";
3030 get_section_type_name (unsigned int sh_type)
3032 static char buff[32];
3036 case SHT_NULL: return "NULL";
3037 case SHT_PROGBITS: return "PROGBITS";
3038 case SHT_SYMTAB: return "SYMTAB";
3039 case SHT_STRTAB: return "STRTAB";
3040 case SHT_RELA: return "RELA";
3041 case SHT_HASH: return "HASH";
3042 case SHT_DYNAMIC: return "DYNAMIC";
3043 case SHT_NOTE: return "NOTE";
3044 case SHT_NOBITS: return "NOBITS";
3045 case SHT_REL: return "REL";
3046 case SHT_SHLIB: return "SHLIB";
3047 case SHT_DYNSYM: return "DYNSYM";
3048 case SHT_INIT_ARRAY: return "INIT_ARRAY";
3049 case SHT_FINI_ARRAY: return "FINI_ARRAY";
3050 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
3051 case SHT_GNU_HASH: return "GNU_HASH";
3052 case SHT_GROUP: return "GROUP";
3053 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
3054 case SHT_GNU_verdef: return "VERDEF";
3055 case SHT_GNU_verneed: return "VERNEED";
3056 case SHT_GNU_versym: return "VERSYM";
3057 case 0x6ffffff0: return "VERSYM";
3058 case 0x6ffffffc: return "VERDEF";
3059 case 0x7ffffffd: return "AUXILIARY";
3060 case 0x7fffffff: return "FILTER";
3061 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
3064 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
3066 const char * result;
3068 switch (elf_header.e_machine)
3071 case EM_MIPS_RS3_LE:
3072 result = get_mips_section_type_name (sh_type);
3075 result = get_parisc_section_type_name (sh_type);
3078 result = get_ia64_section_type_name (sh_type);
3082 result = get_x86_64_section_type_name (sh_type);
3085 result = get_arm_section_type_name (sh_type);
3088 result = get_tic6x_section_type_name (sh_type);
3098 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
3100 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
3102 const char * result;
3104 switch (elf_header.e_machine)
3107 result = get_ia64_section_type_name (sh_type);
3117 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
3119 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
3120 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
3122 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
3128 #define OPTION_DEBUG_DUMP 512
3129 #define OPTION_DYN_SYMS 513
3131 static struct option options[] =
3133 {"all", no_argument, 0, 'a'},
3134 {"file-header", no_argument, 0, 'h'},
3135 {"program-headers", no_argument, 0, 'l'},
3136 {"headers", no_argument, 0, 'e'},
3137 {"histogram", no_argument, 0, 'I'},
3138 {"segments", no_argument, 0, 'l'},
3139 {"sections", no_argument, 0, 'S'},
3140 {"section-headers", no_argument, 0, 'S'},
3141 {"section-groups", no_argument, 0, 'g'},
3142 {"section-details", no_argument, 0, 't'},
3143 {"full-section-name",no_argument, 0, 'N'},
3144 {"symbols", no_argument, 0, 's'},
3145 {"syms", no_argument, 0, 's'},
3146 {"dyn-syms", no_argument, 0, OPTION_DYN_SYMS},
3147 {"relocs", no_argument, 0, 'r'},
3148 {"notes", no_argument, 0, 'n'},
3149 {"dynamic", no_argument, 0, 'd'},
3150 {"arch-specific", no_argument, 0, 'A'},
3151 {"version-info", no_argument, 0, 'V'},
3152 {"use-dynamic", no_argument, 0, 'D'},
3153 {"unwind", no_argument, 0, 'u'},
3154 {"archive-index", no_argument, 0, 'c'},
3155 {"hex-dump", required_argument, 0, 'x'},
3156 {"relocated-dump", required_argument, 0, 'R'},
3157 {"string-dump", required_argument, 0, 'p'},
3158 #ifdef SUPPORT_DISASSEMBLY
3159 {"instruction-dump", required_argument, 0, 'i'},
3161 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
3163 {"version", no_argument, 0, 'v'},
3164 {"wide", no_argument, 0, 'W'},
3165 {"help", no_argument, 0, 'H'},
3166 {0, no_argument, 0, 0}
3170 usage (FILE * stream)
3172 fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
3173 fprintf (stream, _(" Display information about the contents of ELF format files\n"));
3174 fprintf (stream, _(" Options are:\n\
3175 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
3176 -h --file-header Display the ELF file header\n\
3177 -l --program-headers Display the program headers\n\
3178 --segments An alias for --program-headers\n\
3179 -S --section-headers Display the sections' header\n\
3180 --sections An alias for --section-headers\n\
3181 -g --section-groups Display the section groups\n\
3182 -t --section-details Display the section details\n\
3183 -e --headers Equivalent to: -h -l -S\n\
3184 -s --syms Display the symbol table\n\
3185 --symbols An alias for --syms\n\
3186 --dyn-syms Display the dynamic symbol table\n\
3187 -n --notes Display the core notes (if present)\n\
3188 -r --relocs Display the relocations (if present)\n\
3189 -u --unwind Display the unwind info (if present)\n\
3190 -d --dynamic Display the dynamic section (if present)\n\
3191 -V --version-info Display the version sections (if present)\n\
3192 -A --arch-specific Display architecture specific information (if any).\n\
3193 -c --archive-index Display the symbol/file index in an archive\n\
3194 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
3195 -x --hex-dump=<number|name>\n\
3196 Dump the contents of section <number|name> as bytes\n\
3197 -p --string-dump=<number|name>\n\
3198 Dump the contents of section <number|name> as strings\n\
3199 -R --relocated-dump=<number|name>\n\
3200 Dump the contents of section <number|name> as relocated bytes\n\
3201 -w[lLiaprmfFsoRt] or\n\
3202 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
3203 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
3204 =trace_info,=trace_abbrev,=trace_aranges]\n\
3205 Display the contents of DWARF2 debug sections\n"));
3206 #ifdef SUPPORT_DISASSEMBLY
3207 fprintf (stream, _("\
3208 -i --instruction-dump=<number|name>\n\
3209 Disassemble the contents of section <number|name>\n"));
3211 fprintf (stream, _("\
3212 -I --histogram Display histogram of bucket list lengths\n\
3213 -W --wide Allow output width to exceed 80 characters\n\
3214 @<file> Read options from <file>\n\
3215 -H --help Display this information\n\
3216 -v --version Display the version number of readelf\n"));
3218 if (REPORT_BUGS_TO[0] && stream == stdout)
3219 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
3221 exit (stream == stdout ? 0 : 1);
3224 /* Record the fact that the user wants the contents of section number
3225 SECTION to be displayed using the method(s) encoded as flags bits
3226 in TYPE. Note, TYPE can be zero if we are creating the array for
3230 request_dump_bynumber (unsigned int section, dump_type type)
3232 if (section >= num_dump_sects)
3234 dump_type * new_dump_sects;
3236 new_dump_sects = (dump_type *) calloc (section + 1,
3237 sizeof (* dump_sects));
3239 if (new_dump_sects == NULL)
3240 error (_("Out of memory allocating dump request table.\n"));
3243 /* Copy current flag settings. */
3244 memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
3248 dump_sects = new_dump_sects;
3249 num_dump_sects = section + 1;
3254 dump_sects[section] |= type;
3259 /* Request a dump by section name. */
3262 request_dump_byname (const char * section, dump_type type)
3264 struct dump_list_entry * new_request;
3266 new_request = (struct dump_list_entry *)
3267 malloc (sizeof (struct dump_list_entry));
3269 error (_("Out of memory allocating dump request table.\n"));
3271 new_request->name = strdup (section);
3272 if (!new_request->name)
3273 error (_("Out of memory allocating dump request table.\n"));
3275 new_request->type = type;
3277 new_request->next = dump_sects_byname;
3278 dump_sects_byname = new_request;
3282 request_dump (dump_type type)
3288 section = strtoul (optarg, & cp, 0);
3290 if (! *cp && section >= 0)
3291 request_dump_bynumber (section, type);
3293 request_dump_byname (optarg, type);
3298 parse_args (int argc, char ** argv)
3305 while ((c = getopt_long
3306 (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:", options, NULL)) != EOF)
3324 do_section_groups++;
3332 do_section_groups++;
3337 do_section_details++;
3381 request_dump (HEX_DUMP);
3384 request_dump (STRING_DUMP);
3387 request_dump (RELOC_DUMP);
3394 dwarf_select_sections_all ();
3399 dwarf_select_sections_by_letters (optarg);
3402 case OPTION_DEBUG_DUMP:
3409 dwarf_select_sections_by_names (optarg);
3412 case OPTION_DYN_SYMS:
3415 #ifdef SUPPORT_DISASSEMBLY
3417 request_dump (DISASS_DUMP);
3421 print_version (program_name);
3430 /* xgettext:c-format */
3431 error (_("Invalid option '-%c'\n"), c);
3438 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3439 && !do_segments && !do_header && !do_dump && !do_version
3440 && !do_histogram && !do_debugging && !do_arch && !do_notes
3441 && !do_section_groups && !do_archive_index
3446 warn (_("Nothing to do.\n"));
3452 get_elf_class (unsigned int elf_class)
3454 static char buff[32];
3458 case ELFCLASSNONE: return _("none");
3459 case ELFCLASS32: return "ELF32";
3460 case ELFCLASS64: return "ELF64";
3462 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3468 get_data_encoding (unsigned int encoding)
3470 static char buff[32];
3474 case ELFDATANONE: return _("none");
3475 case ELFDATA2LSB: return _("2's complement, little endian");
3476 case ELFDATA2MSB: return _("2's complement, big endian");
3478 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3483 /* Decode the data held in 'elf_header'. */
3486 process_file_header (void)
3488 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3489 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3490 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3491 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3494 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3498 init_dwarf_regnames (elf_header.e_machine);
3504 printf (_("ELF Header:\n"));
3505 printf (_(" Magic: "));
3506 for (i = 0; i < EI_NIDENT; i++)
3507 printf ("%2.2x ", elf_header.e_ident[i]);
3509 printf (_(" Class: %s\n"),
3510 get_elf_class (elf_header.e_ident[EI_CLASS]));
3511 printf (_(" Data: %s\n"),
3512 get_data_encoding (elf_header.e_ident[EI_DATA]));
3513 printf (_(" Version: %d %s\n"),
3514 elf_header.e_ident[EI_VERSION],
3515 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3517 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3518 ? _("<unknown: %lx>")
3520 printf (_(" OS/ABI: %s\n"),
3521 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3522 printf (_(" ABI Version: %d\n"),
3523 elf_header.e_ident[EI_ABIVERSION]);
3524 printf (_(" Type: %s\n"),
3525 get_file_type (elf_header.e_type));
3526 printf (_(" Machine: %s\n"),
3527 get_machine_name (elf_header.e_machine));
3528 printf (_(" Version: 0x%lx\n"),
3529 (unsigned long) elf_header.e_version);
3531 printf (_(" Entry point address: "));
3532 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3533 printf (_("\n Start of program headers: "));
3534 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3535 printf (_(" (bytes into file)\n Start of section headers: "));
3536 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3537 printf (_(" (bytes into file)\n"));
3539 printf (_(" Flags: 0x%lx%s\n"),
3540 (unsigned long) elf_header.e_flags,
3541 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3542 printf (_(" Size of this header: %ld (bytes)\n"),
3543 (long) elf_header.e_ehsize);
3544 printf (_(" Size of program headers: %ld (bytes)\n"),
3545 (long) elf_header.e_phentsize);
3546 printf (_(" Number of program headers: %ld"),
3547 (long) elf_header.e_phnum);
3548 if (section_headers != NULL
3549 && elf_header.e_phnum == PN_XNUM
3550 && section_headers[0].sh_info != 0)
3551 printf (_(" (%ld)"), (long) section_headers[0].sh_info);
3552 putc ('\n', stdout);
3553 printf (_(" Size of section headers: %ld (bytes)\n"),
3554 (long) elf_header.e_shentsize);
3555 printf (_(" Number of section headers: %ld"),
3556 (long) elf_header.e_shnum);
3557 if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
3558 printf (" (%ld)", (long) section_headers[0].sh_size);
3559 putc ('\n', stdout);
3560 printf (_(" Section header string table index: %ld"),
3561 (long) elf_header.e_shstrndx);
3562 if (section_headers != NULL
3563 && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3564 printf (" (%u)", section_headers[0].sh_link);
3565 else if (elf_header.e_shstrndx != SHN_UNDEF
3566 && elf_header.e_shstrndx >= elf_header.e_shnum)
3567 printf (_(" <corrupt: out of range>"));
3568 putc ('\n', stdout);
3571 if (section_headers != NULL)
3573 if (elf_header.e_phnum == PN_XNUM
3574 && section_headers[0].sh_info != 0)
3575 elf_header.e_phnum = section_headers[0].sh_info;
3576 if (elf_header.e_shnum == SHN_UNDEF)
3577 elf_header.e_shnum = section_headers[0].sh_size;
3578 if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
3579 elf_header.e_shstrndx = section_headers[0].sh_link;
3580 else if (elf_header.e_shstrndx >= elf_header.e_shnum)
3581 elf_header.e_shstrndx = SHN_UNDEF;
3582 free (section_headers);
3583 section_headers = NULL;
3591 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3593 Elf32_External_Phdr * phdrs;
3594 Elf32_External_Phdr * external;
3595 Elf_Internal_Phdr * internal;
3598 phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3599 elf_header.e_phentsize,
3601 _("program headers"));
3605 for (i = 0, internal = pheaders, external = phdrs;
3606 i < elf_header.e_phnum;
3607 i++, internal++, external++)
3609 internal->p_type = BYTE_GET (external->p_type);
3610 internal->p_offset = BYTE_GET (external->p_offset);
3611 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3612 internal->p_paddr = BYTE_GET (external->p_paddr);
3613 internal->p_filesz = BYTE_GET (external->p_filesz);
3614 internal->p_memsz = BYTE_GET (external->p_memsz);
3615 internal->p_flags = BYTE_GET (external->p_flags);
3616 internal->p_align = BYTE_GET (external->p_align);
3625 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
3627 Elf64_External_Phdr * phdrs;
3628 Elf64_External_Phdr * external;
3629 Elf_Internal_Phdr * internal;
3632 phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
3633 elf_header.e_phentsize,
3635 _("program headers"));
3639 for (i = 0, internal = pheaders, external = phdrs;
3640 i < elf_header.e_phnum;
3641 i++, internal++, external++)
3643 internal->p_type = BYTE_GET (external->p_type);
3644 internal->p_flags = BYTE_GET (external->p_flags);
3645 internal->p_offset = BYTE_GET (external->p_offset);
3646 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3647 internal->p_paddr = BYTE_GET (external->p_paddr);
3648 internal->p_filesz = BYTE_GET (external->p_filesz);
3649 internal->p_memsz = BYTE_GET (external->p_memsz);
3650 internal->p_align = BYTE_GET (external->p_align);
3658 /* Returns 1 if the program headers were read into `program_headers'. */
3661 get_program_headers (FILE * file)
3663 Elf_Internal_Phdr * phdrs;
3665 /* Check cache of prior read. */
3666 if (program_headers != NULL)
3669 phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
3670 sizeof (Elf_Internal_Phdr));
3674 error (_("Out of memory\n"));
3679 ? get_32bit_program_headers (file, phdrs)
3680 : get_64bit_program_headers (file, phdrs))
3682 program_headers = phdrs;
3690 /* Returns 1 if the program headers were loaded. */
3693 process_program_headers (FILE * file)
3695 Elf_Internal_Phdr * segment;
3698 if (elf_header.e_phnum == 0)
3701 printf (_("\nThere are no program headers in this file.\n"));
3705 if (do_segments && !do_header)
3707 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3708 printf (_("Entry point "));
3709 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3710 printf (_("\nThere are %d program headers, starting at offset "),
3711 elf_header.e_phnum);
3712 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3716 if (! get_program_headers (file))
3721 if (elf_header.e_phnum > 1)
3722 printf (_("\nProgram Headers:\n"));
3724 printf (_("\nProgram Headers:\n"));
3728 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3731 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3735 (_(" Type Offset VirtAddr PhysAddr\n"));
3737 (_(" FileSiz MemSiz Flags Align\n"));
3744 for (i = 0, segment = program_headers;
3745 i < elf_header.e_phnum;
3750 printf (" %-14.14s ", get_segment_type (segment->p_type));
3754 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3755 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3756 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3757 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3758 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3760 (segment->p_flags & PF_R ? 'R' : ' '),
3761 (segment->p_flags & PF_W ? 'W' : ' '),
3762 (segment->p_flags & PF_X ? 'E' : ' '));
3763 printf ("%#lx", (unsigned long) segment->p_align);
3767 if ((unsigned long) segment->p_offset == segment->p_offset)
3768 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3771 print_vma (segment->p_offset, FULL_HEX);
3775 print_vma (segment->p_vaddr, FULL_HEX);
3777 print_vma (segment->p_paddr, FULL_HEX);
3780 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3781 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3784 print_vma (segment->p_filesz, FULL_HEX);
3788 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3789 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3792 print_vma (segment->p_offset, FULL_HEX);
3796 (segment->p_flags & PF_R ? 'R' : ' '),
3797 (segment->p_flags & PF_W ? 'W' : ' '),
3798 (segment->p_flags & PF_X ? 'E' : ' '));
3800 if ((unsigned long) segment->p_align == segment->p_align)
3801 printf ("%#lx", (unsigned long) segment->p_align);
3804 print_vma (segment->p_align, PREFIX_HEX);
3809 print_vma (segment->p_offset, FULL_HEX);
3811 print_vma (segment->p_vaddr, FULL_HEX);
3813 print_vma (segment->p_paddr, FULL_HEX);
3815 print_vma (segment->p_filesz, FULL_HEX);
3817 print_vma (segment->p_memsz, FULL_HEX);
3819 (segment->p_flags & PF_R ? 'R' : ' '),
3820 (segment->p_flags & PF_W ? 'W' : ' '),
3821 (segment->p_flags & PF_X ? 'E' : ' '));
3822 print_vma (segment->p_align, HEX);
3826 switch (segment->p_type)
3830 error (_("more than one dynamic segment\n"));
3832 /* By default, assume that the .dynamic section is the first
3833 section in the DYNAMIC segment. */
3834 dynamic_addr = segment->p_offset;
3835 dynamic_size = segment->p_filesz;
3837 /* Try to locate the .dynamic section. If there is
3838 a section header table, we can easily locate it. */
3839 if (section_headers != NULL)
3841 Elf_Internal_Shdr * sec;
3843 sec = find_section (".dynamic");
3844 if (sec == NULL || sec->sh_size == 0)
3846 /* A corresponding .dynamic section is expected, but on
3847 IA-64/OpenVMS it is OK for it to be missing. */
3848 if (!is_ia64_vms ())
3849 error (_("no .dynamic section in the dynamic segment\n"));
3853 if (sec->sh_type == SHT_NOBITS)
3859 dynamic_addr = sec->sh_offset;
3860 dynamic_size = sec->sh_size;
3862 if (dynamic_addr < segment->p_offset
3863 || dynamic_addr > segment->p_offset + segment->p_filesz)
3864 warn (_("the .dynamic section is not contained"
3865 " within the dynamic segment\n"));
3866 else if (dynamic_addr > segment->p_offset)
3867 warn (_("the .dynamic section is not the first section"
3868 " in the dynamic segment.\n"));
3873 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3875 error (_("Unable to find program interpreter name\n"));
3879 int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX);
3881 if (ret >= (int) sizeof (fmt) || ret < 0)
3882 error (_("Internal error: failed to create format string to display program interpreter\n"));
3884 program_interpreter[0] = 0;
3885 if (fscanf (file, fmt, program_interpreter) <= 0)
3886 error (_("Unable to read program interpreter name\n"));
3889 printf (_("\n [Requesting program interpreter: %s]"),
3890 program_interpreter);
3896 putc ('\n', stdout);
3899 if (do_segments && section_headers != NULL && string_table != NULL)
3901 printf (_("\n Section to Segment mapping:\n"));
3902 printf (_(" Segment Sections...\n"));
3904 for (i = 0; i < elf_header.e_phnum; i++)
3907 Elf_Internal_Shdr * section;
3909 segment = program_headers + i;
3910 section = section_headers + 1;
3912 printf (" %2.2d ", i);
3914 for (j = 1; j < elf_header.e_shnum; j++, section++)
3916 if (!ELF_TBSS_SPECIAL (section, segment)
3917 && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
3918 printf ("%s ", SECTION_NAME (section));
3929 /* Find the file offset corresponding to VMA by using the program headers. */
3932 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
3934 Elf_Internal_Phdr * seg;
3936 if (! get_program_headers (file))
3938 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3942 for (seg = program_headers;
3943 seg < program_headers + elf_header.e_phnum;
3946 if (seg->p_type != PT_LOAD)
3949 if (vma >= (seg->p_vaddr & -seg->p_align)
3950 && vma + size <= seg->p_vaddr + seg->p_filesz)
3951 return vma - seg->p_vaddr + seg->p_offset;
3954 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3955 (unsigned long) vma);
3961 get_32bit_section_headers (FILE * file, unsigned int num)
3963 Elf32_External_Shdr * shdrs;
3964 Elf_Internal_Shdr * internal;
3967 shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
3968 elf_header.e_shentsize, num,
3969 _("section headers"));
3973 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
3974 sizeof (Elf_Internal_Shdr));
3976 if (section_headers == NULL)
3978 error (_("Out of memory\n"));
3982 for (i = 0, internal = section_headers;
3986 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3987 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3988 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3989 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3990 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3991 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3992 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3993 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3994 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3995 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4004 get_64bit_section_headers (FILE * file, unsigned int num)
4006 Elf64_External_Shdr * shdrs;
4007 Elf_Internal_Shdr * internal;
4010 shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
4011 elf_header.e_shentsize, num,
4012 _("section headers"));
4016 section_headers = (Elf_Internal_Shdr *) cmalloc (num,
4017 sizeof (Elf_Internal_Shdr));
4019 if (section_headers == NULL)
4021 error (_("Out of memory\n"));
4025 for (i = 0, internal = section_headers;
4029 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
4030 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
4031 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
4032 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
4033 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
4034 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
4035 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
4036 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
4037 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
4038 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
4046 static Elf_Internal_Sym *
4047 get_32bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4049 unsigned long number;
4050 Elf32_External_Sym * esyms = NULL;
4051 Elf_External_Sym_Shndx * shndx;
4052 Elf_Internal_Sym * isyms = NULL;
4053 Elf_Internal_Sym * psym;
4056 /* Run some sanity checks first. */
4057 if (section->sh_entsize == 0)
4059 error (_("sh_entsize is zero\n"));
4063 number = section->sh_size / section->sh_entsize;
4065 if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
4067 error (_("Invalid sh_entsize\n"));
4071 esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4072 section->sh_size, _("symbols"));
4077 if (symtab_shndx_hdr != NULL
4078 && (symtab_shndx_hdr->sh_link
4079 == (unsigned long) (section - section_headers)))
4081 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4082 symtab_shndx_hdr->sh_offset,
4083 1, symtab_shndx_hdr->sh_size,
4089 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4093 error (_("Out of memory\n"));
4097 for (j = 0, psym = isyms; j < number; j++, psym++)
4099 psym->st_name = BYTE_GET (esyms[j].st_name);
4100 psym->st_value = BYTE_GET (esyms[j].st_value);
4101 psym->st_size = BYTE_GET (esyms[j].st_size);
4102 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4103 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4105 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4106 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4107 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4108 psym->st_info = BYTE_GET (esyms[j].st_info);
4109 psym->st_other = BYTE_GET (esyms[j].st_other);
4121 static Elf_Internal_Sym *
4122 get_64bit_elf_symbols (FILE * file, Elf_Internal_Shdr * section)
4124 unsigned long number;
4125 Elf64_External_Sym * esyms;
4126 Elf_External_Sym_Shndx * shndx;
4127 Elf_Internal_Sym * isyms;
4128 Elf_Internal_Sym * psym;
4131 /* Run some sanity checks first. */
4132 if (section->sh_entsize == 0)
4134 error (_("sh_entsize is zero\n"));
4138 number = section->sh_size / section->sh_entsize;
4140 if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
4142 error (_("Invalid sh_entsize\n"));
4146 esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
4147 section->sh_size, _("symbols"));
4152 if (symtab_shndx_hdr != NULL
4153 && (symtab_shndx_hdr->sh_link
4154 == (unsigned long) (section - section_headers)))
4156 shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
4157 symtab_shndx_hdr->sh_offset,
4158 1, symtab_shndx_hdr->sh_size,
4167 isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
4171 error (_("Out of memory\n"));
4178 for (j = 0, psym = isyms;
4182 psym->st_name = BYTE_GET (esyms[j].st_name);
4183 psym->st_info = BYTE_GET (esyms[j].st_info);
4184 psym->st_other = BYTE_GET (esyms[j].st_other);
4185 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
4186 if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
4188 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
4189 else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
4190 psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
4191 psym->st_value = BYTE_GET (esyms[j].st_value);
4192 psym->st_size = BYTE_GET (esyms[j].st_size);
4203 get_elf_section_flags (bfd_vma sh_flags)
4205 static char buff[1024];
4207 int field_size = is_32bit_elf ? 8 : 16;
4209 int size = sizeof (buff) - (field_size + 4 + 1);
4210 bfd_vma os_flags = 0;
4211 bfd_vma proc_flags = 0;
4212 bfd_vma unknown_flags = 0;
4220 /* 0 */ { STRING_COMMA_LEN ("WRITE") },
4221 /* 1 */ { STRING_COMMA_LEN ("ALLOC") },
4222 /* 2 */ { STRING_COMMA_LEN ("EXEC") },
4223 /* 3 */ { STRING_COMMA_LEN ("MERGE") },
4224 /* 4 */ { STRING_COMMA_LEN ("STRINGS") },
4225 /* 5 */ { STRING_COMMA_LEN ("INFO LINK") },
4226 /* 6 */ { STRING_COMMA_LEN ("LINK ORDER") },
4227 /* 7 */ { STRING_COMMA_LEN ("OS NONCONF") },
4228 /* 8 */ { STRING_COMMA_LEN ("GROUP") },
4229 /* 9 */ { STRING_COMMA_LEN ("TLS") },
4230 /* IA-64 specific. */
4231 /* 10 */ { STRING_COMMA_LEN ("SHORT") },
4232 /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
4233 /* IA-64 OpenVMS specific. */
4234 /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
4235 /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
4236 /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
4237 /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
4238 /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
4239 /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
4241 /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
4242 /* SPARC specific. */
4243 /* 19 */ { STRING_COMMA_LEN ("ORDERED") }
4246 if (do_section_details)
4248 sprintf (buff, "[%*.*lx]: ",
4249 field_size, field_size, (unsigned long) sh_flags);
4250 p += field_size + 4;
4257 flag = sh_flags & - sh_flags;
4260 if (do_section_details)
4264 case SHF_WRITE: sindex = 0; break;
4265 case SHF_ALLOC: sindex = 1; break;
4266 case SHF_EXECINSTR: sindex = 2; break;
4267 case SHF_MERGE: sindex = 3; break;
4268 case SHF_STRINGS: sindex = 4; break;
4269 case SHF_INFO_LINK: sindex = 5; break;
4270 case SHF_LINK_ORDER: sindex = 6; break;
4271 case SHF_OS_NONCONFORMING: sindex = 7; break;
4272 case SHF_GROUP: sindex = 8; break;
4273 case SHF_TLS: sindex = 9; break;
4274 case SHF_EXCLUDE: sindex = 18; break;
4278 switch (elf_header.e_machine)
4281 if (flag == SHF_IA_64_SHORT)
4283 else if (flag == SHF_IA_64_NORECOV)
4286 else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
4289 case SHF_IA_64_VMS_GLOBAL: sindex = 12; break;
4290 case SHF_IA_64_VMS_OVERLAID: sindex = 13; break;
4291 case SHF_IA_64_VMS_SHARED: sindex = 14; break;
4292 case SHF_IA_64_VMS_VECTOR: sindex = 15; break;
4293 case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
4294 case SHF_IA_64_VMS_PROTECTED: sindex = 17; break;
4304 case EM_OLD_SPARCV9:
4305 case EM_SPARC32PLUS:
4308 if (flag == SHF_ORDERED)
4318 if (p != buff + field_size + 4)
4320 if (size < (10 + 2))
4327 size -= flags [sindex].len;
4328 p = stpcpy (p, flags [sindex].str);
4330 else if (flag & SHF_MASKOS)
4332 else if (flag & SHF_MASKPROC)
4335 unknown_flags |= flag;
4341 case SHF_WRITE: *p = 'W'; break;
4342 case SHF_ALLOC: *p = 'A'; break;
4343 case SHF_EXECINSTR: *p = 'X'; break;
4344 case SHF_MERGE: *p = 'M'; break;
4345 case SHF_STRINGS: *p = 'S'; break;
4346 case SHF_INFO_LINK: *p = 'I'; break;
4347 case SHF_LINK_ORDER: *p = 'L'; break;
4348 case SHF_OS_NONCONFORMING: *p = 'O'; break;
4349 case SHF_GROUP: *p = 'G'; break;
4350 case SHF_TLS: *p = 'T'; break;
4351 case SHF_EXCLUDE: *p = 'E'; break;
4354 if ((elf_header.e_machine == EM_X86_64
4355 || elf_header.e_machine == EM_L1OM)
4356 && flag == SHF_X86_64_LARGE)
4358 else if (flag & SHF_MASKOS)
4361 sh_flags &= ~ SHF_MASKOS;
4363 else if (flag & SHF_MASKPROC)
4366 sh_flags &= ~ SHF_MASKPROC;
4376 if (do_section_details)
4380 size -= 5 + field_size;
4381 if (p != buff + field_size + 4)
4389 sprintf (p, "OS (%*.*lx)", field_size, field_size,
4390 (unsigned long) os_flags);
4391 p += 5 + field_size;
4395 size -= 7 + field_size;
4396 if (p != buff + field_size + 4)
4404 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
4405 (unsigned long) proc_flags);
4406 p += 7 + field_size;
4410 size -= 10 + field_size;
4411 if (p != buff + field_size + 4)
4419 sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
4420 (unsigned long) unknown_flags);
4421 p += 10 + field_size;
4430 process_section_headers (FILE * file)
4432 Elf_Internal_Shdr * section;
4435 section_headers = NULL;
4437 if (elf_header.e_shnum == 0)
4440 printf (_("\nThere are no sections in this file.\n"));
4445 if (do_sections && !do_header)
4446 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4447 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
4451 if (! get_32bit_section_headers (file, elf_header.e_shnum))
4454 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
4457 /* Read in the string table, so that we have names to display. */
4458 if (elf_header.e_shstrndx != SHN_UNDEF
4459 && elf_header.e_shstrndx < elf_header.e_shnum)
4461 section = section_headers + elf_header.e_shstrndx;
4463 if (section->sh_size != 0)
4465 string_table = (char *) get_data (NULL, file, section->sh_offset,
4466 1, section->sh_size,
4469 string_table_length = string_table != NULL ? section->sh_size : 0;
4473 /* Scan the sections for the dynamic symbol table
4474 and dynamic string table and debug sections. */
4475 dynamic_symbols = NULL;
4476 dynamic_strings = NULL;
4477 dynamic_syminfo = NULL;
4478 symtab_shndx_hdr = NULL;
4480 eh_addr_size = is_32bit_elf ? 4 : 8;
4481 switch (elf_header.e_machine)
4484 case EM_MIPS_RS3_LE:
4485 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4486 FDE addresses. However, the ABI also has a semi-official ILP32
4487 variant for which the normal FDE address size rules apply.
4489 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4490 section, where XX is the size of longs in bits. Unfortunately,
4491 earlier compilers provided no way of distinguishing ILP32 objects
4492 from LP64 objects, so if there's any doubt, we should assume that
4493 the official LP64 form is being used. */
4494 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
4495 && find_section (".gcc_compiled_long32") == NULL)
4501 switch (elf_header.e_flags & EF_H8_MACH)
4503 case E_H8_MACH_H8300:
4504 case E_H8_MACH_H8300HN:
4505 case E_H8_MACH_H8300SN:
4506 case E_H8_MACH_H8300SXN:
4509 case E_H8_MACH_H8300H:
4510 case E_H8_MACH_H8300S:
4511 case E_H8_MACH_H8300SX:
4519 switch (elf_header.e_flags & EF_M32C_CPU_MASK)
4521 case EF_M32C_CPU_M16C:
4528 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4531 size_t expected_entsize \
4532 = is_32bit_elf ? size32 : size64; \
4533 if (section->sh_entsize != expected_entsize) \
4534 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4535 i, (unsigned long int) section->sh_entsize, \
4536 (unsigned long int) expected_entsize); \
4537 section->sh_entsize = expected_entsize; \
4540 #define CHECK_ENTSIZE(section, i, type) \
4541 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4542 sizeof (Elf64_External_##type))
4544 for (i = 0, section = section_headers;
4545 i < elf_header.e_shnum;
4548 char * name = SECTION_NAME (section);
4550 if (section->sh_type == SHT_DYNSYM)
4552 if (dynamic_symbols != NULL)
4554 error (_("File contains multiple dynamic symbol tables\n"));
4558 CHECK_ENTSIZE (section, i, Sym);
4559 num_dynamic_syms = section->sh_size / section->sh_entsize;
4560 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4562 else if (section->sh_type == SHT_STRTAB
4563 && streq (name, ".dynstr"))
4565 if (dynamic_strings != NULL)
4567 error (_("File contains multiple dynamic string tables\n"));
4571 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
4572 1, section->sh_size,
4573 _("dynamic strings"));
4574 dynamic_strings_length = section->sh_size;
4576 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4578 if (symtab_shndx_hdr != NULL)
4580 error (_("File contains multiple symtab shndx tables\n"));
4583 symtab_shndx_hdr = section;
4585 else if (section->sh_type == SHT_SYMTAB)
4586 CHECK_ENTSIZE (section, i, Sym);
4587 else if (section->sh_type == SHT_GROUP)
4588 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4589 else if (section->sh_type == SHT_REL)
4590 CHECK_ENTSIZE (section, i, Rel);
4591 else if (section->sh_type == SHT_RELA)
4592 CHECK_ENTSIZE (section, i, Rela);
4593 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4594 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
4595 || do_debug_aranges || do_debug_frames || do_debug_macinfo
4596 || do_debug_str || do_debug_loc || do_debug_ranges)
4597 && (const_strneq (name, ".debug_")
4598 || const_strneq (name, ".zdebug_")))
4601 name += sizeof (".zdebug_") - 1;
4603 name += sizeof (".debug_") - 1;
4606 || (do_debug_info && streq (name, "info"))
4607 || (do_debug_info && streq (name, "types"))
4608 || (do_debug_abbrevs && streq (name, "abbrev"))
4609 || (do_debug_lines && streq (name, "line"))
4610 || (do_debug_pubnames && streq (name, "pubnames"))
4611 || (do_debug_pubtypes && streq (name, "pubtypes"))
4612 || (do_debug_aranges && streq (name, "aranges"))
4613 || (do_debug_ranges && streq (name, "ranges"))
4614 || (do_debug_frames && streq (name, "frame"))
4615 || (do_debug_macinfo && streq (name, "macinfo"))
4616 || (do_debug_str && streq (name, "str"))
4617 || (do_debug_loc && streq (name, "loc"))
4619 request_dump_bynumber (i, DEBUG_DUMP);
4621 /* Linkonce section to be combined with .debug_info at link time. */
4622 else if ((do_debugging || do_debug_info)
4623 && const_strneq (name, ".gnu.linkonce.wi."))
4624 request_dump_bynumber (i, DEBUG_DUMP);
4625 else if (do_debug_frames && streq (name, ".eh_frame"))
4626 request_dump_bynumber (i, DEBUG_DUMP);
4627 /* Trace sections for Itanium VMS. */
4628 else if ((do_debugging || do_trace_info || do_trace_abbrevs
4629 || do_trace_aranges)
4630 && const_strneq (name, ".trace_"))
4632 name += sizeof (".trace_") - 1;
4635 || (do_trace_info && streq (name, "info"))
4636 || (do_trace_abbrevs && streq (name, "abbrev"))
4637 || (do_trace_aranges && streq (name, "aranges"))
4639 request_dump_bynumber (i, DEBUG_DUMP);
4647 if (elf_header.e_shnum > 1)
4648 printf (_("\nSection Headers:\n"));
4650 printf (_("\nSection Header:\n"));
4654 if (do_section_details)
4656 printf (_(" [Nr] Name\n"));
4657 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4661 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4665 if (do_section_details)
4667 printf (_(" [Nr] Name\n"));
4668 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4672 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4676 if (do_section_details)
4678 printf (_(" [Nr] Name\n"));
4679 printf (_(" Type Address Offset Link\n"));
4680 printf (_(" Size EntSize Info Align\n"));
4684 printf (_(" [Nr] Name Type Address Offset\n"));
4685 printf (_(" Size EntSize Flags Link Info Align\n"));
4689 if (do_section_details)
4690 printf (_(" Flags\n"));
4692 for (i = 0, section = section_headers;
4693 i < elf_header.e_shnum;
4696 if (do_section_details)
4698 printf (" [%2u] %s\n",
4700 SECTION_NAME (section));
4701 if (is_32bit_elf || do_wide)
4702 printf (" %-15.15s ",
4703 get_section_type_name (section->sh_type));
4706 printf ((do_wide ? " [%2u] %-17s %-15s "
4707 : " [%2u] %-17.17s %-15.15s "),
4709 SECTION_NAME (section),
4710 get_section_type_name (section->sh_type));
4714 const char * link_too_big = NULL;
4716 print_vma (section->sh_addr, LONG_HEX);
4718 printf ( " %6.6lx %6.6lx %2.2lx",
4719 (unsigned long) section->sh_offset,
4720 (unsigned long) section->sh_size,
4721 (unsigned long) section->sh_entsize);
4723 if (do_section_details)
4724 fputs (" ", stdout);
4726 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4728 if (section->sh_link >= elf_header.e_shnum)
4731 /* The sh_link value is out of range. Normally this indicates
4732 an error but it can have special values in Solaris binaries. */
4733 switch (elf_header.e_machine)
4739 case EM_OLD_SPARCV9:
4740 case EM_SPARC32PLUS:
4743 if (section->sh_link == (SHN_BEFORE & 0xffff))
4744 link_too_big = "BEFORE";
4745 else if (section->sh_link == (SHN_AFTER & 0xffff))
4746 link_too_big = "AFTER";
4753 if (do_section_details)
4755 if (link_too_big != NULL && * link_too_big)
4756 printf ("<%s> ", link_too_big);
4758 printf ("%2u ", section->sh_link);
4759 printf ("%3u %2lu\n", section->sh_info,
4760 (unsigned long) section->sh_addralign);
4763 printf ("%2u %3u %2lu\n",
4766 (unsigned long) section->sh_addralign);
4768 if (link_too_big && ! * link_too_big)
4769 warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
4770 i, section->sh_link);
4774 print_vma (section->sh_addr, LONG_HEX);
4776 if ((long) section->sh_offset == section->sh_offset)
4777 printf (" %6.6lx", (unsigned long) section->sh_offset);
4781 print_vma (section->sh_offset, LONG_HEX);
4784 if ((unsigned long) section->sh_size == section->sh_size)
4785 printf (" %6.6lx", (unsigned long) section->sh_size);
4789 print_vma (section->sh_size, LONG_HEX);
4792 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4793 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4797 print_vma (section->sh_entsize, LONG_HEX);
4800 if (do_section_details)
4801 fputs (" ", stdout);
4803 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4805 printf ("%2u %3u ", section->sh_link, section->sh_info);
4807 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4808 printf ("%2lu\n", (unsigned long) section->sh_addralign);
4811 print_vma (section->sh_addralign, DEC);
4815 else if (do_section_details)
4817 printf (" %-15.15s ",
4818 get_section_type_name (section->sh_type));
4819 print_vma (section->sh_addr, LONG_HEX);
4820 if ((long) section->sh_offset == section->sh_offset)
4821 printf (" %16.16lx", (unsigned long) section->sh_offset);
4825 print_vma (section->sh_offset, LONG_HEX);
4827 printf (" %u\n ", section->sh_link);
4828 print_vma (section->sh_size, LONG_HEX);
4830 print_vma (section->sh_entsize, LONG_HEX);
4832 printf (" %-16u %lu\n",
4834 (unsigned long) section->sh_addralign);
4839 print_vma (section->sh_addr, LONG_HEX);
4840 if ((long) section->sh_offset == section->sh_offset)
4841 printf (" %8.8lx", (unsigned long) section->sh_offset);
4845 print_vma (section->sh_offset, LONG_HEX);
4848 print_vma (section->sh_size, LONG_HEX);
4850 print_vma (section->sh_entsize, LONG_HEX);
4852 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4854 printf (" %2u %3u %lu\n",
4857 (unsigned long) section->sh_addralign);
4860 if (do_section_details)
4861 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4864 if (!do_section_details)
4866 if (elf_header.e_machine == EM_X86_64
4867 || elf_header.e_machine == EM_L1OM)
4868 printf (_("Key to Flags:\n\
4869 W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\
4870 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4871 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4873 printf (_("Key to Flags:\n\
4874 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4875 I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\
4876 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4883 get_group_flags (unsigned int flags)
4885 static char buff[32];
4895 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
4902 process_section_groups (FILE * file)
4904 Elf_Internal_Shdr * section;
4906 struct group * group;
4907 Elf_Internal_Shdr * symtab_sec;
4908 Elf_Internal_Shdr * strtab_sec;
4909 Elf_Internal_Sym * symtab;
4913 /* Don't process section groups unless needed. */
4914 if (!do_unwind && !do_section_groups)
4917 if (elf_header.e_shnum == 0)
4919 if (do_section_groups)
4920 printf (_("\nThere are no sections in this file.\n"));
4925 if (section_headers == NULL)
4927 error (_("Section headers are not available!\n"));
4931 section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
4932 sizeof (struct group *));
4934 if (section_headers_groups == NULL)
4936 error (_("Out of memory\n"));
4940 /* Scan the sections for the group section. */
4942 for (i = 0, section = section_headers;
4943 i < elf_header.e_shnum;
4945 if (section->sh_type == SHT_GROUP)
4948 if (group_count == 0)
4950 if (do_section_groups)
4951 printf (_("\nThere are no section groups in this file.\n"));
4956 section_groups = (struct group *) calloc (group_count, sizeof (struct group));
4958 if (section_groups == NULL)
4960 error (_("Out of memory\n"));
4969 for (i = 0, section = section_headers, group = section_groups;
4970 i < elf_header.e_shnum;
4973 if (section->sh_type == SHT_GROUP)
4975 char * name = SECTION_NAME (section);
4977 unsigned char * start;
4978 unsigned char * indices;
4979 unsigned int entry, j, size;
4980 Elf_Internal_Shdr * sec;
4981 Elf_Internal_Sym * sym;
4983 /* Get the symbol table. */
4984 if (section->sh_link >= elf_header.e_shnum
4985 || ((sec = section_headers + section->sh_link)->sh_type
4988 error (_("Bad sh_link in group section `%s'\n"), name);
4992 if (symtab_sec != sec)
4997 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
5002 error (_("Corrupt header in group section `%s'\n"), name);
5006 sym = symtab + section->sh_info;
5008 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5010 if (sym->st_shndx == 0
5011 || sym->st_shndx >= elf_header.e_shnum)
5013 error (_("Bad sh_info in group section `%s'\n"), name);
5017 group_name = SECTION_NAME (section_headers + sym->st_shndx);
5026 /* Get the string table. */
5027 if (symtab_sec->sh_link >= elf_header.e_shnum)
5036 != (sec = section_headers + symtab_sec->sh_link))
5041 strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
5042 1, strtab_sec->sh_size,
5044 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
5046 group_name = sym->st_name < strtab_size
5047 ? strtab + sym->st_name : _("<corrupt>");
5050 start = (unsigned char *) get_data (NULL, file, section->sh_offset,
5051 1, section->sh_size,
5055 size = (section->sh_size / section->sh_entsize) - 1;
5056 entry = byte_get (indices, 4);
5059 if (do_section_groups)
5061 printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
5062 get_group_flags (entry), i, name, group_name, size);
5064 printf (_(" [Index] Name\n"));
5067 group->group_index = i;
5069 for (j = 0; j < size; j++)
5071 struct group_list * g;
5073 entry = byte_get (indices, 4);
5076 if (entry >= elf_header.e_shnum)
5078 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
5079 entry, i, elf_header.e_shnum - 1);
5083 if (section_headers_groups [entry] != NULL)
5087 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
5089 section_headers_groups [entry]->group_index);
5094 /* Intel C/C++ compiler may put section 0 in a
5095 section group. We just warn it the first time
5096 and ignore it afterwards. */
5097 static int warned = 0;
5100 error (_("section 0 in group section [%5u]\n"),
5101 section_headers_groups [entry]->group_index);
5107 section_headers_groups [entry] = group;
5109 if (do_section_groups)
5111 sec = section_headers + entry;
5112 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
5115 g = (struct group_list *) xmalloc (sizeof (struct group_list));
5116 g->section_index = entry;
5117 g->next = group->root;
5135 /* Data used to display dynamic fixups. */
5137 struct ia64_vms_dynfixup
5139 bfd_vma needed_ident; /* Library ident number. */
5140 bfd_vma needed; /* Index in the dstrtab of the library name. */
5141 bfd_vma fixup_needed; /* Index of the library. */
5142 bfd_vma fixup_rela_cnt; /* Number of fixups. */
5143 bfd_vma fixup_rela_off; /* Fixups offset in the dynamic segment. */
5146 /* Data used to display dynamic relocations. */
5148 struct ia64_vms_dynimgrela
5150 bfd_vma img_rela_cnt; /* Number of relocations. */
5151 bfd_vma img_rela_off; /* Reloc offset in the dynamic segment. */
5154 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
5158 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
5159 const char *strtab, unsigned int strtab_sz)
5161 Elf64_External_VMS_IMAGE_FIXUP *imfs;
5163 const char *lib_name;
5165 imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
5166 1, fixup->fixup_rela_cnt * sizeof (*imfs),
5167 _("dynamic section image fixups"));
5171 if (fixup->needed < strtab_sz)
5172 lib_name = strtab + fixup->needed;
5175 warn ("corrupt library name index of 0x%lx found in dynamic entry",
5176 (unsigned long) fixup->needed);
5179 printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
5180 (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
5182 (_("Seg Offset Type SymVec DataType\n"));
5184 for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
5189 printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
5190 printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
5191 type = BYTE_GET (imfs [i].type);
5192 rtype = elf_ia64_reloc_type (type);
5194 printf (" 0x%08x ", type);
5196 printf (" %-32s ", rtype);
5197 printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
5198 printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
5204 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image). */
5207 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
5209 Elf64_External_VMS_IMAGE_RELA *imrs;
5212 imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
5213 1, imgrela->img_rela_cnt * sizeof (*imrs),
5214 _("dynamic section image relas"));
5218 printf (_("\nImage relocs\n"));
5220 (_("Seg Offset Type Addend Seg Sym Off\n"));
5222 for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
5227 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
5228 printf ("%08" BFD_VMA_FMT "x ",
5229 (bfd_vma) BYTE_GET (imrs [i].rela_offset));
5230 type = BYTE_GET (imrs [i].type);
5231 rtype = elf_ia64_reloc_type (type);
5233 printf ("0x%08x ", type);
5235 printf ("%-31s ", rtype);
5236 print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
5237 printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
5238 printf ("%08" BFD_VMA_FMT "x\n",
5239 (bfd_vma) BYTE_GET (imrs [i].sym_offset));
5245 /* Display IA-64 OpenVMS dynamic relocations and fixups. */
5248 process_ia64_vms_dynamic_relocs (FILE *file)
5250 struct ia64_vms_dynfixup fixup;
5251 struct ia64_vms_dynimgrela imgrela;
5252 Elf_Internal_Dyn *entry;
5254 bfd_vma strtab_off = 0;
5255 bfd_vma strtab_sz = 0;
5256 char *strtab = NULL;
5258 memset (&fixup, 0, sizeof (fixup));
5259 memset (&imgrela, 0, sizeof (imgrela));
5261 /* Note: the order of the entries is specified by the OpenVMS specs. */
5262 for (entry = dynamic_section;
5263 entry < dynamic_section + dynamic_nent;
5266 switch (entry->d_tag)
5268 case DT_IA_64_VMS_STRTAB_OFFSET:
5269 strtab_off = entry->d_un.d_val;
5272 strtab_sz = entry->d_un.d_val;
5274 strtab = get_data (NULL, file, dynamic_addr + strtab_off,
5275 1, strtab_sz, _("dynamic string section"));
5278 case DT_IA_64_VMS_NEEDED_IDENT:
5279 fixup.needed_ident = entry->d_un.d_val;
5282 fixup.needed = entry->d_un.d_val;
5284 case DT_IA_64_VMS_FIXUP_NEEDED:
5285 fixup.fixup_needed = entry->d_un.d_val;
5287 case DT_IA_64_VMS_FIXUP_RELA_CNT:
5288 fixup.fixup_rela_cnt = entry->d_un.d_val;
5290 case DT_IA_64_VMS_FIXUP_RELA_OFF:
5291 fixup.fixup_rela_off = entry->d_un.d_val;
5293 dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
5296 case DT_IA_64_VMS_IMG_RELA_CNT:
5297 imgrela.img_rela_cnt = entry->d_un.d_val;
5299 case DT_IA_64_VMS_IMG_RELA_OFF:
5300 imgrela.img_rela_off = entry->d_un.d_val;
5302 dump_ia64_vms_dynamic_relocs (file, &imgrela);
5322 } dynamic_relocations [] =
5324 { "REL", DT_REL, DT_RELSZ, FALSE },
5325 { "RELA", DT_RELA, DT_RELASZ, TRUE },
5326 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
5329 /* Process the reloc section. */
5332 process_relocs (FILE * file)
5334 unsigned long rel_size;
5335 unsigned long rel_offset;
5341 if (do_using_dynamic)
5345 int has_dynamic_reloc;
5348 has_dynamic_reloc = 0;
5350 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
5352 is_rela = dynamic_relocations [i].rela;
5353 name = dynamic_relocations [i].name;
5354 rel_size = dynamic_info [dynamic_relocations [i].size];
5355 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
5357 has_dynamic_reloc |= rel_size;
5359 if (is_rela == UNKNOWN)
5361 if (dynamic_relocations [i].reloc == DT_JMPREL)
5362 switch (dynamic_info[DT_PLTREL])
5376 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
5377 name, rel_offset, rel_size);
5379 dump_relocations (file,
5380 offset_from_vma (file, rel_offset, rel_size),
5382 dynamic_symbols, num_dynamic_syms,
5383 dynamic_strings, dynamic_strings_length, is_rela);
5388 has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
5390 if (! has_dynamic_reloc)
5391 printf (_("\nThere are no dynamic relocations in this file.\n"));
5395 Elf_Internal_Shdr * section;
5399 for (i = 0, section = section_headers;
5400 i < elf_header.e_shnum;
5403 if ( section->sh_type != SHT_RELA
5404 && section->sh_type != SHT_REL)
5407 rel_offset = section->sh_offset;
5408 rel_size = section->sh_size;
5412 Elf_Internal_Shdr * strsec;
5415 printf (_("\nRelocation section "));
5417 if (string_table == NULL)
5418 printf ("%d", section->sh_name);
5420 printf (_("'%s'"), SECTION_NAME (section));
5422 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5423 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
5425 is_rela = section->sh_type == SHT_RELA;
5427 if (section->sh_link != 0
5428 && section->sh_link < elf_header.e_shnum)
5430 Elf_Internal_Shdr * symsec;
5431 Elf_Internal_Sym * symtab;
5432 unsigned long nsyms;
5433 unsigned long strtablen = 0;
5434 char * strtab = NULL;
5436 symsec = section_headers + section->sh_link;
5437 if (symsec->sh_type != SHT_SYMTAB
5438 && symsec->sh_type != SHT_DYNSYM)
5441 nsyms = symsec->sh_size / symsec->sh_entsize;
5442 symtab = GET_ELF_SYMBOLS (file, symsec);
5447 if (symsec->sh_link != 0
5448 && symsec->sh_link < elf_header.e_shnum)
5450 strsec = section_headers + symsec->sh_link;
5452 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5455 strtablen = strtab == NULL ? 0 : strsec->sh_size;
5458 dump_relocations (file, rel_offset, rel_size,
5459 symtab, nsyms, strtab, strtablen, is_rela);
5465 dump_relocations (file, rel_offset, rel_size,
5466 NULL, 0, NULL, 0, is_rela);
5473 printf (_("\nThere are no relocations in this file.\n"));
5479 /* Process the unwind section. */
5481 #include "unwind-ia64.h"
5483 /* An absolute address consists of a section and an offset. If the
5484 section is NULL, the offset itself is the address, otherwise, the
5485 address equals to LOAD_ADDRESS(section) + offset. */
5489 unsigned short section;
5493 #define ABSADDR(a) \
5495 ? section_headers [(a).section].sh_addr + (a).offset \
5498 struct ia64_unw_table_entry
5500 struct absaddr start;
5502 struct absaddr info;
5505 struct ia64_unw_aux_info
5508 struct ia64_unw_table_entry *table; /* Unwind table. */
5509 unsigned long table_len; /* Length of unwind table. */
5510 unsigned char * info; /* Unwind info. */
5511 unsigned long info_size; /* Size of unwind info. */
5512 bfd_vma info_addr; /* starting address of unwind info. */
5513 bfd_vma seg_base; /* Starting address of segment. */
5514 Elf_Internal_Sym * symtab; /* The symbol table. */
5515 unsigned long nsyms; /* Number of symbols. */
5516 char * strtab; /* The string table. */
5517 unsigned long strtab_size; /* Size of string table. */
5521 find_symbol_for_address (Elf_Internal_Sym * symtab,
5522 unsigned long nsyms,
5523 const char * strtab,
5524 unsigned long strtab_size,
5525 struct absaddr addr,
5526 const char ** symname,
5529 bfd_vma dist = 0x100000;
5530 Elf_Internal_Sym * sym;
5531 Elf_Internal_Sym * best = NULL;
5534 REMOVE_ARCH_BITS (addr.offset);
5536 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
5538 bfd_vma value = sym->st_value;
5540 REMOVE_ARCH_BITS (value);
5542 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
5543 && sym->st_name != 0
5544 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
5545 && addr.offset >= value
5546 && addr.offset - value < dist)
5549 dist = addr.offset - value;
5556 *symname = (best->st_name >= strtab_size
5557 ? _("<corrupt>") : strtab + best->st_name);
5562 *offset = addr.offset;
5566 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
5568 struct ia64_unw_table_entry * tp;
5571 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5575 const unsigned char * dp;
5576 const unsigned char * head;
5577 const char * procname;
5579 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5580 aux->strtab_size, tp->start, &procname, &offset);
5582 fputs ("\n<", stdout);
5586 fputs (procname, stdout);
5589 printf ("+%lx", (unsigned long) offset);
5592 fputs (">: [", stdout);
5593 print_vma (tp->start.offset, PREFIX_HEX);
5594 fputc ('-', stdout);
5595 print_vma (tp->end.offset, PREFIX_HEX);
5596 printf ("], info at +0x%lx\n",
5597 (unsigned long) (tp->info.offset - aux->seg_base));
5599 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
5600 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
5602 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5603 (unsigned) UNW_VER (stamp),
5604 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
5605 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
5606 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
5607 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
5609 if (UNW_VER (stamp) != 1)
5611 printf (_("\tUnknown version.\n"));
5616 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
5617 dp = unw_decode (dp, in_body, & in_body);
5622 slurp_ia64_unwind_table (FILE * file,
5623 struct ia64_unw_aux_info * aux,
5624 Elf_Internal_Shdr * sec)
5626 unsigned long size, nrelas, i;
5627 Elf_Internal_Phdr * seg;
5628 struct ia64_unw_table_entry * tep;
5629 Elf_Internal_Shdr * relsec;
5630 Elf_Internal_Rela * rela;
5631 Elf_Internal_Rela * rp;
5632 unsigned char * table;
5634 Elf_Internal_Sym * sym;
5635 const char * relname;
5637 /* First, find the starting address of the segment that includes
5640 if (elf_header.e_phnum)
5642 if (! get_program_headers (file))
5645 for (seg = program_headers;
5646 seg < program_headers + elf_header.e_phnum;
5649 if (seg->p_type != PT_LOAD)
5652 if (sec->sh_addr >= seg->p_vaddr
5653 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5655 aux->seg_base = seg->p_vaddr;
5661 /* Second, build the unwind table from the contents of the unwind section: */
5662 size = sec->sh_size;
5663 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
5668 aux->table = (struct ia64_unw_table_entry *)
5669 xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
5671 for (tp = table; tp < table + size; ++tep)
5673 tep->start.section = SHN_UNDEF;
5674 tep->end.section = SHN_UNDEF;
5675 tep->info.section = SHN_UNDEF;
5676 tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5677 tep->end.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5678 tep->info.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
5679 tep->start.offset += aux->seg_base;
5680 tep->end.offset += aux->seg_base;
5681 tep->info.offset += aux->seg_base;
5685 /* Third, apply any relocations to the unwind table: */
5686 for (relsec = section_headers;
5687 relsec < section_headers + elf_header.e_shnum;
5690 if (relsec->sh_type != SHT_RELA
5691 || relsec->sh_info >= elf_header.e_shnum
5692 || section_headers + relsec->sh_info != sec)
5695 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5699 for (rp = rela; rp < rela + nrelas; ++rp)
5701 relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
5702 sym = aux->symtab + get_reloc_symindex (rp->r_info);
5704 if (! const_strneq (relname, "R_IA64_SEGREL"))
5706 warn (_("Skipping unexpected relocation type %s\n"), relname);
5710 i = rp->r_offset / (3 * eh_addr_size);
5712 switch (rp->r_offset/eh_addr_size % 3)
5715 aux->table[i].start.section = sym->st_shndx;
5716 aux->table[i].start.offset = rp->r_addend + sym->st_value;
5719 aux->table[i].end.section = sym->st_shndx;
5720 aux->table[i].end.offset = rp->r_addend + sym->st_value;
5723 aux->table[i].info.section = sym->st_shndx;
5724 aux->table[i].info.offset = rp->r_addend + sym->st_value;
5734 aux->table_len = size / (3 * eh_addr_size);
5739 ia64_process_unwind (FILE * file)
5741 Elf_Internal_Shdr * sec;
5742 Elf_Internal_Shdr * unwsec = NULL;
5743 Elf_Internal_Shdr * strsec;
5744 unsigned long i, unwcount = 0, unwstart = 0;
5745 struct ia64_unw_aux_info aux;
5747 memset (& aux, 0, sizeof (aux));
5749 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5751 if (sec->sh_type == SHT_SYMTAB
5752 && sec->sh_link < elf_header.e_shnum)
5754 aux.nsyms = sec->sh_size / sec->sh_entsize;
5755 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5757 strsec = section_headers + sec->sh_link;
5758 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
5761 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5763 else if (sec->sh_type == SHT_IA_64_UNWIND)
5768 printf (_("\nThere are no unwind sections in this file.\n"));
5770 while (unwcount-- > 0)
5775 for (i = unwstart, sec = section_headers + unwstart;
5776 i < elf_header.e_shnum; ++i, ++sec)
5777 if (sec->sh_type == SHT_IA_64_UNWIND)
5784 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
5786 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5788 /* We need to find which section group it is in. */
5789 struct group_list * g = section_headers_groups [i]->root;
5791 for (; g != NULL; g = g->next)
5793 sec = section_headers + g->section_index;
5795 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5800 i = elf_header.e_shnum;
5802 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5804 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5805 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5806 suffix = SECTION_NAME (unwsec) + len;
5807 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5809 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5810 && streq (SECTION_NAME (sec) + len2, suffix))
5815 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5816 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5817 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5818 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5820 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5821 suffix = SECTION_NAME (unwsec) + len;
5822 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5824 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5825 && streq (SECTION_NAME (sec) + len2, suffix))
5829 if (i == elf_header.e_shnum)
5831 printf (_("\nCould not find unwind info section for "));
5833 if (string_table == NULL)
5834 printf ("%d", unwsec->sh_name);
5836 printf (_("'%s'"), SECTION_NAME (unwsec));
5840 aux.info_size = sec->sh_size;
5841 aux.info_addr = sec->sh_addr;
5842 aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
5846 printf (_("\nUnwind section "));
5848 if (string_table == NULL)
5849 printf ("%d", unwsec->sh_name);
5851 printf (_("'%s'"), SECTION_NAME (unwsec));
5853 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5854 (unsigned long) unwsec->sh_offset,
5855 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5857 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5859 if (aux.table_len > 0)
5860 dump_ia64_unwind (& aux);
5863 free ((char *) aux.table);
5865 free ((char *) aux.info);
5874 free ((char *) aux.strtab);
5879 struct hppa_unw_table_entry
5881 struct absaddr start;
5883 unsigned int Cannot_unwind:1; /* 0 */
5884 unsigned int Millicode:1; /* 1 */
5885 unsigned int Millicode_save_sr0:1; /* 2 */
5886 unsigned int Region_description:2; /* 3..4 */
5887 unsigned int reserved1:1; /* 5 */
5888 unsigned int Entry_SR:1; /* 6 */
5889 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5890 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5891 unsigned int Args_stored:1; /* 16 */
5892 unsigned int Variable_Frame:1; /* 17 */
5893 unsigned int Separate_Package_Body:1; /* 18 */
5894 unsigned int Frame_Extension_Millicode:1; /* 19 */
5895 unsigned int Stack_Overflow_Check:1; /* 20 */
5896 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5897 unsigned int Ada_Region:1; /* 22 */
5898 unsigned int cxx_info:1; /* 23 */
5899 unsigned int cxx_try_catch:1; /* 24 */
5900 unsigned int sched_entry_seq:1; /* 25 */
5901 unsigned int reserved2:1; /* 26 */
5902 unsigned int Save_SP:1; /* 27 */
5903 unsigned int Save_RP:1; /* 28 */
5904 unsigned int Save_MRP_in_frame:1; /* 29 */
5905 unsigned int extn_ptr_defined:1; /* 30 */
5906 unsigned int Cleanup_defined:1; /* 31 */
5908 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5909 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5910 unsigned int Large_frame:1; /* 2 */
5911 unsigned int Pseudo_SP_Set:1; /* 3 */
5912 unsigned int reserved4:1; /* 4 */
5913 unsigned int Total_frame_size:27; /* 5..31 */
5916 struct hppa_unw_aux_info
5918 struct hppa_unw_table_entry *table; /* Unwind table. */
5919 unsigned long table_len; /* Length of unwind table. */
5920 bfd_vma seg_base; /* Starting address of segment. */
5921 Elf_Internal_Sym * symtab; /* The symbol table. */
5922 unsigned long nsyms; /* Number of symbols. */
5923 char * strtab; /* The string table. */
5924 unsigned long strtab_size; /* Size of string table. */
5928 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
5930 struct hppa_unw_table_entry * tp;
5932 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5935 const char * procname;
5937 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5938 aux->strtab_size, tp->start, &procname,
5941 fputs ("\n<", stdout);
5945 fputs (procname, stdout);
5948 printf ("+%lx", (unsigned long) offset);
5951 fputs (">: [", stdout);
5952 print_vma (tp->start.offset, PREFIX_HEX);
5953 fputc ('-', stdout);
5954 print_vma (tp->end.offset, PREFIX_HEX);
5957 #define PF(_m) if (tp->_m) printf (#_m " ");
5958 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5961 PF(Millicode_save_sr0);
5962 /* PV(Region_description); */
5968 PF(Separate_Package_Body);
5969 PF(Frame_Extension_Millicode);
5970 PF(Stack_Overflow_Check);
5971 PF(Two_Instruction_SP_Increment);
5975 PF(sched_entry_seq);
5978 PF(Save_MRP_in_frame);
5979 PF(extn_ptr_defined);
5980 PF(Cleanup_defined);
5981 PF(MPE_XL_interrupt_marker);
5982 PF(HP_UX_interrupt_marker);
5985 PV(Total_frame_size);
5994 slurp_hppa_unwind_table (FILE * file,
5995 struct hppa_unw_aux_info * aux,
5996 Elf_Internal_Shdr * sec)
5998 unsigned long size, unw_ent_size, nentries, nrelas, i;
5999 Elf_Internal_Phdr * seg;
6000 struct hppa_unw_table_entry * tep;
6001 Elf_Internal_Shdr * relsec;
6002 Elf_Internal_Rela * rela;
6003 Elf_Internal_Rela * rp;
6004 unsigned char * table;
6006 Elf_Internal_Sym * sym;
6007 const char * relname;
6009 /* First, find the starting address of the segment that includes
6012 if (elf_header.e_phnum)
6014 if (! get_program_headers (file))
6017 for (seg = program_headers;
6018 seg < program_headers + elf_header.e_phnum;
6021 if (seg->p_type != PT_LOAD)
6024 if (sec->sh_addr >= seg->p_vaddr
6025 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6027 aux->seg_base = seg->p_vaddr;
6033 /* Second, build the unwind table from the contents of the unwind
6035 size = sec->sh_size;
6036 table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
6042 nentries = size / unw_ent_size;
6043 size = unw_ent_size * nentries;
6045 tep = aux->table = (struct hppa_unw_table_entry *)
6046 xcmalloc (nentries, sizeof (aux->table[0]));
6048 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
6050 unsigned int tmp1, tmp2;
6052 tep->start.section = SHN_UNDEF;
6053 tep->end.section = SHN_UNDEF;
6055 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
6056 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
6057 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
6058 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
6060 tep->start.offset += aux->seg_base;
6061 tep->end.offset += aux->seg_base;
6063 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
6064 tep->Millicode = (tmp1 >> 30) & 0x1;
6065 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
6066 tep->Region_description = (tmp1 >> 27) & 0x3;
6067 tep->reserved1 = (tmp1 >> 26) & 0x1;
6068 tep->Entry_SR = (tmp1 >> 25) & 0x1;
6069 tep->Entry_FR = (tmp1 >> 21) & 0xf;
6070 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
6071 tep->Args_stored = (tmp1 >> 15) & 0x1;
6072 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
6073 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
6074 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
6075 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
6076 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
6077 tep->Ada_Region = (tmp1 >> 9) & 0x1;
6078 tep->cxx_info = (tmp1 >> 8) & 0x1;
6079 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
6080 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
6081 tep->reserved2 = (tmp1 >> 5) & 0x1;
6082 tep->Save_SP = (tmp1 >> 4) & 0x1;
6083 tep->Save_RP = (tmp1 >> 3) & 0x1;
6084 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
6085 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
6086 tep->Cleanup_defined = tmp1 & 0x1;
6088 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
6089 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
6090 tep->Large_frame = (tmp2 >> 29) & 0x1;
6091 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
6092 tep->reserved4 = (tmp2 >> 27) & 0x1;
6093 tep->Total_frame_size = tmp2 & 0x7ffffff;
6097 /* Third, apply any relocations to the unwind table. */
6098 for (relsec = section_headers;
6099 relsec < section_headers + elf_header.e_shnum;
6102 if (relsec->sh_type != SHT_RELA
6103 || relsec->sh_info >= elf_header.e_shnum
6104 || section_headers + relsec->sh_info != sec)
6107 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
6111 for (rp = rela; rp < rela + nrelas; ++rp)
6113 relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
6114 sym = aux->symtab + get_reloc_symindex (rp->r_info);
6116 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
6117 if (! const_strneq (relname, "R_PARISC_SEGREL"))
6119 warn (_("Skipping unexpected relocation type %s\n"), relname);
6123 i = rp->r_offset / unw_ent_size;
6125 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
6128 aux->table[i].start.section = sym->st_shndx;
6129 aux->table[i].start.offset = sym->st_value + rp->r_addend;
6132 aux->table[i].end.section = sym->st_shndx;
6133 aux->table[i].end.offset = sym->st_value + rp->r_addend;
6143 aux->table_len = nentries;
6149 hppa_process_unwind (FILE * file)
6151 struct hppa_unw_aux_info aux;
6152 Elf_Internal_Shdr * unwsec = NULL;
6153 Elf_Internal_Shdr * strsec;
6154 Elf_Internal_Shdr * sec;
6157 memset (& aux, 0, sizeof (aux));
6159 if (string_table == NULL)
6162 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6164 if (sec->sh_type == SHT_SYMTAB
6165 && sec->sh_link < elf_header.e_shnum)
6167 aux.nsyms = sec->sh_size / sec->sh_entsize;
6168 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6170 strsec = section_headers + sec->sh_link;
6171 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6174 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6176 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6181 printf (_("\nThere are no unwind sections in this file.\n"));
6183 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6185 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
6187 printf (_("\nUnwind section "));
6188 printf (_("'%s'"), SECTION_NAME (sec));
6190 printf (_(" at offset 0x%lx contains %lu entries:\n"),
6191 (unsigned long) sec->sh_offset,
6192 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
6194 slurp_hppa_unwind_table (file, &aux, sec);
6195 if (aux.table_len > 0)
6196 dump_hppa_unwind (&aux);
6199 free ((char *) aux.table);
6207 free ((char *) aux.strtab);
6214 unsigned char *data;
6216 Elf_Internal_Shdr *sec;
6217 Elf_Internal_Rela *rela;
6218 unsigned long nrelas;
6219 unsigned int rel_type;
6221 Elf_Internal_Rela *next_rela;
6224 struct arm_unw_aux_info
6228 Elf_Internal_Sym *symtab; /* The symbol table. */
6229 unsigned long nsyms; /* Number of symbols. */
6230 char *strtab; /* The string table. */
6231 unsigned long strtab_size; /* Size of string table. */
6235 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
6236 bfd_vma fn, struct absaddr addr)
6238 const char *procname;
6241 if (addr.section == SHN_UNDEF)
6244 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
6245 aux->strtab_size, addr, &procname,
6248 print_vma (fn, PREFIX_HEX);
6252 fputs (" <", stdout);
6253 fputs (procname, stdout);
6256 printf ("+0x%lx", (unsigned long) sym_offset);
6257 fputc ('>', stdout);
6264 arm_free_section (struct arm_section *arm_sec)
6266 if (arm_sec->data != NULL)
6267 free (arm_sec->data);
6269 if (arm_sec->rela != NULL)
6270 free (arm_sec->rela);
6274 arm_section_get_word (struct arm_unw_aux_info *aux,
6275 struct arm_section *arm_sec,
6276 Elf_Internal_Shdr *sec, bfd_vma word_offset,
6277 unsigned int *wordp, struct absaddr *addr)
6279 Elf_Internal_Rela *rp;
6280 Elf_Internal_Sym *sym;
6281 const char * relname;
6283 bfd_boolean wrapped;
6285 addr->section = SHN_UNDEF;
6288 if (sec != arm_sec->sec)
6290 Elf_Internal_Shdr *relsec;
6292 arm_free_section (arm_sec);
6295 arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
6296 sec->sh_size, _("unwind data"));
6298 arm_sec->rela = NULL;
6299 arm_sec->nrelas = 0;
6301 for (relsec = section_headers;
6302 relsec < section_headers + elf_header.e_shnum;
6305 if (relsec->sh_info >= elf_header.e_shnum
6306 || section_headers + relsec->sh_info != sec)
6309 if (relsec->sh_type == SHT_REL)
6311 if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
6313 & arm_sec->rela, & arm_sec->nrelas))
6317 else if (relsec->sh_type == SHT_RELA)
6319 if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
6321 & arm_sec->rela, & arm_sec->nrelas))
6327 arm_sec->next_rela = arm_sec->rela;
6330 if (arm_sec->data == NULL)
6333 word = byte_get (arm_sec->data + word_offset, 4);
6336 for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
6338 bfd_vma prelval, offset;
6340 if (rp->r_offset > word_offset && !wrapped)
6345 if (rp->r_offset > word_offset)
6348 if (rp->r_offset & 3)
6350 warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
6351 (unsigned long) rp->r_offset);
6355 if (rp->r_offset < word_offset)
6358 relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
6360 if (streq (relname, "R_ARM_NONE"))
6363 if (! streq (relname, "R_ARM_PREL31"))
6365 warn (_("Skipping unexpected relocation type %s\n"), relname);
6369 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
6371 if (arm_sec->rel_type == SHT_REL)
6373 offset = word & 0x7fffffff;
6374 if (offset & 0x40000000)
6375 offset |= ~ (bfd_vma) 0x7fffffff;
6378 offset = rp->r_addend;
6380 offset += sym->st_value;
6381 prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
6383 word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
6384 addr->section = sym->st_shndx;
6385 addr->offset = offset;
6390 arm_sec->next_rela = rp;
6396 decode_arm_unwind (struct arm_unw_aux_info *aux,
6397 unsigned int word, unsigned int remaining,
6398 bfd_vma data_offset, Elf_Internal_Shdr *data_sec,
6399 struct arm_section *data_arm_sec)
6402 unsigned int more_words;
6403 struct absaddr addr;
6406 if (remaining == 0 && more_words) \
6409 if (!arm_section_get_word (aux, data_arm_sec, data_sec, \
6410 data_offset, &word, &addr)) \
6416 #define GET_OP(OP) \
6421 (OP) = word >> 24; \
6426 printf (_("[Truncated opcode]\n")); \
6429 printf (_("0x%02x "), OP)
6433 /* Fetch the first word. */
6434 if (!arm_section_get_word (aux, data_arm_sec, data_sec, data_offset,
6440 if ((word & 0x80000000) == 0)
6442 /* Expand prel31 for personality routine. */
6444 const char *procname;
6447 if (fn & 0x40000000)
6448 fn |= ~ (bfd_vma) 0x7fffffff;
6449 fn = fn + data_sec->sh_addr + data_offset;
6451 printf (_(" Personality routine: "));
6452 procname = arm_print_vma_and_name (aux, fn, addr);
6453 fputc ('\n', stdout);
6455 /* The GCC personality routines use the standard compact
6456 encoding, starting with one byte giving the number of
6458 if (procname != NULL
6459 && (const_strneq (procname, "__gcc_personality_v0")
6460 || const_strneq (procname, "__gxx_personality_v0")
6461 || const_strneq (procname, "__gcj_personality_v0")
6462 || const_strneq (procname, "__gnu_objc_personality_v0")))
6469 printf (_(" [Truncated data]\n"));
6472 more_words = word >> 24;
6481 per_index = (word >> 24) & 0x7f;
6482 if (per_index != 0 && per_index != 1 && per_index != 2)
6484 printf (_(" [reserved compact index %d]\n"), per_index);
6488 printf (_(" Compact model %d\n"), per_index);
6497 more_words = (word >> 16) & 0xff;
6503 /* Decode the unwinding instructions. */
6506 unsigned int op, op2;
6515 printf (_(" 0x%02x "), op);
6517 if ((op & 0xc0) == 0x00)
6519 int offset = ((op & 0x3f) << 2) + 4;
6520 printf (_(" vsp = vsp + %d"), offset);
6522 else if ((op & 0xc0) == 0x40)
6524 int offset = ((op & 0x3f) << 2) + 4;
6525 printf (_(" vsp = vsp - %d"), offset);
6527 else if ((op & 0xf0) == 0x80)
6530 if (op == 0x80 && op2 == 0)
6531 printf (_("Refuse to unwind"));
6534 unsigned int mask = ((op & 0x0f) << 8) | op2;
6539 for (i = 0; i < 12; i++)
6540 if (mask & (1 << i))
6546 printf ("r%d", 4 + i);
6551 else if ((op & 0xf0) == 0x90)
6553 if (op == 0x9d || op == 0x9f)
6554 printf (_(" [Reserved]"));
6556 printf (_(" vsp = r%d"), op & 0x0f);
6558 else if ((op & 0xf0) == 0xa0)
6560 int end = 4 + (op & 0x07);
6564 for (i = 4; i <= end; i++)
6580 else if (op == 0xb0)
6581 printf (_(" finish"));
6582 else if (op == 0xb1)
6585 if (op2 == 0 || (op2 & 0xf0) != 0)
6586 printf (_("[Spare]"));
6589 unsigned int mask = op2 & 0x0f;
6593 for (i = 0; i < 12; i++)
6594 if (mask & (1 << i))
6605 else if (op == 0xb2)
6607 unsigned char buf[9];
6608 unsigned int i, len;
6609 unsigned long offset;
6610 for (i = 0; i < sizeof (buf); i++)
6613 if ((buf[i] & 0x80) == 0)
6616 assert (i < sizeof (buf));
6617 offset = read_uleb128 (buf, &len);
6618 assert (len == i + 1);
6619 offset = offset * 4 + 0x204;
6620 printf (_("vsp = vsp + %ld"), offset);
6624 if (op == 0xb3 || op == 0xc6 || op == 0xc7 || op == 0xc8 || op == 0xc9)
6627 printf (_("[unsupported two-byte opcode]"));
6631 printf (_(" [unsupported opcode]"));
6637 /* Decode the descriptors. Not implemented. */
6641 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
6643 struct arm_section exidx_arm_sec, extab_arm_sec;
6644 unsigned int i, exidx_len;
6646 memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
6647 memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
6648 exidx_len = exidx_sec->sh_size / 8;
6650 for (i = 0; i < exidx_len; i++)
6652 unsigned int exidx_fn, exidx_entry;
6653 struct absaddr fn_addr, entry_addr;
6656 fputc ('\n', stdout);
6658 if (!arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6659 8 * i, &exidx_fn, &fn_addr)
6660 || !arm_section_get_word (aux, &exidx_arm_sec, exidx_sec,
6661 8 * i + 4, &exidx_entry, &entry_addr))
6663 arm_free_section (&exidx_arm_sec);
6664 arm_free_section (&extab_arm_sec);
6668 fn = exidx_fn & 0x7fffffff;
6669 if (fn & 0x40000000)
6670 fn |= ~ (bfd_vma) 0x7fffffff;
6671 fn = fn + exidx_sec->sh_addr + 8 * i;
6673 arm_print_vma_and_name (aux, fn, entry_addr);
6674 fputs (": ", stdout);
6676 if (exidx_entry == 1)
6678 print_vma (exidx_entry, PREFIX_HEX);
6679 fputs (" [cantunwind]\n", stdout);
6681 else if (exidx_entry & 0x80000000)
6683 print_vma (exidx_entry, PREFIX_HEX);
6684 fputc ('\n', stdout);
6685 decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
6689 bfd_vma table, table_offset = 0;
6690 Elf_Internal_Shdr *table_sec;
6692 fputs ("@", stdout);
6693 table = exidx_entry;
6694 if (table & 0x40000000)
6695 table |= ~ (bfd_vma) 0x7fffffff;
6696 table = table + exidx_sec->sh_addr + 8 * i + 4;
6697 print_vma (table, PREFIX_HEX);
6700 /* Locate the matching .ARM.extab. */
6701 if (entry_addr.section != SHN_UNDEF
6702 && entry_addr.section < elf_header.e_shnum)
6704 table_sec = section_headers + entry_addr.section;
6705 table_offset = entry_addr.offset;
6709 table_sec = find_section_by_address (table);
6710 if (table_sec != NULL)
6711 table_offset = table - table_sec->sh_addr;
6713 if (table_sec == NULL)
6715 warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
6716 (unsigned long) table);
6719 decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
6726 arm_free_section (&exidx_arm_sec);
6727 arm_free_section (&extab_arm_sec);
6731 arm_process_unwind (FILE *file)
6733 struct arm_unw_aux_info aux;
6734 Elf_Internal_Shdr *unwsec = NULL;
6735 Elf_Internal_Shdr *strsec;
6736 Elf_Internal_Shdr *sec;
6739 memset (& aux, 0, sizeof (aux));
6742 if (string_table == NULL)
6745 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6747 if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
6749 aux.nsyms = sec->sh_size / sec->sh_entsize;
6750 aux.symtab = GET_ELF_SYMBOLS (file, sec);
6752 strsec = section_headers + sec->sh_link;
6753 aux.strtab = get_data (NULL, file, strsec->sh_offset,
6754 1, strsec->sh_size, _("string table"));
6755 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
6757 else if (sec->sh_type == SHT_ARM_EXIDX)
6762 printf (_("\nThere are no unwind sections in this file.\n"));
6764 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
6766 if (sec->sh_type == SHT_ARM_EXIDX)
6768 printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
6770 (unsigned long) sec->sh_offset,
6771 (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
6773 dump_arm_unwind (&aux, sec);
6780 free ((char *) aux.strtab);
6786 process_unwind (FILE * file)
6788 struct unwind_handler
6791 int (* handler)(FILE *);
6794 { EM_ARM, arm_process_unwind },
6795 { EM_IA_64, ia64_process_unwind },
6796 { EM_PARISC, hppa_process_unwind },
6804 for (i = 0; handlers[i].handler != NULL; i++)
6805 if (elf_header.e_machine == handlers[i].machtype)
6806 return handlers[i].handler (file);
6808 printf (_("\nThere are no unwind sections in this file.\n"));
6813 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
6815 switch (entry->d_tag)
6818 if (entry->d_un.d_val == 0)
6819 printf (_("NONE\n"));
6822 static const char * opts[] =
6824 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
6825 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
6826 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
6827 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
6833 for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
6834 if (entry->d_un.d_val & (1 << cnt))
6836 printf ("%s%s", first ? "" : " ", opts[cnt]);
6843 case DT_MIPS_IVERSION:
6844 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6845 printf (_("Interface Version: %s\n"), GET_DYNAMIC_NAME (entry->d_un.d_val));
6847 printf (_("<corrupt: %ld>\n"), (long) entry->d_un.d_ptr);
6850 case DT_MIPS_TIME_STAMP:
6855 time_t atime = entry->d_un.d_val;
6856 tmp = gmtime (&atime);
6857 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
6858 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6859 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6860 printf (_("Time Stamp: %s\n"), timebuf);
6864 case DT_MIPS_RLD_VERSION:
6865 case DT_MIPS_LOCAL_GOTNO:
6866 case DT_MIPS_CONFLICTNO:
6867 case DT_MIPS_LIBLISTNO:
6868 case DT_MIPS_SYMTABNO:
6869 case DT_MIPS_UNREFEXTNO:
6870 case DT_MIPS_HIPAGENO:
6871 case DT_MIPS_DELTA_CLASS_NO:
6872 case DT_MIPS_DELTA_INSTANCE_NO:
6873 case DT_MIPS_DELTA_RELOC_NO:
6874 case DT_MIPS_DELTA_SYM_NO:
6875 case DT_MIPS_DELTA_CLASSSYM_NO:
6876 case DT_MIPS_COMPACT_SIZE:
6877 printf ("%ld\n", (long) entry->d_un.d_ptr);
6881 printf ("%#lx\n", (unsigned long) entry->d_un.d_ptr);
6886 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
6888 switch (entry->d_tag)
6890 case DT_HP_DLD_FLAGS:
6899 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
6900 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
6901 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
6902 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
6903 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
6904 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
6905 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
6906 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
6907 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
6908 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
6909 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
6910 { DT_HP_GST, "HP_GST" },
6911 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
6912 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
6913 { DT_HP_NODELETE, "HP_NODELETE" },
6914 { DT_HP_GROUP, "HP_GROUP" },
6915 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
6919 bfd_vma val = entry->d_un.d_val;
6921 for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
6922 if (val & flags[cnt].bit)
6926 fputs (flags[cnt].str, stdout);
6928 val ^= flags[cnt].bit;
6931 if (val != 0 || first)
6935 print_vma (val, HEX);
6941 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6949 /* VMS vs Unix time offset and factor. */
6951 #define VMS_EPOCH_OFFSET 35067168000000000LL
6952 #define VMS_GRANULARITY_FACTOR 10000000
6954 /* Display a VMS time in a human readable format. */
6957 print_vms_time (bfd_int64_t vmstime)
6962 unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
6963 tm = gmtime (&unxtime);
6964 printf ("%04u-%02u-%02uT%02u:%02u:%02u",
6965 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
6966 tm->tm_hour, tm->tm_min, tm->tm_sec);
6971 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
6973 switch (entry->d_tag)
6975 case DT_IA_64_PLT_RESERVE:
6976 /* First 3 slots reserved. */
6977 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6979 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
6982 case DT_IA_64_VMS_LINKTIME:
6984 print_vms_time (entry->d_un.d_val);
6988 case DT_IA_64_VMS_LNKFLAGS:
6989 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
6990 if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
6991 printf (" CALL_DEBUG");
6992 if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
6993 printf (" NOP0BUFS");
6994 if (entry->d_un.d_val & VMS_LF_P0IMAGE)
6995 printf (" P0IMAGE");
6996 if (entry->d_un.d_val & VMS_LF_MKTHREADS)
6997 printf (" MKTHREADS");
6998 if (entry->d_un.d_val & VMS_LF_UPCALLS)
6999 printf (" UPCALLS");
7000 if (entry->d_un.d_val & VMS_LF_IMGSTA)
7002 if (entry->d_un.d_val & VMS_LF_INITIALIZE)
7003 printf (" INITIALIZE");
7004 if (entry->d_un.d_val & VMS_LF_MAIN)
7006 if (entry->d_un.d_val & VMS_LF_EXE_INIT)
7007 printf (" EXE_INIT");
7008 if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
7009 printf (" TBK_IN_IMG");
7010 if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
7011 printf (" DBG_IN_IMG");
7012 if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
7013 printf (" TBK_IN_DSF");
7014 if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
7015 printf (" DBG_IN_DSF");
7016 if (entry->d_un.d_val & VMS_LF_SIGNATURES)
7017 printf (" SIGNATURES");
7018 if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
7019 printf (" REL_SEG_OFF");
7023 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
7030 get_32bit_dynamic_section (FILE * file)
7032 Elf32_External_Dyn * edyn;
7033 Elf32_External_Dyn * ext;
7034 Elf_Internal_Dyn * entry;
7036 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7037 dynamic_size, _("dynamic section"));
7041 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7042 might not have the luxury of section headers. Look for the DT_NULL
7043 terminator to determine the number of entries. */
7044 for (ext = edyn, dynamic_nent = 0;
7045 (char *) ext < (char *) edyn + dynamic_size;
7049 if (BYTE_GET (ext->d_tag) == DT_NULL)
7053 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7055 if (dynamic_section == NULL)
7057 error (_("Out of memory\n"));
7062 for (ext = edyn, entry = dynamic_section;
7063 entry < dynamic_section + dynamic_nent;
7066 entry->d_tag = BYTE_GET (ext->d_tag);
7067 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7076 get_64bit_dynamic_section (FILE * file)
7078 Elf64_External_Dyn * edyn;
7079 Elf64_External_Dyn * ext;
7080 Elf_Internal_Dyn * entry;
7082 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
7083 dynamic_size, _("dynamic section"));
7087 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
7088 might not have the luxury of section headers. Look for the DT_NULL
7089 terminator to determine the number of entries. */
7090 for (ext = edyn, dynamic_nent = 0;
7091 (char *) ext < (char *) edyn + dynamic_size;
7095 if (BYTE_GET (ext->d_tag) == DT_NULL)
7099 dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
7101 if (dynamic_section == NULL)
7103 error (_("Out of memory\n"));
7108 for (ext = edyn, entry = dynamic_section;
7109 entry < dynamic_section + dynamic_nent;
7112 entry->d_tag = BYTE_GET (ext->d_tag);
7113 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
7122 print_dynamic_flags (bfd_vma flags)
7130 flag = flags & - flags;
7140 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
7141 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
7142 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
7143 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
7144 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
7145 default: fputs (_("unknown"), stdout); break;
7151 /* Parse and display the contents of the dynamic section. */
7154 process_dynamic_section (FILE * file)
7156 Elf_Internal_Dyn * entry;
7158 if (dynamic_size == 0)
7161 printf (_("\nThere is no dynamic section in this file.\n"));
7168 if (! get_32bit_dynamic_section (file))
7171 else if (! get_64bit_dynamic_section (file))
7174 /* Find the appropriate symbol table. */
7175 if (dynamic_symbols == NULL)
7177 for (entry = dynamic_section;
7178 entry < dynamic_section + dynamic_nent;
7181 Elf_Internal_Shdr section;
7183 if (entry->d_tag != DT_SYMTAB)
7186 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
7188 /* Since we do not know how big the symbol table is,
7189 we default to reading in the entire file (!) and
7190 processing that. This is overkill, I know, but it
7192 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
7194 if (archive_file_offset != 0)
7195 section.sh_size = archive_file_size - section.sh_offset;
7198 if (fseek (file, 0, SEEK_END))
7199 error (_("Unable to seek to end of file!\n"));
7201 section.sh_size = ftell (file) - section.sh_offset;
7205 section.sh_entsize = sizeof (Elf32_External_Sym);
7207 section.sh_entsize = sizeof (Elf64_External_Sym);
7209 num_dynamic_syms = section.sh_size / section.sh_entsize;
7210 if (num_dynamic_syms < 1)
7212 error (_("Unable to determine the number of symbols to load\n"));
7216 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
7220 /* Similarly find a string table. */
7221 if (dynamic_strings == NULL)
7223 for (entry = dynamic_section;
7224 entry < dynamic_section + dynamic_nent;
7227 unsigned long offset;
7230 if (entry->d_tag != DT_STRTAB)
7233 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
7235 /* Since we do not know how big the string table is,
7236 we default to reading in the entire file (!) and
7237 processing that. This is overkill, I know, but it
7240 offset = offset_from_vma (file, entry->d_un.d_val, 0);
7242 if (archive_file_offset != 0)
7243 str_tab_len = archive_file_size - offset;
7246 if (fseek (file, 0, SEEK_END))
7247 error (_("Unable to seek to end of file\n"));
7248 str_tab_len = ftell (file) - offset;
7251 if (str_tab_len < 1)
7254 (_("Unable to determine the length of the dynamic string table\n"));
7258 dynamic_strings = (char *) get_data (NULL, file, offset, 1,
7260 _("dynamic string table"));
7261 dynamic_strings_length = str_tab_len;
7266 /* And find the syminfo section if available. */
7267 if (dynamic_syminfo == NULL)
7269 unsigned long syminsz = 0;
7271 for (entry = dynamic_section;
7272 entry < dynamic_section + dynamic_nent;
7275 if (entry->d_tag == DT_SYMINENT)
7277 /* Note: these braces are necessary to avoid a syntax
7278 error from the SunOS4 C compiler. */
7279 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
7281 else if (entry->d_tag == DT_SYMINSZ)
7282 syminsz = entry->d_un.d_val;
7283 else if (entry->d_tag == DT_SYMINFO)
7284 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
7288 if (dynamic_syminfo_offset != 0 && syminsz != 0)
7290 Elf_External_Syminfo * extsyminfo;
7291 Elf_External_Syminfo * extsym;
7292 Elf_Internal_Syminfo * syminfo;
7294 /* There is a syminfo section. Read the data. */
7295 extsyminfo = (Elf_External_Syminfo *)
7296 get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
7297 _("symbol information"));
7301 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
7302 if (dynamic_syminfo == NULL)
7304 error (_("Out of memory\n"));
7308 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
7309 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
7310 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
7311 ++syminfo, ++extsym)
7313 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
7314 syminfo->si_flags = BYTE_GET (extsym->si_flags);
7321 if (do_dynamic && dynamic_addr)
7322 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
7323 dynamic_addr, dynamic_nent);
7325 printf (_(" Tag Type Name/Value\n"));
7327 for (entry = dynamic_section;
7328 entry < dynamic_section + dynamic_nent;
7336 print_vma (entry->d_tag, FULL_HEX);
7337 dtype = get_dynamic_type (entry->d_tag);
7338 printf (" (%s)%*s", dtype,
7339 ((is_32bit_elf ? 27 : 19)
7340 - (int) strlen (dtype)),
7344 switch (entry->d_tag)
7348 print_dynamic_flags (entry->d_un.d_val);
7358 switch (entry->d_tag)
7361 printf (_("Auxiliary library"));
7365 printf (_("Filter library"));
7369 printf (_("Configuration file"));
7373 printf (_("Dependency audit library"));
7377 printf (_("Audit library"));
7381 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7382 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
7386 print_vma (entry->d_un.d_val, PREFIX_HEX);
7395 printf (_("Flags:"));
7397 if (entry->d_un.d_val == 0)
7398 printf (_(" None\n"));
7401 unsigned long int val = entry->d_un.d_val;
7403 if (val & DTF_1_PARINIT)
7405 printf (" PARINIT");
7406 val ^= DTF_1_PARINIT;
7408 if (val & DTF_1_CONFEXP)
7410 printf (" CONFEXP");
7411 val ^= DTF_1_CONFEXP;
7414 printf (" %lx", val);
7423 printf (_("Flags:"));
7425 if (entry->d_un.d_val == 0)
7426 printf (_(" None\n"));
7429 unsigned long int val = entry->d_un.d_val;
7431 if (val & DF_P1_LAZYLOAD)
7433 printf (" LAZYLOAD");
7434 val ^= DF_P1_LAZYLOAD;
7436 if (val & DF_P1_GROUPPERM)
7438 printf (" GROUPPERM");
7439 val ^= DF_P1_GROUPPERM;
7442 printf (" %lx", val);
7451 printf (_("Flags:"));
7452 if (entry->d_un.d_val == 0)
7453 printf (_(" None\n"));
7456 unsigned long int val = entry->d_un.d_val;
7463 if (val & DF_1_GLOBAL)
7468 if (val & DF_1_GROUP)
7473 if (val & DF_1_NODELETE)
7475 printf (" NODELETE");
7476 val ^= DF_1_NODELETE;
7478 if (val & DF_1_LOADFLTR)
7480 printf (" LOADFLTR");
7481 val ^= DF_1_LOADFLTR;
7483 if (val & DF_1_INITFIRST)
7485 printf (" INITFIRST");
7486 val ^= DF_1_INITFIRST;
7488 if (val & DF_1_NOOPEN)
7493 if (val & DF_1_ORIGIN)
7498 if (val & DF_1_DIRECT)
7503 if (val & DF_1_TRANS)
7508 if (val & DF_1_INTERPOSE)
7510 printf (" INTERPOSE");
7511 val ^= DF_1_INTERPOSE;
7513 if (val & DF_1_NODEFLIB)
7515 printf (" NODEFLIB");
7516 val ^= DF_1_NODEFLIB;
7518 if (val & DF_1_NODUMP)
7523 if (val & DF_1_CONLFAT)
7525 printf (" CONLFAT");
7526 val ^= DF_1_CONLFAT;
7529 printf (" %lx", val);
7536 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7538 puts (get_dynamic_type (entry->d_un.d_val));
7558 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7564 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
7565 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7571 switch (entry->d_tag)
7574 printf (_("Shared library: [%s]"), name);
7576 if (streq (name, program_interpreter))
7577 printf (_(" program interpreter"));
7581 printf (_("Library soname: [%s]"), name);
7585 printf (_("Library rpath: [%s]"), name);
7589 printf (_("Library runpath: [%s]"), name);
7593 print_vma (entry->d_un.d_val, PREFIX_HEX);
7598 print_vma (entry->d_un.d_val, PREFIX_HEX);
7611 dynamic_info[entry->d_tag] = entry->d_un.d_val;
7615 case DT_INIT_ARRAYSZ:
7616 case DT_FINI_ARRAYSZ:
7617 case DT_GNU_CONFLICTSZ:
7618 case DT_GNU_LIBLISTSZ:
7621 print_vma (entry->d_un.d_val, UNSIGNED);
7622 printf (_(" (bytes)\n"));
7632 print_vma (entry->d_un.d_val, UNSIGNED);
7645 if (entry->d_tag == DT_USED
7646 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
7648 char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
7652 printf (_("Not needed object: [%s]\n"), name);
7657 print_vma (entry->d_un.d_val, PREFIX_HEX);
7663 /* The value of this entry is ignored. */
7668 case DT_GNU_PRELINKED:
7672 time_t atime = entry->d_un.d_val;
7674 tmp = gmtime (&atime);
7675 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
7676 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
7677 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
7683 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
7686 print_vma (entry->d_un.d_val, PREFIX_HEX);
7692 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
7693 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
7698 switch (elf_header.e_machine)
7701 case EM_MIPS_RS3_LE:
7702 dynamic_section_mips_val (entry);
7705 dynamic_section_parisc_val (entry);
7708 dynamic_section_ia64_val (entry);
7711 print_vma (entry->d_un.d_val, PREFIX_HEX);
7723 get_ver_flags (unsigned int flags)
7725 static char buff[32];
7732 if (flags & VER_FLG_BASE)
7733 strcat (buff, "BASE ");
7735 if (flags & VER_FLG_WEAK)
7737 if (flags & VER_FLG_BASE)
7738 strcat (buff, "| ");
7740 strcat (buff, "WEAK ");
7743 if (flags & VER_FLG_INFO)
7745 if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
7746 strcat (buff, "| ");
7748 strcat (buff, "INFO ");
7751 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
7752 strcat (buff, _("| <unknown>"));
7757 /* Display the contents of the version sections. */
7760 process_version_sections (FILE * file)
7762 Elf_Internal_Shdr * section;
7769 for (i = 0, section = section_headers;
7770 i < elf_header.e_shnum;
7773 switch (section->sh_type)
7775 case SHT_GNU_verdef:
7777 Elf_External_Verdef * edefs;
7785 (_("\nVersion definition section '%s' contains %u entries:\n"),
7786 SECTION_NAME (section), section->sh_info);
7788 printf (_(" Addr: 0x"));
7789 printf_vma (section->sh_addr);
7790 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7791 (unsigned long) section->sh_offset, section->sh_link,
7792 section->sh_link < elf_header.e_shnum
7793 ? SECTION_NAME (section_headers + section->sh_link)
7796 edefs = (Elf_External_Verdef *)
7797 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
7798 _("version definition section"));
7799 endbuf = (char *) edefs + section->sh_size;
7803 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7806 Elf_External_Verdef * edef;
7807 Elf_Internal_Verdef ent;
7808 Elf_External_Verdaux * eaux;
7809 Elf_Internal_Verdaux aux;
7813 /* Check for negative or very large indicies. */
7814 if ((unsigned char *) edefs + idx < (unsigned char *) edefs)
7817 vstart = ((char *) edefs) + idx;
7818 if (vstart + sizeof (*edef) > endbuf)
7821 edef = (Elf_External_Verdef *) vstart;
7823 ent.vd_version = BYTE_GET (edef->vd_version);
7824 ent.vd_flags = BYTE_GET (edef->vd_flags);
7825 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
7826 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
7827 ent.vd_hash = BYTE_GET (edef->vd_hash);
7828 ent.vd_aux = BYTE_GET (edef->vd_aux);
7829 ent.vd_next = BYTE_GET (edef->vd_next);
7831 printf (_(" %#06x: Rev: %d Flags: %s"),
7832 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
7834 printf (_(" Index: %d Cnt: %d "),
7835 ent.vd_ndx, ent.vd_cnt);
7837 /* Check for overflow. */
7838 if ((unsigned char *)(vstart + ent.vd_aux) < (unsigned char *) vstart
7839 || (unsigned char *)(vstart + ent.vd_aux) > (unsigned char *) endbuf)
7842 vstart += ent.vd_aux;
7844 eaux = (Elf_External_Verdaux *) vstart;
7846 aux.vda_name = BYTE_GET (eaux->vda_name);
7847 aux.vda_next = BYTE_GET (eaux->vda_next);
7849 if (VALID_DYNAMIC_NAME (aux.vda_name))
7850 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
7852 printf (_("Name index: %ld\n"), aux.vda_name);
7854 isum = idx + ent.vd_aux;
7856 for (j = 1; j < ent.vd_cnt; j++)
7858 /* Check for overflow. */
7859 if ((unsigned char *)(vstart + aux.vda_next) < (unsigned char *) vstart
7860 || (unsigned char *)(vstart + aux.vda_next) > (unsigned char *) endbuf)
7863 isum += aux.vda_next;
7864 vstart += aux.vda_next;
7866 eaux = (Elf_External_Verdaux *) vstart;
7867 if (vstart + sizeof (*eaux) > endbuf)
7870 aux.vda_name = BYTE_GET (eaux->vda_name);
7871 aux.vda_next = BYTE_GET (eaux->vda_next);
7873 if (VALID_DYNAMIC_NAME (aux.vda_name))
7874 printf (_(" %#06x: Parent %d: %s\n"),
7875 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
7877 printf (_(" %#06x: Parent %d, name index: %ld\n"),
7878 isum, j, aux.vda_name);
7882 printf (_(" Version def aux past end of section\n"));
7887 if (cnt < section->sh_info)
7888 printf (_(" Version definition past end of section\n"));
7894 case SHT_GNU_verneed:
7896 Elf_External_Verneed * eneed;
7903 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
7904 SECTION_NAME (section), section->sh_info);
7906 printf (_(" Addr: 0x"));
7907 printf_vma (section->sh_addr);
7908 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
7909 (unsigned long) section->sh_offset, section->sh_link,
7910 section->sh_link < elf_header.e_shnum
7911 ? SECTION_NAME (section_headers + section->sh_link)
7914 eneed = (Elf_External_Verneed *) get_data (NULL, file,
7915 section->sh_offset, 1,
7917 _("version need section"));
7918 endbuf = (char *) eneed + section->sh_size;
7922 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
7924 Elf_External_Verneed * entry;
7925 Elf_Internal_Verneed ent;
7930 if ((unsigned char *) eneed + idx < (unsigned char *) eneed)
7933 vstart = ((char *) eneed) + idx;
7934 if (vstart + sizeof (*entry) > endbuf)
7937 entry = (Elf_External_Verneed *) vstart;
7939 ent.vn_version = BYTE_GET (entry->vn_version);
7940 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
7941 ent.vn_file = BYTE_GET (entry->vn_file);
7942 ent.vn_aux = BYTE_GET (entry->vn_aux);
7943 ent.vn_next = BYTE_GET (entry->vn_next);
7945 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
7947 if (VALID_DYNAMIC_NAME (ent.vn_file))
7948 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
7950 printf (_(" File: %lx"), ent.vn_file);
7952 printf (_(" Cnt: %d\n"), ent.vn_cnt);
7954 /* Check for overflow. */
7955 if ((unsigned char *)(vstart + ent.vn_aux) < (unsigned char *) vstart
7956 || (unsigned char *)(vstart + ent.vn_aux) > (unsigned char *) endbuf)
7959 vstart += ent.vn_aux;
7961 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
7963 Elf_External_Vernaux * eaux;
7964 Elf_Internal_Vernaux aux;
7966 if (vstart + sizeof (*eaux) > endbuf)
7968 eaux = (Elf_External_Vernaux *) vstart;
7970 aux.vna_hash = BYTE_GET (eaux->vna_hash);
7971 aux.vna_flags = BYTE_GET (eaux->vna_flags);
7972 aux.vna_other = BYTE_GET (eaux->vna_other);
7973 aux.vna_name = BYTE_GET (eaux->vna_name);
7974 aux.vna_next = BYTE_GET (eaux->vna_next);
7976 if (VALID_DYNAMIC_NAME (aux.vna_name))
7977 printf (_(" %#06x: Name: %s"),
7978 isum, GET_DYNAMIC_NAME (aux.vna_name));
7980 printf (_(" %#06x: Name index: %lx"),
7981 isum, aux.vna_name);
7983 printf (_(" Flags: %s Version: %d\n"),
7984 get_ver_flags (aux.vna_flags), aux.vna_other);
7986 /* Check for overflow. */
7987 if ((unsigned char *)(vstart + aux.vna_next) < (unsigned char *) vstart
7988 || (unsigned char *)(vstart + aux.vna_next) > (unsigned char *) endbuf)
7991 isum += aux.vna_next;
7992 vstart += aux.vna_next;
7995 printf (_(" Version need aux past end of section\n"));
7999 if (cnt < section->sh_info)
8000 printf (_(" Version need past end of section\n"));
8006 case SHT_GNU_versym:
8008 Elf_Internal_Shdr * link_section;
8011 unsigned char * edata;
8012 unsigned short * data;
8014 Elf_Internal_Sym * symbols;
8015 Elf_Internal_Shdr * string_sec;
8018 if (section->sh_link >= elf_header.e_shnum)
8021 link_section = section_headers + section->sh_link;
8022 total = section->sh_size / sizeof (Elf_External_Versym);
8024 if (link_section->sh_link >= elf_header.e_shnum)
8029 symbols = GET_ELF_SYMBOLS (file, link_section);
8030 if (symbols == NULL)
8033 string_sec = section_headers + link_section->sh_link;
8035 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
8036 string_sec->sh_size,
8037 _("version string table"));
8041 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
8042 SECTION_NAME (section), total);
8044 printf (_(" Addr: "));
8045 printf_vma (section->sh_addr);
8046 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
8047 (unsigned long) section->sh_offset, section->sh_link,
8048 SECTION_NAME (link_section));
8050 off = offset_from_vma (file,
8051 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8052 total * sizeof (short));
8053 edata = (unsigned char *) get_data (NULL, file, off, total,
8055 _("version symbol data"));
8062 data = (short unsigned int *) cmalloc (total, sizeof (short));
8064 for (cnt = total; cnt --;)
8065 data[cnt] = byte_get (edata + cnt * sizeof (short),
8070 for (cnt = 0; cnt < total; cnt += 4)
8073 int check_def, check_need;
8076 printf (" %03x:", cnt);
8078 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
8079 switch (data[cnt + j])
8082 fputs (_(" 0 (*local*) "), stdout);
8086 fputs (_(" 1 (*global*) "), stdout);
8090 nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
8091 data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
8093 /* If this index value is greater than the size of the symbols
8094 array, break to avoid an out-of-bounds read, */
8095 if ((unsigned long)(cnt + j) >=
8096 ((unsigned long)link_section->sh_size /
8097 (unsigned long)link_section->sh_entsize))
8099 warn (_("invalid index into symbol array\n"));
8105 if (symbols[cnt + j].st_shndx >= elf_header.e_shnum
8106 || section_headers[symbols[cnt + j].st_shndx].sh_type
8109 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
8116 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
8118 Elf_Internal_Verneed ivn;
8119 unsigned long offset;
8121 offset = offset_from_vma
8122 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8123 sizeof (Elf_External_Verneed));
8127 Elf_Internal_Vernaux ivna;
8128 Elf_External_Verneed evn;
8129 Elf_External_Vernaux evna;
8130 unsigned long a_off;
8132 get_data (&evn, file, offset, sizeof (evn), 1,
8135 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8136 ivn.vn_next = BYTE_GET (evn.vn_next);
8138 a_off = offset + ivn.vn_aux;
8142 get_data (&evna, file, a_off, sizeof (evna),
8143 1, _("version need aux (2)"));
8145 ivna.vna_next = BYTE_GET (evna.vna_next);
8146 ivna.vna_other = BYTE_GET (evna.vna_other);
8148 a_off += ivna.vna_next;
8150 while (ivna.vna_other != data[cnt + j]
8151 && ivna.vna_next != 0);
8153 if (ivna.vna_other == data[cnt + j])
8155 ivna.vna_name = BYTE_GET (evna.vna_name);
8157 if (ivna.vna_name >= string_sec->sh_size)
8158 name = _("*invalid*");
8160 name = strtab + ivna.vna_name;
8161 nn += printf ("(%s%-*s",
8163 12 - (int) strlen (name),
8169 offset += ivn.vn_next;
8171 while (ivn.vn_next);
8174 if (check_def && data[cnt + j] != 0x8001
8175 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8177 Elf_Internal_Verdef ivd;
8178 Elf_External_Verdef evd;
8179 unsigned long offset;
8181 offset = offset_from_vma
8182 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8187 get_data (&evd, file, offset, sizeof (evd), 1,
8190 ivd.vd_next = BYTE_GET (evd.vd_next);
8191 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8193 offset += ivd.vd_next;
8195 while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
8196 && ivd.vd_next != 0);
8198 if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
8200 Elf_External_Verdaux evda;
8201 Elf_Internal_Verdaux ivda;
8203 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8205 get_data (&evda, file,
8206 offset - ivd.vd_next + ivd.vd_aux,
8208 _("version def aux"));
8210 ivda.vda_name = BYTE_GET (evda.vda_name);
8212 if (ivda.vda_name >= string_sec->sh_size)
8213 name = _("*invalid*");
8215 name = strtab + ivda.vda_name;
8216 nn += printf ("(%s%-*s",
8218 12 - (int) strlen (name),
8224 printf ("%*c", 18 - nn, ' ');
8242 printf (_("\nNo version information found in this file.\n"));
8248 get_symbol_binding (unsigned int binding)
8250 static char buff[32];
8254 case STB_LOCAL: return "LOCAL";
8255 case STB_GLOBAL: return "GLOBAL";
8256 case STB_WEAK: return "WEAK";
8258 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
8259 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
8261 else if (binding >= STB_LOOS && binding <= STB_HIOS)
8263 if (binding == STB_GNU_UNIQUE
8264 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8265 /* GNU/Linux is still using the default value 0. */
8266 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8268 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
8271 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
8277 get_symbol_type (unsigned int type)
8279 static char buff[32];
8283 case STT_NOTYPE: return "NOTYPE";
8284 case STT_OBJECT: return "OBJECT";
8285 case STT_FUNC: return "FUNC";
8286 case STT_SECTION: return "SECTION";
8287 case STT_FILE: return "FILE";
8288 case STT_COMMON: return "COMMON";
8289 case STT_TLS: return "TLS";
8290 case STT_RELC: return "RELC";
8291 case STT_SRELC: return "SRELC";
8293 if (type >= STT_LOPROC && type <= STT_HIPROC)
8295 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
8296 return "THUMB_FUNC";
8298 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
8301 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
8302 return "PARISC_MILLI";
8304 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
8306 else if (type >= STT_LOOS && type <= STT_HIOS)
8308 if (elf_header.e_machine == EM_PARISC)
8310 if (type == STT_HP_OPAQUE)
8312 if (type == STT_HP_STUB)
8316 if (type == STT_GNU_IFUNC
8317 && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
8318 /* GNU/Linux is still using the default value 0. */
8319 || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
8322 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
8325 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
8331 get_symbol_visibility (unsigned int visibility)
8335 case STV_DEFAULT: return "DEFAULT";
8336 case STV_INTERNAL: return "INTERNAL";
8337 case STV_HIDDEN: return "HIDDEN";
8338 case STV_PROTECTED: return "PROTECTED";
8344 get_mips_symbol_other (unsigned int other)
8348 case STO_OPTIONAL: return "OPTIONAL";
8349 case STO_MIPS16: return "MIPS16";
8350 case STO_MIPS_PLT: return "MIPS PLT";
8351 case STO_MIPS_PIC: return "MIPS PIC";
8352 default: return NULL;
8357 get_ia64_symbol_other (unsigned int other)
8361 static char res[32];
8365 /* Function types is for images and .STB files only. */
8366 switch (elf_header.e_type)
8370 switch (VMS_ST_FUNC_TYPE (other))
8372 case VMS_SFT_CODE_ADDR:
8373 strcat (res, " CA");
8375 case VMS_SFT_SYMV_IDX:
8376 strcat (res, " VEC");
8379 strcat (res, " FD");
8381 case VMS_SFT_RESERVE:
8382 strcat (res, " RSV");
8391 switch (VMS_ST_LINKAGE (other))
8393 case VMS_STL_IGNORE:
8394 strcat (res, " IGN");
8396 case VMS_STL_RESERVE:
8397 strcat (res, " RSV");
8400 strcat (res, " STD");
8403 strcat (res, " LNK");
8418 get_symbol_other (unsigned int other)
8420 const char * result = NULL;
8421 static char buff [32];
8426 switch (elf_header.e_machine)
8429 result = get_mips_symbol_other (other);
8432 result = get_ia64_symbol_other (other);
8441 snprintf (buff, sizeof buff, _("<other>: %x"), other);
8446 get_symbol_index_type (unsigned int type)
8448 static char buff[32];
8452 case SHN_UNDEF: return "UND";
8453 case SHN_ABS: return "ABS";
8454 case SHN_COMMON: return "COM";
8456 if (type == SHN_IA_64_ANSI_COMMON
8457 && elf_header.e_machine == EM_IA_64
8458 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
8460 else if ((elf_header.e_machine == EM_X86_64
8461 || elf_header.e_machine == EM_L1OM)
8462 && type == SHN_X86_64_LCOMMON)
8464 else if (type == SHN_MIPS_SCOMMON
8465 && elf_header.e_machine == EM_MIPS)
8467 else if (type == SHN_MIPS_SUNDEFINED
8468 && elf_header.e_machine == EM_MIPS)
8470 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
8471 sprintf (buff, "PRC[0x%04x]", type & 0xffff);
8472 else if (type >= SHN_LOOS && type <= SHN_HIOS)
8473 sprintf (buff, "OS [0x%04x]", type & 0xffff);
8474 else if (type >= SHN_LORESERVE)
8475 sprintf (buff, "RSV[0x%04x]", type & 0xffff);
8477 sprintf (buff, "%3d", type);
8485 get_dynamic_data (FILE * file, unsigned int number, unsigned int ent_size)
8487 unsigned char * e_data;
8490 e_data = (unsigned char *) cmalloc (number, ent_size);
8494 error (_("Out of memory\n"));
8498 if (fread (e_data, ent_size, number, file) != number)
8500 error (_("Unable to read in dynamic data\n"));
8504 i_data = (bfd_vma *) cmalloc (number, sizeof (*i_data));
8508 error (_("Out of memory\n"));
8514 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
8522 print_dynamic_symbol (bfd_vma si, unsigned long hn)
8524 Elf_Internal_Sym * psym;
8527 psym = dynamic_symbols + si;
8529 n = print_vma (si, DEC_5);
8531 fputs (" " + n, stdout);
8532 printf (" %3lu: ", hn);
8533 print_vma (psym->st_value, LONG_HEX);
8535 print_vma (psym->st_size, DEC_5);
8537 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8538 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8539 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8540 /* Check to see if any other bits in the st_other field are set.
8541 Note - displaying this information disrupts the layout of the
8542 table being generated, but for the moment this case is very
8544 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8545 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8546 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
8547 if (VALID_DYNAMIC_NAME (psym->st_name))
8548 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8550 printf (_(" <corrupt: %14ld>"), psym->st_name);
8554 /* Dump the symbol table. */
8556 process_symbol_table (FILE * file)
8558 Elf_Internal_Shdr * section;
8559 bfd_vma nbuckets = 0;
8560 bfd_vma nchains = 0;
8561 bfd_vma * buckets = NULL;
8562 bfd_vma * chains = NULL;
8563 bfd_vma ngnubuckets = 0;
8564 bfd_vma * gnubuckets = NULL;
8565 bfd_vma * gnuchains = NULL;
8566 bfd_vma gnusymidx = 0;
8568 if (!do_syms && !do_dyn_syms && !do_histogram)
8571 if (dynamic_info[DT_HASH]
8573 || (do_using_dynamic
8575 && dynamic_strings != NULL)))
8577 unsigned char nb[8];
8578 unsigned char nc[8];
8579 int hash_ent_size = 4;
8581 if ((elf_header.e_machine == EM_ALPHA
8582 || elf_header.e_machine == EM_S390
8583 || elf_header.e_machine == EM_S390_OLD)
8584 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
8588 (archive_file_offset
8589 + offset_from_vma (file, dynamic_info[DT_HASH],
8590 sizeof nb + sizeof nc)),
8593 error (_("Unable to seek to start of dynamic information\n"));
8597 if (fread (nb, hash_ent_size, 1, file) != 1)
8599 error (_("Failed to read in number of buckets\n"));
8603 if (fread (nc, hash_ent_size, 1, file) != 1)
8605 error (_("Failed to read in number of chains\n"));
8609 nbuckets = byte_get (nb, hash_ent_size);
8610 nchains = byte_get (nc, hash_ent_size);
8612 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
8613 chains = get_dynamic_data (file, nchains, hash_ent_size);
8616 if (buckets == NULL || chains == NULL)
8618 if (do_using_dynamic)
8629 if (dynamic_info_DT_GNU_HASH
8631 || (do_using_dynamic
8633 && dynamic_strings != NULL)))
8635 unsigned char nb[16];
8636 bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
8637 bfd_vma buckets_vma;
8640 (archive_file_offset
8641 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
8645 error (_("Unable to seek to start of dynamic information\n"));
8649 if (fread (nb, 16, 1, file) != 1)
8651 error (_("Failed to read in number of buckets\n"));
8655 ngnubuckets = byte_get (nb, 4);
8656 gnusymidx = byte_get (nb + 4, 4);
8657 bitmaskwords = byte_get (nb + 8, 4);
8658 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
8660 buckets_vma += bitmaskwords * 4;
8662 buckets_vma += bitmaskwords * 8;
8665 (archive_file_offset
8666 + offset_from_vma (file, buckets_vma, 4)),
8669 error (_("Unable to seek to start of dynamic information\n"));
8673 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
8675 if (gnubuckets == NULL)
8678 for (i = 0; i < ngnubuckets; i++)
8679 if (gnubuckets[i] != 0)
8681 if (gnubuckets[i] < gnusymidx)
8684 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
8685 maxchain = gnubuckets[i];
8688 if (maxchain == 0xffffffff)
8691 maxchain -= gnusymidx;
8694 (archive_file_offset
8695 + offset_from_vma (file, buckets_vma
8696 + 4 * (ngnubuckets + maxchain), 4)),
8699 error (_("Unable to seek to start of dynamic information\n"));
8705 if (fread (nb, 4, 1, file) != 1)
8707 error (_("Failed to determine last chain length\n"));
8711 if (maxchain + 1 == 0)
8716 while ((byte_get (nb, 4) & 1) == 0);
8719 (archive_file_offset
8720 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
8723 error (_("Unable to seek to start of dynamic information\n"));
8727 gnuchains = get_dynamic_data (file, maxchain, 4);
8730 if (gnuchains == NULL)
8735 if (do_using_dynamic)
8740 if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
8743 && dynamic_strings != NULL)
8747 if (dynamic_info[DT_HASH])
8751 printf (_("\nSymbol table for image:\n"));
8753 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8755 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8757 for (hn = 0; hn < nbuckets; hn++)
8762 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
8763 print_dynamic_symbol (si, hn);
8767 if (dynamic_info_DT_GNU_HASH)
8769 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
8771 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8773 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
8775 for (hn = 0; hn < ngnubuckets; ++hn)
8776 if (gnubuckets[hn] != 0)
8778 bfd_vma si = gnubuckets[hn];
8779 bfd_vma off = si - gnusymidx;
8783 print_dynamic_symbol (si, hn);
8786 while ((gnuchains[off++] & 1) == 0);
8790 else if (do_dyn_syms || (do_syms && !do_using_dynamic))
8794 for (i = 0, section = section_headers;
8795 i < elf_header.e_shnum;
8799 char * strtab = NULL;
8800 unsigned long int strtab_size = 0;
8801 Elf_Internal_Sym * symtab;
8802 Elf_Internal_Sym * psym;
8804 if ((section->sh_type != SHT_SYMTAB
8805 && section->sh_type != SHT_DYNSYM)
8807 && section->sh_type == SHT_SYMTAB))
8810 if (section->sh_entsize == 0)
8812 printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
8813 SECTION_NAME (section));
8817 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
8818 SECTION_NAME (section),
8819 (unsigned long) (section->sh_size / section->sh_entsize));
8822 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8824 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
8826 symtab = GET_ELF_SYMBOLS (file, section);
8830 if (section->sh_link == elf_header.e_shstrndx)
8832 strtab = string_table;
8833 strtab_size = string_table_length;
8835 else if (section->sh_link < elf_header.e_shnum)
8837 Elf_Internal_Shdr * string_sec;
8839 string_sec = section_headers + section->sh_link;
8841 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
8842 1, string_sec->sh_size,
8844 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
8847 for (si = 0, psym = symtab;
8848 si < section->sh_size / section->sh_entsize;
8851 printf ("%6d: ", si);
8852 print_vma (psym->st_value, LONG_HEX);
8854 print_vma (psym->st_size, DEC_5);
8855 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
8856 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
8857 printf (" %-7s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
8858 /* Check to see if any other bits in the st_other field are set.
8859 Note - displaying this information disrupts the layout of the
8860 table being generated, but for the moment this case is very rare. */
8861 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
8862 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
8863 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
8864 print_symbol (25, psym->st_name < strtab_size
8865 ? strtab + psym->st_name : _("<corrupt>"));
8867 if (section->sh_type == SHT_DYNSYM &&
8868 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
8870 unsigned char data[2];
8871 unsigned short vers_data;
8872 unsigned long offset;
8876 offset = offset_from_vma
8877 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
8878 sizeof data + si * sizeof (vers_data));
8880 get_data (&data, file, offset + si * sizeof (vers_data),
8881 sizeof (data), 1, _("version data"));
8883 vers_data = byte_get (data, 2);
8885 is_nobits = (psym->st_shndx < elf_header.e_shnum
8886 && section_headers[psym->st_shndx].sh_type
8889 check_def = (psym->st_shndx != SHN_UNDEF);
8891 if ((vers_data & VERSYM_HIDDEN) || vers_data > 1)
8893 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
8894 && (is_nobits || ! check_def))
8896 Elf_External_Verneed evn;
8897 Elf_Internal_Verneed ivn;
8898 Elf_Internal_Vernaux ivna;
8900 /* We must test both. */
8901 offset = offset_from_vma
8902 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
8907 unsigned long vna_off;
8909 get_data (&evn, file, offset, sizeof (evn), 1,
8912 ivn.vn_aux = BYTE_GET (evn.vn_aux);
8913 ivn.vn_next = BYTE_GET (evn.vn_next);
8915 vna_off = offset + ivn.vn_aux;
8919 Elf_External_Vernaux evna;
8921 get_data (&evna, file, vna_off,
8923 _("version need aux (3)"));
8925 ivna.vna_other = BYTE_GET (evna.vna_other);
8926 ivna.vna_next = BYTE_GET (evna.vna_next);
8927 ivna.vna_name = BYTE_GET (evna.vna_name);
8929 vna_off += ivna.vna_next;
8931 while (ivna.vna_other != vers_data
8932 && ivna.vna_next != 0);
8934 if (ivna.vna_other == vers_data)
8937 offset += ivn.vn_next;
8939 while (ivn.vn_next != 0);
8941 if (ivna.vna_other == vers_data)
8944 ivna.vna_name < strtab_size
8945 ? strtab + ivna.vna_name : _("<corrupt>"),
8949 else if (! is_nobits)
8950 error (_("bad dynamic symbol\n"));
8957 if (vers_data != 0x8001
8958 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
8960 Elf_Internal_Verdef ivd;
8961 Elf_Internal_Verdaux ivda;
8962 Elf_External_Verdaux evda;
8965 off = offset_from_vma
8967 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
8968 sizeof (Elf_External_Verdef));
8972 Elf_External_Verdef evd;
8974 get_data (&evd, file, off, sizeof (evd),
8975 1, _("version def"));
8977 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
8978 ivd.vd_aux = BYTE_GET (evd.vd_aux);
8979 ivd.vd_next = BYTE_GET (evd.vd_next);
8983 while (ivd.vd_ndx != (vers_data & VERSYM_VERSION)
8984 && ivd.vd_next != 0);
8989 get_data (&evda, file, off, sizeof (evda),
8990 1, _("version def aux"));
8992 ivda.vda_name = BYTE_GET (evda.vda_name);
8994 if (psym->st_name != ivda.vda_name)
8995 printf ((vers_data & VERSYM_HIDDEN)
8997 ivda.vda_name < strtab_size
8998 ? strtab + ivda.vda_name : _("<corrupt>"));
9008 if (strtab != string_table)
9014 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
9016 if (do_histogram && buckets != NULL)
9018 unsigned long * lengths;
9019 unsigned long * counts;
9022 unsigned long maxlength = 0;
9023 unsigned long nzero_counts = 0;
9024 unsigned long nsyms = 0;
9026 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
9027 (unsigned long) nbuckets);
9028 printf (_(" Length Number %% of total Coverage\n"));
9030 lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
9031 if (lengths == NULL)
9033 error (_("Out of memory\n"));
9036 for (hn = 0; hn < nbuckets; ++hn)
9038 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
9041 if (maxlength < ++lengths[hn])
9046 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9049 error (_("Out of memory\n"));
9053 for (hn = 0; hn < nbuckets; ++hn)
9054 ++counts[lengths[hn]];
9059 printf (" 0 %-10lu (%5.1f%%)\n",
9060 counts[0], (counts[0] * 100.0) / nbuckets);
9061 for (i = 1; i <= maxlength; ++i)
9063 nzero_counts += counts[i] * i;
9064 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9065 i, counts[i], (counts[i] * 100.0) / nbuckets,
9066 (nzero_counts * 100.0) / nsyms);
9074 if (buckets != NULL)
9080 if (do_histogram && gnubuckets != NULL)
9082 unsigned long * lengths;
9083 unsigned long * counts;
9085 unsigned long maxlength = 0;
9086 unsigned long nzero_counts = 0;
9087 unsigned long nsyms = 0;
9089 lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
9090 if (lengths == NULL)
9092 error (_("Out of memory\n"));
9096 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
9097 (unsigned long) ngnubuckets);
9098 printf (_(" Length Number %% of total Coverage\n"));
9100 for (hn = 0; hn < ngnubuckets; ++hn)
9101 if (gnubuckets[hn] != 0)
9103 bfd_vma off, length = 1;
9105 for (off = gnubuckets[hn] - gnusymidx;
9106 (gnuchains[off] & 1) == 0; ++off)
9108 lengths[hn] = length;
9109 if (length > maxlength)
9114 counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
9117 error (_("Out of memory\n"));
9121 for (hn = 0; hn < ngnubuckets; ++hn)
9122 ++counts[lengths[hn]];
9124 if (ngnubuckets > 0)
9127 printf (" 0 %-10lu (%5.1f%%)\n",
9128 counts[0], (counts[0] * 100.0) / ngnubuckets);
9129 for (j = 1; j <= maxlength; ++j)
9131 nzero_counts += counts[j] * j;
9132 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
9133 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
9134 (nzero_counts * 100.0) / nsyms);
9148 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
9152 if (dynamic_syminfo == NULL
9154 /* No syminfo, this is ok. */
9157 /* There better should be a dynamic symbol section. */
9158 if (dynamic_symbols == NULL || dynamic_strings == NULL)
9162 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
9163 dynamic_syminfo_offset, dynamic_syminfo_nent);
9165 printf (_(" Num: Name BoundTo Flags\n"));
9166 for (i = 0; i < dynamic_syminfo_nent; ++i)
9168 unsigned short int flags = dynamic_syminfo[i].si_flags;
9170 printf ("%4d: ", i);
9171 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
9172 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
9174 printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
9177 switch (dynamic_syminfo[i].si_boundto)
9179 case SYMINFO_BT_SELF:
9180 fputs ("SELF ", stdout);
9182 case SYMINFO_BT_PARENT:
9183 fputs ("PARENT ", stdout);
9186 if (dynamic_syminfo[i].si_boundto > 0
9187 && dynamic_syminfo[i].si_boundto < dynamic_nent
9188 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
9190 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
9194 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
9198 if (flags & SYMINFO_FLG_DIRECT)
9200 if (flags & SYMINFO_FLG_PASSTHRU)
9201 printf (" PASSTHRU");
9202 if (flags & SYMINFO_FLG_COPY)
9204 if (flags & SYMINFO_FLG_LAZYLOAD)
9205 printf (" LAZYLOAD");
9213 /* Check to see if the given reloc needs to be handled in a target specific
9214 manner. If so then process the reloc and return TRUE otherwise return
9218 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
9219 unsigned char * start,
9220 Elf_Internal_Sym * symtab)
9222 unsigned int reloc_type = get_reloc_type (reloc->r_info);
9224 switch (elf_header.e_machine)
9227 case EM_CYGNUS_MN10300:
9229 static Elf_Internal_Sym * saved_sym = NULL;
9233 case 34: /* R_MN10300_ALIGN */
9235 case 33: /* R_MN10300_SYM_DIFF */
9236 saved_sym = symtab + get_reloc_symindex (reloc->r_info);
9238 case 1: /* R_MN10300_32 */
9239 case 2: /* R_MN10300_16 */
9240 if (saved_sym != NULL)
9244 value = reloc->r_addend
9245 + (symtab[get_reloc_symindex (reloc->r_info)].st_value
9246 - saved_sym->st_value);
9248 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
9255 if (saved_sym != NULL)
9256 error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc"));
9266 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
9267 DWARF debug sections. This is a target specific test. Note - we do not
9268 go through the whole including-target-headers-multiple-times route, (as
9269 we have already done with <elf/h8.h>) because this would become very
9270 messy and even then this function would have to contain target specific
9271 information (the names of the relocs instead of their numeric values).
9272 FIXME: This is not the correct way to solve this problem. The proper way
9273 is to have target specific reloc sizing and typing functions created by
9274 the reloc-macros.h header, in the same way that it already creates the
9275 reloc naming functions. */
9278 is_32bit_abs_reloc (unsigned int reloc_type)
9280 switch (elf_header.e_machine)
9284 return reloc_type == 1; /* R_386_32. */
9286 return reloc_type == 1; /* R_68K_32. */
9288 return reloc_type == 1; /* R_860_32. */
9290 return reloc_type == 2; /* R_960_32. */
9292 return reloc_type == 1; /* R_ALPHA_REFLONG. */
9294 return reloc_type == 1; /* R_ARC_32. */
9296 return reloc_type == 2; /* R_ARM_ABS32 */
9299 return reloc_type == 1;
9301 return reloc_type == 0x12; /* R_byte4_data. */
9303 return reloc_type == 3; /* R_CRIS_32. */
9306 return reloc_type == 3; /* R_CR16_NUM32. */
9308 return reloc_type == 15; /* R_CRX_NUM32. */
9310 return reloc_type == 1;
9311 case EM_CYGNUS_D10V:
9313 return reloc_type == 6; /* R_D10V_32. */
9314 case EM_CYGNUS_D30V:
9316 return reloc_type == 12; /* R_D30V_32_NORMAL. */
9318 return reloc_type == 3; /* R_DLX_RELOC_32. */
9319 case EM_CYGNUS_FR30:
9321 return reloc_type == 3; /* R_FR30_32. */
9325 return reloc_type == 1; /* R_H8_DIR32. */
9327 return reloc_type == 0x65; /* R_IA64_SECREL32LSB. */
9330 return reloc_type == 2; /* R_IP2K_32. */
9332 return reloc_type == 2; /* R_IQ2000_32. */
9333 case EM_LATTICEMICO32:
9334 return reloc_type == 3; /* R_LM32_32. */
9337 return reloc_type == 3; /* R_M32C_32. */
9339 return reloc_type == 34; /* R_M32R_32_RELA. */
9341 return reloc_type == 1; /* R_MCORE_ADDR32. */
9343 return reloc_type == 4; /* R_MEP_32. */
9345 return reloc_type == 1; /* R_MICROBLAZE_32. */
9347 return reloc_type == 2; /* R_MIPS_32. */
9349 return reloc_type == 4; /* R_MMIX_32. */
9350 case EM_CYGNUS_MN10200:
9352 return reloc_type == 1; /* R_MN10200_32. */
9353 case EM_CYGNUS_MN10300:
9355 return reloc_type == 1; /* R_MN10300_32. */
9357 return reloc_type == 1; /* R_MOXIE_32. */
9360 return reloc_type == 1; /* R_MSP43_32. */
9362 return reloc_type == 2; /* R_MT_32. */
9363 case EM_ALTERA_NIOS2:
9365 return reloc_type == 1; /* R_NIOS_32. */
9368 return reloc_type == 1; /* R_OR32_32. */
9370 return (reloc_type == 1 /* R_PARISC_DIR32. */
9371 || reloc_type == 41); /* R_PARISC_SECREL32. */
9374 return reloc_type == 1; /* R_PJ_DATA_DIR32. */
9376 return reloc_type == 1; /* R_PPC64_ADDR32. */
9378 return reloc_type == 1; /* R_PPC_ADDR32. */
9380 return reloc_type == 1; /* R_RX_DIR32. */
9382 return reloc_type == 1; /* R_I370_ADDR31. */
9385 return reloc_type == 4; /* R_S390_32. */
9387 return reloc_type == 8; /* R_SCORE_ABS32. */
9389 return reloc_type == 1; /* R_SH_DIR32. */
9390 case EM_SPARC32PLUS:
9393 return reloc_type == 3 /* R_SPARC_32. */
9394 || reloc_type == 23; /* R_SPARC_UA32. */
9396 return reloc_type == 6; /* R_SPU_ADDR32 */
9398 return reloc_type == 1; /* R_C6000_ABS32. */
9399 case EM_CYGNUS_V850:
9401 return reloc_type == 6; /* R_V850_ABS32. */
9403 return reloc_type == 1; /* R_VAX_32. */
9406 return reloc_type == 10; /* R_X86_64_32. */
9409 return reloc_type == 3; /* R_XC16C_ABS_32. */
9411 return reloc_type == 1; /* R_XSTROMY16_32. */
9414 return reloc_type == 1; /* R_XTENSA_32. */
9416 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
9417 elf_header.e_machine);
9422 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9423 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
9426 is_32bit_pcrel_reloc (unsigned int reloc_type)
9428 switch (elf_header.e_machine)
9432 return reloc_type == 2; /* R_386_PC32. */
9434 return reloc_type == 4; /* R_68K_PC32. */
9436 return reloc_type == 10; /* R_ALPHA_SREL32. */
9438 return reloc_type == 3; /* R_ARM_REL32 */
9440 return reloc_type == 2; /* R_MICROBLAZE_32_PCREL. */
9442 return reloc_type == 9; /* R_PARISC_PCREL32. */
9444 return reloc_type == 26; /* R_PPC_REL32. */
9446 return reloc_type == 26; /* R_PPC64_REL32. */
9449 return reloc_type == 5; /* R_390_PC32. */
9451 return reloc_type == 2; /* R_SH_REL32. */
9452 case EM_SPARC32PLUS:
9455 return reloc_type == 6; /* R_SPARC_DISP32. */
9457 return reloc_type == 13; /* R_SPU_REL32. */
9460 return reloc_type == 2; /* R_X86_64_PC32. */
9463 return reloc_type == 14; /* R_XTENSA_32_PCREL. */
9465 /* Do not abort or issue an error message here. Not all targets use
9466 pc-relative 32-bit relocs in their DWARF debug information and we
9467 have already tested for target coverage in is_32bit_abs_reloc. A
9468 more helpful warning message will be generated by apply_relocations
9469 anyway, so just return. */
9474 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9475 a 64-bit absolute RELA relocation used in DWARF debug sections. */
9478 is_64bit_abs_reloc (unsigned int reloc_type)
9480 switch (elf_header.e_machine)
9483 return reloc_type == 2; /* R_ALPHA_REFQUAD. */
9485 return reloc_type == 0x27; /* R_IA64_DIR64LSB. */
9487 return reloc_type == 80; /* R_PARISC_DIR64. */
9489 return reloc_type == 38; /* R_PPC64_ADDR64. */
9490 case EM_SPARC32PLUS:
9493 return reloc_type == 54; /* R_SPARC_UA64. */
9496 return reloc_type == 1; /* R_X86_64_64. */
9499 return reloc_type == 22; /* R_S390_64 */
9501 return reloc_type == 18; /* R_MIPS_64 */
9507 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
9508 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
9511 is_64bit_pcrel_reloc (unsigned int reloc_type)
9513 switch (elf_header.e_machine)
9516 return reloc_type == 11; /* R_ALPHA_SREL64 */
9518 return reloc_type == 0x4f; /* R_IA64_PCREL64LSB */
9520 return reloc_type == 72; /* R_PARISC_PCREL64 */
9522 return reloc_type == 44; /* R_PPC64_REL64 */
9523 case EM_SPARC32PLUS:
9526 return reloc_type == 46; /* R_SPARC_DISP64 */
9529 return reloc_type == 24; /* R_X86_64_PC64 */
9532 return reloc_type == 23; /* R_S390_PC64 */
9538 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9539 a 24-bit absolute RELA relocation used in DWARF debug sections. */
9542 is_24bit_abs_reloc (unsigned int reloc_type)
9544 switch (elf_header.e_machine)
9546 case EM_CYGNUS_MN10200:
9548 return reloc_type == 4; /* R_MN10200_24. */
9554 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
9555 a 16-bit absolute RELA relocation used in DWARF debug sections. */
9558 is_16bit_abs_reloc (unsigned int reloc_type)
9560 switch (elf_header.e_machine)
9564 return reloc_type == 4; /* R_AVR_16. */
9565 case EM_CYGNUS_D10V:
9567 return reloc_type == 3; /* R_D10V_16. */
9571 return reloc_type == R_H8_DIR16;
9574 return reloc_type == 1; /* R_IP2K_16. */
9577 return reloc_type == 1; /* R_M32C_16 */
9580 return reloc_type == 5; /* R_MSP430_16_BYTE. */
9581 case EM_ALTERA_NIOS2:
9583 return reloc_type == 9; /* R_NIOS_16. */
9585 return reloc_type == 2; /* R_C6000_ABS16. */
9588 return reloc_type == 2; /* R_XC16C_ABS_16. */
9594 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
9595 relocation entries (possibly formerly used for SHT_GROUP sections). */
9598 is_none_reloc (unsigned int reloc_type)
9600 switch (elf_header.e_machine)
9602 case EM_68K: /* R_68K_NONE. */
9603 case EM_386: /* R_386_NONE. */
9604 case EM_SPARC32PLUS:
9606 case EM_SPARC: /* R_SPARC_NONE. */
9607 case EM_MIPS: /* R_MIPS_NONE. */
9608 case EM_PARISC: /* R_PARISC_NONE. */
9609 case EM_ALPHA: /* R_ALPHA_NONE. */
9610 case EM_PPC: /* R_PPC_NONE. */
9611 case EM_PPC64: /* R_PPC64_NONE. */
9612 case EM_ARM: /* R_ARM_NONE. */
9613 case EM_IA_64: /* R_IA64_NONE. */
9614 case EM_SH: /* R_SH_NONE. */
9616 case EM_S390: /* R_390_NONE. */
9617 case EM_CRIS: /* R_CRIS_NONE. */
9618 case EM_X86_64: /* R_X86_64_NONE. */
9619 case EM_L1OM: /* R_X86_64_NONE. */
9620 case EM_MN10300: /* R_MN10300_NONE. */
9621 case EM_MOXIE: /* R_MOXIE_NONE. */
9622 case EM_M32R: /* R_M32R_NONE. */
9623 case EM_TI_C6000:/* R_C6000_NONE. */
9625 case EM_C166: /* R_XC16X_NONE. */
9626 return reloc_type == 0;
9629 return (reloc_type == 0 /* R_XTENSA_NONE. */
9630 || reloc_type == 17 /* R_XTENSA_DIFF8. */
9631 || reloc_type == 18 /* R_XTENSA_DIFF16. */
9632 || reloc_type == 19 /* R_XTENSA_DIFF32. */);
9637 /* Apply relocations to a section.
9638 Note: So far support has been added only for those relocations
9639 which can be found in debug sections.
9640 FIXME: Add support for more relocations ? */
9643 apply_relocations (void * file,
9644 Elf_Internal_Shdr * section,
9645 unsigned char * start)
9647 Elf_Internal_Shdr * relsec;
9648 unsigned char * end = start + section->sh_size;
9650 if (elf_header.e_type != ET_REL)
9653 /* Find the reloc section associated with the section. */
9654 for (relsec = section_headers;
9655 relsec < section_headers + elf_header.e_shnum;
9658 bfd_boolean is_rela;
9659 unsigned long num_relocs;
9660 Elf_Internal_Rela * relocs;
9661 Elf_Internal_Rela * rp;
9662 Elf_Internal_Shdr * symsec;
9663 Elf_Internal_Sym * symtab;
9664 Elf_Internal_Sym * sym;
9666 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9667 || relsec->sh_info >= elf_header.e_shnum
9668 || section_headers + relsec->sh_info != section
9669 || relsec->sh_size == 0
9670 || relsec->sh_link >= elf_header.e_shnum)
9673 is_rela = relsec->sh_type == SHT_RELA;
9677 if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
9678 relsec->sh_size, & relocs, & num_relocs))
9683 if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
9684 relsec->sh_size, & relocs, & num_relocs))
9688 /* SH uses RELA but uses in place value instead of the addend field. */
9689 if (elf_header.e_machine == EM_SH)
9692 symsec = section_headers + relsec->sh_link;
9693 symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec);
9695 for (rp = relocs; rp < relocs + num_relocs; ++rp)
9698 unsigned int reloc_type;
9699 unsigned int reloc_size;
9700 unsigned char * rloc;
9702 reloc_type = get_reloc_type (rp->r_info);
9704 if (target_specific_reloc_handling (rp, start, symtab))
9706 else if (is_none_reloc (reloc_type))
9708 else if (is_32bit_abs_reloc (reloc_type)
9709 || is_32bit_pcrel_reloc (reloc_type))
9711 else if (is_64bit_abs_reloc (reloc_type)
9712 || is_64bit_pcrel_reloc (reloc_type))
9714 else if (is_24bit_abs_reloc (reloc_type))
9716 else if (is_16bit_abs_reloc (reloc_type))
9720 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
9721 reloc_type, SECTION_NAME (section));
9725 rloc = start + rp->r_offset;
9726 if ((rloc + reloc_size) > end)
9728 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
9729 (unsigned long) rp->r_offset,
9730 SECTION_NAME (section));
9734 sym = symtab + get_reloc_symindex (rp->r_info);
9736 /* If the reloc has a symbol associated with it,
9737 make sure that it is of an appropriate type.
9739 Relocations against symbols without type can happen.
9740 Gcc -feliminate-dwarf2-dups may generate symbols
9741 without type for debug info.
9743 Icc generates relocations against function symbols
9744 instead of local labels.
9746 Relocations against object symbols can happen, eg when
9747 referencing a global array. For an example of this see
9748 the _clz.o binary in libgcc.a. */
9750 && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
9752 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
9753 get_symbol_type (ELF_ST_TYPE (sym->st_info)),
9754 (long int)(rp - relocs),
9755 SECTION_NAME (relsec));
9761 addend += rp->r_addend;
9762 /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
9765 || (elf_header.e_machine == EM_XTENSA
9767 || ((elf_header.e_machine == EM_PJ
9768 || elf_header.e_machine == EM_PJ_OLD)
9770 || ((elf_header.e_machine == EM_D30V
9771 || elf_header.e_machine == EM_CYGNUS_D30V)
9772 && reloc_type == 12))
9773 addend += byte_get (rloc, reloc_size);
9775 if (is_32bit_pcrel_reloc (reloc_type)
9776 || is_64bit_pcrel_reloc (reloc_type))
9778 /* On HPPA, all pc-relative relocations are biased by 8. */
9779 if (elf_header.e_machine == EM_PARISC)
9781 byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
9785 byte_put (rloc, addend + sym->st_value, reloc_size);
9794 #ifdef SUPPORT_DISASSEMBLY
9796 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
9798 printf (_("\nAssembly dump of section %s\n"),
9799 SECTION_NAME (section));
9801 /* XXX -- to be done --- XXX */
9807 /* Reads in the contents of SECTION from FILE, returning a pointer
9808 to a malloc'ed buffer or NULL if something went wrong. */
9811 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
9813 bfd_size_type num_bytes;
9815 num_bytes = section->sh_size;
9817 if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
9819 printf (_("\nSection '%s' has no data to dump.\n"),
9820 SECTION_NAME (section));
9824 return (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
9825 _("section contents"));
9830 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
9832 Elf_Internal_Shdr * relsec;
9833 bfd_size_type num_bytes;
9837 char * name = SECTION_NAME (section);
9838 bfd_boolean some_strings_shown;
9840 start = get_section_contents (section, file);
9844 printf (_("\nString dump of section '%s':\n"), name);
9846 /* If the section being dumped has relocations against it the user might
9847 be expecting these relocations to have been applied. Check for this
9848 case and issue a warning message in order to avoid confusion.
9849 FIXME: Maybe we ought to have an option that dumps a section with
9851 for (relsec = section_headers;
9852 relsec < section_headers + elf_header.e_shnum;
9855 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9856 || relsec->sh_info >= elf_header.e_shnum
9857 || section_headers + relsec->sh_info != section
9858 || relsec->sh_size == 0
9859 || relsec->sh_link >= elf_header.e_shnum)
9862 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9866 num_bytes = section->sh_size;
9868 end = start + num_bytes;
9869 some_strings_shown = FALSE;
9873 while (!ISPRINT (* data))
9880 /* PR 11128: Use two separate invocations in order to work
9881 around bugs in the Solaris 8 implementation of printf. */
9882 printf (" [%6tx] ", data - start);
9883 printf ("%s\n", data);
9885 printf (" [%6Ix] %s\n", (size_t) (data - start), data);
9887 data += strlen (data);
9888 some_strings_shown = TRUE;
9892 if (! some_strings_shown)
9893 printf (_(" No strings found in this section."));
9901 dump_section_as_bytes (Elf_Internal_Shdr * section,
9903 bfd_boolean relocate)
9905 Elf_Internal_Shdr * relsec;
9906 bfd_size_type bytes;
9908 unsigned char * data;
9909 unsigned char * start;
9911 start = (unsigned char *) get_section_contents (section, file);
9915 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
9919 apply_relocations (file, section, start);
9923 /* If the section being dumped has relocations against it the user might
9924 be expecting these relocations to have been applied. Check for this
9925 case and issue a warning message in order to avoid confusion.
9926 FIXME: Maybe we ought to have an option that dumps a section with
9928 for (relsec = section_headers;
9929 relsec < section_headers + elf_header.e_shnum;
9932 if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
9933 || relsec->sh_info >= elf_header.e_shnum
9934 || section_headers + relsec->sh_info != section
9935 || relsec->sh_size == 0
9936 || relsec->sh_link >= elf_header.e_shnum)
9939 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
9944 addr = section->sh_addr;
9945 bytes = section->sh_size;
9954 lbytes = (bytes > 16 ? 16 : bytes);
9956 printf (" 0x%8.8lx ", (unsigned long) addr);
9958 for (j = 0; j < 16; j++)
9961 printf ("%2.2x", data[j]);
9969 for (j = 0; j < lbytes; j++)
9972 if (k >= ' ' && k < 0x7f)
9990 /* Uncompresses a section that was compressed using zlib, in place. */
9993 uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
9994 dwarf_size_type *size ATTRIBUTE_UNUSED)
9999 dwarf_size_type compressed_size = *size;
10000 unsigned char * compressed_buffer = *buffer;
10001 dwarf_size_type uncompressed_size;
10002 unsigned char * uncompressed_buffer;
10005 dwarf_size_type header_size = 12;
10007 /* Read the zlib header. In this case, it should be "ZLIB" followed
10008 by the uncompressed section size, 8 bytes in big-endian order. */
10009 if (compressed_size < header_size
10010 || ! streq ((char *) compressed_buffer, "ZLIB"))
10013 uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
10014 uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
10015 uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
10016 uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8;
10017 uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8;
10018 uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8;
10019 uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
10020 uncompressed_size += compressed_buffer[11];
10022 /* It is possible the section consists of several compressed
10023 buffers concatenated together, so we uncompress in a loop. */
10024 strm.zalloc = NULL;
10026 strm.opaque = NULL;
10027 strm.avail_in = compressed_size - header_size;
10028 strm.next_in = (Bytef *) compressed_buffer + header_size;
10029 strm.avail_out = uncompressed_size;
10030 uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
10032 rc = inflateInit (& strm);
10033 while (strm.avail_in > 0)
10037 strm.next_out = ((Bytef *) uncompressed_buffer
10038 + (uncompressed_size - strm.avail_out));
10039 rc = inflate (&strm, Z_FINISH);
10040 if (rc != Z_STREAM_END)
10042 rc = inflateReset (& strm);
10044 rc = inflateEnd (& strm);
10046 || strm.avail_out != 0)
10049 free (compressed_buffer);
10050 *buffer = uncompressed_buffer;
10051 *size = uncompressed_size;
10055 free (uncompressed_buffer);
10056 /* Indicate decompression failure. */
10059 #endif /* HAVE_ZLIB_H */
10063 load_specific_debug_section (enum dwarf_section_display_enum debug,
10064 Elf_Internal_Shdr * sec, void * file)
10066 struct dwarf_section * section = &debug_displays [debug].section;
10069 /* If it is already loaded, do nothing. */
10070 if (section->start != NULL)
10073 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
10074 section->address = sec->sh_addr;
10075 section->size = sec->sh_size;
10076 section->start = (unsigned char *) get_data (NULL, (FILE *) file,
10078 sec->sh_size, buf);
10079 if (uncompress_section_contents (§ion->start, §ion->size))
10080 sec->sh_size = section->size;
10082 if (section->start == NULL)
10085 if (debug_displays [debug].relocate)
10086 apply_relocations ((FILE *) file, sec, section->start);
10092 load_debug_section (enum dwarf_section_display_enum debug, void * file)
10094 struct dwarf_section * section = &debug_displays [debug].section;
10095 Elf_Internal_Shdr * sec;
10097 /* Locate the debug section. */
10098 sec = find_section (section->uncompressed_name);
10100 section->name = section->uncompressed_name;
10103 sec = find_section (section->compressed_name);
10105 section->name = section->compressed_name;
10110 return load_specific_debug_section (debug, sec, (FILE *) file);
10114 free_debug_section (enum dwarf_section_display_enum debug)
10116 struct dwarf_section * section = &debug_displays [debug].section;
10118 if (section->start == NULL)
10121 free ((char *) section->start);
10122 section->start = NULL;
10123 section->address = 0;
10128 display_debug_section (Elf_Internal_Shdr * section, FILE * file)
10130 char * name = SECTION_NAME (section);
10131 bfd_size_type length;
10135 length = section->sh_size;
10138 printf (_("\nSection '%s' has no debugging data.\n"), name);
10141 if (section->sh_type == SHT_NOBITS)
10143 /* There is no point in dumping the contents of a debugging section
10144 which has the NOBITS type - the bits in the file will be random.
10145 This can happen when a file containing a .eh_frame section is
10146 stripped with the --only-keep-debug command line option. */
10147 printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"), name);
10151 if (const_strneq (name, ".gnu.linkonce.wi."))
10152 name = ".debug_info";
10154 /* See if we know how to display the contents of this section. */
10155 for (i = 0; i < max; i++)
10156 if (streq (debug_displays[i].section.uncompressed_name, name)
10157 || streq (debug_displays[i].section.compressed_name, name))
10159 struct dwarf_section * sec = &debug_displays [i].section;
10160 int secondary = (section != find_section (name));
10163 free_debug_section ((enum dwarf_section_display_enum) i);
10165 if (streq (sec->uncompressed_name, name))
10166 sec->name = sec->uncompressed_name;
10168 sec->name = sec->compressed_name;
10169 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
10172 result &= debug_displays[i].display (sec, file);
10174 if (secondary || (i != info && i != abbrev))
10175 free_debug_section ((enum dwarf_section_display_enum) i);
10183 printf (_("Unrecognized debug section: %s\n"), name);
10190 /* Set DUMP_SECTS for all sections where dumps were requested
10191 based on section name. */
10194 initialise_dumps_byname (void)
10196 struct dump_list_entry * cur;
10198 for (cur = dump_sects_byname; cur; cur = cur->next)
10203 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
10204 if (streq (SECTION_NAME (section_headers + i), cur->name))
10206 request_dump_bynumber (i, cur->type);
10211 warn (_("Section '%s' was not dumped because it does not exist!\n"),
10217 process_section_contents (FILE * file)
10219 Elf_Internal_Shdr * section;
10225 initialise_dumps_byname ();
10227 for (i = 0, section = section_headers;
10228 i < elf_header.e_shnum && i < num_dump_sects;
10231 #ifdef SUPPORT_DISASSEMBLY
10232 if (dump_sects[i] & DISASS_DUMP)
10233 disassemble_section (section, file);
10235 if (dump_sects[i] & HEX_DUMP)
10236 dump_section_as_bytes (section, file, FALSE);
10238 if (dump_sects[i] & RELOC_DUMP)
10239 dump_section_as_bytes (section, file, TRUE);
10241 if (dump_sects[i] & STRING_DUMP)
10242 dump_section_as_strings (section, file);
10244 if (dump_sects[i] & DEBUG_DUMP)
10245 display_debug_section (section, file);
10248 /* Check to see if the user requested a
10249 dump of a section that does not exist. */
10250 while (i++ < num_dump_sects)
10252 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10256 process_mips_fpe_exception (int mask)
10261 if (mask & OEX_FPU_INEX)
10262 fputs ("INEX", stdout), first = 0;
10263 if (mask & OEX_FPU_UFLO)
10264 printf ("%sUFLO", first ? "" : "|"), first = 0;
10265 if (mask & OEX_FPU_OFLO)
10266 printf ("%sOFLO", first ? "" : "|"), first = 0;
10267 if (mask & OEX_FPU_DIV0)
10268 printf ("%sDIV0", first ? "" : "|"), first = 0;
10269 if (mask & OEX_FPU_INVAL)
10270 printf ("%sINVAL", first ? "" : "|");
10273 fputs ("0", stdout);
10276 /* ARM EABI attributes section. */
10281 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
10283 const char ** table;
10284 } arm_attr_public_tag;
10286 static const char * arm_attr_tag_CPU_arch[] =
10287 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
10288 "v6K", "v7", "v6-M", "v6S-M", "v7E-M"};
10289 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
10290 static const char * arm_attr_tag_THUMB_ISA_use[] =
10291 {"No", "Thumb-1", "Thumb-2"};
10292 static const char * arm_attr_tag_FP_arch[] =
10293 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16"};
10294 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
10295 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
10296 {"No", "NEONv1", "NEONv1 with Fused-MAC"};
10297 static const char * arm_attr_tag_PCS_config[] =
10298 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
10299 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
10300 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
10301 {"V6", "SB", "TLS", "Unused"};
10302 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
10303 {"Absolute", "PC-relative", "SB-relative", "None"};
10304 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
10305 {"Absolute", "PC-relative", "None"};
10306 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
10307 {"None", "direct", "GOT-indirect"};
10308 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
10309 {"None", "??? 1", "2", "??? 3", "4"};
10310 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
10311 static const char * arm_attr_tag_ABI_FP_denormal[] =
10312 {"Unused", "Needed", "Sign only"};
10313 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
10314 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
10315 static const char * arm_attr_tag_ABI_FP_number_model[] =
10316 {"Unused", "Finite", "RTABI", "IEEE 754"};
10317 static const char * arm_attr_tag_ABI_enum_size[] =
10318 {"Unused", "small", "int", "forced to int"};
10319 static const char * arm_attr_tag_ABI_HardFP_use[] =
10320 {"As Tag_FP_arch", "SP only", "DP only", "SP and DP"};
10321 static const char * arm_attr_tag_ABI_VFP_args[] =
10322 {"AAPCS", "VFP registers", "custom"};
10323 static const char * arm_attr_tag_ABI_WMMX_args[] =
10324 {"AAPCS", "WMMX registers", "custom"};
10325 static const char * arm_attr_tag_ABI_optimization_goals[] =
10326 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10327 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
10328 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
10329 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
10330 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
10331 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
10332 static const char * arm_attr_tag_FP_HP_extension[] =
10333 {"Not Allowed", "Allowed"};
10334 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
10335 {"None", "IEEE 754", "Alternative Format"};
10336 static const char * arm_attr_tag_MPextension_use[] =
10337 {"Not Allowed", "Allowed"};
10338 static const char * arm_attr_tag_DIV_use[] =
10339 {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
10340 "Allowed in v7-A with integer division extension"};
10341 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
10342 static const char * arm_attr_tag_Virtualization_use[] =
10343 {"Not Allowed", "TrustZone", "Virtualization Extensions",
10344 "TrustZone and Virtualization Extensions"};
10345 static const char * arm_attr_tag_MPextension_use_legacy[] =
10346 {"Not Allowed", "Allowed"};
10348 #define LOOKUP(id, name) \
10349 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
10350 static arm_attr_public_tag arm_attr_public_tags[] =
10352 {4, "CPU_raw_name", 1, NULL},
10353 {5, "CPU_name", 1, NULL},
10354 LOOKUP(6, CPU_arch),
10355 {7, "CPU_arch_profile", 0, NULL},
10356 LOOKUP(8, ARM_ISA_use),
10357 LOOKUP(9, THUMB_ISA_use),
10358 LOOKUP(10, FP_arch),
10359 LOOKUP(11, WMMX_arch),
10360 LOOKUP(12, Advanced_SIMD_arch),
10361 LOOKUP(13, PCS_config),
10362 LOOKUP(14, ABI_PCS_R9_use),
10363 LOOKUP(15, ABI_PCS_RW_data),
10364 LOOKUP(16, ABI_PCS_RO_data),
10365 LOOKUP(17, ABI_PCS_GOT_use),
10366 LOOKUP(18, ABI_PCS_wchar_t),
10367 LOOKUP(19, ABI_FP_rounding),
10368 LOOKUP(20, ABI_FP_denormal),
10369 LOOKUP(21, ABI_FP_exceptions),
10370 LOOKUP(22, ABI_FP_user_exceptions),
10371 LOOKUP(23, ABI_FP_number_model),
10372 {24, "ABI_align_needed", 0, NULL},
10373 {25, "ABI_align_preserved", 0, NULL},
10374 LOOKUP(26, ABI_enum_size),
10375 LOOKUP(27, ABI_HardFP_use),
10376 LOOKUP(28, ABI_VFP_args),
10377 LOOKUP(29, ABI_WMMX_args),
10378 LOOKUP(30, ABI_optimization_goals),
10379 LOOKUP(31, ABI_FP_optimization_goals),
10380 {32, "compatibility", 0, NULL},
10381 LOOKUP(34, CPU_unaligned_access),
10382 LOOKUP(36, FP_HP_extension),
10383 LOOKUP(38, ABI_FP_16bit_format),
10384 LOOKUP(42, MPextension_use),
10385 LOOKUP(44, DIV_use),
10386 {64, "nodefaults", 0, NULL},
10387 {65, "also_compatible_with", 0, NULL},
10388 LOOKUP(66, T2EE_use),
10389 {67, "conformance", 1, NULL},
10390 LOOKUP(68, Virtualization_use),
10391 LOOKUP(70, MPextension_use_legacy)
10395 static unsigned char *
10396 display_arm_attribute (unsigned char * p)
10401 arm_attr_public_tag * attr;
10405 tag = read_uleb128 (p, &len);
10408 for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
10410 if (arm_attr_public_tags[i].tag == tag)
10412 attr = &arm_attr_public_tags[i];
10419 printf (" Tag_%s: ", attr->name);
10420 switch (attr->type)
10425 case 7: /* Tag_CPU_arch_profile. */
10426 val = read_uleb128 (p, &len);
10430 case 0: printf (_("None\n")); break;
10431 case 'A': printf (_("Application\n")); break;
10432 case 'R': printf (_("Realtime\n")); break;
10433 case 'M': printf (_("Microcontroller\n")); break;
10434 case 'S': printf (_("Application or Realtime\n")); break;
10435 default: printf ("??? (%d)\n", val); break;
10439 case 24: /* Tag_align_needed. */
10440 val = read_uleb128 (p, &len);
10444 case 0: printf (_("None\n")); break;
10445 case 1: printf (_("8-byte\n")); break;
10446 case 2: printf (_("4-byte\n")); break;
10447 case 3: printf ("??? 3\n"); break;
10450 printf (_("8-byte and up to %d-byte extended\n"),
10453 printf ("??? (%d)\n", val);
10458 case 25: /* Tag_align_preserved. */
10459 val = read_uleb128 (p, &len);
10463 case 0: printf (_("None\n")); break;
10464 case 1: printf (_("8-byte, except leaf SP\n")); break;
10465 case 2: printf (_("8-byte\n")); break;
10466 case 3: printf ("??? 3\n"); break;
10469 printf (_("8-byte and up to %d-byte extended\n"),
10472 printf ("??? (%d)\n", val);
10477 case 32: /* Tag_compatibility. */
10478 val = read_uleb128 (p, &len);
10480 printf (_("flag = %d, vendor = %s\n"), val, p);
10481 p += strlen ((char *) p) + 1;
10484 case 64: /* Tag_nodefaults. */
10486 printf (_("True\n"));
10489 case 65: /* Tag_also_compatible_with. */
10490 val = read_uleb128 (p, &len);
10492 if (val == 6 /* Tag_CPU_arch. */)
10494 val = read_uleb128 (p, &len);
10496 if ((unsigned int)val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
10497 printf ("??? (%d)\n", val);
10499 printf ("%s\n", arm_attr_tag_CPU_arch[val]);
10503 while (*(p++) != '\0' /* NUL terminator. */);
10517 assert (attr->type & 0x80);
10518 val = read_uleb128 (p, &len);
10520 type = attr->type & 0x7f;
10522 printf ("??? (%d)\n", val);
10524 printf ("%s\n", attr->table[val]);
10531 type = 1; /* String. */
10533 type = 2; /* uleb128. */
10534 printf (" Tag_unknown_%d: ", tag);
10539 printf ("\"%s\"\n", p);
10540 p += strlen ((char *) p) + 1;
10544 val = read_uleb128 (p, &len);
10546 printf ("%d (0x%x)\n", val, val);
10552 static unsigned char *
10553 display_gnu_attribute (unsigned char * p,
10554 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
10561 tag = read_uleb128 (p, &len);
10564 /* Tag_compatibility is the only generic GNU attribute defined at
10568 val = read_uleb128 (p, &len);
10570 printf (_("flag = %d, vendor = %s\n"), val, p);
10571 p += strlen ((char *) p) + 1;
10575 if ((tag & 2) == 0 && display_proc_gnu_attribute)
10576 return display_proc_gnu_attribute (p, tag);
10579 type = 1; /* String. */
10581 type = 2; /* uleb128. */
10582 printf (" Tag_unknown_%d: ", tag);
10586 printf ("\"%s\"\n", p);
10587 p += strlen ((char *) p) + 1;
10591 val = read_uleb128 (p, &len);
10593 printf ("%d (0x%x)\n", val, val);
10599 static unsigned char *
10600 display_power_gnu_attribute (unsigned char * p, int tag)
10606 if (tag == Tag_GNU_Power_ABI_FP)
10608 val = read_uleb128 (p, &len);
10610 printf (" Tag_GNU_Power_ABI_FP: ");
10615 printf (_("Hard or soft float\n"));
10618 printf (_("Hard float\n"));
10621 printf (_("Soft float\n"));
10624 printf (_("Single-precision hard float\n"));
10627 printf ("??? (%d)\n", val);
10633 if (tag == Tag_GNU_Power_ABI_Vector)
10635 val = read_uleb128 (p, &len);
10637 printf (" Tag_GNU_Power_ABI_Vector: ");
10641 printf (_("Any\n"));
10644 printf (_("Generic\n"));
10647 printf ("AltiVec\n");
10653 printf ("??? (%d)\n", val);
10659 if (tag == Tag_GNU_Power_ABI_Struct_Return)
10661 val = read_uleb128 (p, &len);
10663 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
10667 printf (_("Any\n"));
10670 printf ("r3/r4\n");
10673 printf (_("Memory\n"));
10676 printf ("??? (%d)\n", val);
10683 type = 1; /* String. */
10685 type = 2; /* uleb128. */
10686 printf (" Tag_unknown_%d: ", tag);
10690 printf ("\"%s\"\n", p);
10691 p += strlen ((char *) p) + 1;
10695 val = read_uleb128 (p, &len);
10697 printf ("%d (0x%x)\n", val, val);
10703 static unsigned char *
10704 display_mips_gnu_attribute (unsigned char * p, int tag)
10710 if (tag == Tag_GNU_MIPS_ABI_FP)
10712 val = read_uleb128 (p, &len);
10714 printf (" Tag_GNU_MIPS_ABI_FP: ");
10719 printf (_("Hard or soft float\n"));
10722 printf (_("Hard float (double precision)\n"));
10725 printf (_("Hard float (single precision)\n"));
10728 printf (_("Soft float\n"));
10731 printf (_("Hard float (MIPS32r2 64-bit FPU)\n"));
10734 printf ("??? (%d)\n", val);
10741 type = 1; /* String. */
10743 type = 2; /* uleb128. */
10744 printf (" Tag_unknown_%d: ", tag);
10748 printf ("\"%s\"\n", p);
10749 p += strlen ((char *) p) + 1;
10753 val = read_uleb128 (p, &len);
10755 printf ("%d (0x%x)\n", val, val);
10761 static unsigned char *
10762 display_tic6x_attribute (unsigned char * p)
10768 tag = read_uleb128 (p, &len);
10774 val = read_uleb128 (p, &len);
10776 printf (" Tag_ISA: ");
10780 case C6XABI_Tag_ISA_none:
10781 printf (_("None\n"));
10783 case C6XABI_Tag_ISA_C62X:
10786 case C6XABI_Tag_ISA_C67X:
10789 case C6XABI_Tag_ISA_C67XP:
10790 printf ("C67x+\n");
10792 case C6XABI_Tag_ISA_C64X:
10795 case C6XABI_Tag_ISA_C64XP:
10796 printf ("C64x+\n");
10798 case C6XABI_Tag_ISA_C674X:
10799 printf ("C674x\n");
10802 printf ("??? (%d)\n", val);
10807 case Tag_ABI_wchar_t:
10808 val = read_uleb128 (p, &len);
10810 printf (" Tag_ABI_wchar_t: ");
10814 printf (_("Not used\n"));
10817 printf (_("2 bytes\n"));
10820 printf (_("4 bytes\n"));
10823 printf ("??? (%d)\n", val);
10828 case Tag_ABI_stack_align_needed:
10829 val = read_uleb128 (p, &len);
10831 printf (" Tag_ABI_stack_align_needed: ");
10835 printf (_("8-byte\n"));
10838 printf (_("16-byte\n"));
10841 printf ("??? (%d)\n", val);
10846 case Tag_ABI_stack_align_preserved:
10847 val = read_uleb128 (p, &len);
10849 printf (" Tag_ABI_stack_align_preserved: ");
10853 printf (_("8-byte\n"));
10856 printf (_("16-byte\n"));
10859 printf ("??? (%d)\n", val);
10865 val = read_uleb128 (p, &len);
10867 printf (" Tag_ABI_DSBT: ");
10871 printf (_("DSBT addressing not used\n"));
10874 printf (_("DSBT addressing used\n"));
10877 printf ("??? (%d)\n", val);
10883 val = read_uleb128 (p, &len);
10885 printf (" Tag_ABI_PID: ");
10889 printf (_("Data addressing position-dependent\n"));
10892 printf (_("Data addressing position-independent, GOT near DP\n"));
10895 printf (_("Data addressing position-independent, GOT far from DP\n"));
10898 printf ("??? (%d)\n", val);
10904 val = read_uleb128 (p, &len);
10906 printf (" Tag_ABI_PIC: ");
10910 printf (_("Code addressing position-dependent\n"));
10913 printf (_("Code addressing position-independent\n"));
10916 printf ("??? (%d)\n", val);
10921 case Tag_ABI_array_object_alignment:
10922 val = read_uleb128 (p, &len);
10924 printf (" Tag_ABI_array_object_alignment: ");
10928 printf (_("8-byte\n"));
10931 printf (_("4-byte\n"));
10934 printf (_("16-byte\n"));
10937 printf ("??? (%d)\n", val);
10942 case Tag_ABI_array_object_align_expected:
10943 val = read_uleb128 (p, &len);
10945 printf (" Tag_ABI_array_object_align_expected: ");
10949 printf (_("8-byte\n"));
10952 printf (_("4-byte\n"));
10955 printf (_("16-byte\n"));
10958 printf ("??? (%d)\n", val);
10963 case Tag_ABI_compatibility:
10964 val = read_uleb128 (p, &len);
10966 printf (" Tag_ABI_compatibility: ");
10967 printf (_("flag = %d, vendor = %s\n"), val, p);
10968 p += strlen ((char *) p) + 1;
10971 case Tag_ABI_conformance:
10972 printf (" Tag_ABI_conformance: ");
10973 printf ("\"%s\"\n", p);
10974 p += strlen ((char *) p) + 1;
10978 printf (" Tag_unknown_%d: ", tag);
10982 printf ("\"%s\"\n", p);
10983 p += strlen ((char *) p) + 1;
10987 val = read_uleb128 (p, &len);
10989 printf ("%d (0x%x)\n", val, val);
10996 process_attributes (FILE * file,
10997 const char * public_name,
10998 unsigned int proc_type,
10999 unsigned char * (* display_pub_attribute) (unsigned char *),
11000 unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int))
11002 Elf_Internal_Shdr * sect;
11003 unsigned char * contents;
11005 unsigned char * end;
11006 bfd_vma section_len;
11010 /* Find the section header so that we get the size. */
11011 for (i = 0, sect = section_headers;
11012 i < elf_header.e_shnum;
11015 if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
11018 contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
11019 sect->sh_size, _("attributes"));
11020 if (contents == NULL)
11026 len = sect->sh_size - 1;
11032 bfd_boolean public_section;
11033 bfd_boolean gnu_section;
11035 section_len = byte_get (p, 4);
11038 if (section_len > len)
11040 printf (_("ERROR: Bad section length (%d > %d)\n"),
11041 (int) section_len, (int) len);
11045 len -= section_len;
11046 printf (_("Attribute Section: %s\n"), p);
11048 if (public_name && streq ((char *) p, public_name))
11049 public_section = TRUE;
11051 public_section = FALSE;
11053 if (streq ((char *) p, "gnu"))
11054 gnu_section = TRUE;
11056 gnu_section = FALSE;
11058 namelen = strlen ((char *) p) + 1;
11060 section_len -= namelen + 4;
11062 while (section_len > 0)
11068 size = byte_get (p, 4);
11069 if (size > section_len)
11071 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
11072 (int) size, (int) section_len);
11073 size = section_len;
11076 section_len -= size;
11077 end = p + size - 1;
11083 printf (_("File Attributes\n"));
11086 printf (_("Section Attributes:"));
11089 printf (_("Symbol Attributes:"));
11095 val = read_uleb128 (p, &j);
11099 printf (" %d", val);
11104 printf (_("Unknown tag: %d\n"), tag);
11105 public_section = FALSE;
11109 if (public_section)
11112 p = display_pub_attribute (p);
11114 else if (gnu_section)
11117 p = display_gnu_attribute (p,
11118 display_proc_gnu_attribute);
11122 /* ??? Do something sensible, like dump hex. */
11123 printf (_(" Unknown section contexts\n"));
11130 printf (_("Unknown format '%c'\n"), *p);
11138 process_arm_specific (FILE * file)
11140 return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
11141 display_arm_attribute, NULL);
11145 process_power_specific (FILE * file)
11147 return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11148 display_power_gnu_attribute);
11152 process_tic6x_specific (FILE * file)
11154 return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
11155 display_tic6x_attribute, NULL);
11158 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
11159 Print the Address, Access and Initial fields of an entry at VMA ADDR
11160 and return the VMA of the next entry. */
11163 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11166 print_vma (addr, LONG_HEX);
11168 if (addr < pltgot + 0xfff0)
11169 printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
11171 printf ("%10s", "");
11174 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11179 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11180 print_vma (entry, LONG_HEX);
11182 return addr + (is_32bit_elf ? 4 : 8);
11185 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
11186 PLTGOT. Print the Address and Initial fields of an entry at VMA
11187 ADDR and return the VMA of the next entry. */
11190 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
11193 print_vma (addr, LONG_HEX);
11196 printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
11201 entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
11202 print_vma (entry, LONG_HEX);
11204 return addr + (is_32bit_elf ? 4 : 8);
11208 process_mips_specific (FILE * file)
11210 Elf_Internal_Dyn * entry;
11211 size_t liblist_offset = 0;
11212 size_t liblistno = 0;
11213 size_t conflictsno = 0;
11214 size_t options_offset = 0;
11215 size_t conflicts_offset = 0;
11216 size_t pltrelsz = 0;
11218 bfd_vma pltgot = 0;
11219 bfd_vma mips_pltgot = 0;
11220 bfd_vma jmprel = 0;
11221 bfd_vma local_gotno = 0;
11222 bfd_vma gotsym = 0;
11223 bfd_vma symtabno = 0;
11225 process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
11226 display_mips_gnu_attribute);
11228 /* We have a lot of special sections. Thanks SGI! */
11229 if (dynamic_section == NULL)
11230 /* No information available. */
11233 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
11234 switch (entry->d_tag)
11236 case DT_MIPS_LIBLIST:
11238 = offset_from_vma (file, entry->d_un.d_val,
11239 liblistno * sizeof (Elf32_External_Lib));
11241 case DT_MIPS_LIBLISTNO:
11242 liblistno = entry->d_un.d_val;
11244 case DT_MIPS_OPTIONS:
11245 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
11247 case DT_MIPS_CONFLICT:
11249 = offset_from_vma (file, entry->d_un.d_val,
11250 conflictsno * sizeof (Elf32_External_Conflict));
11252 case DT_MIPS_CONFLICTNO:
11253 conflictsno = entry->d_un.d_val;
11256 pltgot = entry->d_un.d_ptr;
11258 case DT_MIPS_LOCAL_GOTNO:
11259 local_gotno = entry->d_un.d_val;
11261 case DT_MIPS_GOTSYM:
11262 gotsym = entry->d_un.d_val;
11264 case DT_MIPS_SYMTABNO:
11265 symtabno = entry->d_un.d_val;
11267 case DT_MIPS_PLTGOT:
11268 mips_pltgot = entry->d_un.d_ptr;
11271 pltrel = entry->d_un.d_val;
11274 pltrelsz = entry->d_un.d_val;
11277 jmprel = entry->d_un.d_ptr;
11283 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
11285 Elf32_External_Lib * elib;
11288 elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
11290 sizeof (Elf32_External_Lib),
11294 printf (_("\nSection '.liblist' contains %lu entries:\n"),
11295 (unsigned long) liblistno);
11296 fputs (_(" Library Time Stamp Checksum Version Flags\n"),
11299 for (cnt = 0; cnt < liblistno; ++cnt)
11306 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11307 atime = BYTE_GET (elib[cnt].l_time_stamp);
11308 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11309 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11310 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11312 tmp = gmtime (&atime);
11313 snprintf (timebuf, sizeof (timebuf),
11314 "%04u-%02u-%02uT%02u:%02u:%02u",
11315 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11316 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11318 printf ("%3lu: ", (unsigned long) cnt);
11319 if (VALID_DYNAMIC_NAME (liblist.l_name))
11320 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
11322 printf (_("<corrupt: %9ld>"), liblist.l_name);
11323 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11324 liblist.l_version);
11326 if (liblist.l_flags == 0)
11330 static const struct
11337 { " EXACT_MATCH", LL_EXACT_MATCH },
11338 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11339 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11340 { " EXPORTS", LL_EXPORTS },
11341 { " DELAY_LOAD", LL_DELAY_LOAD },
11342 { " DELTA", LL_DELTA }
11344 int flags = liblist.l_flags;
11347 for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
11348 if ((flags & l_flags_vals[fcnt].bit) != 0)
11350 fputs (l_flags_vals[fcnt].name, stdout);
11351 flags ^= l_flags_vals[fcnt].bit;
11354 printf (" %#x", (unsigned int) flags);
11364 if (options_offset != 0)
11366 Elf_External_Options * eopt;
11367 Elf_Internal_Shdr * sect = section_headers;
11368 Elf_Internal_Options * iopt;
11369 Elf_Internal_Options * option;
11373 /* Find the section header so that we get the size. */
11374 while (sect->sh_type != SHT_MIPS_OPTIONS)
11377 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
11378 sect->sh_size, _("options"));
11381 iopt = (Elf_Internal_Options *)
11382 cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
11385 error (_("Out of memory\n"));
11392 while (offset < sect->sh_size)
11394 Elf_External_Options * eoption;
11396 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11398 option->kind = BYTE_GET (eoption->kind);
11399 option->size = BYTE_GET (eoption->size);
11400 option->section = BYTE_GET (eoption->section);
11401 option->info = BYTE_GET (eoption->info);
11403 offset += option->size;
11409 printf (_("\nSection '%s' contains %d entries:\n"),
11410 SECTION_NAME (sect), cnt);
11418 switch (option->kind)
11421 /* This shouldn't happen. */
11422 printf (" NULL %d %lx", option->section, option->info);
11425 printf (" REGINFO ");
11426 if (elf_header.e_machine == EM_MIPS)
11429 Elf32_External_RegInfo * ereg;
11430 Elf32_RegInfo reginfo;
11432 ereg = (Elf32_External_RegInfo *) (option + 1);
11433 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11434 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11435 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11436 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11437 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11438 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11440 printf ("GPR %08lx GP 0x%lx\n",
11441 reginfo.ri_gprmask,
11442 (unsigned long) reginfo.ri_gp_value);
11443 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11444 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11445 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11450 Elf64_External_RegInfo * ereg;
11451 Elf64_Internal_RegInfo reginfo;
11453 ereg = (Elf64_External_RegInfo *) (option + 1);
11454 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11455 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11456 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11457 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11458 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11459 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11461 printf ("GPR %08lx GP 0x",
11462 reginfo.ri_gprmask);
11463 printf_vma (reginfo.ri_gp_value);
11466 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11467 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11468 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11472 case ODK_EXCEPTIONS:
11473 fputs (" EXCEPTIONS fpe_min(", stdout);
11474 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11475 fputs (") fpe_max(", stdout);
11476 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11477 fputs (")", stdout);
11479 if (option->info & OEX_PAGE0)
11480 fputs (" PAGE0", stdout);
11481 if (option->info & OEX_SMM)
11482 fputs (" SMM", stdout);
11483 if (option->info & OEX_FPDBUG)
11484 fputs (" FPDBUG", stdout);
11485 if (option->info & OEX_DISMISS)
11486 fputs (" DISMISS", stdout);
11489 fputs (" PAD ", stdout);
11490 if (option->info & OPAD_PREFIX)
11491 fputs (" PREFIX", stdout);
11492 if (option->info & OPAD_POSTFIX)
11493 fputs (" POSTFIX", stdout);
11494 if (option->info & OPAD_SYMBOL)
11495 fputs (" SYMBOL", stdout);
11498 fputs (" HWPATCH ", stdout);
11499 if (option->info & OHW_R4KEOP)
11500 fputs (" R4KEOP", stdout);
11501 if (option->info & OHW_R8KPFETCH)
11502 fputs (" R8KPFETCH", stdout);
11503 if (option->info & OHW_R5KEOP)
11504 fputs (" R5KEOP", stdout);
11505 if (option->info & OHW_R5KCVTL)
11506 fputs (" R5KCVTL", stdout);
11509 fputs (" FILL ", stdout);
11510 /* XXX Print content of info word? */
11513 fputs (" TAGS ", stdout);
11514 /* XXX Print content of info word? */
11517 fputs (" HWAND ", stdout);
11518 if (option->info & OHWA0_R4KEOP_CHECKED)
11519 fputs (" R4KEOP_CHECKED", stdout);
11520 if (option->info & OHWA0_R4KEOP_CLEAN)
11521 fputs (" R4KEOP_CLEAN", stdout);
11524 fputs (" HWOR ", stdout);
11525 if (option->info & OHWA0_R4KEOP_CHECKED)
11526 fputs (" R4KEOP_CHECKED", stdout);
11527 if (option->info & OHWA0_R4KEOP_CLEAN)
11528 fputs (" R4KEOP_CLEAN", stdout);
11531 printf (" GP_GROUP %#06lx self-contained %#06lx",
11532 option->info & OGP_GROUP,
11533 (option->info & OGP_SELF) >> 16);
11536 printf (" IDENT %#06lx self-contained %#06lx",
11537 option->info & OGP_GROUP,
11538 (option->info & OGP_SELF) >> 16);
11541 /* This shouldn't happen. */
11542 printf (" %3d ??? %d %lx",
11543 option->kind, option->section, option->info);
11547 len = sizeof (* eopt);
11548 while (len < option->size)
11549 if (((char *) option)[len] >= ' '
11550 && ((char *) option)[len] < 0x7f)
11551 printf ("%c", ((char *) option)[len++]);
11553 printf ("\\%03o", ((char *) option)[len++]);
11555 fputs ("\n", stdout);
11563 if (conflicts_offset != 0 && conflictsno != 0)
11565 Elf32_Conflict * iconf;
11568 if (dynamic_symbols == NULL)
11570 error (_("conflict list found without a dynamic symbol table\n"));
11574 iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
11577 error (_("Out of memory\n"));
11583 Elf32_External_Conflict * econf32;
11585 econf32 = (Elf32_External_Conflict *)
11586 get_data (NULL, file, conflicts_offset, conflictsno,
11587 sizeof (* econf32), _("conflict"));
11591 for (cnt = 0; cnt < conflictsno; ++cnt)
11592 iconf[cnt] = BYTE_GET (econf32[cnt]);
11598 Elf64_External_Conflict * econf64;
11600 econf64 = (Elf64_External_Conflict *)
11601 get_data (NULL, file, conflicts_offset, conflictsno,
11602 sizeof (* econf64), _("conflict"));
11606 for (cnt = 0; cnt < conflictsno; ++cnt)
11607 iconf[cnt] = BYTE_GET (econf64[cnt]);
11612 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11613 (unsigned long) conflictsno);
11614 puts (_(" Num: Index Value Name"));
11616 for (cnt = 0; cnt < conflictsno; ++cnt)
11618 Elf_Internal_Sym * psym = & dynamic_symbols[iconf[cnt]];
11620 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11621 print_vma (psym->st_value, FULL_HEX);
11623 if (VALID_DYNAMIC_NAME (psym->st_name))
11624 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11626 printf (_("<corrupt: %14ld>"), psym->st_name);
11633 if (pltgot != 0 && local_gotno != 0)
11635 bfd_vma ent, local_end, global_end;
11637 unsigned char * data;
11641 addr_size = (is_32bit_elf ? 4 : 8);
11642 local_end = pltgot + local_gotno * addr_size;
11643 global_end = local_end + (symtabno - gotsym) * addr_size;
11645 offset = offset_from_vma (file, pltgot, global_end - pltgot);
11646 data = (unsigned char *) get_data (NULL, file, offset,
11647 global_end - pltgot, 1, _("GOT"));
11648 printf (_("\nPrimary GOT:\n"));
11649 printf (_(" Canonical gp value: "));
11650 print_vma (pltgot + 0x7ff0, LONG_HEX);
11653 printf (_(" Reserved entries:\n"));
11654 printf (_(" %*s %10s %*s Purpose\n"),
11655 addr_size * 2, _("Address"), _("Access"),
11656 addr_size * 2, _("Initial"));
11657 ent = print_mips_got_entry (data, pltgot, ent);
11658 printf (_(" Lazy resolver\n"));
11660 && (byte_get (data + ent - pltgot, addr_size)
11661 >> (addr_size * 8 - 1)) != 0)
11663 ent = print_mips_got_entry (data, pltgot, ent);
11664 printf (_(" Module pointer (GNU extension)\n"));
11668 if (ent < local_end)
11670 printf (_(" Local entries:\n"));
11671 printf (_(" %*s %10s %*s\n"),
11672 addr_size * 2, _("Address"), _("Access"),
11673 addr_size * 2, _("Initial"));
11674 while (ent < local_end)
11676 ent = print_mips_got_entry (data, pltgot, ent);
11682 if (gotsym < symtabno)
11686 printf (_(" Global entries:\n"));
11687 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
11688 addr_size * 2, _("Address"), _("Access"),
11689 addr_size * 2, _("Initial"),
11690 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11691 sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
11692 for (i = gotsym; i < symtabno; i++)
11694 Elf_Internal_Sym * psym;
11696 psym = dynamic_symbols + i;
11697 ent = print_mips_got_entry (data, pltgot, ent);
11699 print_vma (psym->st_value, LONG_HEX);
11700 printf (" %-7s %3s ",
11701 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11702 get_symbol_index_type (psym->st_shndx));
11703 if (VALID_DYNAMIC_NAME (psym->st_name))
11704 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11706 printf (_("<corrupt: %14ld>"), psym->st_name);
11716 if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
11719 size_t offset, rel_offset;
11720 unsigned long count, i;
11721 unsigned char * data;
11722 int addr_size, sym_width;
11723 Elf_Internal_Rela * rels;
11725 rel_offset = offset_from_vma (file, jmprel, pltrelsz);
11726 if (pltrel == DT_RELA)
11728 if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
11733 if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
11738 addr_size = (is_32bit_elf ? 4 : 8);
11739 end = mips_pltgot + (2 + count) * addr_size;
11741 offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
11742 data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
11744 printf (_("\nPLT GOT:\n\n"));
11745 printf (_(" Reserved entries:\n"));
11746 printf (_(" %*s %*s Purpose\n"),
11747 addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
11748 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11749 printf (_(" PLT lazy resolver\n"));
11750 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11751 printf (_(" Module pointer\n"));
11754 printf (_(" Entries:\n"));
11755 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
11756 addr_size * 2, _("Address"),
11757 addr_size * 2, _("Initial"),
11758 addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
11759 sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
11760 for (i = 0; i < count; i++)
11762 Elf_Internal_Sym * psym;
11764 psym = dynamic_symbols + get_reloc_symindex (rels[i].r_info);
11765 ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
11767 print_vma (psym->st_value, LONG_HEX);
11768 printf (" %-7s %3s ",
11769 get_symbol_type (ELF_ST_TYPE (psym->st_info)),
11770 get_symbol_index_type (psym->st_shndx));
11771 if (VALID_DYNAMIC_NAME (psym->st_name))
11772 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
11774 printf (_("<corrupt: %14ld>"), psym->st_name);
11788 process_gnu_liblist (FILE * file)
11790 Elf_Internal_Shdr * section;
11791 Elf_Internal_Shdr * string_sec;
11792 Elf32_External_Lib * elib;
11794 size_t strtab_size;
11801 for (i = 0, section = section_headers;
11802 i < elf_header.e_shnum;
11805 switch (section->sh_type)
11807 case SHT_GNU_LIBLIST:
11808 if (section->sh_link >= elf_header.e_shnum)
11811 elib = (Elf32_External_Lib *)
11812 get_data (NULL, file, section->sh_offset, 1, section->sh_size,
11817 string_sec = section_headers + section->sh_link;
11819 strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
11820 string_sec->sh_size,
11821 _("liblist string table"));
11822 strtab_size = string_sec->sh_size;
11825 || section->sh_entsize != sizeof (Elf32_External_Lib))
11831 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11832 SECTION_NAME (section),
11833 (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
11835 puts (_(" Library Time Stamp Checksum Version Flags"));
11837 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11845 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11846 atime = BYTE_GET (elib[cnt].l_time_stamp);
11847 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11848 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11849 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11851 tmp = gmtime (&atime);
11852 snprintf (timebuf, sizeof (timebuf),
11853 "%04u-%02u-%02uT%02u:%02u:%02u",
11854 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11855 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11857 printf ("%3lu: ", (unsigned long) cnt);
11859 printf ("%-20s", liblist.l_name < strtab_size
11860 ? strtab + liblist.l_name : _("<corrupt>"));
11862 printf ("%-20.20s", liblist.l_name < strtab_size
11863 ? strtab + liblist.l_name : _("<corrupt>"));
11864 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11865 liblist.l_version, liblist.l_flags);
11875 static const char *
11876 get_note_type (unsigned e_type)
11878 static char buff[64];
11880 if (elf_header.e_type == ET_CORE)
11884 return _("NT_AUXV (auxiliary vector)");
11886 return _("NT_PRSTATUS (prstatus structure)");
11888 return _("NT_FPREGSET (floating point registers)");
11890 return _("NT_PRPSINFO (prpsinfo structure)");
11891 case NT_TASKSTRUCT:
11892 return _("NT_TASKSTRUCT (task structure)");
11894 return _("NT_PRXFPREG (user_xfpregs structure)");
11896 return _("NT_PPC_VMX (ppc Altivec registers)");
11898 return _("NT_PPC_VSX (ppc VSX registers)");
11899 case NT_X86_XSTATE:
11900 return _("NT_X86_XSTATE (x86 XSAVE extended state)");
11901 case NT_S390_HIGH_GPRS:
11902 return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
11903 case NT_S390_TIMER:
11904 return _("NT_S390_TIMER (s390 timer register)");
11905 case NT_S390_TODCMP:
11906 return _("NT_S390_TODCMP (s390 TOD comparator register)");
11907 case NT_S390_TODPREG:
11908 return _("NT_S390_TODPREG (s390 TOD programmable register)");
11910 return _("NT_S390_CTRS (s390 control registers)");
11911 case NT_S390_PREFIX:
11912 return _("NT_S390_PREFIX (s390 prefix register)");
11914 return _("NT_PSTATUS (pstatus structure)");
11916 return _("NT_FPREGS (floating point registers)");
11918 return _("NT_PSINFO (psinfo structure)");
11920 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11922 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11923 case NT_WIN32PSTATUS:
11924 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11932 return _("NT_VERSION (version)");
11934 return _("NT_ARCH (architecture)");
11939 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11943 static const char *
11944 get_gnu_elf_note_type (unsigned e_type)
11946 static char buff[64];
11950 case NT_GNU_ABI_TAG:
11951 return _("NT_GNU_ABI_TAG (ABI version tag)");
11953 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
11954 case NT_GNU_BUILD_ID:
11955 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
11956 case NT_GNU_GOLD_VERSION:
11957 return _("NT_GNU_GOLD_VERSION (gold version)");
11962 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11966 static const char *
11967 get_netbsd_elfcore_note_type (unsigned e_type)
11969 static char buff[64];
11971 if (e_type == NT_NETBSDCORE_PROCINFO)
11973 /* NetBSD core "procinfo" structure. */
11974 return _("NetBSD procinfo structure");
11977 /* As of Jan 2002 there are no other machine-independent notes
11978 defined for NetBSD core files. If the note type is less
11979 than the start of the machine-dependent note types, we don't
11982 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11984 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11988 switch (elf_header.e_machine)
11990 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11991 and PT_GETFPREGS == mach+2. */
11996 case EM_SPARC32PLUS:
12000 case NT_NETBSDCORE_FIRSTMACH + 0:
12001 return _("PT_GETREGS (reg structure)");
12002 case NT_NETBSDCORE_FIRSTMACH + 2:
12003 return _("PT_GETFPREGS (fpreg structure)");
12009 /* On all other arch's, PT_GETREGS == mach+1 and
12010 PT_GETFPREGS == mach+3. */
12014 case NT_NETBSDCORE_FIRSTMACH + 1:
12015 return _("PT_GETREGS (reg structure)");
12016 case NT_NETBSDCORE_FIRSTMACH + 3:
12017 return _("PT_GETFPREGS (fpreg structure)");
12023 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
12024 e_type - NT_NETBSDCORE_FIRSTMACH);
12028 /* Note that by the ELF standard, the name field is already null byte
12029 terminated, and namesz includes the terminating null byte.
12030 I.E. the value of namesz for the name "FSF" is 4.
12032 If the value of namesz is zero, there is no name present. */
12034 process_note (Elf_Internal_Note * pnote)
12036 const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
12039 if (pnote->namesz == 0)
12040 /* If there is no note name, then use the default set of
12041 note type strings. */
12042 nt = get_note_type (pnote->type);
12044 else if (const_strneq (pnote->namedata, "GNU"))
12045 /* GNU-specific object file notes. */
12046 nt = get_gnu_elf_note_type (pnote->type);
12048 else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
12049 /* NetBSD-specific core file notes. */
12050 nt = get_netbsd_elfcore_note_type (pnote->type);
12052 else if (strneq (pnote->namedata, "SPU/", 4))
12054 /* SPU-specific core file notes. */
12055 nt = pnote->namedata + 4;
12060 /* Don't recognize this note name; just use the default set of
12061 note type strings. */
12062 nt = get_note_type (pnote->type);
12064 printf (" %s\t\t0x%08lx\t%s\n", name, pnote->descsz, nt);
12070 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
12072 Elf_External_Note * pnotes;
12073 Elf_External_Note * external;
12079 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
12081 if (pnotes == NULL)
12086 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
12087 (unsigned long) offset, (unsigned long) length);
12088 printf (_(" Owner\t\tData size\tDescription\n"));
12090 while (external < (Elf_External_Note *) ((char *) pnotes + length))
12092 Elf_External_Note * next;
12093 Elf_Internal_Note inote;
12094 char * temp = NULL;
12096 inote.type = BYTE_GET (external->type);
12097 inote.namesz = BYTE_GET (external->namesz);
12098 inote.namedata = external->name;
12099 inote.descsz = BYTE_GET (external->descsz);
12100 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
12101 inote.descpos = offset + (inote.descdata - (char *) pnotes);
12103 next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
12105 if ( ((char *) next > ((char *) pnotes) + length)
12106 || ((char *) next < (char *) pnotes))
12108 warn (_("corrupt note found at offset %lx into core notes\n"),
12109 (unsigned long) ((char *) external - (char *) pnotes));
12110 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12111 inote.type, inote.namesz, inote.descsz);
12117 /* Prevent out-of-bounds indexing. */
12118 if (inote.namedata + inote.namesz >= (char *) pnotes + length
12119 || inote.namedata + inote.namesz < inote.namedata)
12121 warn (_("corrupt note found at offset %lx into core notes\n"),
12122 (unsigned long) ((char *) external - (char *) pnotes));
12123 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
12124 inote.type, inote.namesz, inote.descsz);
12128 /* Verify that name is null terminated. It appears that at least
12129 one version of Linux (RedHat 6.0) generates corefiles that don't
12130 comply with the ELF spec by failing to include the null byte in
12132 if (inote.namedata[inote.namesz] != '\0')
12134 temp = (char *) malloc (inote.namesz + 1);
12138 error (_("Out of memory\n"));
12143 strncpy (temp, inote.namedata, inote.namesz);
12144 temp[inote.namesz] = 0;
12146 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
12147 inote.namedata = temp;
12150 res &= process_note (& inote);
12165 process_corefile_note_segments (FILE * file)
12167 Elf_Internal_Phdr * segment;
12171 if (! get_program_headers (file))
12174 for (i = 0, segment = program_headers;
12175 i < elf_header.e_phnum;
12178 if (segment->p_type == PT_NOTE)
12179 res &= process_corefile_note_segment (file,
12180 (bfd_vma) segment->p_offset,
12181 (bfd_vma) segment->p_filesz);
12188 process_note_sections (FILE * file)
12190 Elf_Internal_Shdr * section;
12194 for (i = 0, section = section_headers;
12195 i < elf_header.e_shnum;
12197 if (section->sh_type == SHT_NOTE)
12198 res &= process_corefile_note_segment (file,
12199 (bfd_vma) section->sh_offset,
12200 (bfd_vma) section->sh_size);
12206 process_notes (FILE * file)
12208 /* If we have not been asked to display the notes then do nothing. */
12212 if (elf_header.e_type != ET_CORE)
12213 return process_note_sections (file);
12215 /* No program headers means no NOTE segment. */
12216 if (elf_header.e_phnum > 0)
12217 return process_corefile_note_segments (file);
12219 printf (_("No note segments present in the core file.\n"));
12224 process_arch_specific (FILE * file)
12229 switch (elf_header.e_machine)
12232 return process_arm_specific (file);
12234 case EM_MIPS_RS3_LE:
12235 return process_mips_specific (file);
12238 return process_power_specific (file);
12241 return process_tic6x_specific (file);
12250 get_file_header (FILE * file)
12252 /* Read in the identity array. */
12253 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
12256 /* Determine how to read the rest of the header. */
12257 switch (elf_header.e_ident[EI_DATA])
12259 default: /* fall through */
12260 case ELFDATANONE: /* fall through */
12262 byte_get = byte_get_little_endian;
12263 byte_put = byte_put_little_endian;
12266 byte_get = byte_get_big_endian;
12267 byte_put = byte_put_big_endian;
12271 /* For now we only support 32 bit and 64 bit ELF files. */
12272 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
12274 /* Read in the rest of the header. */
12277 Elf32_External_Ehdr ehdr32;
12279 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
12282 elf_header.e_type = BYTE_GET (ehdr32.e_type);
12283 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
12284 elf_header.e_version = BYTE_GET (ehdr32.e_version);
12285 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
12286 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
12287 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
12288 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
12289 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
12290 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
12291 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
12292 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
12293 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
12294 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
12298 Elf64_External_Ehdr ehdr64;
12300 /* If we have been compiled with sizeof (bfd_vma) == 4, then
12301 we will not be able to cope with the 64bit data found in
12302 64 ELF files. Detect this now and abort before we start
12303 overwriting things. */
12304 if (sizeof (bfd_vma) < 8)
12306 error (_("This instance of readelf has been built without support for a\n\
12307 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12311 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
12314 elf_header.e_type = BYTE_GET (ehdr64.e_type);
12315 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
12316 elf_header.e_version = BYTE_GET (ehdr64.e_version);
12317 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
12318 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
12319 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
12320 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
12321 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
12322 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
12323 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
12324 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
12325 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
12326 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
12329 if (elf_header.e_shoff)
12331 /* There may be some extensions in the first section header. Don't
12332 bomb if we can't read it. */
12334 get_32bit_section_headers (file, 1);
12336 get_64bit_section_headers (file, 1);
12342 /* Process one ELF object file according to the command line options.
12343 This file may actually be stored in an archive. The file is
12344 positioned at the start of the ELF object. */
12347 process_object (char * file_name, FILE * file)
12351 if (! get_file_header (file))
12353 error (_("%s: Failed to read file header\n"), file_name);
12357 /* Initialise per file variables. */
12358 for (i = ARRAY_SIZE (version_info); i--;)
12359 version_info[i] = 0;
12361 for (i = ARRAY_SIZE (dynamic_info); i--;)
12362 dynamic_info[i] = 0;
12364 /* Process the file. */
12366 printf (_("\nFile: %s\n"), file_name);
12368 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12369 Note we do this even if cmdline_dump_sects is empty because we
12370 must make sure that the dump_sets array is zeroed out before each
12371 object file is processed. */
12372 if (num_dump_sects > num_cmdline_dump_sects)
12373 memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
12375 if (num_cmdline_dump_sects > 0)
12377 if (num_dump_sects == 0)
12378 /* A sneaky way of allocating the dump_sects array. */
12379 request_dump_bynumber (num_cmdline_dump_sects, 0);
12381 assert (num_dump_sects >= num_cmdline_dump_sects);
12382 memcpy (dump_sects, cmdline_dump_sects,
12383 num_cmdline_dump_sects * sizeof (* dump_sects));
12386 if (! process_file_header ())
12389 if (! process_section_headers (file))
12391 /* Without loaded section headers we cannot process lots of
12393 do_unwind = do_version = do_dump = do_arch = 0;
12395 if (! do_using_dynamic)
12396 do_syms = do_dyn_syms = do_reloc = 0;
12399 if (! process_section_groups (file))
12401 /* Without loaded section groups we cannot process unwind. */
12405 if (process_program_headers (file))
12406 process_dynamic_section (file);
12408 process_relocs (file);
12410 process_unwind (file);
12412 process_symbol_table (file);
12414 process_syminfo (file);
12416 process_version_sections (file);
12418 process_section_contents (file);
12420 process_notes (file);
12422 process_gnu_liblist (file);
12424 process_arch_specific (file);
12426 if (program_headers)
12428 free (program_headers);
12429 program_headers = NULL;
12432 if (section_headers)
12434 free (section_headers);
12435 section_headers = NULL;
12440 free (string_table);
12441 string_table = NULL;
12442 string_table_length = 0;
12445 if (dynamic_strings)
12447 free (dynamic_strings);
12448 dynamic_strings = NULL;
12449 dynamic_strings_length = 0;
12452 if (dynamic_symbols)
12454 free (dynamic_symbols);
12455 dynamic_symbols = NULL;
12456 num_dynamic_syms = 0;
12459 if (dynamic_syminfo)
12461 free (dynamic_syminfo);
12462 dynamic_syminfo = NULL;
12465 if (section_headers_groups)
12467 free (section_headers_groups);
12468 section_headers_groups = NULL;
12471 if (section_groups)
12473 struct group_list * g;
12474 struct group_list * next;
12476 for (i = 0; i < group_count; i++)
12478 for (g = section_groups [i].root; g != NULL; g = next)
12485 free (section_groups);
12486 section_groups = NULL;
12489 free_debug_memory ();
12494 /* Return the path name for a proxy entry in a thin archive, adjusted relative
12495 to the path name of the thin archive itself if necessary. Always returns
12496 a pointer to malloc'ed memory. */
12499 adjust_relative_path (char * file_name, char * name, int name_len)
12501 char * member_file_name;
12502 const char * base_name = lbasename (file_name);
12504 /* This is a proxy entry for a thin archive member.
12505 If the extended name table contains an absolute path
12506 name, or if the archive is in the current directory,
12507 use the path name as given. Otherwise, we need to
12508 find the member relative to the directory where the
12509 archive is located. */
12510 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
12512 member_file_name = (char *) malloc (name_len + 1);
12513 if (member_file_name == NULL)
12515 error (_("Out of memory\n"));
12518 memcpy (member_file_name, name, name_len);
12519 member_file_name[name_len] = '\0';
12523 /* Concatenate the path components of the archive file name
12524 to the relative path name from the extended name table. */
12525 size_t prefix_len = base_name - file_name;
12526 member_file_name = (char *) malloc (prefix_len + name_len + 1);
12527 if (member_file_name == NULL)
12529 error (_("Out of memory\n"));
12532 memcpy (member_file_name, file_name, prefix_len);
12533 memcpy (member_file_name + prefix_len, name, name_len);
12534 member_file_name[prefix_len + name_len] = '\0';
12536 return member_file_name;
12539 /* Structure to hold information about an archive file. */
12541 struct archive_info
12543 char * file_name; /* Archive file name. */
12544 FILE * file; /* Open file descriptor. */
12545 unsigned long index_num; /* Number of symbols in table. */
12546 unsigned long * index_array; /* The array of member offsets. */
12547 char * sym_table; /* The symbol table. */
12548 unsigned long sym_size; /* Size of the symbol table. */
12549 char * longnames; /* The long file names table. */
12550 unsigned long longnames_size; /* Size of the long file names table. */
12551 unsigned long nested_member_origin; /* Origin in the nested archive of the current member. */
12552 unsigned long next_arhdr_offset; /* Offset of the next archive header. */
12553 bfd_boolean is_thin_archive; /* TRUE if this is a thin archive. */
12554 struct ar_hdr arhdr; /* Current archive header. */
12557 /* Read the symbol table and long-name table from an archive. */
12560 setup_archive (struct archive_info * arch, char * file_name, FILE * file,
12561 bfd_boolean is_thin_archive, bfd_boolean read_symbols)
12564 unsigned long size;
12566 arch->file_name = strdup (file_name);
12568 arch->index_num = 0;
12569 arch->index_array = NULL;
12570 arch->sym_table = NULL;
12571 arch->sym_size = 0;
12572 arch->longnames = NULL;
12573 arch->longnames_size = 0;
12574 arch->nested_member_origin = 0;
12575 arch->is_thin_archive = is_thin_archive;
12576 arch->next_arhdr_offset = SARMAG;
12578 /* Read the first archive member header. */
12579 if (fseek (file, SARMAG, SEEK_SET) != 0)
12581 error (_("%s: failed to seek to first archive header\n"), file_name);
12584 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12585 if (got != sizeof arch->arhdr)
12590 error (_("%s: failed to read archive header\n"), file_name);
12594 /* See if this is the archive symbol table. */
12595 if (const_strneq (arch->arhdr.ar_name, "/ ")
12596 || const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
12598 size = strtoul (arch->arhdr.ar_size, NULL, 10);
12599 size = size + (size & 1);
12601 arch->next_arhdr_offset += sizeof arch->arhdr + size;
12606 /* A buffer used to hold numbers read in from an archive index.
12607 These are always 4 bytes long and stored in big-endian format. */
12608 #define SIZEOF_AR_INDEX_NUMBERS 4
12609 unsigned char integer_buffer[SIZEOF_AR_INDEX_NUMBERS];
12610 unsigned char * index_buffer;
12612 /* Check the size of the archive index. */
12613 if (size < SIZEOF_AR_INDEX_NUMBERS)
12615 error (_("%s: the archive index is empty\n"), file_name);
12619 /* Read the numer of entries in the archive index. */
12620 got = fread (integer_buffer, 1, sizeof integer_buffer, file);
12621 if (got != sizeof (integer_buffer))
12623 error (_("%s: failed to read archive index\n"), file_name);
12626 arch->index_num = byte_get_big_endian (integer_buffer, sizeof integer_buffer);
12627 size -= SIZEOF_AR_INDEX_NUMBERS;
12629 /* Read in the archive index. */
12630 if (size < arch->index_num * SIZEOF_AR_INDEX_NUMBERS)
12632 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
12633 file_name, arch->index_num);
12636 index_buffer = (unsigned char *)
12637 malloc (arch->index_num * SIZEOF_AR_INDEX_NUMBERS);
12638 if (index_buffer == NULL)
12640 error (_("Out of memory whilst trying to read archive symbol index\n"));
12643 got = fread (index_buffer, SIZEOF_AR_INDEX_NUMBERS, arch->index_num, file);
12644 if (got != arch->index_num)
12646 free (index_buffer);
12647 error (_("%s: failed to read archive index\n"), file_name);
12650 size -= arch->index_num * SIZEOF_AR_INDEX_NUMBERS;
12652 /* Convert the index numbers into the host's numeric format. */
12653 arch->index_array = (long unsigned int *)
12654 malloc (arch->index_num * sizeof (* arch->index_array));
12655 if (arch->index_array == NULL)
12657 free (index_buffer);
12658 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
12662 for (i = 0; i < arch->index_num; i++)
12663 arch->index_array[i] = byte_get_big_endian ((unsigned char *) (index_buffer + (i * SIZEOF_AR_INDEX_NUMBERS)),
12664 SIZEOF_AR_INDEX_NUMBERS);
12665 free (index_buffer);
12667 /* The remaining space in the header is taken up by the symbol table. */
12670 error (_("%s: the archive has an index but no symbols\n"), file_name);
12673 arch->sym_table = (char *) malloc (size);
12674 arch->sym_size = size;
12675 if (arch->sym_table == NULL)
12677 error (_("Out of memory whilst trying to read archive index symbol table\n"));
12680 got = fread (arch->sym_table, 1, size, file);
12683 error (_("%s: failed to read archive index symbol table\n"), file_name);
12689 if (fseek (file, size, SEEK_CUR) != 0)
12691 error (_("%s: failed to skip archive symbol table\n"), file_name);
12696 /* Read the next archive header. */
12697 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
12698 if (got != sizeof arch->arhdr)
12702 error (_("%s: failed to read archive header following archive index\n"), file_name);
12706 else if (read_symbols)
12707 printf (_("%s has no archive index\n"), file_name);
12709 if (const_strneq (arch->arhdr.ar_name, "// "))
12711 /* This is the archive string table holding long member names. */
12712 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
12713 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
12715 arch->longnames = (char *) malloc (arch->longnames_size);
12716 if (arch->longnames == NULL)
12718 error (_("Out of memory reading long symbol names in archive\n"));
12722 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
12724 free (arch->longnames);
12725 arch->longnames = NULL;
12726 error (_("%s: failed to read long symbol name string table\n"), file_name);
12730 if ((arch->longnames_size & 1) != 0)
12737 /* Release the memory used for the archive information. */
12740 release_archive (struct archive_info * arch)
12742 if (arch->file_name != NULL)
12743 free (arch->file_name);
12744 if (arch->index_array != NULL)
12745 free (arch->index_array);
12746 if (arch->sym_table != NULL)
12747 free (arch->sym_table);
12748 if (arch->longnames != NULL)
12749 free (arch->longnames);
12752 /* Open and setup a nested archive, if not already open. */
12755 setup_nested_archive (struct archive_info * nested_arch, char * member_file_name)
12757 FILE * member_file;
12759 /* Have we already setup this archive? */
12760 if (nested_arch->file_name != NULL
12761 && streq (nested_arch->file_name, member_file_name))
12764 /* Close previous file and discard cached information. */
12765 if (nested_arch->file != NULL)
12766 fclose (nested_arch->file);
12767 release_archive (nested_arch);
12769 member_file = fopen (member_file_name, "rb");
12770 if (member_file == NULL)
12772 return setup_archive (nested_arch, member_file_name, member_file, FALSE, FALSE);
12776 get_archive_member_name_at (struct archive_info * arch,
12777 unsigned long offset,
12778 struct archive_info * nested_arch);
12780 /* Get the name of an archive member from the current archive header.
12781 For simple names, this will modify the ar_name field of the current
12782 archive header. For long names, it will return a pointer to the
12783 longnames table. For nested archives, it will open the nested archive
12784 and get the name recursively. NESTED_ARCH is a single-entry cache so
12785 we don't keep rereading the same information from a nested archive. */
12788 get_archive_member_name (struct archive_info * arch,
12789 struct archive_info * nested_arch)
12791 unsigned long j, k;
12793 if (arch->arhdr.ar_name[0] == '/')
12795 /* We have a long name. */
12797 char * member_file_name;
12798 char * member_name;
12800 arch->nested_member_origin = 0;
12801 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
12802 if (arch->is_thin_archive && endp != NULL && * endp == ':')
12803 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
12805 while ((j < arch->longnames_size)
12806 && (arch->longnames[j] != '\n')
12807 && (arch->longnames[j] != '\0'))
12809 if (arch->longnames[j-1] == '/')
12811 arch->longnames[j] = '\0';
12813 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
12814 return arch->longnames + k;
12816 /* This is a proxy for a member of a nested archive.
12817 Find the name of the member in that archive. */
12818 member_file_name = adjust_relative_path (arch->file_name, arch->longnames + k, j - k);
12819 if (member_file_name != NULL
12820 && setup_nested_archive (nested_arch, member_file_name) == 0
12821 && (member_name = get_archive_member_name_at (nested_arch, arch->nested_member_origin, NULL)) != NULL)
12823 free (member_file_name);
12824 return member_name;
12826 free (member_file_name);
12828 /* Last resort: just return the name of the nested archive. */
12829 return arch->longnames + k;
12832 /* We have a normal (short) name. */
12834 while ((arch->arhdr.ar_name[j] != '/')
12835 && (j < sizeof (arch->arhdr.ar_name) - 1))
12837 arch->arhdr.ar_name[j] = '\0';
12838 return arch->arhdr.ar_name;
12841 /* Get the name of an archive member at a given OFFSET within an archive ARCH. */
12844 get_archive_member_name_at (struct archive_info * arch,
12845 unsigned long offset,
12846 struct archive_info * nested_arch)
12850 if (fseek (arch->file, offset, SEEK_SET) != 0)
12852 error (_("%s: failed to seek to next file name\n"), arch->file_name);
12855 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
12856 if (got != sizeof arch->arhdr)
12858 error (_("%s: failed to read archive header\n"), arch->file_name);
12861 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
12863 error (_("%s: did not find a valid archive header\n"), arch->file_name);
12867 return get_archive_member_name (arch, nested_arch);
12870 /* Construct a string showing the name of the archive member, qualified
12871 with the name of the containing archive file. For thin archives, we
12872 use square brackets to denote the indirection. For nested archives,
12873 we show the qualified name of the external member inside the square
12874 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
12877 make_qualified_name (struct archive_info * arch,
12878 struct archive_info * nested_arch,
12879 char * member_name)
12884 len = strlen (arch->file_name) + strlen (member_name) + 3;
12885 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12886 len += strlen (nested_arch->file_name) + 2;
12888 name = (char *) malloc (len);
12891 error (_("Out of memory\n"));
12895 if (arch->is_thin_archive && arch->nested_member_origin != 0)
12896 snprintf (name, len, "%s[%s(%s)]", arch->file_name, nested_arch->file_name, member_name);
12897 else if (arch->is_thin_archive)
12898 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
12900 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
12905 /* Process an ELF archive.
12906 On entry the file is positioned just after the ARMAG string. */
12909 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
12911 struct archive_info arch;
12912 struct archive_info nested_arch;
12918 /* The ARCH structure is used to hold information about this archive. */
12919 arch.file_name = NULL;
12921 arch.index_array = NULL;
12922 arch.sym_table = NULL;
12923 arch.longnames = NULL;
12925 /* The NESTED_ARCH structure is used as a single-item cache of information
12926 about a nested archive (when members of a thin archive reside within
12927 another regular archive file). */
12928 nested_arch.file_name = NULL;
12929 nested_arch.file = NULL;
12930 nested_arch.index_array = NULL;
12931 nested_arch.sym_table = NULL;
12932 nested_arch.longnames = NULL;
12934 if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
12940 if (do_archive_index)
12942 if (arch.sym_table == NULL)
12943 error (_("%s: unable to dump the index as none was found\n"), file_name);
12947 unsigned long current_pos;
12949 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
12950 file_name, arch.index_num, arch.sym_size);
12951 current_pos = ftell (file);
12953 for (i = l = 0; i < arch.index_num; i++)
12955 if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
12957 char * member_name;
12959 member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
12961 if (member_name != NULL)
12963 char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
12965 if (qualified_name != NULL)
12967 printf (_("Binary %s contains:\n"), qualified_name);
12968 free (qualified_name);
12973 if (l >= arch.sym_size)
12975 error (_("%s: end of the symbol table reached before the end of the index\n"),
12979 printf ("\t%s\n", arch.sym_table + l);
12980 l += strlen (arch.sym_table + l) + 1;
12985 if (l < arch.sym_size)
12986 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
12989 if (fseek (file, current_pos, SEEK_SET) != 0)
12991 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
12997 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
12998 && !do_segments && !do_header && !do_dump && !do_version
12999 && !do_histogram && !do_debugging && !do_arch && !do_notes
13000 && !do_section_groups && !do_dyn_syms)
13002 ret = 0; /* Archive index only. */
13013 char * qualified_name;
13015 /* Read the next archive header. */
13016 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
13018 error (_("%s: failed to seek to next archive header\n"), file_name);
13021 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
13022 if (got != sizeof arch.arhdr)
13026 error (_("%s: failed to read archive header\n"), file_name);
13030 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
13032 error (_("%s: did not find a valid archive header\n"), arch.file_name);
13037 arch.next_arhdr_offset += sizeof arch.arhdr;
13039 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
13040 if (archive_file_size & 01)
13041 ++archive_file_size;
13043 name = get_archive_member_name (&arch, &nested_arch);
13046 error (_("%s: bad archive file name\n"), file_name);
13050 namelen = strlen (name);
13052 qualified_name = make_qualified_name (&arch, &nested_arch, name);
13053 if (qualified_name == NULL)
13055 error (_("%s: bad archive file name\n"), file_name);
13060 if (is_thin_archive && arch.nested_member_origin == 0)
13062 /* This is a proxy for an external member of a thin archive. */
13063 FILE * member_file;
13064 char * member_file_name = adjust_relative_path (file_name, name, namelen);
13065 if (member_file_name == NULL)
13071 member_file = fopen (member_file_name, "rb");
13072 if (member_file == NULL)
13074 error (_("Input file '%s' is not readable.\n"), member_file_name);
13075 free (member_file_name);
13080 archive_file_offset = arch.nested_member_origin;
13082 ret |= process_object (qualified_name, member_file);
13084 fclose (member_file);
13085 free (member_file_name);
13087 else if (is_thin_archive)
13089 /* This is a proxy for a member of a nested archive. */
13090 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
13092 /* The nested archive file will have been opened and setup by
13093 get_archive_member_name. */
13094 if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
13096 error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
13101 ret |= process_object (qualified_name, nested_arch.file);
13105 archive_file_offset = arch.next_arhdr_offset;
13106 arch.next_arhdr_offset += archive_file_size;
13108 ret |= process_object (qualified_name, file);
13111 free (qualified_name);
13115 if (nested_arch.file != NULL)
13116 fclose (nested_arch.file);
13117 release_archive (&nested_arch);
13118 release_archive (&arch);
13124 process_file (char * file_name)
13127 struct stat statbuf;
13128 char armag[SARMAG];
13131 if (stat (file_name, &statbuf) < 0)
13133 if (errno == ENOENT)
13134 error (_("'%s': No such file\n"), file_name);
13136 error (_("Could not locate '%s'. System error message: %s\n"),
13137 file_name, strerror (errno));
13141 if (! S_ISREG (statbuf.st_mode))
13143 error (_("'%s' is not an ordinary file\n"), file_name);
13147 file = fopen (file_name, "rb");
13150 error (_("Input file '%s' is not readable.\n"), file_name);
13154 if (fread (armag, SARMAG, 1, file) != 1)
13156 error (_("%s: Failed to read file's magic number\n"), file_name);
13161 if (memcmp (armag, ARMAG, SARMAG) == 0)
13162 ret = process_archive (file_name, file, FALSE);
13163 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
13164 ret = process_archive (file_name, file, TRUE);
13167 if (do_archive_index)
13168 error (_("File %s is not an archive so its index cannot be displayed.\n"),
13172 archive_file_size = archive_file_offset = 0;
13173 ret = process_object (file_name, file);
13181 #ifdef SUPPORT_DISASSEMBLY
13182 /* Needed by the i386 disassembler. For extra credit, someone could
13183 fix this so that we insert symbolic addresses here, esp for GOT/PLT
13187 print_address (unsigned int addr, FILE * outfile)
13189 fprintf (outfile,"0x%8.8x", addr);
13192 /* Needed by the i386 disassembler. */
13194 db_task_printsym (unsigned int addr)
13196 print_address (addr, stderr);
13201 main (int argc, char ** argv)
13205 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
13206 setlocale (LC_MESSAGES, "");
13208 #if defined (HAVE_SETLOCALE)
13209 setlocale (LC_CTYPE, "");
13211 bindtextdomain (PACKAGE, LOCALEDIR);
13212 textdomain (PACKAGE);
13214 expandargv (&argc, &argv);
13216 parse_args (argc, argv);
13218 if (num_dump_sects > 0)
13220 /* Make a copy of the dump_sects array. */
13221 cmdline_dump_sects = (dump_type *)
13222 malloc (num_dump_sects * sizeof (* dump_sects));
13223 if (cmdline_dump_sects == NULL)
13224 error (_("Out of memory allocating dump request table.\n"));
13227 memcpy (cmdline_dump_sects, dump_sects,
13228 num_dump_sects * sizeof (* dump_sects));
13229 num_cmdline_dump_sects = num_dump_sects;
13233 if (optind < (argc - 1))
13237 while (optind < argc)
13238 err |= process_file (argv[optind++]);
13240 if (dump_sects != NULL)
13242 if (cmdline_dump_sects != NULL)
13243 free (cmdline_dump_sects);