1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
64 /* The following headers use the elf/reloc-macros.h file to
65 automatically generate relocation recognition functions
66 such as elf_mips_reloc_type() */
68 #define RELOC_MACROS_GEN_FUNC
70 #include "elf/alpha.h"
92 #include "elf/m68hc11.h"
93 #include "elf/mcore.h"
96 #include "elf/mn10200.h"
97 #include "elf/mn10300.h"
99 #include "elf/msp430.h"
100 #include "elf/or32.h"
103 #include "elf/ppc64.h"
104 #include "elf/s390.h"
106 #include "elf/sparc.h"
107 #include "elf/v850.h"
109 #include "elf/x86-64.h"
110 #include "elf/xstormy16.h"
112 #include "elf/iq2000.h"
113 #include "elf/xtensa.h"
119 #include "libiberty.h"
121 char *program_name = "readelf";
122 static long archive_file_offset;
123 static unsigned long archive_file_size;
124 static unsigned long dynamic_addr;
125 static bfd_size_type dynamic_size;
126 static unsigned int dynamic_nent;
127 static char *dynamic_strings;
128 static unsigned long dynamic_strings_length;
129 static char *string_table;
130 static unsigned long string_table_length;
131 static unsigned long num_dynamic_syms;
132 static Elf_Internal_Sym *dynamic_symbols;
133 static Elf_Internal_Syminfo *dynamic_syminfo;
134 static unsigned long dynamic_syminfo_offset;
135 static unsigned int dynamic_syminfo_nent;
136 static char program_interpreter[64];
137 static bfd_vma dynamic_info[DT_JMPREL + 1];
138 static bfd_vma dynamic_info_DT_GNU_HASH;
139 static bfd_vma version_info[16];
140 static Elf_Internal_Ehdr elf_header;
141 static Elf_Internal_Shdr *section_headers;
142 static Elf_Internal_Phdr *program_headers;
143 static Elf_Internal_Dyn *dynamic_section;
144 static Elf_Internal_Shdr *symtab_shndx_hdr;
145 static int show_name;
146 static int do_dynamic;
149 static int do_sections;
150 static int do_section_groups;
151 static int do_section_details;
152 static int do_segments;
153 static int do_unwind;
154 static int do_using_dynamic;
155 static int do_header;
157 static int do_version;
159 static int do_histogram;
160 static int do_debugging;
163 static int is_32bit_elf;
167 struct group_list *next;
168 unsigned int section_index;
173 struct group_list *root;
174 unsigned int group_index;
177 static size_t group_count;
178 static struct group *section_groups;
179 static struct group **section_headers_groups;
181 /* A linked list of the section names for which dumps were requested
183 struct dump_list_entry
187 struct dump_list_entry *next;
189 static struct dump_list_entry *dump_sects_byname;
191 /* A dynamic array of flags indicating for which sections a hex dump
192 has been requested (via the -x switch) and/or a disassembly dump
193 (via the -i switch). */
194 char *cmdline_dump_sects = NULL;
195 unsigned num_cmdline_dump_sects = 0;
197 /* A dynamic array of flags indicating for which sections a dump of
198 some kind has been requested. It is reset on a per-object file
199 basis and then initialised from the cmdline_dump_sects array,
200 the results of interpreting the -w switch, and the
201 dump_sects_byname list. */
202 char *dump_sects = NULL;
203 unsigned int num_dump_sects = 0;
205 #define HEX_DUMP (1 << 0)
206 #define DISASS_DUMP (1 << 1)
207 #define DEBUG_DUMP (1 << 2)
209 /* How to print a vma value. */
210 typedef enum print_mode
222 static void (*byte_put) (unsigned char *, bfd_vma, int);
226 #define SECTION_NAME(X) \
227 ((X) == NULL ? "<none>" \
228 : string_table == NULL ? "<no-name>" \
229 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
230 : string_table + (X)->sh_name))
232 /* Given st_shndx I, map to section_headers index. */
233 #define SECTION_HEADER_INDEX(I) \
234 ((I) < SHN_LORESERVE \
236 : ((I) <= SHN_HIRESERVE \
238 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
240 /* Reverse of the above. */
241 #define SECTION_HEADER_NUM(N) \
242 ((N) < SHN_LORESERVE \
244 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
246 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
248 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
250 #define BYTE_GET(field) byte_get (field, sizeof (field))
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_ELF_SYMBOLS(file, section) \
255 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
256 : get_64bit_elf_symbols (file, section))
258 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
259 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
260 already been called and verified that the string exists. */
261 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
263 /* This is just a bit of syntatic sugar. */
264 #define streq(a,b) (strcmp ((a), (b)) == 0)
265 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
268 get_data (void *var, FILE *file, long offset, size_t size, size_t nmemb,
273 if (size == 0 || nmemb == 0)
276 if (fseek (file, archive_file_offset + offset, SEEK_SET))
278 error (_("Unable to seek to 0x%lx for %s\n"),
279 archive_file_offset + offset, reason);
286 /* Check for overflow. */
287 if (nmemb < (~(size_t) 0 - 1) / size)
288 /* + 1 so that we can '\0' terminate invalid string table sections. */
289 mvar = malloc (size * nmemb + 1);
293 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
294 (unsigned long)(size * nmemb), reason);
298 ((char *) mvar)[size * nmemb] = '\0';
301 if (fread (mvar, size, nmemb, file) != nmemb)
303 error (_("Unable to read in 0x%lx bytes of %s\n"),
304 (unsigned long)(size * nmemb), reason);
314 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
319 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
320 field[6] = ((value >> 24) >> 24) & 0xff;
321 field[5] = ((value >> 24) >> 16) & 0xff;
322 field[4] = ((value >> 24) >> 8) & 0xff;
325 field[3] = (value >> 24) & 0xff;
326 field[2] = (value >> 16) & 0xff;
329 field[1] = (value >> 8) & 0xff;
332 field[0] = value & 0xff;
336 error (_("Unhandled data length: %d\n"), size);
341 #if defined BFD64 && !BFD_HOST_64BIT_LONG
343 print_dec_vma (bfd_vma vma, int is_signed)
349 if (is_signed && (bfd_signed_vma) vma < 0)
358 *bufp++ = '0' + vma % 10;
370 print_hex_vma (bfd_vma vma)
378 char digit = '0' + (vma & 0x0f);
380 digit += 'a' - '0' - 10;
393 /* Print a VMA value. */
395 print_vma (bfd_vma vma, print_mode mode)
404 return printf ("0x%8.8lx", (unsigned long) vma);
407 return printf ("%8.8lx", (unsigned long) vma);
411 return printf ("%5ld", (long) vma);
415 return printf ("0x%lx", (unsigned long) vma);
418 return printf ("%lx", (unsigned long) vma);
421 return printf ("%ld", (unsigned long) vma);
424 return printf ("%lu", (unsigned long) vma);
447 #if BFD_HOST_64BIT_LONG
448 return nc + printf ("%lx", vma);
450 return nc + print_hex_vma (vma);
454 #if BFD_HOST_64BIT_LONG
455 return printf ("%ld", vma);
457 return print_dec_vma (vma, 1);
461 #if BFD_HOST_64BIT_LONG
463 return printf ("%5ld", vma);
465 return printf ("%#lx", vma);
468 return printf ("%5ld", _bfd_int64_low (vma));
470 return print_hex_vma (vma);
474 #if BFD_HOST_64BIT_LONG
475 return printf ("%lu", vma);
477 return print_dec_vma (vma, 0);
485 /* Display a symbol on stdout. If do_wide is not true then
486 format the symbol to be at most WIDTH characters,
487 truncating as necessary. If WIDTH is negative then
488 format the string to be exactly - WIDTH characters,
489 truncating or padding as necessary. */
492 print_symbol (int width, const char *symbol)
495 printf ("%s", symbol);
497 printf ("%-*.*s", width, width, symbol);
499 printf ("%-.*s", width, symbol);
503 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
508 field[7] = value & 0xff;
509 field[6] = (value >> 8) & 0xff;
510 field[5] = (value >> 16) & 0xff;
511 field[4] = (value >> 24) & 0xff;
516 field[3] = value & 0xff;
517 field[2] = (value >> 8) & 0xff;
521 field[1] = value & 0xff;
525 field[0] = value & 0xff;
529 error (_("Unhandled data length: %d\n"), size);
534 /* Return a pointer to section NAME, or NULL if no such section exists. */
536 static Elf_Internal_Shdr *
537 find_section (const char *name)
541 for (i = 0; i < elf_header.e_shnum; i++)
542 if (streq (SECTION_NAME (section_headers + i), name))
543 return section_headers + i;
548 /* Guess the relocation size commonly used by the specific machines. */
551 guess_is_rela (unsigned long e_machine)
555 /* Targets that use REL relocations. */
570 /* Targets that use RELA relocations. */
585 case EM_CYGNUS_MN10200:
587 case EM_CYGNUS_MN10300:
618 case EM_ALTERA_NIOS2:
639 warn (_("Don't know about relocations on this machine architecture\n"));
645 slurp_rela_relocs (FILE *file,
646 unsigned long rel_offset,
647 unsigned long rel_size,
648 Elf_Internal_Rela **relasp,
649 unsigned long *nrelasp)
651 Elf_Internal_Rela *relas;
652 unsigned long nrelas;
657 Elf32_External_Rela *erelas;
659 erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
663 nrelas = rel_size / sizeof (Elf32_External_Rela);
665 relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
670 error (_("out of memory parsing relocs"));
674 for (i = 0; i < nrelas; i++)
676 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
677 relas[i].r_info = BYTE_GET (erelas[i].r_info);
678 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
685 Elf64_External_Rela *erelas;
687 erelas = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
691 nrelas = rel_size / sizeof (Elf64_External_Rela);
693 relas = cmalloc (nrelas, sizeof (Elf_Internal_Rela));
698 error (_("out of memory parsing relocs"));
702 for (i = 0; i < nrelas; i++)
704 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
705 relas[i].r_info = BYTE_GET (erelas[i].r_info);
706 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
717 slurp_rel_relocs (FILE *file,
718 unsigned long rel_offset,
719 unsigned long rel_size,
720 Elf_Internal_Rela **relsp,
721 unsigned long *nrelsp)
723 Elf_Internal_Rela *rels;
729 Elf32_External_Rel *erels;
731 erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
735 nrels = rel_size / sizeof (Elf32_External_Rel);
737 rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
742 error (_("out of memory parsing relocs"));
746 for (i = 0; i < nrels; i++)
748 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
749 rels[i].r_info = BYTE_GET (erels[i].r_info);
750 rels[i].r_addend = 0;
757 Elf64_External_Rel *erels;
759 erels = get_data (NULL, file, rel_offset, 1, rel_size, _("relocs"));
763 nrels = rel_size / sizeof (Elf64_External_Rel);
765 rels = cmalloc (nrels, sizeof (Elf_Internal_Rela));
770 error (_("out of memory parsing relocs"));
774 for (i = 0; i < nrels; i++)
776 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
777 rels[i].r_info = BYTE_GET (erels[i].r_info);
778 rels[i].r_addend = 0;
788 /* Display the contents of the relocation data found at the specified
792 dump_relocations (FILE *file,
793 unsigned long rel_offset,
794 unsigned long rel_size,
795 Elf_Internal_Sym *symtab,
798 unsigned long strtablen,
802 Elf_Internal_Rela *rels;
805 if (is_rela == UNKNOWN)
806 is_rela = guess_is_rela (elf_header.e_machine);
810 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
815 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
824 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
826 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
831 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
833 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
841 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
843 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
848 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
850 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
854 for (i = 0; i < rel_size; i++)
857 const char *rtype2 = NULL;
858 const char *rtype3 = NULL;
861 bfd_vma symtab_index;
866 offset = rels[i].r_offset;
867 info = rels[i].r_info;
871 type = ELF32_R_TYPE (info);
872 symtab_index = ELF32_R_SYM (info);
876 /* The #ifdef BFD64 below is to prevent a compile time warning.
877 We know that if we do not have a 64 bit data type that we
878 will never execute this code anyway. */
880 if (elf_header.e_machine == EM_MIPS)
882 /* In little-endian objects, r_info isn't really a 64-bit
883 little-endian value: it has a 32-bit little-endian
884 symbol index followed by four individual byte fields.
885 Reorder INFO accordingly. */
886 if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
887 info = (((info & 0xffffffff) << 32)
888 | ((info >> 56) & 0xff)
889 | ((info >> 40) & 0xff00)
890 | ((info >> 24) & 0xff0000)
891 | ((info >> 8) & 0xff000000));
892 type = ELF64_MIPS_R_TYPE (info);
893 type2 = ELF64_MIPS_R_TYPE2 (info);
894 type3 = ELF64_MIPS_R_TYPE3 (info);
896 else if (elf_header.e_machine == EM_SPARCV9)
897 type = ELF64_R_TYPE_ID (info);
899 type = ELF64_R_TYPE (info);
901 symtab_index = ELF64_R_SYM (info);
907 #ifdef _bfd_int64_low
908 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
910 printf ("%8.8lx %8.8lx ", offset, info);
915 #ifdef _bfd_int64_low
917 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
918 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
919 _bfd_int64_high (offset),
920 _bfd_int64_low (offset),
921 _bfd_int64_high (info),
922 _bfd_int64_low (info));
925 ? "%16.16lx %16.16lx "
926 : "%12.12lx %12.12lx ",
931 switch (elf_header.e_machine)
939 rtype = elf_m32r_reloc_type (type);
944 rtype = elf_i386_reloc_type (type);
949 rtype = elf_m68hc11_reloc_type (type);
953 rtype = elf_m68k_reloc_type (type);
957 rtype = elf_i960_reloc_type (type);
962 rtype = elf_avr_reloc_type (type);
969 rtype = elf_sparc_reloc_type (type);
974 rtype = v850_reloc_type (type);
979 rtype = elf_d10v_reloc_type (type);
984 rtype = elf_d30v_reloc_type (type);
988 rtype = elf_dlx_reloc_type (type);
992 rtype = elf_sh_reloc_type (type);
996 case EM_CYGNUS_MN10300:
997 rtype = elf_mn10300_reloc_type (type);
1001 case EM_CYGNUS_MN10200:
1002 rtype = elf_mn10200_reloc_type (type);
1006 case EM_CYGNUS_FR30:
1007 rtype = elf_fr30_reloc_type (type);
1011 rtype = elf_frv_reloc_type (type);
1015 rtype = elf_mcore_reloc_type (type);
1019 rtype = elf_mmix_reloc_type (type);
1024 rtype = elf_msp430_reloc_type (type);
1028 rtype = elf_ppc_reloc_type (type);
1032 rtype = elf_ppc64_reloc_type (type);
1036 case EM_MIPS_RS3_LE:
1037 rtype = elf_mips_reloc_type (type);
1040 rtype2 = elf_mips_reloc_type (type2);
1041 rtype3 = elf_mips_reloc_type (type3);
1046 rtype = elf_alpha_reloc_type (type);
1050 rtype = elf_arm_reloc_type (type);
1054 rtype = elf_arc_reloc_type (type);
1058 rtype = elf_hppa_reloc_type (type);
1064 rtype = elf_h8_reloc_type (type);
1069 rtype = elf_or32_reloc_type (type);
1074 rtype = elf_pj_reloc_type (type);
1077 rtype = elf_ia64_reloc_type (type);
1081 rtype = elf_cris_reloc_type (type);
1085 rtype = elf_i860_reloc_type (type);
1089 rtype = elf_x86_64_reloc_type (type);
1093 rtype = i370_reloc_type (type);
1098 rtype = elf_s390_reloc_type (type);
1102 rtype = elf_xstormy16_reloc_type (type);
1106 rtype = elf_crx_reloc_type (type);
1110 rtype = elf_vax_reloc_type (type);
1115 rtype = elf_ip2k_reloc_type (type);
1119 rtype = elf_iq2000_reloc_type (type);
1124 rtype = elf_xtensa_reloc_type (type);
1128 rtype = elf_m32c_reloc_type (type);
1132 rtype = elf_mt_reloc_type (type);
1136 rtype = elf_bfin_reloc_type (type);
1142 #ifdef _bfd_int64_low
1143 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1145 printf (_("unrecognized: %-7lx"), type);
1148 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1150 if (elf_header.e_machine == EM_ALPHA
1151 && streq (rtype, "R_ALPHA_LITUSE")
1154 switch (rels[i].r_addend)
1156 case LITUSE_ALPHA_ADDR: rtype = "ADDR"; break;
1157 case LITUSE_ALPHA_BASE: rtype = "BASE"; break;
1158 case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1159 case LITUSE_ALPHA_JSR: rtype = "JSR"; break;
1160 case LITUSE_ALPHA_TLSGD: rtype = "TLSGD"; break;
1161 case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1162 case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1163 default: rtype = NULL;
1166 printf (" (%s)", rtype);
1170 printf (_("<unknown addend: %lx>"),
1171 (unsigned long) rels[i].r_addend);
1174 else if (symtab_index)
1176 if (symtab == NULL || symtab_index >= nsyms)
1177 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1180 Elf_Internal_Sym *psym;
1182 psym = symtab + symtab_index;
1185 print_vma (psym->st_value, LONG_HEX);
1186 printf (is_32bit_elf ? " " : " ");
1188 if (psym->st_name == 0)
1190 const char *sec_name = "<null>";
1193 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1195 bfd_vma sec_index = (bfd_vma) -1;
1197 if (psym->st_shndx < SHN_LORESERVE)
1198 sec_index = psym->st_shndx;
1199 else if (psym->st_shndx > SHN_HIRESERVE)
1200 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1203 if (sec_index != (bfd_vma) -1)
1204 sec_name = SECTION_NAME (section_headers + sec_index);
1205 else if (psym->st_shndx == SHN_ABS)
1207 else if (psym->st_shndx == SHN_COMMON)
1208 sec_name = "COMMON";
1209 else if (elf_header.e_machine == EM_X86_64
1210 && psym->st_shndx == SHN_X86_64_LCOMMON)
1211 sec_name = "LARGE_COMMON";
1212 else if (elf_header.e_machine == EM_IA_64
1213 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1214 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1215 sec_name = "ANSI_COM";
1218 sprintf (name_buf, "<section 0x%x>",
1219 (unsigned int) psym->st_shndx);
1220 sec_name = name_buf;
1223 print_symbol (22, sec_name);
1225 else if (strtab == NULL)
1226 printf (_("<string table index: %3ld>"), psym->st_name);
1227 else if (psym->st_name >= strtablen)
1228 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1230 print_symbol (22, strtab + psym->st_name);
1233 printf (" + %lx", (unsigned long) rels[i].r_addend);
1238 printf ("%*c", is_32bit_elf ?
1239 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1240 print_vma (rels[i].r_addend, LONG_HEX);
1243 if (elf_header.e_machine == EM_SPARCV9 && streq (rtype, "R_SPARC_OLO10"))
1244 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1248 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1250 printf (" Type2: ");
1253 #ifdef _bfd_int64_low
1254 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1256 printf (_("unrecognized: %-7lx"), type2);
1259 printf ("%-17.17s", rtype2);
1261 printf ("\n Type3: ");
1264 #ifdef _bfd_int64_low
1265 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1267 printf (_("unrecognized: %-7lx"), type3);
1270 printf ("%-17.17s", rtype3);
1282 get_mips_dynamic_type (unsigned long type)
1286 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1287 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1288 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1289 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1290 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1291 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1292 case DT_MIPS_MSYM: return "MIPS_MSYM";
1293 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1294 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1295 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1296 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1297 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1298 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1299 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1300 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1301 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1302 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1303 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1304 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1305 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1306 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1307 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1308 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1309 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1310 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1311 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1312 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1313 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1314 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1315 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1316 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1317 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1318 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1319 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1320 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1321 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1322 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1323 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1324 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1325 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1326 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1327 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1328 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1335 get_sparc64_dynamic_type (unsigned long type)
1339 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1346 get_ppc_dynamic_type (unsigned long type)
1350 case DT_PPC_GOT: return "PPC_GOT";
1357 get_ppc64_dynamic_type (unsigned long type)
1361 case DT_PPC64_GLINK: return "PPC64_GLINK";
1362 case DT_PPC64_OPD: return "PPC64_OPD";
1363 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1370 get_parisc_dynamic_type (unsigned long type)
1374 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1375 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1376 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1377 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1378 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1379 case DT_HP_PREINIT: return "HP_PREINIT";
1380 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1381 case DT_HP_NEEDED: return "HP_NEEDED";
1382 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1383 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1384 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1385 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1386 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1387 case DT_HP_EPLTREL: return "HP_GST_EPLTREL";
1388 case DT_HP_EPLTRELSZ: return "HP_GST_EPLTRELSZ";
1389 case DT_HP_FILTERED: return "HP_FILTERED";
1390 case DT_HP_FILTER_TLS: return "HP_FILTER_TLS";
1391 case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1392 case DT_HP_LAZYLOAD: return "HP_LAZYLOAD";
1393 case DT_HP_BIND_NOW_COUNT: return "HP_BIND_NOW_COUNT";
1394 case DT_PLT: return "PLT";
1395 case DT_PLT_SIZE: return "PLT_SIZE";
1396 case DT_DLT: return "DLT";
1397 case DT_DLT_SIZE: return "DLT_SIZE";
1404 get_ia64_dynamic_type (unsigned long type)
1408 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1415 get_alpha_dynamic_type (unsigned long type)
1419 case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1426 get_dynamic_type (unsigned long type)
1428 static char buff[64];
1432 case DT_NULL: return "NULL";
1433 case DT_NEEDED: return "NEEDED";
1434 case DT_PLTRELSZ: return "PLTRELSZ";
1435 case DT_PLTGOT: return "PLTGOT";
1436 case DT_HASH: return "HASH";
1437 case DT_STRTAB: return "STRTAB";
1438 case DT_SYMTAB: return "SYMTAB";
1439 case DT_RELA: return "RELA";
1440 case DT_RELASZ: return "RELASZ";
1441 case DT_RELAENT: return "RELAENT";
1442 case DT_STRSZ: return "STRSZ";
1443 case DT_SYMENT: return "SYMENT";
1444 case DT_INIT: return "INIT";
1445 case DT_FINI: return "FINI";
1446 case DT_SONAME: return "SONAME";
1447 case DT_RPATH: return "RPATH";
1448 case DT_SYMBOLIC: return "SYMBOLIC";
1449 case DT_REL: return "REL";
1450 case DT_RELSZ: return "RELSZ";
1451 case DT_RELENT: return "RELENT";
1452 case DT_PLTREL: return "PLTREL";
1453 case DT_DEBUG: return "DEBUG";
1454 case DT_TEXTREL: return "TEXTREL";
1455 case DT_JMPREL: return "JMPREL";
1456 case DT_BIND_NOW: return "BIND_NOW";
1457 case DT_INIT_ARRAY: return "INIT_ARRAY";
1458 case DT_FINI_ARRAY: return "FINI_ARRAY";
1459 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1460 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1461 case DT_RUNPATH: return "RUNPATH";
1462 case DT_FLAGS: return "FLAGS";
1464 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1465 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1467 case DT_CHECKSUM: return "CHECKSUM";
1468 case DT_PLTPADSZ: return "PLTPADSZ";
1469 case DT_MOVEENT: return "MOVEENT";
1470 case DT_MOVESZ: return "MOVESZ";
1471 case DT_FEATURE: return "FEATURE";
1472 case DT_POSFLAG_1: return "POSFLAG_1";
1473 case DT_SYMINSZ: return "SYMINSZ";
1474 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1476 case DT_ADDRRNGLO: return "ADDRRNGLO";
1477 case DT_CONFIG: return "CONFIG";
1478 case DT_DEPAUDIT: return "DEPAUDIT";
1479 case DT_AUDIT: return "AUDIT";
1480 case DT_PLTPAD: return "PLTPAD";
1481 case DT_MOVETAB: return "MOVETAB";
1482 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1484 case DT_VERSYM: return "VERSYM";
1486 case DT_TLSDESC_GOT: return "TLSDESC_GOT";
1487 case DT_TLSDESC_PLT: return "TLSDESC_PLT";
1488 case DT_RELACOUNT: return "RELACOUNT";
1489 case DT_RELCOUNT: return "RELCOUNT";
1490 case DT_FLAGS_1: return "FLAGS_1";
1491 case DT_VERDEF: return "VERDEF";
1492 case DT_VERDEFNUM: return "VERDEFNUM";
1493 case DT_VERNEED: return "VERNEED";
1494 case DT_VERNEEDNUM: return "VERNEEDNUM";
1496 case DT_AUXILIARY: return "AUXILIARY";
1497 case DT_USED: return "USED";
1498 case DT_FILTER: return "FILTER";
1500 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1501 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1502 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1503 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1504 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1505 case DT_GNU_HASH: return "GNU_HASH";
1508 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1512 switch (elf_header.e_machine)
1515 case EM_MIPS_RS3_LE:
1516 result = get_mips_dynamic_type (type);
1519 result = get_sparc64_dynamic_type (type);
1522 result = get_ppc_dynamic_type (type);
1525 result = get_ppc64_dynamic_type (type);
1528 result = get_ia64_dynamic_type (type);
1531 result = get_alpha_dynamic_type (type);
1541 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1543 else if (((type >= DT_LOOS) && (type <= DT_HIOS))
1544 || (elf_header.e_machine == EM_PARISC
1545 && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
1549 switch (elf_header.e_machine)
1552 result = get_parisc_dynamic_type (type);
1562 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1566 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1573 get_file_type (unsigned e_type)
1575 static char buff[32];
1579 case ET_NONE: return _("NONE (None)");
1580 case ET_REL: return _("REL (Relocatable file)");
1581 case ET_EXEC: return _("EXEC (Executable file)");
1582 case ET_DYN: return _("DYN (Shared object file)");
1583 case ET_CORE: return _("CORE (Core file)");
1586 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1587 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1588 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1589 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1591 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1597 get_machine_name (unsigned e_machine)
1599 static char buff[64]; /* XXX */
1603 case EM_NONE: return _("None");
1604 case EM_M32: return "WE32100";
1605 case EM_SPARC: return "Sparc";
1606 case EM_386: return "Intel 80386";
1607 case EM_68K: return "MC68000";
1608 case EM_88K: return "MC88000";
1609 case EM_486: return "Intel 80486";
1610 case EM_860: return "Intel 80860";
1611 case EM_MIPS: return "MIPS R3000";
1612 case EM_S370: return "IBM System/370";
1613 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1614 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1615 case EM_PARISC: return "HPPA";
1616 case EM_PPC_OLD: return "Power PC (old)";
1617 case EM_SPARC32PLUS: return "Sparc v8+" ;
1618 case EM_960: return "Intel 90860";
1619 case EM_PPC: return "PowerPC";
1620 case EM_PPC64: return "PowerPC64";
1621 case EM_V800: return "NEC V800";
1622 case EM_FR20: return "Fujitsu FR20";
1623 case EM_RH32: return "TRW RH32";
1624 case EM_MCORE: return "MCORE";
1625 case EM_ARM: return "ARM";
1626 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1627 case EM_SH: return "Renesas / SuperH SH";
1628 case EM_SPARCV9: return "Sparc v9";
1629 case EM_TRICORE: return "Siemens Tricore";
1630 case EM_ARC: return "ARC";
1631 case EM_H8_300: return "Renesas H8/300";
1632 case EM_H8_300H: return "Renesas H8/300H";
1633 case EM_H8S: return "Renesas H8S";
1634 case EM_H8_500: return "Renesas H8/500";
1635 case EM_IA_64: return "Intel IA-64";
1636 case EM_MIPS_X: return "Stanford MIPS-X";
1637 case EM_COLDFIRE: return "Motorola Coldfire";
1638 case EM_68HC12: return "Motorola M68HC12";
1639 case EM_ALPHA: return "Alpha";
1640 case EM_CYGNUS_D10V:
1641 case EM_D10V: return "d10v";
1642 case EM_CYGNUS_D30V:
1643 case EM_D30V: return "d30v";
1644 case EM_CYGNUS_M32R:
1645 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1646 case EM_CYGNUS_V850:
1647 case EM_V850: return "NEC v850";
1648 case EM_CYGNUS_MN10300:
1649 case EM_MN10300: return "mn10300";
1650 case EM_CYGNUS_MN10200:
1651 case EM_MN10200: return "mn10200";
1652 case EM_CYGNUS_FR30:
1653 case EM_FR30: return "Fujitsu FR30";
1654 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1656 case EM_PJ: return "picoJava";
1657 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1658 case EM_PCP: return "Siemens PCP";
1659 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1660 case EM_NDR1: return "Denso NDR1 microprocesspr";
1661 case EM_STARCORE: return "Motorola Star*Core processor";
1662 case EM_ME16: return "Toyota ME16 processor";
1663 case EM_ST100: return "STMicroelectronics ST100 processor";
1664 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1665 case EM_FX66: return "Siemens FX66 microcontroller";
1666 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1667 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1668 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1669 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1670 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1671 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1672 case EM_SVX: return "Silicon Graphics SVx";
1673 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1674 case EM_VAX: return "Digital VAX";
1676 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1677 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1678 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1679 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1680 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1681 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1682 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1683 case EM_PRISM: return "Vitesse Prism";
1684 case EM_X86_64: return "Advanced Micro Devices X86-64";
1686 case EM_S390: return "IBM S/390";
1687 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1689 case EM_OR32: return "OpenRISC";
1690 case EM_CRX: return "National Semiconductor CRX microprocessor";
1691 case EM_DLX: return "OpenDLX";
1693 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1694 case EM_IQ2000: return "Vitesse IQ2000";
1696 case EM_XTENSA: return "Tensilica Xtensa Processor";
1697 case EM_M32C: return "Renesas M32c";
1698 case EM_MT: return "Morpho Techologies MT processor";
1699 case EM_BLACKFIN: return "Analog Devices Blackfin";
1700 case EM_NIOS32: return "Altera Nios";
1701 case EM_ALTERA_NIOS2: return "Altera Nios II";
1702 case EM_XC16X: return "Infineon Technologies xc16x";
1704 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_machine);
1710 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1715 eabi = EF_ARM_EABI_VERSION (e_flags);
1716 e_flags &= ~ EF_ARM_EABIMASK;
1718 /* Handle "generic" ARM flags. */
1719 if (e_flags & EF_ARM_RELEXEC)
1721 strcat (buf, ", relocatable executable");
1722 e_flags &= ~ EF_ARM_RELEXEC;
1725 if (e_flags & EF_ARM_HASENTRY)
1727 strcat (buf, ", has entry point");
1728 e_flags &= ~ EF_ARM_HASENTRY;
1731 /* Now handle EABI specific flags. */
1735 strcat (buf, ", <unrecognized EABI>");
1740 case EF_ARM_EABI_VER1:
1741 strcat (buf, ", Version1 EABI");
1746 /* Process flags one bit at a time. */
1747 flag = e_flags & - e_flags;
1752 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1753 strcat (buf, ", sorted symbol tables");
1763 case EF_ARM_EABI_VER2:
1764 strcat (buf, ", Version2 EABI");
1769 /* Process flags one bit at a time. */
1770 flag = e_flags & - e_flags;
1775 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1776 strcat (buf, ", sorted symbol tables");
1779 case EF_ARM_DYNSYMSUSESEGIDX:
1780 strcat (buf, ", dynamic symbols use segment index");
1783 case EF_ARM_MAPSYMSFIRST:
1784 strcat (buf, ", mapping symbols precede others");
1794 case EF_ARM_EABI_VER3:
1795 strcat (buf, ", Version3 EABI");
1798 case EF_ARM_EABI_VER4:
1799 strcat (buf, ", Version4 EABI");
1802 case EF_ARM_EABI_VER5:
1803 strcat (buf, ", Version5 EABI");
1809 /* Process flags one bit at a time. */
1810 flag = e_flags & - e_flags;
1816 strcat (buf, ", BE8");
1820 strcat (buf, ", LE8");
1830 case EF_ARM_EABI_UNKNOWN:
1831 strcat (buf, ", GNU EABI");
1836 /* Process flags one bit at a time. */
1837 flag = e_flags & - e_flags;
1842 case EF_ARM_INTERWORK:
1843 strcat (buf, ", interworking enabled");
1846 case EF_ARM_APCS_26:
1847 strcat (buf, ", uses APCS/26");
1850 case EF_ARM_APCS_FLOAT:
1851 strcat (buf, ", uses APCS/float");
1855 strcat (buf, ", position independent");
1859 strcat (buf, ", 8 bit structure alignment");
1862 case EF_ARM_NEW_ABI:
1863 strcat (buf, ", uses new ABI");
1866 case EF_ARM_OLD_ABI:
1867 strcat (buf, ", uses old ABI");
1870 case EF_ARM_SOFT_FLOAT:
1871 strcat (buf, ", software FP");
1874 case EF_ARM_VFP_FLOAT:
1875 strcat (buf, ", VFP");
1878 case EF_ARM_MAVERICK_FLOAT:
1879 strcat (buf, ", Maverick FP");
1890 strcat (buf,", <unknown>");
1894 get_machine_flags (unsigned e_flags, unsigned e_machine)
1896 static char buf[1024];
1908 decode_ARM_machine_flags (e_flags, buf);
1912 switch (e_flags & EF_FRV_CPU_MASK)
1914 case EF_FRV_CPU_GENERIC:
1918 strcat (buf, ", fr???");
1921 case EF_FRV_CPU_FR300:
1922 strcat (buf, ", fr300");
1925 case EF_FRV_CPU_FR400:
1926 strcat (buf, ", fr400");
1928 case EF_FRV_CPU_FR405:
1929 strcat (buf, ", fr405");
1932 case EF_FRV_CPU_FR450:
1933 strcat (buf, ", fr450");
1936 case EF_FRV_CPU_FR500:
1937 strcat (buf, ", fr500");
1939 case EF_FRV_CPU_FR550:
1940 strcat (buf, ", fr550");
1943 case EF_FRV_CPU_SIMPLE:
1944 strcat (buf, ", simple");
1946 case EF_FRV_CPU_TOMCAT:
1947 strcat (buf, ", tomcat");
1953 if (e_flags & EF_M68K_CPU32)
1954 strcat (buf, ", cpu32");
1955 if (e_flags & EF_M68K_M68000)
1956 strcat (buf, ", m68000");
1957 if (e_flags & EF_M68K_ISA_MASK)
1959 char const *isa = _("unknown");
1960 char const *mac = _("unknown mac");
1961 char const *additional = NULL;
1963 switch (e_flags & EF_M68K_ISA_MASK)
1965 case EF_M68K_ISA_A_NODIV:
1967 additional = ", nodiv";
1972 case EF_M68K_ISA_A_PLUS:
1975 case EF_M68K_ISA_B_NOUSP:
1977 additional = ", nousp";
1983 strcat (buf, ", cf, isa ");
1986 strcat (buf, additional);
1987 if (e_flags & EF_M68K_FLOAT)
1988 strcat (buf, ", float");
1989 switch (e_flags & EF_M68K_MAC_MASK)
2010 if (e_flags & EF_PPC_EMB)
2011 strcat (buf, ", emb");
2013 if (e_flags & EF_PPC_RELOCATABLE)
2014 strcat (buf, ", relocatable");
2016 if (e_flags & EF_PPC_RELOCATABLE_LIB)
2017 strcat (buf, ", relocatable-lib");
2021 case EM_CYGNUS_V850:
2022 switch (e_flags & EF_V850_ARCH)
2025 strcat (buf, ", v850e1");
2028 strcat (buf, ", v850e");
2031 strcat (buf, ", v850");
2034 strcat (buf, ", unknown v850 architecture variant");
2040 case EM_CYGNUS_M32R:
2041 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2042 strcat (buf, ", m32r");
2047 case EM_MIPS_RS3_LE:
2048 if (e_flags & EF_MIPS_NOREORDER)
2049 strcat (buf, ", noreorder");
2051 if (e_flags & EF_MIPS_PIC)
2052 strcat (buf, ", pic");
2054 if (e_flags & EF_MIPS_CPIC)
2055 strcat (buf, ", cpic");
2057 if (e_flags & EF_MIPS_UCODE)
2058 strcat (buf, ", ugen_reserved");
2060 if (e_flags & EF_MIPS_ABI2)
2061 strcat (buf, ", abi2");
2063 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2064 strcat (buf, ", odk first");
2066 if (e_flags & EF_MIPS_32BITMODE)
2067 strcat (buf, ", 32bitmode");
2069 switch ((e_flags & EF_MIPS_MACH))
2071 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2072 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2073 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2074 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2075 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2076 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2077 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2078 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2079 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2080 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2082 /* We simply ignore the field in this case to avoid confusion:
2083 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2086 default: strcat (buf, ", unknown CPU"); break;
2089 switch ((e_flags & EF_MIPS_ABI))
2091 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2092 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2093 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2094 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2096 /* We simply ignore the field in this case to avoid confusion:
2097 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2098 This means it is likely to be an o32 file, but not for
2101 default: strcat (buf, ", unknown ABI"); break;
2104 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2105 strcat (buf, ", mdmx");
2107 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2108 strcat (buf, ", mips16");
2110 switch ((e_flags & EF_MIPS_ARCH))
2112 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2113 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2114 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2115 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2116 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2117 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2118 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2119 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2120 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2121 default: strcat (buf, ", unknown ISA"); break;
2127 switch ((e_flags & EF_SH_MACH_MASK))
2129 case EF_SH1: strcat (buf, ", sh1"); break;
2130 case EF_SH2: strcat (buf, ", sh2"); break;
2131 case EF_SH3: strcat (buf, ", sh3"); break;
2132 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2133 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2134 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2135 case EF_SH3E: strcat (buf, ", sh3e"); break;
2136 case EF_SH4: strcat (buf, ", sh4"); break;
2137 case EF_SH5: strcat (buf, ", sh5"); break;
2138 case EF_SH2E: strcat (buf, ", sh2e"); break;
2139 case EF_SH4A: strcat (buf, ", sh4a"); break;
2140 case EF_SH2A: strcat (buf, ", sh2a"); break;
2141 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2142 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2143 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2144 case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
2145 case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
2146 case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2147 case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
2148 case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
2149 case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
2150 default: strcat (buf, ", unknown ISA"); break;
2156 if (e_flags & EF_SPARC_32PLUS)
2157 strcat (buf, ", v8+");
2159 if (e_flags & EF_SPARC_SUN_US1)
2160 strcat (buf, ", ultrasparcI");
2162 if (e_flags & EF_SPARC_SUN_US3)
2163 strcat (buf, ", ultrasparcIII");
2165 if (e_flags & EF_SPARC_HAL_R1)
2166 strcat (buf, ", halr1");
2168 if (e_flags & EF_SPARC_LEDATA)
2169 strcat (buf, ", ledata");
2171 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2172 strcat (buf, ", tso");
2174 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2175 strcat (buf, ", pso");
2177 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2178 strcat (buf, ", rmo");
2182 switch (e_flags & EF_PARISC_ARCH)
2184 case EFA_PARISC_1_0:
2185 strcpy (buf, ", PA-RISC 1.0");
2187 case EFA_PARISC_1_1:
2188 strcpy (buf, ", PA-RISC 1.1");
2190 case EFA_PARISC_2_0:
2191 strcpy (buf, ", PA-RISC 2.0");
2196 if (e_flags & EF_PARISC_TRAPNIL)
2197 strcat (buf, ", trapnil");
2198 if (e_flags & EF_PARISC_EXT)
2199 strcat (buf, ", ext");
2200 if (e_flags & EF_PARISC_LSB)
2201 strcat (buf, ", lsb");
2202 if (e_flags & EF_PARISC_WIDE)
2203 strcat (buf, ", wide");
2204 if (e_flags & EF_PARISC_NO_KABP)
2205 strcat (buf, ", no kabp");
2206 if (e_flags & EF_PARISC_LAZYSWAP)
2207 strcat (buf, ", lazyswap");
2212 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2213 strcat (buf, ", new calling convention");
2215 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2216 strcat (buf, ", gnu calling convention");
2220 if ((e_flags & EF_IA_64_ABI64))
2221 strcat (buf, ", 64-bit");
2223 strcat (buf, ", 32-bit");
2224 if ((e_flags & EF_IA_64_REDUCEDFP))
2225 strcat (buf, ", reduced fp model");
2226 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2227 strcat (buf, ", no function descriptors, constant gp");
2228 else if ((e_flags & EF_IA_64_CONS_GP))
2229 strcat (buf, ", constant gp");
2230 if ((e_flags & EF_IA_64_ABSOLUTE))
2231 strcat (buf, ", absolute");
2235 if ((e_flags & EF_VAX_NONPIC))
2236 strcat (buf, ", non-PIC");
2237 if ((e_flags & EF_VAX_DFLOAT))
2238 strcat (buf, ", D-Float");
2239 if ((e_flags & EF_VAX_GFLOAT))
2240 strcat (buf, ", G-Float");
2249 get_osabi_name (unsigned int osabi)
2251 static char buff[32];
2255 case ELFOSABI_NONE: return "UNIX - System V";
2256 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2257 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2258 case ELFOSABI_LINUX: return "UNIX - Linux";
2259 case ELFOSABI_HURD: return "GNU/Hurd";
2260 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2261 case ELFOSABI_AIX: return "UNIX - AIX";
2262 case ELFOSABI_IRIX: return "UNIX - IRIX";
2263 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2264 case ELFOSABI_TRU64: return "UNIX - TRU64";
2265 case ELFOSABI_MODESTO: return "Novell - Modesto";
2266 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2267 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2268 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2269 case ELFOSABI_AROS: return "Amiga Research OS";
2270 case ELFOSABI_STANDALONE: return _("Standalone App");
2271 case ELFOSABI_ARM: return "ARM";
2273 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2279 get_arm_segment_type (unsigned long type)
2293 get_mips_segment_type (unsigned long type)
2297 case PT_MIPS_REGINFO:
2299 case PT_MIPS_RTPROC:
2301 case PT_MIPS_OPTIONS:
2311 get_parisc_segment_type (unsigned long type)
2315 case PT_HP_TLS: return "HP_TLS";
2316 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2317 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2318 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2319 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2320 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2321 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2322 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2323 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2324 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2325 case PT_HP_PARALLEL: return "HP_PARALLEL";
2326 case PT_HP_FASTBIND: return "HP_FASTBIND";
2327 case PT_HP_OPT_ANNOT: return "HP_OPT_ANNOT";
2328 case PT_HP_HSL_ANNOT: return "HP_HSL_ANNOT";
2329 case PT_HP_STACK: return "HP_STACK";
2330 case PT_HP_CORE_UTSNAME: return "HP_CORE_UTSNAME";
2331 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2332 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2333 case PT_PARISC_WEAKORDER: return "PARISC_WEAKORDER";
2342 get_ia64_segment_type (unsigned long type)
2346 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2347 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2348 case PT_HP_TLS: return "HP_TLS";
2349 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2350 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2351 case PT_IA_64_HP_STACK: return "HP_STACK";
2360 get_segment_type (unsigned long p_type)
2362 static char buff[32];
2366 case PT_NULL: return "NULL";
2367 case PT_LOAD: return "LOAD";
2368 case PT_DYNAMIC: return "DYNAMIC";
2369 case PT_INTERP: return "INTERP";
2370 case PT_NOTE: return "NOTE";
2371 case PT_SHLIB: return "SHLIB";
2372 case PT_PHDR: return "PHDR";
2373 case PT_TLS: return "TLS";
2375 case PT_GNU_EH_FRAME:
2376 return "GNU_EH_FRAME";
2377 case PT_GNU_STACK: return "GNU_STACK";
2378 case PT_GNU_RELRO: return "GNU_RELRO";
2381 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2385 switch (elf_header.e_machine)
2388 result = get_arm_segment_type (p_type);
2391 case EM_MIPS_RS3_LE:
2392 result = get_mips_segment_type (p_type);
2395 result = get_parisc_segment_type (p_type);
2398 result = get_ia64_segment_type (p_type);
2408 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2410 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2414 switch (elf_header.e_machine)
2417 result = get_parisc_segment_type (p_type);
2420 result = get_ia64_segment_type (p_type);
2430 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2433 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2440 get_mips_section_type_name (unsigned int sh_type)
2444 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2445 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2446 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2447 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2448 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2449 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2450 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2451 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2452 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2453 case SHT_MIPS_RELD: return "MIPS_RELD";
2454 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2455 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2456 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2457 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2458 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2459 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2460 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2461 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2462 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2463 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2464 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2465 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2466 case SHT_MIPS_LINE: return "MIPS_LINE";
2467 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2468 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2469 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2470 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2471 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2472 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2473 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2474 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2475 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2476 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2477 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2478 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2479 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2480 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2481 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2482 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2490 get_parisc_section_type_name (unsigned int sh_type)
2494 case SHT_PARISC_EXT: return "PARISC_EXT";
2495 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2496 case SHT_PARISC_DOC: return "PARISC_DOC";
2497 case SHT_PARISC_ANNOT: return "PARISC_ANNOT";
2498 case SHT_PARISC_SYMEXTN: return "PARISC_SYMEXTN";
2499 case SHT_PARISC_STUBS: return "PARISC_STUBS";
2500 case SHT_PARISC_DLKM: return "PARISC_DLKM";
2508 get_ia64_section_type_name (unsigned int sh_type)
2510 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2511 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2512 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2516 case SHT_IA_64_EXT: return "IA_64_EXT";
2517 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2518 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2526 get_x86_64_section_type_name (unsigned int sh_type)
2530 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2538 get_arm_section_type_name (unsigned int sh_type)
2544 case SHT_ARM_PREEMPTMAP:
2545 return "ARM_PREEMPTMAP";
2546 case SHT_ARM_ATTRIBUTES:
2547 return "ARM_ATTRIBUTES";
2555 get_section_type_name (unsigned int sh_type)
2557 static char buff[32];
2561 case SHT_NULL: return "NULL";
2562 case SHT_PROGBITS: return "PROGBITS";
2563 case SHT_SYMTAB: return "SYMTAB";
2564 case SHT_STRTAB: return "STRTAB";
2565 case SHT_RELA: return "RELA";
2566 case SHT_HASH: return "HASH";
2567 case SHT_DYNAMIC: return "DYNAMIC";
2568 case SHT_NOTE: return "NOTE";
2569 case SHT_NOBITS: return "NOBITS";
2570 case SHT_REL: return "REL";
2571 case SHT_SHLIB: return "SHLIB";
2572 case SHT_DYNSYM: return "DYNSYM";
2573 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2574 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2575 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2576 case SHT_GNU_HASH: return "GNU_HASH";
2577 case SHT_GROUP: return "GROUP";
2578 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2579 case SHT_GNU_verdef: return "VERDEF";
2580 case SHT_GNU_verneed: return "VERNEED";
2581 case SHT_GNU_versym: return "VERSYM";
2582 case 0x6ffffff0: return "VERSYM";
2583 case 0x6ffffffc: return "VERDEF";
2584 case 0x7ffffffd: return "AUXILIARY";
2585 case 0x7fffffff: return "FILTER";
2586 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2589 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2593 switch (elf_header.e_machine)
2596 case EM_MIPS_RS3_LE:
2597 result = get_mips_section_type_name (sh_type);
2600 result = get_parisc_section_type_name (sh_type);
2603 result = get_ia64_section_type_name (sh_type);
2606 result = get_x86_64_section_type_name (sh_type);
2609 result = get_arm_section_type_name (sh_type);
2619 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2621 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2622 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2623 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2624 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2626 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
2632 #define OPTION_DEBUG_DUMP 512
2634 static struct option options[] =
2636 {"all", no_argument, 0, 'a'},
2637 {"file-header", no_argument, 0, 'h'},
2638 {"program-headers", no_argument, 0, 'l'},
2639 {"headers", no_argument, 0, 'e'},
2640 {"histogram", no_argument, 0, 'I'},
2641 {"segments", no_argument, 0, 'l'},
2642 {"sections", no_argument, 0, 'S'},
2643 {"section-headers", no_argument, 0, 'S'},
2644 {"section-groups", no_argument, 0, 'g'},
2645 {"section-details", no_argument, 0, 't'},
2646 {"full-section-name",no_argument, 0, 'N'},
2647 {"symbols", no_argument, 0, 's'},
2648 {"syms", no_argument, 0, 's'},
2649 {"relocs", no_argument, 0, 'r'},
2650 {"notes", no_argument, 0, 'n'},
2651 {"dynamic", no_argument, 0, 'd'},
2652 {"arch-specific", no_argument, 0, 'A'},
2653 {"version-info", no_argument, 0, 'V'},
2654 {"use-dynamic", no_argument, 0, 'D'},
2655 {"hex-dump", required_argument, 0, 'x'},
2656 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2657 {"unwind", no_argument, 0, 'u'},
2658 #ifdef SUPPORT_DISASSEMBLY
2659 {"instruction-dump", required_argument, 0, 'i'},
2662 {"version", no_argument, 0, 'v'},
2663 {"wide", no_argument, 0, 'W'},
2664 {"help", no_argument, 0, 'H'},
2665 {0, no_argument, 0, 0}
2671 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2672 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2673 fprintf (stdout, _(" Options are:\n\
2674 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2675 -h --file-header Display the ELF file header\n\
2676 -l --program-headers Display the program headers\n\
2677 --segments An alias for --program-headers\n\
2678 -S --section-headers Display the sections' header\n\
2679 --sections An alias for --section-headers\n\
2680 -g --section-groups Display the section groups\n\
2681 -t --section-details Display the section details\n\
2682 -e --headers Equivalent to: -h -l -S\n\
2683 -s --syms Display the symbol table\n\
2684 --symbols An alias for --syms\n\
2685 -n --notes Display the core notes (if present)\n\
2686 -r --relocs Display the relocations (if present)\n\
2687 -u --unwind Display the unwind info (if present)\n\
2688 -d --dynamic Display the dynamic section (if present)\n\
2689 -V --version-info Display the version sections (if present)\n\
2690 -A --arch-specific Display architecture specific information (if any).\n\
2691 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2692 -x --hex-dump=<number> Dump the contents of section <number>\n\
2693 -w[liaprmfFsoR] or\n\
2694 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2695 Display the contents of DWARF2 debug sections\n"));
2696 #ifdef SUPPORT_DISASSEMBLY
2697 fprintf (stdout, _("\
2698 -i --instruction-dump=<number>\n\
2699 Disassemble the contents of section <number>\n"));
2701 fprintf (stdout, _("\
2702 -I --histogram Display histogram of bucket list lengths\n\
2703 -W --wide Allow output width to exceed 80 characters\n\
2704 @<file> Read options from <file>\n\
2705 -H --help Display this information\n\
2706 -v --version Display the version number of readelf\n"));
2707 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2712 /* Record the fact that the user wants the contents of section number
2713 SECTION to be displayed using the method(s) encoded as flags bits
2714 in TYPE. Note, TYPE can be zero if we are creating the array for
2718 request_dump (unsigned int section, int type)
2720 if (section >= num_dump_sects)
2722 char *new_dump_sects;
2724 new_dump_sects = calloc (section + 1, 1);
2726 if (new_dump_sects == NULL)
2727 error (_("Out of memory allocating dump request table."));
2730 /* Copy current flag settings. */
2731 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2735 dump_sects = new_dump_sects;
2736 num_dump_sects = section + 1;
2741 dump_sects[section] |= type;
2746 /* Request a dump by section name. */
2749 request_dump_byname (const char *section, int type)
2751 struct dump_list_entry *new_request;
2753 new_request = malloc (sizeof (struct dump_list_entry));
2755 error (_("Out of memory allocating dump request table."));
2757 new_request->name = strdup (section);
2758 if (!new_request->name)
2759 error (_("Out of memory allocating dump request table."));
2761 new_request->type = type;
2763 new_request->next = dump_sects_byname;
2764 dump_sects_byname = new_request;
2768 parse_args (int argc, char **argv)
2775 while ((c = getopt_long
2776 (argc, argv, "ersuahnldSDAINtgw::x:i:vVWH", options, NULL)) != EOF)
2797 do_section_groups++;
2805 do_section_groups++;
2810 do_section_details++;
2852 section = strtoul (optarg, & cp, 0);
2853 if (! *cp && section >= 0)
2854 request_dump (section, HEX_DUMP);
2856 request_dump_byname (optarg, HEX_DUMP);
2864 unsigned int index = 0;
2868 while (optarg[index])
2869 switch (optarg[index++])
2878 do_debug_abbrevs = 1;
2888 do_debug_pubnames = 1;
2892 do_debug_aranges = 1;
2896 do_debug_ranges = 1;
2900 do_debug_frames_interp = 1;
2902 do_debug_frames = 1;
2907 do_debug_macinfo = 1;
2921 warn (_("Unrecognized debug option '%s'\n"), optarg);
2926 case OPTION_DEBUG_DUMP:
2934 const char * option;
2937 debug_dump_long_opts;
2939 debug_dump_long_opts opts_table [] =
2941 /* Please keep this table alpha- sorted. */
2942 { "Ranges", & do_debug_ranges },
2943 { "abbrev", & do_debug_abbrevs },
2944 { "aranges", & do_debug_aranges },
2945 { "frames", & do_debug_frames },
2946 { "frames-interp", & do_debug_frames_interp },
2947 { "info", & do_debug_info },
2948 { "line", & do_debug_lines },
2949 { "loc", & do_debug_loc },
2950 { "macro", & do_debug_macinfo },
2951 { "pubnames", & do_debug_pubnames },
2952 /* This entry is for compatability
2953 with earlier versions of readelf. */
2954 { "ranges", & do_debug_aranges },
2955 { "str", & do_debug_str },
2966 debug_dump_long_opts * entry;
2968 for (entry = opts_table; entry->option; entry++)
2970 size_t len = strlen (entry->option);
2972 if (strneq (p, entry->option, len)
2973 && (p[len] == ',' || p[len] == '\0'))
2975 * entry->variable = 1;
2977 /* The --debug-dump=frames-interp option also
2978 enables the --debug-dump=frames option. */
2979 if (do_debug_frames_interp)
2980 do_debug_frames = 1;
2987 if (entry->option == NULL)
2989 warn (_("Unrecognized debug option '%s'\n"), p);
2990 p = strchr (p, ',');
3000 #ifdef SUPPORT_DISASSEMBLY
3003 section = strtoul (optarg, & cp, 0);
3004 if (! *cp && section >= 0)
3006 request_dump (section, DISASS_DUMP);
3012 print_version (program_name);
3021 #ifdef SUPPORT_DISASSEMBLY
3024 /* xgettext:c-format */
3025 error (_("Invalid option '-%c'\n"), c);
3032 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
3033 && !do_segments && !do_header && !do_dump && !do_version
3034 && !do_histogram && !do_debugging && !do_arch && !do_notes
3035 && !do_section_groups)
3039 warn (_("Nothing to do.\n"));
3045 get_elf_class (unsigned int elf_class)
3047 static char buff[32];
3051 case ELFCLASSNONE: return _("none");
3052 case ELFCLASS32: return "ELF32";
3053 case ELFCLASS64: return "ELF64";
3055 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
3061 get_data_encoding (unsigned int encoding)
3063 static char buff[32];
3067 case ELFDATANONE: return _("none");
3068 case ELFDATA2LSB: return _("2's complement, little endian");
3069 case ELFDATA2MSB: return _("2's complement, big endian");
3071 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
3076 /* Decode the data held in 'elf_header'. */
3079 process_file_header (void)
3081 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3082 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3083 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3084 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3087 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3095 printf (_("ELF Header:\n"));
3096 printf (_(" Magic: "));
3097 for (i = 0; i < EI_NIDENT; i++)
3098 printf ("%2.2x ", elf_header.e_ident[i]);
3100 printf (_(" Class: %s\n"),
3101 get_elf_class (elf_header.e_ident[EI_CLASS]));
3102 printf (_(" Data: %s\n"),
3103 get_data_encoding (elf_header.e_ident[EI_DATA]));
3104 printf (_(" Version: %d %s\n"),
3105 elf_header.e_ident[EI_VERSION],
3106 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3108 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3111 printf (_(" OS/ABI: %s\n"),
3112 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3113 printf (_(" ABI Version: %d\n"),
3114 elf_header.e_ident[EI_ABIVERSION]);
3115 printf (_(" Type: %s\n"),
3116 get_file_type (elf_header.e_type));
3117 printf (_(" Machine: %s\n"),
3118 get_machine_name (elf_header.e_machine));
3119 printf (_(" Version: 0x%lx\n"),
3120 (unsigned long) elf_header.e_version);
3122 printf (_(" Entry point address: "));
3123 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3124 printf (_("\n Start of program headers: "));
3125 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3126 printf (_(" (bytes into file)\n Start of section headers: "));
3127 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3128 printf (_(" (bytes into file)\n"));
3130 printf (_(" Flags: 0x%lx%s\n"),
3131 (unsigned long) elf_header.e_flags,
3132 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3133 printf (_(" Size of this header: %ld (bytes)\n"),
3134 (long) elf_header.e_ehsize);
3135 printf (_(" Size of program headers: %ld (bytes)\n"),
3136 (long) elf_header.e_phentsize);
3137 printf (_(" Number of program headers: %ld\n"),
3138 (long) elf_header.e_phnum);
3139 printf (_(" Size of section headers: %ld (bytes)\n"),
3140 (long) elf_header.e_shentsize);
3141 printf (_(" Number of section headers: %ld"),
3142 (long) elf_header.e_shnum);
3143 if (section_headers != NULL && elf_header.e_shnum == 0)
3144 printf (" (%ld)", (long) section_headers[0].sh_size);
3145 putc ('\n', stdout);
3146 printf (_(" Section header string table index: %ld"),
3147 (long) elf_header.e_shstrndx);
3148 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
3149 printf (" (%ld)", (long) section_headers[0].sh_link);
3150 else if (elf_header.e_shstrndx != SHN_UNDEF
3151 && (elf_header.e_shstrndx >= elf_header.e_shnum
3152 || (elf_header.e_shstrndx >= SHN_LORESERVE
3153 && elf_header.e_shstrndx <= SHN_HIRESERVE)))
3154 printf (" <corrupt: out of range>");
3155 putc ('\n', stdout);
3158 if (section_headers != NULL)
3160 if (elf_header.e_shnum == 0)
3161 elf_header.e_shnum = section_headers[0].sh_size;
3162 if (elf_header.e_shstrndx == SHN_XINDEX)
3163 elf_header.e_shstrndx = section_headers[0].sh_link;
3164 else if (elf_header.e_shstrndx != SHN_UNDEF
3165 && (elf_header.e_shstrndx >= elf_header.e_shnum
3166 || (elf_header.e_shstrndx >= SHN_LORESERVE
3167 && elf_header.e_shstrndx <= SHN_HIRESERVE)))
3168 elf_header.e_shstrndx = SHN_UNDEF;
3169 free (section_headers);
3170 section_headers = NULL;
3178 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3180 Elf32_External_Phdr *phdrs;
3181 Elf32_External_Phdr *external;
3182 Elf_Internal_Phdr *internal;
3185 phdrs = get_data (NULL, file, elf_header.e_phoff,
3186 elf_header.e_phentsize, elf_header.e_phnum,
3187 _("program headers"));
3191 for (i = 0, internal = program_headers, external = phdrs;
3192 i < elf_header.e_phnum;
3193 i++, internal++, external++)
3195 internal->p_type = BYTE_GET (external->p_type);
3196 internal->p_offset = BYTE_GET (external->p_offset);
3197 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3198 internal->p_paddr = BYTE_GET (external->p_paddr);
3199 internal->p_filesz = BYTE_GET (external->p_filesz);
3200 internal->p_memsz = BYTE_GET (external->p_memsz);
3201 internal->p_flags = BYTE_GET (external->p_flags);
3202 internal->p_align = BYTE_GET (external->p_align);
3211 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3213 Elf64_External_Phdr *phdrs;
3214 Elf64_External_Phdr *external;
3215 Elf_Internal_Phdr *internal;
3218 phdrs = get_data (NULL, file, elf_header.e_phoff,
3219 elf_header.e_phentsize, elf_header.e_phnum,
3220 _("program headers"));
3224 for (i = 0, internal = program_headers, external = phdrs;
3225 i < elf_header.e_phnum;
3226 i++, internal++, external++)
3228 internal->p_type = BYTE_GET (external->p_type);
3229 internal->p_flags = BYTE_GET (external->p_flags);
3230 internal->p_offset = BYTE_GET (external->p_offset);
3231 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3232 internal->p_paddr = BYTE_GET (external->p_paddr);
3233 internal->p_filesz = BYTE_GET (external->p_filesz);
3234 internal->p_memsz = BYTE_GET (external->p_memsz);
3235 internal->p_align = BYTE_GET (external->p_align);
3243 /* Returns 1 if the program headers were read into `program_headers'. */
3246 get_program_headers (FILE *file)
3248 Elf_Internal_Phdr *phdrs;
3250 /* Check cache of prior read. */
3251 if (program_headers != NULL)
3254 phdrs = cmalloc (elf_header.e_phnum, sizeof (Elf_Internal_Phdr));
3258 error (_("Out of memory\n"));
3263 ? get_32bit_program_headers (file, phdrs)
3264 : get_64bit_program_headers (file, phdrs))
3266 program_headers = phdrs;
3274 /* Returns 1 if the program headers were loaded. */
3277 process_program_headers (FILE *file)
3279 Elf_Internal_Phdr *segment;
3282 if (elf_header.e_phnum == 0)
3285 printf (_("\nThere are no program headers in this file.\n"));
3289 if (do_segments && !do_header)
3291 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3292 printf (_("Entry point "));
3293 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3294 printf (_("\nThere are %d program headers, starting at offset "),
3295 elf_header.e_phnum);
3296 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3300 if (! get_program_headers (file))
3305 if (elf_header.e_phnum > 1)
3306 printf (_("\nProgram Headers:\n"));
3308 printf (_("\nProgram Headers:\n"));
3312 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3315 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3319 (_(" Type Offset VirtAddr PhysAddr\n"));
3321 (_(" FileSiz MemSiz Flags Align\n"));
3328 for (i = 0, segment = program_headers;
3329 i < elf_header.e_phnum;
3334 printf (" %-14.14s ", get_segment_type (segment->p_type));
3338 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3339 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3340 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3341 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3342 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3344 (segment->p_flags & PF_R ? 'R' : ' '),
3345 (segment->p_flags & PF_W ? 'W' : ' '),
3346 (segment->p_flags & PF_X ? 'E' : ' '));
3347 printf ("%#lx", (unsigned long) segment->p_align);
3351 if ((unsigned long) segment->p_offset == segment->p_offset)
3352 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3355 print_vma (segment->p_offset, FULL_HEX);
3359 print_vma (segment->p_vaddr, FULL_HEX);
3361 print_vma (segment->p_paddr, FULL_HEX);
3364 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3365 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3368 print_vma (segment->p_filesz, FULL_HEX);
3372 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3373 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3376 print_vma (segment->p_offset, FULL_HEX);
3380 (segment->p_flags & PF_R ? 'R' : ' '),
3381 (segment->p_flags & PF_W ? 'W' : ' '),
3382 (segment->p_flags & PF_X ? 'E' : ' '));
3384 if ((unsigned long) segment->p_align == segment->p_align)
3385 printf ("%#lx", (unsigned long) segment->p_align);
3388 print_vma (segment->p_align, PREFIX_HEX);
3393 print_vma (segment->p_offset, FULL_HEX);
3395 print_vma (segment->p_vaddr, FULL_HEX);
3397 print_vma (segment->p_paddr, FULL_HEX);
3399 print_vma (segment->p_filesz, FULL_HEX);
3401 print_vma (segment->p_memsz, FULL_HEX);
3403 (segment->p_flags & PF_R ? 'R' : ' '),
3404 (segment->p_flags & PF_W ? 'W' : ' '),
3405 (segment->p_flags & PF_X ? 'E' : ' '));
3406 print_vma (segment->p_align, HEX);
3410 switch (segment->p_type)
3414 error (_("more than one dynamic segment\n"));
3416 /* Try to locate the .dynamic section. If there is
3417 a section header table, we can easily locate it. */
3418 if (section_headers != NULL)
3420 Elf_Internal_Shdr *sec;
3422 sec = find_section (".dynamic");
3423 if (sec == NULL || sec->sh_size == 0)
3425 error (_("no .dynamic section in the dynamic segment"));
3429 dynamic_addr = sec->sh_offset;
3430 dynamic_size = sec->sh_size;
3432 if (dynamic_addr < segment->p_offset
3433 || dynamic_addr > segment->p_offset + segment->p_filesz)
3434 warn (_("the .dynamic section is not contained within the dynamic segment"));
3435 else if (dynamic_addr > segment->p_offset)
3436 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3440 /* Otherwise, we can only assume that the .dynamic
3441 section is the first section in the DYNAMIC segment. */
3442 dynamic_addr = segment->p_offset;
3443 dynamic_size = segment->p_filesz;
3448 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3450 error (_("Unable to find program interpreter name\n"));
3453 program_interpreter[0] = 0;
3454 fscanf (file, "%63s", program_interpreter);
3457 printf (_("\n [Requesting program interpreter: %s]"),
3458 program_interpreter);
3464 putc ('\n', stdout);
3467 if (do_segments && section_headers != NULL && string_table != NULL)
3469 printf (_("\n Section to Segment mapping:\n"));
3470 printf (_(" Segment Sections...\n"));
3472 for (i = 0; i < elf_header.e_phnum; i++)
3475 Elf_Internal_Shdr *section;
3477 segment = program_headers + i;
3478 section = section_headers;
3480 printf (" %2.2d ", i);
3482 for (j = 1; j < elf_header.e_shnum; j++, section++)
3484 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section, segment))
3485 printf ("%s ", SECTION_NAME (section));
3496 /* Find the file offset corresponding to VMA by using the program headers. */
3499 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3501 Elf_Internal_Phdr *seg;
3503 if (! get_program_headers (file))
3505 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3509 for (seg = program_headers;
3510 seg < program_headers + elf_header.e_phnum;
3513 if (seg->p_type != PT_LOAD)
3516 if (vma >= (seg->p_vaddr & -seg->p_align)
3517 && vma + size <= seg->p_vaddr + seg->p_filesz)
3518 return vma - seg->p_vaddr + seg->p_offset;
3521 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3528 get_32bit_section_headers (FILE *file, unsigned int num)
3530 Elf32_External_Shdr *shdrs;
3531 Elf_Internal_Shdr *internal;
3534 shdrs = get_data (NULL, file, elf_header.e_shoff,
3535 elf_header.e_shentsize, num, _("section headers"));
3539 section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3541 if (section_headers == NULL)
3543 error (_("Out of memory\n"));
3547 for (i = 0, internal = section_headers;
3551 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3552 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3553 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3554 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3555 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3556 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3557 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3558 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3559 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3560 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3569 get_64bit_section_headers (FILE *file, unsigned int num)
3571 Elf64_External_Shdr *shdrs;
3572 Elf_Internal_Shdr *internal;
3575 shdrs = get_data (NULL, file, elf_header.e_shoff,
3576 elf_header.e_shentsize, num, _("section headers"));
3580 section_headers = cmalloc (num, sizeof (Elf_Internal_Shdr));
3582 if (section_headers == NULL)
3584 error (_("Out of memory\n"));
3588 for (i = 0, internal = section_headers;
3592 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3593 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3594 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3595 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3596 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3597 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3598 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3599 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3600 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3601 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3609 static Elf_Internal_Sym *
3610 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3612 unsigned long number;
3613 Elf32_External_Sym *esyms;
3614 Elf_External_Sym_Shndx *shndx;
3615 Elf_Internal_Sym *isyms;
3616 Elf_Internal_Sym *psym;
3619 esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3625 if (symtab_shndx_hdr != NULL
3626 && (symtab_shndx_hdr->sh_link
3627 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3629 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3630 1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3638 number = section->sh_size / section->sh_entsize;
3639 isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3643 error (_("Out of memory\n"));
3650 for (j = 0, psym = isyms;
3654 psym->st_name = BYTE_GET (esyms[j].st_name);
3655 psym->st_value = BYTE_GET (esyms[j].st_value);
3656 psym->st_size = BYTE_GET (esyms[j].st_size);
3657 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3658 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3660 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3661 psym->st_info = BYTE_GET (esyms[j].st_info);
3662 psym->st_other = BYTE_GET (esyms[j].st_other);
3672 static Elf_Internal_Sym *
3673 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3675 unsigned long number;
3676 Elf64_External_Sym *esyms;
3677 Elf_External_Sym_Shndx *shndx;
3678 Elf_Internal_Sym *isyms;
3679 Elf_Internal_Sym *psym;
3682 esyms = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
3688 if (symtab_shndx_hdr != NULL
3689 && (symtab_shndx_hdr->sh_link
3690 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3692 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3693 1, symtab_shndx_hdr->sh_size, _("symtab shndx"));
3701 number = section->sh_size / section->sh_entsize;
3702 isyms = cmalloc (number, sizeof (Elf_Internal_Sym));
3706 error (_("Out of memory\n"));
3713 for (j = 0, psym = isyms;
3717 psym->st_name = BYTE_GET (esyms[j].st_name);
3718 psym->st_info = BYTE_GET (esyms[j].st_info);
3719 psym->st_other = BYTE_GET (esyms[j].st_other);
3720 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3721 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3723 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3724 psym->st_value = BYTE_GET (esyms[j].st_value);
3725 psym->st_size = BYTE_GET (esyms[j].st_size);
3736 get_elf_section_flags (bfd_vma sh_flags)
3738 static char buff[1024];
3740 int field_size = is_32bit_elf ? 8 : 16;
3741 int index, size = sizeof (buff) - (field_size + 4 + 1);
3742 bfd_vma os_flags = 0;
3743 bfd_vma proc_flags = 0;
3744 bfd_vma unknown_flags = 0;
3758 { "LINK ORDER", 10 },
3759 { "OS NONCONF", 10 },
3764 if (do_section_details)
3766 sprintf (buff, "[%*.*lx]: ",
3767 field_size, field_size, (unsigned long) sh_flags);
3768 p += field_size + 4;
3775 flag = sh_flags & - sh_flags;
3778 if (do_section_details)
3782 case SHF_WRITE: index = 0; break;
3783 case SHF_ALLOC: index = 1; break;
3784 case SHF_EXECINSTR: index = 2; break;
3785 case SHF_MERGE: index = 3; break;
3786 case SHF_STRINGS: index = 4; break;
3787 case SHF_INFO_LINK: index = 5; break;
3788 case SHF_LINK_ORDER: index = 6; break;
3789 case SHF_OS_NONCONFORMING: index = 7; break;
3790 case SHF_GROUP: index = 8; break;
3791 case SHF_TLS: index = 9; break;
3800 if (p != buff + field_size + 4)
3802 if (size < (10 + 2))
3809 size -= flags [index].len;
3810 p = stpcpy (p, flags [index].str);
3812 else if (flag & SHF_MASKOS)
3814 else if (flag & SHF_MASKPROC)
3817 unknown_flags |= flag;
3823 case SHF_WRITE: *p = 'W'; break;
3824 case SHF_ALLOC: *p = 'A'; break;
3825 case SHF_EXECINSTR: *p = 'X'; break;
3826 case SHF_MERGE: *p = 'M'; break;
3827 case SHF_STRINGS: *p = 'S'; break;
3828 case SHF_INFO_LINK: *p = 'I'; break;
3829 case SHF_LINK_ORDER: *p = 'L'; break;
3830 case SHF_OS_NONCONFORMING: *p = 'O'; break;
3831 case SHF_GROUP: *p = 'G'; break;
3832 case SHF_TLS: *p = 'T'; break;
3835 if (elf_header.e_machine == EM_X86_64
3836 && flag == SHF_X86_64_LARGE)
3838 else if (flag & SHF_MASKOS)
3841 sh_flags &= ~ SHF_MASKOS;
3843 else if (flag & SHF_MASKPROC)
3846 sh_flags &= ~ SHF_MASKPROC;
3856 if (do_section_details)
3860 size -= 5 + field_size;
3861 if (p != buff + field_size + 4)
3869 sprintf (p, "OS (%*.*lx)", field_size, field_size,
3870 (unsigned long) os_flags);
3871 p += 5 + field_size;
3875 size -= 7 + field_size;
3876 if (p != buff + field_size + 4)
3884 sprintf (p, "PROC (%*.*lx)", field_size, field_size,
3885 (unsigned long) proc_flags);
3886 p += 7 + field_size;
3890 size -= 10 + field_size;
3891 if (p != buff + field_size + 4)
3899 sprintf (p, "UNKNOWN (%*.*lx)", field_size, field_size,
3900 (unsigned long) unknown_flags);
3901 p += 10 + field_size;
3910 process_section_headers (FILE *file)
3912 Elf_Internal_Shdr *section;
3915 section_headers = NULL;
3917 if (elf_header.e_shnum == 0)
3920 printf (_("\nThere are no sections in this file.\n"));
3925 if (do_sections && !do_header)
3926 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3927 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3931 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3934 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3937 /* Read in the string table, so that we have names to display. */
3938 if (elf_header.e_shstrndx != SHN_UNDEF
3939 && SECTION_HEADER_INDEX (elf_header.e_shstrndx) < elf_header.e_shnum)
3941 section = SECTION_HEADER (elf_header.e_shstrndx);
3943 if (section->sh_size != 0)
3945 string_table = get_data (NULL, file, section->sh_offset,
3946 1, section->sh_size, _("string table"));
3948 string_table_length = string_table != NULL ? section->sh_size : 0;
3952 /* Scan the sections for the dynamic symbol table
3953 and dynamic string table and debug sections. */
3954 dynamic_symbols = NULL;
3955 dynamic_strings = NULL;
3956 dynamic_syminfo = NULL;
3957 symtab_shndx_hdr = NULL;
3959 eh_addr_size = is_32bit_elf ? 4 : 8;
3960 switch (elf_header.e_machine)
3963 case EM_MIPS_RS3_LE:
3964 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3965 FDE addresses. However, the ABI also has a semi-official ILP32
3966 variant for which the normal FDE address size rules apply.
3968 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3969 section, where XX is the size of longs in bits. Unfortunately,
3970 earlier compilers provided no way of distinguishing ILP32 objects
3971 from LP64 objects, so if there's any doubt, we should assume that
3972 the official LP64 form is being used. */
3973 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
3974 && find_section (".gcc_compiled_long32") == NULL)
3980 switch (elf_header.e_flags & EF_H8_MACH)
3982 case E_H8_MACH_H8300:
3983 case E_H8_MACH_H8300HN:
3984 case E_H8_MACH_H8300SN:
3985 case E_H8_MACH_H8300SXN:
3988 case E_H8_MACH_H8300H:
3989 case E_H8_MACH_H8300S:
3990 case E_H8_MACH_H8300SX:
3996 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3999 size_t expected_entsize \
4000 = is_32bit_elf ? size32 : size64; \
4001 if (section->sh_entsize != expected_entsize) \
4002 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4003 i, (unsigned long int) section->sh_entsize, \
4004 (unsigned long int) expected_entsize); \
4005 section->sh_entsize = expected_entsize; \
4008 #define CHECK_ENTSIZE(section, i, type) \
4009 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4010 sizeof (Elf64_External_##type))
4012 for (i = 0, section = section_headers;
4013 i < elf_header.e_shnum;
4016 char *name = SECTION_NAME (section);
4018 if (section->sh_type == SHT_DYNSYM)
4020 if (dynamic_symbols != NULL)
4022 error (_("File contains multiple dynamic symbol tables\n"));
4026 CHECK_ENTSIZE (section, i, Sym);
4027 num_dynamic_syms = section->sh_size / section->sh_entsize;
4028 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
4030 else if (section->sh_type == SHT_STRTAB
4031 && streq (name, ".dynstr"))
4033 if (dynamic_strings != NULL)
4035 error (_("File contains multiple dynamic string tables\n"));
4039 dynamic_strings = get_data (NULL, file, section->sh_offset,
4040 1, section->sh_size, _("dynamic strings"));
4041 dynamic_strings_length = section->sh_size;
4043 else if (section->sh_type == SHT_SYMTAB_SHNDX)
4045 if (symtab_shndx_hdr != NULL)
4047 error (_("File contains multiple symtab shndx tables\n"));
4050 symtab_shndx_hdr = section;
4052 else if (section->sh_type == SHT_SYMTAB)
4053 CHECK_ENTSIZE (section, i, Sym);
4054 else if (section->sh_type == SHT_GROUP)
4055 CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
4056 else if (section->sh_type == SHT_REL)
4057 CHECK_ENTSIZE (section, i, Rel);
4058 else if (section->sh_type == SHT_RELA)
4059 CHECK_ENTSIZE (section, i, Rela);
4060 else if ((do_debugging || do_debug_info || do_debug_abbrevs
4061 || do_debug_lines || do_debug_pubnames || do_debug_aranges
4062 || do_debug_frames || do_debug_macinfo || do_debug_str
4063 || do_debug_loc || do_debug_ranges)
4064 && strneq (name, ".debug_", 7))
4069 || (do_debug_info && streq (name, "info"))
4070 || (do_debug_abbrevs && streq (name, "abbrev"))
4071 || (do_debug_lines && streq (name, "line"))
4072 || (do_debug_pubnames && streq (name, "pubnames"))
4073 || (do_debug_aranges && streq (name, "aranges"))
4074 || (do_debug_ranges && streq (name, "ranges"))
4075 || (do_debug_frames && streq (name, "frame"))
4076 || (do_debug_macinfo && streq (name, "macinfo"))
4077 || (do_debug_str && streq (name, "str"))
4078 || (do_debug_loc && streq (name, "loc"))
4080 request_dump (i, DEBUG_DUMP);
4082 /* linkonce section to be combined with .debug_info at link time. */
4083 else if ((do_debugging || do_debug_info)
4084 && strneq (name, ".gnu.linkonce.wi.", 17))
4085 request_dump (i, DEBUG_DUMP);
4086 else if (do_debug_frames && streq (name, ".eh_frame"))
4087 request_dump (i, DEBUG_DUMP);
4093 if (elf_header.e_shnum > 1)
4094 printf (_("\nSection Headers:\n"));
4096 printf (_("\nSection Header:\n"));
4100 if (do_section_details)
4102 printf (_(" [Nr] Name\n"));
4103 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4107 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4111 if (do_section_details)
4113 printf (_(" [Nr] Name\n"));
4114 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4118 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4122 if (do_section_details)
4124 printf (_(" [Nr] Name\n"));
4125 printf (_(" Type Address Offset Link\n"));
4126 printf (_(" Size EntSize Info Align\n"));
4130 printf (_(" [Nr] Name Type Address Offset\n"));
4131 printf (_(" Size EntSize Flags Link Info Align\n"));
4135 if (do_section_details)
4136 printf (_(" Flags\n"));
4138 for (i = 0, section = section_headers;
4139 i < elf_header.e_shnum;
4142 if (do_section_details)
4144 printf (" [%2u] %s\n",
4145 SECTION_HEADER_NUM (i),
4146 SECTION_NAME (section));
4147 if (is_32bit_elf || do_wide)
4148 printf (" %-15.15s ",
4149 get_section_type_name (section->sh_type));
4152 printf (" [%2u] %-17.17s %-15.15s ",
4153 SECTION_HEADER_NUM (i),
4154 SECTION_NAME (section),
4155 get_section_type_name (section->sh_type));
4159 print_vma (section->sh_addr, LONG_HEX);
4161 printf ( " %6.6lx %6.6lx %2.2lx",
4162 (unsigned long) section->sh_offset,
4163 (unsigned long) section->sh_size,
4164 (unsigned long) section->sh_entsize);
4166 if (do_section_details)
4167 fputs (" ", stdout);
4169 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4171 printf ("%2ld %3lu %2ld\n",
4172 (unsigned long) section->sh_link,
4173 (unsigned long) section->sh_info,
4174 (unsigned long) section->sh_addralign);
4178 print_vma (section->sh_addr, LONG_HEX);
4180 if ((long) section->sh_offset == section->sh_offset)
4181 printf (" %6.6lx", (unsigned long) section->sh_offset);
4185 print_vma (section->sh_offset, LONG_HEX);
4188 if ((unsigned long) section->sh_size == section->sh_size)
4189 printf (" %6.6lx", (unsigned long) section->sh_size);
4193 print_vma (section->sh_size, LONG_HEX);
4196 if ((unsigned long) section->sh_entsize == section->sh_entsize)
4197 printf (" %2.2lx", (unsigned long) section->sh_entsize);
4201 print_vma (section->sh_entsize, LONG_HEX);
4204 if (do_section_details)
4205 fputs (" ", stdout);
4207 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4209 printf ("%2ld %3lu ",
4210 (unsigned long) section->sh_link,
4211 (unsigned long) section->sh_info);
4213 if ((unsigned long) section->sh_addralign == section->sh_addralign)
4214 printf ("%2ld\n", (unsigned long) section->sh_addralign);
4217 print_vma (section->sh_addralign, DEC);
4221 else if (do_section_details)
4223 printf (" %-15.15s ",
4224 get_section_type_name (section->sh_type));
4225 print_vma (section->sh_addr, LONG_HEX);
4226 if ((long) section->sh_offset == section->sh_offset)
4227 printf (" %16.16lx", (unsigned long) section->sh_offset);
4231 print_vma (section->sh_offset, LONG_HEX);
4233 printf (" %ld\n ", (unsigned long) section->sh_link);
4234 print_vma (section->sh_size, LONG_HEX);
4236 print_vma (section->sh_entsize, LONG_HEX);
4238 printf (" %-16lu %ld\n",
4239 (unsigned long) section->sh_info,
4240 (unsigned long) section->sh_addralign);
4245 print_vma (section->sh_addr, LONG_HEX);
4246 if ((long) section->sh_offset == section->sh_offset)
4247 printf (" %8.8lx", (unsigned long) section->sh_offset);
4251 print_vma (section->sh_offset, LONG_HEX);
4254 print_vma (section->sh_size, LONG_HEX);
4256 print_vma (section->sh_entsize, LONG_HEX);
4258 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4260 printf (" %2ld %3lu %ld\n",
4261 (unsigned long) section->sh_link,
4262 (unsigned long) section->sh_info,
4263 (unsigned long) section->sh_addralign);
4266 if (do_section_details)
4267 printf (" %s\n", get_elf_section_flags (section->sh_flags));
4270 if (!do_section_details)
4271 printf (_("Key to Flags:\n\
4272 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4273 I (info), L (link order), G (group), x (unknown)\n\
4274 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4280 get_group_flags (unsigned int flags)
4282 static char buff[32];
4289 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x]"), flags);
4296 process_section_groups (FILE *file)
4298 Elf_Internal_Shdr *section;
4300 struct group *group;
4301 Elf_Internal_Shdr *symtab_sec, *strtab_sec;
4302 Elf_Internal_Sym *symtab;
4306 /* Don't process section groups unless needed. */
4307 if (!do_unwind && !do_section_groups)
4310 if (elf_header.e_shnum == 0)
4312 if (do_section_groups)
4313 printf (_("\nThere are no sections in this file.\n"));
4318 if (section_headers == NULL)
4320 error (_("Section headers are not available!\n"));
4324 section_headers_groups = calloc (elf_header.e_shnum,
4325 sizeof (struct group *));
4327 if (section_headers_groups == NULL)
4329 error (_("Out of memory\n"));
4333 /* Scan the sections for the group section. */
4335 for (i = 0, section = section_headers;
4336 i < elf_header.e_shnum;
4338 if (section->sh_type == SHT_GROUP)
4341 if (group_count == 0)
4343 if (do_section_groups)
4344 printf (_("\nThere are no section groups in this file.\n"));
4349 section_groups = calloc (group_count, sizeof (struct group));
4351 if (section_groups == NULL)
4353 error (_("Out of memory\n"));
4362 for (i = 0, section = section_headers, group = section_groups;
4363 i < elf_header.e_shnum;
4366 if (section->sh_type == SHT_GROUP)
4368 char *name = SECTION_NAME (section);
4370 unsigned char *start, *indices;
4371 unsigned int entry, j, size;
4372 Elf_Internal_Shdr *sec;
4373 Elf_Internal_Sym *sym;
4375 /* Get the symbol table. */
4376 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum
4377 || ((sec = SECTION_HEADER (section->sh_link))->sh_type
4380 error (_("Bad sh_link in group section `%s'\n"), name);
4384 if (symtab_sec != sec)
4389 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4392 sym = symtab + section->sh_info;
4394 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4396 bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
4399 error (_("Bad sh_info in group section `%s'\n"), name);
4403 group_name = SECTION_NAME (section_headers + sec_index);
4412 /* Get the string table. */
4413 if (SECTION_HEADER_INDEX (symtab_sec->sh_link)
4414 >= elf_header.e_shnum)
4423 != (sec = SECTION_HEADER (symtab_sec->sh_link)))
4428 strtab = get_data (NULL, file, strtab_sec->sh_offset,
4429 1, strtab_sec->sh_size,
4431 strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
4433 group_name = sym->st_name < strtab_size
4434 ? strtab + sym->st_name : "<corrupt>";
4437 start = get_data (NULL, file, section->sh_offset,
4438 1, section->sh_size, _("section data"));
4441 size = (section->sh_size / section->sh_entsize) - 1;
4442 entry = byte_get (indices, 4);
4445 if (do_section_groups)
4447 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4448 get_group_flags (entry), i, name, group_name, size);
4450 printf (_(" [Index] Name\n"));
4453 group->group_index = i;
4455 for (j = 0; j < size; j++)
4457 struct group_list *g;
4459 entry = byte_get (indices, 4);
4462 if (SECTION_HEADER_INDEX (entry) >= elf_header.e_shnum)
4464 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4465 entry, i, elf_header.e_shnum - 1);
4468 else if (entry >= SHN_LORESERVE && entry <= SHN_HIRESERVE)
4470 error (_("invalid section [%5u] in group section [%5u]\n"),
4475 if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
4480 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4482 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4487 /* Intel C/C++ compiler may put section 0 in a
4488 section group. We just warn it the first time
4489 and ignore it afterwards. */
4490 static int warned = 0;
4493 error (_("section 0 in group section [%5u]\n"),
4494 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4500 section_headers_groups [SECTION_HEADER_INDEX (entry)]
4503 if (do_section_groups)
4505 sec = SECTION_HEADER (entry);
4506 printf (" [%5u] %s\n", entry, SECTION_NAME (sec));
4509 g = xmalloc (sizeof (struct group_list));
4510 g->section_index = entry;
4511 g->next = group->root;
4535 } dynamic_relocations [] =
4537 { "REL", DT_REL, DT_RELSZ, FALSE },
4538 { "RELA", DT_RELA, DT_RELASZ, TRUE },
4539 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4542 /* Process the reloc section. */
4545 process_relocs (FILE *file)
4547 unsigned long rel_size;
4548 unsigned long rel_offset;
4554 if (do_using_dynamic)
4558 int has_dynamic_reloc;
4561 has_dynamic_reloc = 0;
4563 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4565 is_rela = dynamic_relocations [i].rela;
4566 name = dynamic_relocations [i].name;
4567 rel_size = dynamic_info [dynamic_relocations [i].size];
4568 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4570 has_dynamic_reloc |= rel_size;
4572 if (is_rela == UNKNOWN)
4574 if (dynamic_relocations [i].reloc == DT_JMPREL)
4575 switch (dynamic_info[DT_PLTREL])
4589 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4590 name, rel_offset, rel_size);
4592 dump_relocations (file,
4593 offset_from_vma (file, rel_offset, rel_size),
4595 dynamic_symbols, num_dynamic_syms,
4596 dynamic_strings, dynamic_strings_length, is_rela);
4600 if (! has_dynamic_reloc)
4601 printf (_("\nThere are no dynamic relocations in this file.\n"));
4605 Elf_Internal_Shdr *section;
4609 for (i = 0, section = section_headers;
4610 i < elf_header.e_shnum;
4613 if ( section->sh_type != SHT_RELA
4614 && section->sh_type != SHT_REL)
4617 rel_offset = section->sh_offset;
4618 rel_size = section->sh_size;
4622 Elf_Internal_Shdr *strsec;
4625 printf (_("\nRelocation section "));
4627 if (string_table == NULL)
4628 printf ("%d", section->sh_name);
4630 printf (_("'%s'"), SECTION_NAME (section));
4632 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4633 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4635 is_rela = section->sh_type == SHT_RELA;
4637 if (section->sh_link
4638 && SECTION_HEADER_INDEX (section->sh_link)
4639 < elf_header.e_shnum)
4641 Elf_Internal_Shdr *symsec;
4642 Elf_Internal_Sym *symtab;
4643 unsigned long nsyms;
4644 unsigned long strtablen = 0;
4645 char *strtab = NULL;
4647 symsec = SECTION_HEADER (section->sh_link);
4648 if (symsec->sh_type != SHT_SYMTAB
4649 && symsec->sh_type != SHT_DYNSYM)
4652 nsyms = symsec->sh_size / symsec->sh_entsize;
4653 symtab = GET_ELF_SYMBOLS (file, symsec);
4658 if (SECTION_HEADER_INDEX (symsec->sh_link)
4659 < elf_header.e_shnum)
4661 strsec = SECTION_HEADER (symsec->sh_link);
4663 strtab = get_data (NULL, file, strsec->sh_offset,
4666 strtablen = strtab == NULL ? 0 : strsec->sh_size;
4669 dump_relocations (file, rel_offset, rel_size,
4670 symtab, nsyms, strtab, strtablen, is_rela);
4676 dump_relocations (file, rel_offset, rel_size,
4677 NULL, 0, NULL, 0, is_rela);
4684 printf (_("\nThere are no relocations in this file.\n"));
4690 /* Process the unwind section. */
4692 #include "unwind-ia64.h"
4694 /* An absolute address consists of a section and an offset. If the
4695 section is NULL, the offset itself is the address, otherwise, the
4696 address equals to LOAD_ADDRESS(section) + offset. */
4700 unsigned short section;
4704 #define ABSADDR(a) \
4706 ? section_headers [(a).section].sh_addr + (a).offset \
4709 struct ia64_unw_aux_info
4711 struct ia64_unw_table_entry
4713 struct absaddr start;
4715 struct absaddr info;
4717 *table; /* Unwind table. */
4718 unsigned long table_len; /* Length of unwind table. */
4719 unsigned char *info; /* Unwind info. */
4720 unsigned long info_size; /* Size of unwind info. */
4721 bfd_vma info_addr; /* starting address of unwind info. */
4722 bfd_vma seg_base; /* Starting address of segment. */
4723 Elf_Internal_Sym *symtab; /* The symbol table. */
4724 unsigned long nsyms; /* Number of symbols. */
4725 char *strtab; /* The string table. */
4726 unsigned long strtab_size; /* Size of string table. */
4730 find_symbol_for_address (Elf_Internal_Sym *symtab,
4731 unsigned long nsyms,
4733 unsigned long strtab_size,
4734 struct absaddr addr,
4735 const char **symname,
4738 bfd_vma dist = 0x100000;
4739 Elf_Internal_Sym *sym, *best = NULL;
4742 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4744 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4745 && sym->st_name != 0
4746 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4747 && addr.offset >= sym->st_value
4748 && addr.offset - sym->st_value < dist)
4751 dist = addr.offset - sym->st_value;
4758 *symname = (best->st_name >= strtab_size
4759 ? "<corrupt>" : strtab + best->st_name);
4764 *offset = addr.offset;
4768 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4770 struct ia64_unw_table_entry *tp;
4773 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4777 const unsigned char *dp;
4778 const unsigned char *head;
4779 const char *procname;
4781 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4782 aux->strtab_size, tp->start, &procname, &offset);
4784 fputs ("\n<", stdout);
4788 fputs (procname, stdout);
4791 printf ("+%lx", (unsigned long) offset);
4794 fputs (">: [", stdout);
4795 print_vma (tp->start.offset, PREFIX_HEX);
4796 fputc ('-', stdout);
4797 print_vma (tp->end.offset, PREFIX_HEX);
4798 printf ("], info at +0x%lx\n",
4799 (unsigned long) (tp->info.offset - aux->seg_base));
4801 head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
4802 stamp = byte_get ((unsigned char *) head, sizeof (stamp));
4804 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4805 (unsigned) UNW_VER (stamp),
4806 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4807 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4808 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4809 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4811 if (UNW_VER (stamp) != 1)
4813 printf ("\tUnknown version.\n");
4818 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
4819 dp = unw_decode (dp, in_body, & in_body);
4824 slurp_ia64_unwind_table (FILE *file,
4825 struct ia64_unw_aux_info *aux,
4826 Elf_Internal_Shdr *sec)
4828 unsigned long size, nrelas, i;
4829 Elf_Internal_Phdr *seg;
4830 struct ia64_unw_table_entry *tep;
4831 Elf_Internal_Shdr *relsec;
4832 Elf_Internal_Rela *rela, *rp;
4833 unsigned char *table, *tp;
4834 Elf_Internal_Sym *sym;
4835 const char *relname;
4837 /* First, find the starting address of the segment that includes
4840 if (elf_header.e_phnum)
4842 if (! get_program_headers (file))
4845 for (seg = program_headers;
4846 seg < program_headers + elf_header.e_phnum;
4849 if (seg->p_type != PT_LOAD)
4852 if (sec->sh_addr >= seg->p_vaddr
4853 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4855 aux->seg_base = seg->p_vaddr;
4861 /* Second, build the unwind table from the contents of the unwind section: */
4862 size = sec->sh_size;
4863 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
4867 aux->table = xcmalloc (size / (3 * eh_addr_size), sizeof (aux->table[0]));
4869 for (tp = table; tp < table + size; tp += 3 * eh_addr_size, ++tep)
4871 tep->start.section = SHN_UNDEF;
4872 tep->end.section = SHN_UNDEF;
4873 tep->info.section = SHN_UNDEF;
4876 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4877 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4878 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4882 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
4883 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
4884 tep->info.offset = BYTE_GET ((unsigned char *) tp + 16);
4886 tep->start.offset += aux->seg_base;
4887 tep->end.offset += aux->seg_base;
4888 tep->info.offset += aux->seg_base;
4892 /* Third, apply any relocations to the unwind table: */
4894 for (relsec = section_headers;
4895 relsec < section_headers + elf_header.e_shnum;
4898 if (relsec->sh_type != SHT_RELA
4899 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
4900 || SECTION_HEADER (relsec->sh_info) != sec)
4903 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4907 for (rp = rela; rp < rela + nrelas; ++rp)
4911 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4912 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4916 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4917 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4920 if (! strneq (relname, "R_IA64_SEGREL", 13))
4922 warn (_("Skipping unexpected relocation type %s\n"), relname);
4926 i = rp->r_offset / (3 * eh_addr_size);
4928 switch (rp->r_offset/eh_addr_size % 3)
4931 aux->table[i].start.section = sym->st_shndx;
4932 aux->table[i].start.offset += rp->r_addend + sym->st_value;
4935 aux->table[i].end.section = sym->st_shndx;
4936 aux->table[i].end.offset += rp->r_addend + sym->st_value;
4939 aux->table[i].info.section = sym->st_shndx;
4940 aux->table[i].info.offset += rp->r_addend + sym->st_value;
4950 aux->table_len = size / (3 * eh_addr_size);
4955 ia64_process_unwind (FILE *file)
4957 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4958 unsigned long i, unwcount = 0, unwstart = 0;
4959 struct ia64_unw_aux_info aux;
4961 memset (& aux, 0, sizeof (aux));
4963 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4965 if (sec->sh_type == SHT_SYMTAB
4966 && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
4968 aux.nsyms = sec->sh_size / sec->sh_entsize;
4969 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4971 strsec = SECTION_HEADER (sec->sh_link);
4972 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4973 1, strsec->sh_size, _("string table"));
4974 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
4976 else if (sec->sh_type == SHT_IA_64_UNWIND)
4981 printf (_("\nThere are no unwind sections in this file.\n"));
4983 while (unwcount-- > 0)
4988 for (i = unwstart, sec = section_headers + unwstart;
4989 i < elf_header.e_shnum; ++i, ++sec)
4990 if (sec->sh_type == SHT_IA_64_UNWIND)
4997 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4999 if ((unwsec->sh_flags & SHF_GROUP) != 0)
5001 /* We need to find which section group it is in. */
5002 struct group_list *g = section_headers_groups [i]->root;
5004 for (; g != NULL; g = g->next)
5006 sec = SECTION_HEADER (g->section_index);
5008 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
5013 i = elf_header.e_shnum;
5015 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
5017 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5018 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
5019 suffix = SECTION_NAME (unwsec) + len;
5020 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5022 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
5023 && streq (SECTION_NAME (sec) + len2, suffix))
5028 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5029 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5030 len = sizeof (ELF_STRING_ia64_unwind) - 1;
5031 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
5033 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
5034 suffix = SECTION_NAME (unwsec) + len;
5035 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
5037 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
5038 && streq (SECTION_NAME (sec) + len2, suffix))
5042 if (i == elf_header.e_shnum)
5044 printf (_("\nCould not find unwind info section for "));
5046 if (string_table == NULL)
5047 printf ("%d", unwsec->sh_name);
5049 printf (_("'%s'"), SECTION_NAME (unwsec));
5053 aux.info_size = sec->sh_size;
5054 aux.info_addr = sec->sh_addr;
5055 aux.info = get_data (NULL, file, sec->sh_offset, 1, aux.info_size,
5058 printf (_("\nUnwind section "));
5060 if (string_table == NULL)
5061 printf ("%d", unwsec->sh_name);
5063 printf (_("'%s'"), SECTION_NAME (unwsec));
5065 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5066 (unsigned long) unwsec->sh_offset,
5067 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
5069 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
5071 if (aux.table_len > 0)
5072 dump_ia64_unwind (& aux);
5075 free ((char *) aux.table);
5077 free ((char *) aux.info);
5086 free ((char *) aux.strtab);
5091 struct hppa_unw_aux_info
5093 struct hppa_unw_table_entry
5095 struct absaddr start;
5097 unsigned int Cannot_unwind:1; /* 0 */
5098 unsigned int Millicode:1; /* 1 */
5099 unsigned int Millicode_save_sr0:1; /* 2 */
5100 unsigned int Region_description:2; /* 3..4 */
5101 unsigned int reserved1:1; /* 5 */
5102 unsigned int Entry_SR:1; /* 6 */
5103 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
5104 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
5105 unsigned int Args_stored:1; /* 16 */
5106 unsigned int Variable_Frame:1; /* 17 */
5107 unsigned int Separate_Package_Body:1; /* 18 */
5108 unsigned int Frame_Extension_Millicode:1; /* 19 */
5109 unsigned int Stack_Overflow_Check:1; /* 20 */
5110 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
5111 unsigned int Ada_Region:1; /* 22 */
5112 unsigned int cxx_info:1; /* 23 */
5113 unsigned int cxx_try_catch:1; /* 24 */
5114 unsigned int sched_entry_seq:1; /* 25 */
5115 unsigned int reserved2:1; /* 26 */
5116 unsigned int Save_SP:1; /* 27 */
5117 unsigned int Save_RP:1; /* 28 */
5118 unsigned int Save_MRP_in_frame:1; /* 29 */
5119 unsigned int extn_ptr_defined:1; /* 30 */
5120 unsigned int Cleanup_defined:1; /* 31 */
5122 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
5123 unsigned int HP_UX_interrupt_marker:1; /* 1 */
5124 unsigned int Large_frame:1; /* 2 */
5125 unsigned int Pseudo_SP_Set:1; /* 3 */
5126 unsigned int reserved4:1; /* 4 */
5127 unsigned int Total_frame_size:27; /* 5..31 */
5129 *table; /* Unwind table. */
5130 unsigned long table_len; /* Length of unwind table. */
5131 bfd_vma seg_base; /* Starting address of segment. */
5132 Elf_Internal_Sym *symtab; /* The symbol table. */
5133 unsigned long nsyms; /* Number of symbols. */
5134 char *strtab; /* The string table. */
5135 unsigned long strtab_size; /* Size of string table. */
5139 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
5141 struct hppa_unw_table_entry *tp;
5143 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
5146 const char *procname;
5148 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
5149 aux->strtab_size, tp->start, &procname,
5152 fputs ("\n<", stdout);
5156 fputs (procname, stdout);
5159 printf ("+%lx", (unsigned long) offset);
5162 fputs (">: [", stdout);
5163 print_vma (tp->start.offset, PREFIX_HEX);
5164 fputc ('-', stdout);
5165 print_vma (tp->end.offset, PREFIX_HEX);
5168 #define PF(_m) if (tp->_m) printf (#_m " ");
5169 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5172 PF(Millicode_save_sr0);
5173 /* PV(Region_description); */
5179 PF(Separate_Package_Body);
5180 PF(Frame_Extension_Millicode);
5181 PF(Stack_Overflow_Check);
5182 PF(Two_Instruction_SP_Increment);
5186 PF(sched_entry_seq);
5189 PF(Save_MRP_in_frame);
5190 PF(extn_ptr_defined);
5191 PF(Cleanup_defined);
5192 PF(MPE_XL_interrupt_marker);
5193 PF(HP_UX_interrupt_marker);
5196 PV(Total_frame_size);
5205 slurp_hppa_unwind_table (FILE *file,
5206 struct hppa_unw_aux_info *aux,
5207 Elf_Internal_Shdr *sec)
5209 unsigned long size, unw_ent_size, nentries, nrelas, i;
5210 Elf_Internal_Phdr *seg;
5211 struct hppa_unw_table_entry *tep;
5212 Elf_Internal_Shdr *relsec;
5213 Elf_Internal_Rela *rela, *rp;
5214 unsigned char *table, *tp;
5215 Elf_Internal_Sym *sym;
5216 const char *relname;
5218 /* First, find the starting address of the segment that includes
5221 if (elf_header.e_phnum)
5223 if (! get_program_headers (file))
5226 for (seg = program_headers;
5227 seg < program_headers + elf_header.e_phnum;
5230 if (seg->p_type != PT_LOAD)
5233 if (sec->sh_addr >= seg->p_vaddr
5234 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
5236 aux->seg_base = seg->p_vaddr;
5242 /* Second, build the unwind table from the contents of the unwind
5244 size = sec->sh_size;
5245 table = get_data (NULL, file, sec->sh_offset, 1, size, _("unwind table"));
5250 nentries = size / unw_ent_size;
5251 size = unw_ent_size * nentries;
5253 tep = aux->table = xcmalloc (nentries, sizeof (aux->table[0]));
5255 for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
5257 unsigned int tmp1, tmp2;
5259 tep->start.section = SHN_UNDEF;
5260 tep->end.section = SHN_UNDEF;
5262 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
5263 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
5264 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
5265 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
5267 tep->start.offset += aux->seg_base;
5268 tep->end.offset += aux->seg_base;
5270 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
5271 tep->Millicode = (tmp1 >> 30) & 0x1;
5272 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
5273 tep->Region_description = (tmp1 >> 27) & 0x3;
5274 tep->reserved1 = (tmp1 >> 26) & 0x1;
5275 tep->Entry_SR = (tmp1 >> 25) & 0x1;
5276 tep->Entry_FR = (tmp1 >> 21) & 0xf;
5277 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
5278 tep->Args_stored = (tmp1 >> 15) & 0x1;
5279 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
5280 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
5281 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
5282 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
5283 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
5284 tep->Ada_Region = (tmp1 >> 9) & 0x1;
5285 tep->cxx_info = (tmp1 >> 8) & 0x1;
5286 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
5287 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
5288 tep->reserved2 = (tmp1 >> 5) & 0x1;
5289 tep->Save_SP = (tmp1 >> 4) & 0x1;
5290 tep->Save_RP = (tmp1 >> 3) & 0x1;
5291 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
5292 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
5293 tep->Cleanup_defined = tmp1 & 0x1;
5295 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
5296 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
5297 tep->Large_frame = (tmp2 >> 29) & 0x1;
5298 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
5299 tep->reserved4 = (tmp2 >> 27) & 0x1;
5300 tep->Total_frame_size = tmp2 & 0x7ffffff;
5304 /* Third, apply any relocations to the unwind table. */
5306 for (relsec = section_headers;
5307 relsec < section_headers + elf_header.e_shnum;
5310 if (relsec->sh_type != SHT_RELA
5311 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
5312 || SECTION_HEADER (relsec->sh_info) != sec)
5315 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5319 for (rp = rela; rp < rela + nrelas; ++rp)
5323 relname = elf_hppa_reloc_type (ELF32_R_TYPE (rp->r_info));
5324 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
5328 relname = elf_hppa_reloc_type (ELF64_R_TYPE (rp->r_info));
5329 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
5332 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5333 if (strncmp (relname, "R_PARISC_SEGREL", 15) != 0)
5335 warn (_("Skipping unexpected relocation type %s\n"), relname);
5339 i = rp->r_offset / unw_ent_size;
5341 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
5344 aux->table[i].start.section = sym->st_shndx;
5345 aux->table[i].start.offset += sym->st_value + rp->r_addend;
5348 aux->table[i].end.section = sym->st_shndx;
5349 aux->table[i].end.offset += sym->st_value + rp->r_addend;
5359 aux->table_len = nentries;
5365 hppa_process_unwind (FILE *file)
5367 struct hppa_unw_aux_info aux;
5368 Elf_Internal_Shdr *unwsec = NULL;
5369 Elf_Internal_Shdr *strsec;
5370 Elf_Internal_Shdr *sec;
5373 memset (& aux, 0, sizeof (aux));
5375 if (string_table == NULL)
5378 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5380 if (sec->sh_type == SHT_SYMTAB
5381 && SECTION_HEADER_INDEX (sec->sh_link) < elf_header.e_shnum)
5383 aux.nsyms = sec->sh_size / sec->sh_entsize;
5384 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5386 strsec = SECTION_HEADER (sec->sh_link);
5387 aux.strtab = get_data (NULL, file, strsec->sh_offset,
5388 1, strsec->sh_size, _("string table"));
5389 aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
5391 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5396 printf (_("\nThere are no unwind sections in this file.\n"));
5398 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5400 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5402 printf (_("\nUnwind section "));
5403 printf (_("'%s'"), SECTION_NAME (sec));
5405 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5406 (unsigned long) sec->sh_offset,
5407 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
5409 slurp_hppa_unwind_table (file, &aux, sec);
5410 if (aux.table_len > 0)
5411 dump_hppa_unwind (&aux);
5414 free ((char *) aux.table);
5422 free ((char *) aux.strtab);
5428 process_unwind (FILE *file)
5430 struct unwind_handler {
5432 int (*handler)(FILE *file);
5434 { EM_IA_64, ia64_process_unwind },
5435 { EM_PARISC, hppa_process_unwind },
5443 for (i = 0; handlers[i].handler != NULL; i++)
5444 if (elf_header.e_machine == handlers[i].machtype)
5445 return handlers[i].handler (file);
5447 printf (_("\nThere are no unwind sections in this file.\n"));
5452 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5454 switch (entry->d_tag)
5457 if (entry->d_un.d_val == 0)
5461 static const char * opts[] =
5463 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5464 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5465 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5466 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5471 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
5472 if (entry->d_un.d_val & (1 << cnt))
5474 printf ("%s%s", first ? "" : " ", opts[cnt]);
5481 case DT_MIPS_IVERSION:
5482 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5483 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5485 printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5488 case DT_MIPS_TIME_STAMP:
5493 time_t time = entry->d_un.d_val;
5494 tmp = gmtime (&time);
5495 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
5496 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5497 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5498 printf ("Time Stamp: %s\n", timebuf);
5502 case DT_MIPS_RLD_VERSION:
5503 case DT_MIPS_LOCAL_GOTNO:
5504 case DT_MIPS_CONFLICTNO:
5505 case DT_MIPS_LIBLISTNO:
5506 case DT_MIPS_SYMTABNO:
5507 case DT_MIPS_UNREFEXTNO:
5508 case DT_MIPS_HIPAGENO:
5509 case DT_MIPS_DELTA_CLASS_NO:
5510 case DT_MIPS_DELTA_INSTANCE_NO:
5511 case DT_MIPS_DELTA_RELOC_NO:
5512 case DT_MIPS_DELTA_SYM_NO:
5513 case DT_MIPS_DELTA_CLASSSYM_NO:
5514 case DT_MIPS_COMPACT_SIZE:
5515 printf ("%ld\n", (long) entry->d_un.d_ptr);
5519 printf ("%#lx\n", (long) entry->d_un.d_ptr);
5525 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5527 switch (entry->d_tag)
5529 case DT_HP_DLD_FLAGS:
5538 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5539 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5540 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5541 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5542 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5543 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5544 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5545 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5546 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5547 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5548 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
5549 { DT_HP_GST, "HP_GST" },
5550 { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
5551 { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
5552 { DT_HP_NODELETE, "HP_NODELETE" },
5553 { DT_HP_GROUP, "HP_GROUP" },
5554 { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
5558 bfd_vma val = entry->d_un.d_val;
5560 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
5561 if (val & flags[cnt].bit)
5565 fputs (flags[cnt].str, stdout);
5567 val ^= flags[cnt].bit;
5570 if (val != 0 || first)
5574 print_vma (val, HEX);
5580 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5587 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5589 switch (entry->d_tag)
5591 case DT_IA_64_PLT_RESERVE:
5592 /* First 3 slots reserved. */
5593 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5595 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5599 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5606 get_32bit_dynamic_section (FILE *file)
5608 Elf32_External_Dyn *edyn, *ext;
5609 Elf_Internal_Dyn *entry;
5611 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5612 _("dynamic section"));
5616 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5617 might not have the luxury of section headers. Look for the DT_NULL
5618 terminator to determine the number of entries. */
5619 for (ext = edyn, dynamic_nent = 0;
5620 (char *) ext < (char *) edyn + dynamic_size;
5624 if (BYTE_GET (ext->d_tag) == DT_NULL)
5628 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5629 if (dynamic_section == NULL)
5631 error (_("Out of memory\n"));
5636 for (ext = edyn, entry = dynamic_section;
5637 entry < dynamic_section + dynamic_nent;
5640 entry->d_tag = BYTE_GET (ext->d_tag);
5641 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5650 get_64bit_dynamic_section (FILE *file)
5652 Elf64_External_Dyn *edyn, *ext;
5653 Elf_Internal_Dyn *entry;
5655 edyn = get_data (NULL, file, dynamic_addr, 1, dynamic_size,
5656 _("dynamic section"));
5660 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5661 might not have the luxury of section headers. Look for the DT_NULL
5662 terminator to determine the number of entries. */
5663 for (ext = edyn, dynamic_nent = 0;
5664 (char *) ext < (char *) edyn + dynamic_size;
5668 if (BYTE_GET (ext->d_tag) == DT_NULL)
5672 dynamic_section = cmalloc (dynamic_nent, sizeof (*entry));
5673 if (dynamic_section == NULL)
5675 error (_("Out of memory\n"));
5680 for (ext = edyn, entry = dynamic_section;
5681 entry < dynamic_section + dynamic_nent;
5684 entry->d_tag = BYTE_GET (ext->d_tag);
5685 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5694 print_dynamic_flags (bfd_vma flags)
5702 flag = flags & - flags;
5712 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
5713 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
5714 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
5715 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
5716 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
5717 default: fputs ("unknown", stdout); break;
5723 /* Parse and display the contents of the dynamic section. */
5726 process_dynamic_section (FILE *file)
5728 Elf_Internal_Dyn *entry;
5730 if (dynamic_size == 0)
5733 printf (_("\nThere is no dynamic section in this file.\n"));
5740 if (! get_32bit_dynamic_section (file))
5743 else if (! get_64bit_dynamic_section (file))
5746 /* Find the appropriate symbol table. */
5747 if (dynamic_symbols == NULL)
5749 for (entry = dynamic_section;
5750 entry < dynamic_section + dynamic_nent;
5753 Elf_Internal_Shdr section;
5755 if (entry->d_tag != DT_SYMTAB)
5758 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5760 /* Since we do not know how big the symbol table is,
5761 we default to reading in the entire file (!) and
5762 processing that. This is overkill, I know, but it
5764 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5766 if (archive_file_offset != 0)
5767 section.sh_size = archive_file_size - section.sh_offset;
5770 if (fseek (file, 0, SEEK_END))
5771 error (_("Unable to seek to end of file!"));
5773 section.sh_size = ftell (file) - section.sh_offset;
5777 section.sh_entsize = sizeof (Elf32_External_Sym);
5779 section.sh_entsize = sizeof (Elf64_External_Sym);
5781 num_dynamic_syms = section.sh_size / section.sh_entsize;
5782 if (num_dynamic_syms < 1)
5784 error (_("Unable to determine the number of symbols to load\n"));
5788 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
5792 /* Similarly find a string table. */
5793 if (dynamic_strings == NULL)
5795 for (entry = dynamic_section;
5796 entry < dynamic_section + dynamic_nent;
5799 unsigned long offset;
5802 if (entry->d_tag != DT_STRTAB)
5805 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5807 /* Since we do not know how big the string table is,
5808 we default to reading in the entire file (!) and
5809 processing that. This is overkill, I know, but it
5812 offset = offset_from_vma (file, entry->d_un.d_val, 0);
5814 if (archive_file_offset != 0)
5815 str_tab_len = archive_file_size - offset;
5818 if (fseek (file, 0, SEEK_END))
5819 error (_("Unable to seek to end of file\n"));
5820 str_tab_len = ftell (file) - offset;
5823 if (str_tab_len < 1)
5826 (_("Unable to determine the length of the dynamic string table\n"));
5830 dynamic_strings = get_data (NULL, file, offset, 1, str_tab_len,
5831 _("dynamic string table"));
5832 dynamic_strings_length = str_tab_len;
5837 /* And find the syminfo section if available. */
5838 if (dynamic_syminfo == NULL)
5840 unsigned long syminsz = 0;
5842 for (entry = dynamic_section;
5843 entry < dynamic_section + dynamic_nent;
5846 if (entry->d_tag == DT_SYMINENT)
5848 /* Note: these braces are necessary to avoid a syntax
5849 error from the SunOS4 C compiler. */
5850 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
5852 else if (entry->d_tag == DT_SYMINSZ)
5853 syminsz = entry->d_un.d_val;
5854 else if (entry->d_tag == DT_SYMINFO)
5855 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
5859 if (dynamic_syminfo_offset != 0 && syminsz != 0)
5861 Elf_External_Syminfo *extsyminfo, *extsym;
5862 Elf_Internal_Syminfo *syminfo;
5864 /* There is a syminfo section. Read the data. */
5865 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, 1,
5866 syminsz, _("symbol information"));
5870 dynamic_syminfo = malloc (syminsz);
5871 if (dynamic_syminfo == NULL)
5873 error (_("Out of memory\n"));
5877 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
5878 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
5879 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
5880 ++syminfo, ++extsym)
5882 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
5883 syminfo->si_flags = BYTE_GET (extsym->si_flags);
5890 if (do_dynamic && dynamic_addr)
5891 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5892 dynamic_addr, dynamic_nent);
5894 printf (_(" Tag Type Name/Value\n"));
5896 for (entry = dynamic_section;
5897 entry < dynamic_section + dynamic_nent;
5905 print_vma (entry->d_tag, FULL_HEX);
5906 dtype = get_dynamic_type (entry->d_tag);
5907 printf (" (%s)%*s", dtype,
5908 ((is_32bit_elf ? 27 : 19)
5909 - (int) strlen (dtype)),
5913 switch (entry->d_tag)
5917 print_dynamic_flags (entry->d_un.d_val);
5927 switch (entry->d_tag)
5930 printf (_("Auxiliary library"));
5934 printf (_("Filter library"));
5938 printf (_("Configuration file"));
5942 printf (_("Dependency audit library"));
5946 printf (_("Audit library"));
5950 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5951 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5955 print_vma (entry->d_un.d_val, PREFIX_HEX);
5964 printf (_("Flags:"));
5966 if (entry->d_un.d_val == 0)
5967 printf (_(" None\n"));
5970 unsigned long int val = entry->d_un.d_val;
5972 if (val & DTF_1_PARINIT)
5974 printf (" PARINIT");
5975 val ^= DTF_1_PARINIT;
5977 if (val & DTF_1_CONFEXP)
5979 printf (" CONFEXP");
5980 val ^= DTF_1_CONFEXP;
5983 printf (" %lx", val);
5992 printf (_("Flags:"));
5994 if (entry->d_un.d_val == 0)
5995 printf (_(" None\n"));
5998 unsigned long int val = entry->d_un.d_val;
6000 if (val & DF_P1_LAZYLOAD)
6002 printf (" LAZYLOAD");
6003 val ^= DF_P1_LAZYLOAD;
6005 if (val & DF_P1_GROUPPERM)
6007 printf (" GROUPPERM");
6008 val ^= DF_P1_GROUPPERM;
6011 printf (" %lx", val);
6020 printf (_("Flags:"));
6021 if (entry->d_un.d_val == 0)
6022 printf (_(" None\n"));
6025 unsigned long int val = entry->d_un.d_val;
6032 if (val & DF_1_GLOBAL)
6037 if (val & DF_1_GROUP)
6042 if (val & DF_1_NODELETE)
6044 printf (" NODELETE");
6045 val ^= DF_1_NODELETE;
6047 if (val & DF_1_LOADFLTR)
6049 printf (" LOADFLTR");
6050 val ^= DF_1_LOADFLTR;
6052 if (val & DF_1_INITFIRST)
6054 printf (" INITFIRST");
6055 val ^= DF_1_INITFIRST;
6057 if (val & DF_1_NOOPEN)
6062 if (val & DF_1_ORIGIN)
6067 if (val & DF_1_DIRECT)
6072 if (val & DF_1_TRANS)
6077 if (val & DF_1_INTERPOSE)
6079 printf (" INTERPOSE");
6080 val ^= DF_1_INTERPOSE;
6082 if (val & DF_1_NODEFLIB)
6084 printf (" NODEFLIB");
6085 val ^= DF_1_NODEFLIB;
6087 if (val & DF_1_NODUMP)
6092 if (val & DF_1_CONLFAT)
6094 printf (" CONLFAT");
6095 val ^= DF_1_CONLFAT;
6098 printf (" %lx", val);
6105 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6107 puts (get_dynamic_type (entry->d_un.d_val));
6127 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6133 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
6134 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6140 switch (entry->d_tag)
6143 printf (_("Shared library: [%s]"), name);
6145 if (streq (name, program_interpreter))
6146 printf (_(" program interpreter"));
6150 printf (_("Library soname: [%s]"), name);
6154 printf (_("Library rpath: [%s]"), name);
6158 printf (_("Library runpath: [%s]"), name);
6162 print_vma (entry->d_un.d_val, PREFIX_HEX);
6167 print_vma (entry->d_un.d_val, PREFIX_HEX);
6180 dynamic_info[entry->d_tag] = entry->d_un.d_val;
6184 case DT_INIT_ARRAYSZ:
6185 case DT_FINI_ARRAYSZ:
6186 case DT_GNU_CONFLICTSZ:
6187 case DT_GNU_LIBLISTSZ:
6190 print_vma (entry->d_un.d_val, UNSIGNED);
6191 printf (" (bytes)\n");
6201 print_vma (entry->d_un.d_val, UNSIGNED);
6214 if (entry->d_tag == DT_USED
6215 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
6217 char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
6221 printf (_("Not needed object: [%s]\n"), name);
6226 print_vma (entry->d_un.d_val, PREFIX_HEX);
6232 /* The value of this entry is ignored. */
6237 case DT_GNU_PRELINKED:
6241 time_t time = entry->d_un.d_val;
6243 tmp = gmtime (&time);
6244 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6245 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
6246 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
6252 dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
6255 print_vma (entry->d_un.d_val, PREFIX_HEX);
6261 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
6262 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
6267 switch (elf_header.e_machine)
6270 case EM_MIPS_RS3_LE:
6271 dynamic_section_mips_val (entry);
6274 dynamic_section_parisc_val (entry);
6277 dynamic_section_ia64_val (entry);
6280 print_vma (entry->d_un.d_val, PREFIX_HEX);
6292 get_ver_flags (unsigned int flags)
6294 static char buff[32];
6301 if (flags & VER_FLG_BASE)
6302 strcat (buff, "BASE ");
6304 if (flags & VER_FLG_WEAK)
6306 if (flags & VER_FLG_BASE)
6307 strcat (buff, "| ");
6309 strcat (buff, "WEAK ");
6312 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
6313 strcat (buff, "| <unknown>");
6318 /* Display the contents of the version sections. */
6320 process_version_sections (FILE *file)
6322 Elf_Internal_Shdr *section;
6329 for (i = 0, section = section_headers;
6330 i < elf_header.e_shnum;
6333 switch (section->sh_type)
6335 case SHT_GNU_verdef:
6337 Elf_External_Verdef *edefs;
6344 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6345 SECTION_NAME (section), section->sh_info);
6347 printf (_(" Addr: 0x"));
6348 printf_vma (section->sh_addr);
6349 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6350 (unsigned long) section->sh_offset, section->sh_link,
6351 SECTION_HEADER_INDEX (section->sh_link)
6352 < elf_header.e_shnum
6353 ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6356 edefs = get_data (NULL, file, section->sh_offset, 1,
6358 _("version definition section"));
6362 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6365 Elf_External_Verdef *edef;
6366 Elf_Internal_Verdef ent;
6367 Elf_External_Verdaux *eaux;
6368 Elf_Internal_Verdaux aux;
6372 vstart = ((char *) edefs) + idx;
6374 edef = (Elf_External_Verdef *) vstart;
6376 ent.vd_version = BYTE_GET (edef->vd_version);
6377 ent.vd_flags = BYTE_GET (edef->vd_flags);
6378 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
6379 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
6380 ent.vd_hash = BYTE_GET (edef->vd_hash);
6381 ent.vd_aux = BYTE_GET (edef->vd_aux);
6382 ent.vd_next = BYTE_GET (edef->vd_next);
6384 printf (_(" %#06x: Rev: %d Flags: %s"),
6385 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
6387 printf (_(" Index: %d Cnt: %d "),
6388 ent.vd_ndx, ent.vd_cnt);
6390 vstart += ent.vd_aux;
6392 eaux = (Elf_External_Verdaux *) vstart;
6394 aux.vda_name = BYTE_GET (eaux->vda_name);
6395 aux.vda_next = BYTE_GET (eaux->vda_next);
6397 if (VALID_DYNAMIC_NAME (aux.vda_name))
6398 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
6400 printf (_("Name index: %ld\n"), aux.vda_name);
6402 isum = idx + ent.vd_aux;
6404 for (j = 1; j < ent.vd_cnt; j++)
6406 isum += aux.vda_next;
6407 vstart += aux.vda_next;
6409 eaux = (Elf_External_Verdaux *) vstart;
6411 aux.vda_name = BYTE_GET (eaux->vda_name);
6412 aux.vda_next = BYTE_GET (eaux->vda_next);
6414 if (VALID_DYNAMIC_NAME (aux.vda_name))
6415 printf (_(" %#06x: Parent %d: %s\n"),
6416 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
6418 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6419 isum, j, aux.vda_name);
6429 case SHT_GNU_verneed:
6431 Elf_External_Verneed *eneed;
6437 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6438 SECTION_NAME (section), section->sh_info);
6440 printf (_(" Addr: 0x"));
6441 printf_vma (section->sh_addr);
6442 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6443 (unsigned long) section->sh_offset, section->sh_link,
6444 SECTION_HEADER_INDEX (section->sh_link)
6445 < elf_header.e_shnum
6446 ? SECTION_NAME (SECTION_HEADER (section->sh_link))
6449 eneed = get_data (NULL, file, section->sh_offset, 1,
6451 _("version need section"));
6455 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6457 Elf_External_Verneed *entry;
6458 Elf_Internal_Verneed ent;
6463 vstart = ((char *) eneed) + idx;
6465 entry = (Elf_External_Verneed *) vstart;
6467 ent.vn_version = BYTE_GET (entry->vn_version);
6468 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
6469 ent.vn_file = BYTE_GET (entry->vn_file);
6470 ent.vn_aux = BYTE_GET (entry->vn_aux);
6471 ent.vn_next = BYTE_GET (entry->vn_next);
6473 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
6475 if (VALID_DYNAMIC_NAME (ent.vn_file))
6476 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6478 printf (_(" File: %lx"), ent.vn_file);
6480 printf (_(" Cnt: %d\n"), ent.vn_cnt);
6482 vstart += ent.vn_aux;
6484 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6486 Elf_External_Vernaux *eaux;
6487 Elf_Internal_Vernaux aux;
6489 eaux = (Elf_External_Vernaux *) vstart;
6491 aux.vna_hash = BYTE_GET (eaux->vna_hash);
6492 aux.vna_flags = BYTE_GET (eaux->vna_flags);
6493 aux.vna_other = BYTE_GET (eaux->vna_other);
6494 aux.vna_name = BYTE_GET (eaux->vna_name);
6495 aux.vna_next = BYTE_GET (eaux->vna_next);
6497 if (VALID_DYNAMIC_NAME (aux.vna_name))
6498 printf (_(" %#06x: Name: %s"),
6499 isum, GET_DYNAMIC_NAME (aux.vna_name));
6501 printf (_(" %#06x: Name index: %lx"),
6502 isum, aux.vna_name);
6504 printf (_(" Flags: %s Version: %d\n"),
6505 get_ver_flags (aux.vna_flags), aux.vna_other);
6507 isum += aux.vna_next;
6508 vstart += aux.vna_next;
6518 case SHT_GNU_versym:
6520 Elf_Internal_Shdr *link_section;
6523 unsigned char *edata;
6524 unsigned short *data;
6526 Elf_Internal_Sym *symbols;
6527 Elf_Internal_Shdr *string_sec;
6530 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
6533 link_section = SECTION_HEADER (section->sh_link);
6534 total = section->sh_size / sizeof (Elf_External_Versym);
6536 if (SECTION_HEADER_INDEX (link_section->sh_link)
6537 >= elf_header.e_shnum)
6542 symbols = GET_ELF_SYMBOLS (file, link_section);
6544 string_sec = SECTION_HEADER (link_section->sh_link);
6546 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
6547 string_sec->sh_size, _("version string table"));
6551 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6552 SECTION_NAME (section), total);
6554 printf (_(" Addr: "));
6555 printf_vma (section->sh_addr);
6556 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6557 (unsigned long) section->sh_offset, section->sh_link,
6558 SECTION_NAME (link_section));
6560 off = offset_from_vma (file,
6561 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6562 total * sizeof (short));
6563 edata = get_data (NULL, file, off, total, sizeof (short),
6564 _("version symbol data"));
6571 data = cmalloc (total, sizeof (short));
6573 for (cnt = total; cnt --;)
6574 data[cnt] = byte_get (edata + cnt * sizeof (short),
6579 for (cnt = 0; cnt < total; cnt += 4)
6582 int check_def, check_need;
6585 printf (" %03x:", cnt);
6587 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6588 switch (data[cnt + j])
6591 fputs (_(" 0 (*local*) "), stdout);
6595 fputs (_(" 1 (*global*) "), stdout);
6599 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6600 data[cnt + j] & 0x8000 ? 'h' : ' ');
6604 if (SECTION_HEADER_INDEX (symbols[cnt + j].st_shndx)
6605 >= elf_header.e_shnum
6606 || SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
6609 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6616 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6618 Elf_Internal_Verneed ivn;
6619 unsigned long offset;
6621 offset = offset_from_vma
6622 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6623 sizeof (Elf_External_Verneed));
6627 Elf_Internal_Vernaux ivna;
6628 Elf_External_Verneed evn;
6629 Elf_External_Vernaux evna;
6630 unsigned long a_off;
6632 get_data (&evn, file, offset, sizeof (evn), 1,
6635 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6636 ivn.vn_next = BYTE_GET (evn.vn_next);
6638 a_off = offset + ivn.vn_aux;
6642 get_data (&evna, file, a_off, sizeof (evna),
6643 1, _("version need aux (2)"));
6645 ivna.vna_next = BYTE_GET (evna.vna_next);
6646 ivna.vna_other = BYTE_GET (evna.vna_other);
6648 a_off += ivna.vna_next;
6650 while (ivna.vna_other != data[cnt + j]
6651 && ivna.vna_next != 0);
6653 if (ivna.vna_other == data[cnt + j])
6655 ivna.vna_name = BYTE_GET (evna.vna_name);
6657 name = strtab + ivna.vna_name;
6658 nn += printf ("(%s%-*s",
6660 12 - (int) strlen (name),
6666 offset += ivn.vn_next;
6668 while (ivn.vn_next);
6671 if (check_def && data[cnt + j] != 0x8001
6672 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6674 Elf_Internal_Verdef ivd;
6675 Elf_External_Verdef evd;
6676 unsigned long offset;
6678 offset = offset_from_vma
6679 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6684 get_data (&evd, file, offset, sizeof (evd), 1,
6687 ivd.vd_next = BYTE_GET (evd.vd_next);
6688 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6690 offset += ivd.vd_next;
6692 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6693 && ivd.vd_next != 0);
6695 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6697 Elf_External_Verdaux evda;
6698 Elf_Internal_Verdaux ivda;
6700 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6702 get_data (&evda, file,
6703 offset - ivd.vd_next + ivd.vd_aux,
6705 _("version def aux"));
6707 ivda.vda_name = BYTE_GET (evda.vda_name);
6709 name = strtab + ivda.vda_name;
6710 nn += printf ("(%s%-*s",
6712 12 - (int) strlen (name),
6718 printf ("%*c", 18 - nn, ' ');
6736 printf (_("\nNo version information found in this file.\n"));
6742 get_symbol_binding (unsigned int binding)
6744 static char buff[32];
6748 case STB_LOCAL: return "LOCAL";
6749 case STB_GLOBAL: return "GLOBAL";
6750 case STB_WEAK: return "WEAK";
6752 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6753 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
6755 else if (binding >= STB_LOOS && binding <= STB_HIOS)
6756 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
6758 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
6764 get_symbol_type (unsigned int type)
6766 static char buff[32];
6770 case STT_NOTYPE: return "NOTYPE";
6771 case STT_OBJECT: return "OBJECT";
6772 case STT_FUNC: return "FUNC";
6773 case STT_SECTION: return "SECTION";
6774 case STT_FILE: return "FILE";
6775 case STT_COMMON: return "COMMON";
6776 case STT_TLS: return "TLS";
6778 if (type >= STT_LOPROC && type <= STT_HIPROC)
6780 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6781 return "THUMB_FUNC";
6783 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6786 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6787 return "PARISC_MILLI";
6789 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
6791 else if (type >= STT_LOOS && type <= STT_HIOS)
6793 if (elf_header.e_machine == EM_PARISC)
6795 if (type == STT_HP_OPAQUE)
6797 if (type == STT_HP_STUB)
6801 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
6804 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
6810 get_symbol_visibility (unsigned int visibility)
6814 case STV_DEFAULT: return "DEFAULT";
6815 case STV_INTERNAL: return "INTERNAL";
6816 case STV_HIDDEN: return "HIDDEN";
6817 case STV_PROTECTED: return "PROTECTED";
6823 get_mips_symbol_other (unsigned int other)
6827 case STO_OPTIONAL: return "OPTIONAL";
6828 case STO_MIPS16: return "MIPS16";
6829 default: return NULL;
6834 get_symbol_other (unsigned int other)
6836 const char * result = NULL;
6837 static char buff [32];
6842 switch (elf_header.e_machine)
6845 result = get_mips_symbol_other (other);
6853 snprintf (buff, sizeof buff, _("<other>: %x"), other);
6858 get_symbol_index_type (unsigned int type)
6860 static char buff[32];
6864 case SHN_UNDEF: return "UND";
6865 case SHN_ABS: return "ABS";
6866 case SHN_COMMON: return "COM";
6868 if (type == SHN_IA_64_ANSI_COMMON
6869 && elf_header.e_machine == EM_IA_64
6870 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
6872 else if (elf_header.e_machine == EM_X86_64
6873 && type == SHN_X86_64_LCOMMON)
6875 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
6876 sprintf (buff, "PRC[0x%04x]", type);
6877 else if (type >= SHN_LOOS && type <= SHN_HIOS)
6878 sprintf (buff, "OS [0x%04x]", type);
6879 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
6880 sprintf (buff, "RSV[0x%04x]", type);
6882 sprintf (buff, "%3d", type);
6890 get_dynamic_data (FILE *file, unsigned int number, unsigned int ent_size)
6892 unsigned char *e_data;
6895 e_data = cmalloc (number, ent_size);
6899 error (_("Out of memory\n"));
6903 if (fread (e_data, ent_size, number, file) != number)
6905 error (_("Unable to read in dynamic data\n"));
6909 i_data = cmalloc (number, sizeof (*i_data));
6913 error (_("Out of memory\n"));
6919 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
6926 /* Dump the symbol table. */
6928 process_symbol_table (FILE *file)
6930 Elf_Internal_Shdr *section;
6931 bfd_vma nbuckets = 0;
6932 bfd_vma nchains = 0;
6933 bfd_vma *buckets = NULL;
6934 bfd_vma *chains = NULL;
6935 bfd_vma ngnubuckets = 0;
6936 bfd_vma *gnubuckets = NULL;
6937 bfd_vma *gnuchains = NULL;
6939 if (! do_syms && !do_histogram)
6942 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
6945 unsigned char nb[8];
6946 unsigned char nc[8];
6947 int hash_ent_size = 4;
6949 if ((elf_header.e_machine == EM_ALPHA
6950 || elf_header.e_machine == EM_S390
6951 || elf_header.e_machine == EM_S390_OLD)
6952 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
6956 (archive_file_offset
6957 + offset_from_vma (file, dynamic_info[DT_HASH],
6958 sizeof nb + sizeof nc)),
6961 error (_("Unable to seek to start of dynamic information"));
6965 if (fread (nb, hash_ent_size, 1, file) != 1)
6967 error (_("Failed to read in number of buckets\n"));
6971 if (fread (nc, hash_ent_size, 1, file) != 1)
6973 error (_("Failed to read in number of chains\n"));
6977 nbuckets = byte_get (nb, hash_ent_size);
6978 nchains = byte_get (nc, hash_ent_size);
6980 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
6981 chains = get_dynamic_data (file, nchains, hash_ent_size);
6983 if (buckets == NULL || chains == NULL)
6988 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
6993 printf (_("\nSymbol table for image:\n"));
6995 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6997 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6999 for (hn = 0; hn < nbuckets; hn++)
7004 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
7006 Elf_Internal_Sym *psym;
7009 psym = dynamic_symbols + si;
7011 n = print_vma (si, DEC_5);
7013 fputs (" " + n, stdout);
7014 printf (" %3lu: ", hn);
7015 print_vma (psym->st_value, LONG_HEX);
7017 print_vma (psym->st_size, DEC_5);
7019 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7020 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7021 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7022 /* Check to see if any other bits in the st_other field are set.
7023 Note - displaying this information disrupts the layout of the
7024 table being generated, but for the moment this case is very rare. */
7025 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7026 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7027 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
7028 if (VALID_DYNAMIC_NAME (psym->st_name))
7029 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
7031 printf (" <corrupt: %14ld>", psym->st_name);
7036 else if (do_syms && !do_using_dynamic)
7040 for (i = 0, section = section_headers;
7041 i < elf_header.e_shnum;
7045 char *strtab = NULL;
7046 unsigned long int strtab_size = 0;
7047 Elf_Internal_Sym *symtab;
7048 Elf_Internal_Sym *psym;
7051 if ( section->sh_type != SHT_SYMTAB
7052 && section->sh_type != SHT_DYNSYM)
7055 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7056 SECTION_NAME (section),
7057 (unsigned long) (section->sh_size / section->sh_entsize));
7059 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7061 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7063 symtab = GET_ELF_SYMBOLS (file, section);
7067 if (section->sh_link == elf_header.e_shstrndx)
7069 strtab = string_table;
7070 strtab_size = string_table_length;
7072 else if (SECTION_HEADER_INDEX (section->sh_link) < elf_header.e_shnum)
7074 Elf_Internal_Shdr *string_sec;
7076 string_sec = SECTION_HEADER (section->sh_link);
7078 strtab = get_data (NULL, file, string_sec->sh_offset,
7079 1, string_sec->sh_size, _("string table"));
7080 strtab_size = strtab != NULL ? string_sec->sh_size : 0;
7083 for (si = 0, psym = symtab;
7084 si < section->sh_size / section->sh_entsize;
7087 printf ("%6d: ", si);
7088 print_vma (psym->st_value, LONG_HEX);
7090 print_vma (psym->st_size, DEC_5);
7091 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
7092 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
7093 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
7094 /* Check to see if any other bits in the st_other field are set.
7095 Note - displaying this information disrupts the layout of the
7096 table being generated, but for the moment this case is very rare. */
7097 if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
7098 printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
7099 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
7100 print_symbol (25, psym->st_name < strtab_size
7101 ? strtab + psym->st_name : "<corrupt>");
7103 if (section->sh_type == SHT_DYNSYM &&
7104 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
7106 unsigned char data[2];
7107 unsigned short vers_data;
7108 unsigned long offset;
7112 offset = offset_from_vma
7113 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
7114 sizeof data + si * sizeof (vers_data));
7116 get_data (&data, file, offset + si * sizeof (vers_data),
7117 sizeof (data), 1, _("version data"));
7119 vers_data = byte_get (data, 2);
7121 is_nobits = (SECTION_HEADER_INDEX (psym->st_shndx)
7122 < elf_header.e_shnum
7123 && SECTION_HEADER (psym->st_shndx)->sh_type
7126 check_def = (psym->st_shndx != SHN_UNDEF);
7128 if ((vers_data & 0x8000) || vers_data > 1)
7130 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
7131 && (is_nobits || ! check_def))
7133 Elf_External_Verneed evn;
7134 Elf_Internal_Verneed ivn;
7135 Elf_Internal_Vernaux ivna;
7137 /* We must test both. */
7138 offset = offset_from_vma
7139 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
7144 unsigned long vna_off;
7146 get_data (&evn, file, offset, sizeof (evn), 1,
7149 ivn.vn_aux = BYTE_GET (evn.vn_aux);
7150 ivn.vn_next = BYTE_GET (evn.vn_next);
7152 vna_off = offset + ivn.vn_aux;
7156 Elf_External_Vernaux evna;
7158 get_data (&evna, file, vna_off,
7160 _("version need aux (3)"));
7162 ivna.vna_other = BYTE_GET (evna.vna_other);
7163 ivna.vna_next = BYTE_GET (evna.vna_next);
7164 ivna.vna_name = BYTE_GET (evna.vna_name);
7166 vna_off += ivna.vna_next;
7168 while (ivna.vna_other != vers_data
7169 && ivna.vna_next != 0);
7171 if (ivna.vna_other == vers_data)
7174 offset += ivn.vn_next;
7176 while (ivn.vn_next != 0);
7178 if (ivna.vna_other == vers_data)
7181 ivna.vna_name < strtab_size
7182 ? strtab + ivna.vna_name : "<corrupt>",
7186 else if (! is_nobits)
7187 error (_("bad dynamic symbol"));
7194 if (vers_data != 0x8001
7195 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
7197 Elf_Internal_Verdef ivd;
7198 Elf_Internal_Verdaux ivda;
7199 Elf_External_Verdaux evda;
7200 unsigned long offset;
7202 offset = offset_from_vma
7204 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
7205 sizeof (Elf_External_Verdef));
7209 Elf_External_Verdef evd;
7211 get_data (&evd, file, offset, sizeof (evd),
7212 1, _("version def"));
7214 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
7215 ivd.vd_aux = BYTE_GET (evd.vd_aux);
7216 ivd.vd_next = BYTE_GET (evd.vd_next);
7218 offset += ivd.vd_next;
7220 while (ivd.vd_ndx != (vers_data & 0x7fff)
7221 && ivd.vd_next != 0);
7223 offset -= ivd.vd_next;
7224 offset += ivd.vd_aux;
7226 get_data (&evda, file, offset, sizeof (evda),
7227 1, _("version def aux"));
7229 ivda.vda_name = BYTE_GET (evda.vda_name);
7231 if (psym->st_name != ivda.vda_name)
7232 printf ((vers_data & 0x8000)
7234 ivda.vda_name < strtab_size
7235 ? strtab + ivda.vda_name : "<corrupt>");
7245 if (strtab != string_table)
7251 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7253 if (do_histogram && buckets != NULL)
7255 unsigned long *lengths;
7256 unsigned long *counts;
7259 unsigned long maxlength = 0;
7260 unsigned long nzero_counts = 0;
7261 unsigned long nsyms = 0;
7263 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7264 (unsigned long) nbuckets);
7265 printf (_(" Length Number %% of total Coverage\n"));
7267 lengths = calloc (nbuckets, sizeof (*lengths));
7268 if (lengths == NULL)
7270 error (_("Out of memory"));
7273 for (hn = 0; hn < nbuckets; ++hn)
7275 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
7278 if (maxlength < ++lengths[hn])
7283 counts = calloc (maxlength + 1, sizeof (*counts));
7286 error (_("Out of memory"));
7290 for (hn = 0; hn < nbuckets; ++hn)
7291 ++counts[lengths[hn]];
7296 printf (" 0 %-10lu (%5.1f%%)\n",
7297 counts[0], (counts[0] * 100.0) / nbuckets);
7298 for (i = 1; i <= maxlength; ++i)
7300 nzero_counts += counts[i] * i;
7301 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7302 i, counts[i], (counts[i] * 100.0) / nbuckets,
7303 (nzero_counts * 100.0) / nsyms);
7311 if (buckets != NULL)
7317 if (do_histogram && dynamic_info_DT_GNU_HASH)
7319 unsigned char nb[16];
7320 bfd_vma i, maxchain = 0xffffffff, symidx, bitmaskwords;
7321 unsigned long *lengths;
7322 unsigned long *counts;
7324 unsigned long maxlength = 0;
7325 unsigned long nzero_counts = 0;
7326 unsigned long nsyms = 0;
7327 bfd_vma buckets_vma;
7330 (archive_file_offset
7331 + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
7335 error (_("Unable to seek to start of dynamic information"));
7339 if (fread (nb, 16, 1, file) != 1)
7341 error (_("Failed to read in number of buckets\n"));
7345 ngnubuckets = byte_get (nb, 4);
7346 symidx = byte_get (nb + 4, 4);
7347 bitmaskwords = byte_get (nb + 8, 4);
7348 buckets_vma = dynamic_info_DT_GNU_HASH + 16;
7350 buckets_vma += bitmaskwords * 4;
7352 buckets_vma += bitmaskwords * 8;
7355 (archive_file_offset
7356 + offset_from_vma (file, buckets_vma, 4)),
7359 error (_("Unable to seek to start of dynamic information"));
7363 gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
7365 if (gnubuckets == NULL)
7368 for (i = 0; i < ngnubuckets; i++)
7369 if (gnubuckets[i] != 0)
7371 if (gnubuckets[i] < symidx)
7374 if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
7375 maxchain = gnubuckets[i];
7378 if (maxchain == 0xffffffff)
7384 (archive_file_offset
7385 + offset_from_vma (file, buckets_vma
7386 + 4 * (ngnubuckets + maxchain), 4)),
7389 error (_("Unable to seek to start of dynamic information"));
7395 if (fread (nb, 4, 1, file) != 1)
7397 error (_("Failed to determine last chain length\n"));
7401 if (maxchain + 1 == 0)
7406 while ((byte_get (nb, 4) & 1) == 0);
7409 (archive_file_offset
7410 + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
7413 error (_("Unable to seek to start of dynamic information"));
7417 gnuchains = get_dynamic_data (file, maxchain, 4);
7419 if (gnuchains == NULL)
7422 lengths = calloc (ngnubuckets, sizeof (*lengths));
7423 if (lengths == NULL)
7425 error (_("Out of memory"));
7429 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7430 (unsigned long) ngnubuckets);
7431 printf (_(" Length Number %% of total Coverage\n"));
7433 for (hn = 0; hn < ngnubuckets; ++hn)
7434 if (gnubuckets[hn] != 0)
7436 bfd_vma off, length = 1;
7438 for (off = gnubuckets[hn] - symidx;
7439 (gnuchains[off] & 1) == 0; ++off)
7441 lengths[hn] = length;
7442 if (length > maxlength)
7447 counts = calloc (maxlength + 1, sizeof (*counts));
7450 error (_("Out of memory"));
7454 for (hn = 0; hn < ngnubuckets; ++hn)
7455 ++counts[lengths[hn]];
7457 if (ngnubuckets > 0)
7460 printf (" 0 %-10lu (%5.1f%%)\n",
7461 counts[0], (counts[0] * 100.0) / ngnubuckets);
7462 for (j = 1; j <= maxlength; ++j)
7464 nzero_counts += counts[j] * j;
7465 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7466 j, counts[j], (counts[j] * 100.0) / ngnubuckets,
7467 (nzero_counts * 100.0) / nsyms);
7481 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
7485 if (dynamic_syminfo == NULL
7487 /* No syminfo, this is ok. */
7490 /* There better should be a dynamic symbol section. */
7491 if (dynamic_symbols == NULL || dynamic_strings == NULL)
7495 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7496 dynamic_syminfo_offset, dynamic_syminfo_nent);
7498 printf (_(" Num: Name BoundTo Flags\n"));
7499 for (i = 0; i < dynamic_syminfo_nent; ++i)
7501 unsigned short int flags = dynamic_syminfo[i].si_flags;
7503 printf ("%4d: ", i);
7504 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
7505 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
7507 printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
7510 switch (dynamic_syminfo[i].si_boundto)
7512 case SYMINFO_BT_SELF:
7513 fputs ("SELF ", stdout);
7515 case SYMINFO_BT_PARENT:
7516 fputs ("PARENT ", stdout);
7519 if (dynamic_syminfo[i].si_boundto > 0
7520 && dynamic_syminfo[i].si_boundto < dynamic_nent
7521 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
7523 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
7527 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
7531 if (flags & SYMINFO_FLG_DIRECT)
7533 if (flags & SYMINFO_FLG_PASSTHRU)
7534 printf (" PASSTHRU");
7535 if (flags & SYMINFO_FLG_COPY)
7537 if (flags & SYMINFO_FLG_LAZYLOAD)
7538 printf (" LAZYLOAD");
7546 #ifdef SUPPORT_DISASSEMBLY
7548 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
7550 printf (_("\nAssembly dump of section %s\n"),
7551 SECTION_NAME (section));
7553 /* XXX -- to be done --- XXX */
7560 dump_section (Elf_Internal_Shdr *section, FILE *file)
7562 bfd_size_type bytes;
7564 unsigned char *data;
7565 unsigned char *start;
7567 bytes = section->sh_size;
7569 if (bytes == 0 || section->sh_type == SHT_NOBITS)
7571 printf (_("\nSection '%s' has no data to dump.\n"),
7572 SECTION_NAME (section));
7576 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
7578 addr = section->sh_addr;
7580 start = get_data (NULL, file, section->sh_offset, 1, bytes,
7593 lbytes = (bytes > 16 ? 16 : bytes);
7595 printf (" 0x%8.8lx ", (unsigned long) addr);
7597 switch (elf_header.e_ident[EI_DATA])
7601 for (j = 15; j >= 0; j --)
7604 printf ("%2.2x", data[j]);
7614 for (j = 0; j < 16; j++)
7617 printf ("%2.2x", data[j]);
7627 for (j = 0; j < lbytes; j++)
7630 if (k >= ' ' && k < 0x7f)
7648 /* Apply addends of RELA relocations. */
7651 debug_apply_rela_addends (void *file,
7652 Elf_Internal_Shdr *section,
7653 unsigned char *start)
7655 Elf_Internal_Shdr *relsec;
7656 unsigned char *end = start + section->sh_size;
7657 /* FIXME: The relocation field size is relocation type dependent. */
7658 unsigned int reloc_size = 4;
7660 if (!is_relocatable)
7663 if (section->sh_size < reloc_size)
7666 for (relsec = section_headers;
7667 relsec < section_headers + elf_header.e_shnum;
7670 unsigned long nrelas;
7671 Elf_Internal_Rela *rela, *rp;
7672 Elf_Internal_Shdr *symsec;
7673 Elf_Internal_Sym *symtab;
7674 Elf_Internal_Sym *sym;
7676 if (relsec->sh_type != SHT_RELA
7677 || SECTION_HEADER_INDEX (relsec->sh_info) >= elf_header.e_shnum
7678 || SECTION_HEADER (relsec->sh_info) != section
7679 || relsec->sh_size == 0
7680 || SECTION_HEADER_INDEX (relsec->sh_link) >= elf_header.e_shnum)
7683 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7687 symsec = SECTION_HEADER (relsec->sh_link);
7688 symtab = GET_ELF_SYMBOLS (file, symsec);
7690 for (rp = rela; rp < rela + nrelas; ++rp)
7694 loc = start + rp->r_offset;
7695 if ((loc + reloc_size) > end)
7697 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7698 (unsigned long) rp->r_offset,
7699 SECTION_NAME (section));
7705 sym = symtab + ELF32_R_SYM (rp->r_info);
7707 if (ELF32_R_SYM (rp->r_info) != 0
7708 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION
7709 /* Relocations against object symbols can happen,
7710 eg when referencing a global array. For an
7711 example of this see the _clz.o binary in libgcc.a. */
7712 && ELF32_ST_TYPE (sym->st_info) != STT_OBJECT)
7714 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7715 get_symbol_type (ELF32_ST_TYPE (sym->st_info)),
7716 SECTION_NAME (section));
7722 /* In MIPS little-endian objects, r_info isn't really a
7723 64-bit little-endian value: it has a 32-bit little-endian
7724 symbol index followed by four individual byte fields.
7725 Reorder INFO accordingly. */
7726 if (elf_header.e_machine == EM_MIPS
7727 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
7728 rp->r_info = (((rp->r_info & 0xffffffff) << 32)
7729 | ((rp->r_info >> 56) & 0xff)
7730 | ((rp->r_info >> 40) & 0xff00)
7731 | ((rp->r_info >> 24) & 0xff0000)
7732 | ((rp->r_info >> 8) & 0xff000000));
7734 sym = symtab + ELF64_R_SYM (rp->r_info);
7736 if (ELF64_R_SYM (rp->r_info) != 0
7737 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION
7738 && ELF64_ST_TYPE (sym->st_info) != STT_OBJECT)
7740 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7741 get_symbol_type (ELF64_ST_TYPE (sym->st_info)),
7742 SECTION_NAME (section));
7747 byte_put (loc, rp->r_addend, reloc_size);
7758 load_debug_section (enum dwarf_section_display_enum debug, void *file)
7760 struct dwarf_section *section = &debug_displays [debug].section;
7761 Elf_Internal_Shdr *sec;
7764 /* If it is already loaded, do nothing. */
7765 if (section->start != NULL)
7768 /* Locate the debug section. */
7769 sec = find_section (section->name);
7773 snprintf (buf, sizeof (buf), _("%s section data"), section->name);
7774 section->address = sec->sh_addr;
7775 section->size = sec->sh_size;
7776 section->start = get_data (NULL, file, sec->sh_offset, 1,
7779 if (debug_displays [debug].relocate)
7780 debug_apply_rela_addends (file, sec, section->start);
7782 return section->start != NULL;
7786 free_debug_section (enum dwarf_section_display_enum debug)
7788 struct dwarf_section *section = &debug_displays [debug].section;
7790 if (section->start == NULL)
7793 free ((char *) section->start);
7794 section->start = NULL;
7795 section->address = 0;
7800 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
7802 char *name = SECTION_NAME (section);
7803 bfd_size_type length;
7805 enum dwarf_section_display_enum i;
7807 length = section->sh_size;
7810 printf (_("\nSection '%s' has no debugging data.\n"), name);
7814 if (strneq (name, ".gnu.linkonce.wi.", 17))
7815 name = ".debug_info";
7817 /* See if we know how to display the contents of this section. */
7818 for (i = 0; i < max; i++)
7819 if (streq (debug_displays[i].section.name, name))
7821 struct dwarf_section *sec = &debug_displays [i].section;
7823 if (load_debug_section (i, file))
7825 result &= debug_displays[i].display (sec, file);
7827 if (i != info && i != abbrev)
7828 free_debug_section (i);
7836 printf (_("Unrecognized debug section: %s\n"), name);
7843 /* Set DUMP_SECTS for all sections where dumps were requested
7844 based on section name. */
7847 initialise_dumps_byname (void)
7849 struct dump_list_entry *cur;
7851 for (cur = dump_sects_byname; cur; cur = cur->next)
7856 for (i = 0, any = 0; i < elf_header.e_shnum; i++)
7857 if (streq (SECTION_NAME (section_headers + i), cur->name))
7859 request_dump (i, cur->type);
7864 warn (_("Section '%s' was not dumped because it does not exist!\n"),
7870 process_section_contents (FILE *file)
7872 Elf_Internal_Shdr *section;
7878 initialise_dumps_byname ();
7880 for (i = 0, section = section_headers;
7881 i < elf_header.e_shnum && i < num_dump_sects;
7884 #ifdef SUPPORT_DISASSEMBLY
7885 if (dump_sects[i] & DISASS_DUMP)
7886 disassemble_section (section, file);
7888 if (dump_sects[i] & HEX_DUMP)
7889 dump_section (section, file);
7891 if (dump_sects[i] & DEBUG_DUMP)
7892 display_debug_section (section, file);
7895 /* Check to see if the user requested a
7896 dump of a section that does not exist. */
7897 while (i++ < num_dump_sects)
7899 warn (_("Section %d was not dumped because it does not exist!\n"), i);
7903 process_mips_fpe_exception (int mask)
7908 if (mask & OEX_FPU_INEX)
7909 fputs ("INEX", stdout), first = 0;
7910 if (mask & OEX_FPU_UFLO)
7911 printf ("%sUFLO", first ? "" : "|"), first = 0;
7912 if (mask & OEX_FPU_OFLO)
7913 printf ("%sOFLO", first ? "" : "|"), first = 0;
7914 if (mask & OEX_FPU_DIV0)
7915 printf ("%sDIV0", first ? "" : "|"), first = 0;
7916 if (mask & OEX_FPU_INVAL)
7917 printf ("%sINVAL", first ? "" : "|");
7920 fputs ("0", stdout);
7923 /* ARM EABI attributes section. */
7928 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
7931 } arm_attr_public_tag;
7933 static const char *arm_attr_tag_CPU_arch[] =
7934 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
7936 static const char *arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
7937 static const char *arm_attr_tag_THUMB_ISA_use[] =
7938 {"No", "Thumb-1", "Thumb-2"};
7939 /* FIXME: VFPv3 encoding was extrapolated! */
7940 static const char *arm_attr_tag_VFP_arch[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
7941 static const char *arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1"};
7942 static const char *arm_attr_tag_NEON_arch[] = {"No", "NEONv1"};
7943 static const char *arm_attr_tag_ABI_PCS_config[] =
7944 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
7945 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
7946 static const char *arm_attr_tag_ABI_PCS_R9_use[] =
7947 {"V6", "SB", "TLS", "Unused"};
7948 static const char *arm_attr_tag_ABI_PCS_RW_data[] =
7949 {"Absolute", "PC-relative", "SB-relative", "None"};
7950 static const char *arm_attr_tag_ABI_PCS_RO_DATA[] =
7951 {"Absolute", "PC-relative", "None"};
7952 static const char *arm_attr_tag_ABI_PCS_GOT_use[] =
7953 {"None", "direct", "GOT-indirect"};
7954 static const char *arm_attr_tag_ABI_PCS_wchar_t[] =
7955 {"None", "??? 1", "2", "??? 3", "4"};
7956 static const char *arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
7957 static const char *arm_attr_tag_ABI_FP_denormal[] = {"Unused", "Needed"};
7958 static const char *arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
7959 static const char *arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
7960 static const char *arm_attr_tag_ABI_FP_number_model[] =
7961 {"Unused", "Finite", "RTABI", "IEEE 754"};
7962 static const char *arm_attr_tag_ABI_align8_needed[] = {"No", "Yes", "4-byte"};
7963 static const char *arm_attr_tag_ABI_align8_preserved[] =
7964 {"No", "Yes, except leaf SP", "Yes"};
7965 static const char *arm_attr_tag_ABI_enum_size[] =
7966 {"Unused", "small", "int", "forced to int"};
7967 static const char *arm_attr_tag_ABI_HardFP_use[] =
7968 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
7969 static const char *arm_attr_tag_ABI_VFP_args[] =
7970 {"AAPCS", "VFP registers", "custom"};
7971 static const char *arm_attr_tag_ABI_WMMX_args[] =
7972 {"AAPCS", "WMMX registers", "custom"};
7973 static const char *arm_attr_tag_ABI_optimization_goals[] =
7974 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7975 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
7976 static const char *arm_attr_tag_ABI_FP_optimization_goals[] =
7977 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
7978 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
7980 #define LOOKUP(id, name) \
7981 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
7982 static arm_attr_public_tag arm_attr_public_tags[] =
7984 {4, "CPU_raw_name", 1, NULL},
7985 {5, "CPU_name", 1, NULL},
7986 LOOKUP(6, CPU_arch),
7987 {7, "CPU_arch_profile", 0, NULL},
7988 LOOKUP(8, ARM_ISA_use),
7989 LOOKUP(9, THUMB_ISA_use),
7990 LOOKUP(10, VFP_arch),
7991 LOOKUP(11, WMMX_arch),
7992 LOOKUP(12, NEON_arch),
7993 LOOKUP(13, ABI_PCS_config),
7994 LOOKUP(14, ABI_PCS_R9_use),
7995 LOOKUP(15, ABI_PCS_RW_data),
7996 LOOKUP(16, ABI_PCS_RO_DATA),
7997 LOOKUP(17, ABI_PCS_GOT_use),
7998 LOOKUP(18, ABI_PCS_wchar_t),
7999 LOOKUP(19, ABI_FP_rounding),
8000 LOOKUP(20, ABI_FP_denormal),
8001 LOOKUP(21, ABI_FP_exceptions),
8002 LOOKUP(22, ABI_FP_user_exceptions),
8003 LOOKUP(23, ABI_FP_number_model),
8004 LOOKUP(24, ABI_align8_needed),
8005 LOOKUP(25, ABI_align8_preserved),
8006 LOOKUP(26, ABI_enum_size),
8007 LOOKUP(27, ABI_HardFP_use),
8008 LOOKUP(28, ABI_VFP_args),
8009 LOOKUP(29, ABI_WMMX_args),
8010 LOOKUP(30, ABI_optimization_goals),
8011 LOOKUP(31, ABI_FP_optimization_goals),
8012 {32, "compatibility", 0, NULL}
8016 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8019 read_uleb128 (unsigned char *p, unsigned int *plen)
8033 val |= ((unsigned int)c & 0x7f) << shift;
8042 static unsigned char *
8043 display_arm_attribute (unsigned char *p)
8048 arm_attr_public_tag *attr;
8052 tag = read_uleb128 (p, &len);
8055 for (i = 0; i < ARRAY_SIZE(arm_attr_public_tags); i++)
8057 if (arm_attr_public_tags[i].tag == tag)
8059 attr = &arm_attr_public_tags[i];
8066 printf (" Tag_%s: ", attr->name);
8072 case 7: /* Tag_CPU_arch_profile. */
8073 val = read_uleb128 (p, &len);
8077 case 0: printf ("None\n"); break;
8078 case 'A': printf ("Application\n"); break;
8079 case 'R': printf ("Realtime\n"); break;
8080 case 'M': printf ("Microcontroller\n"); break;
8081 default: printf ("??? (%d)\n", val); break;
8085 case 32: /* Tag_compatibility. */
8086 val = read_uleb128 (p, &len);
8088 printf ("flag = %d, vendor = %s\n", val, p);
8089 p += strlen((char *)p) + 1;
8103 assert (attr->type & 0x80);
8104 val = read_uleb128 (p, &len);
8106 type = attr->type & 0x7f;
8108 printf ("??? (%d)\n", val);
8110 printf ("%s\n", attr->table[val]);
8117 type = 1; /* String. */
8119 type = 2; /* uleb128. */
8120 printf (" Tag_unknown_%d: ", tag);
8125 printf ("\"%s\"\n", p);
8126 p += strlen((char *)p) + 1;
8130 val = read_uleb128 (p, &len);
8132 printf ("%d (0x%x)\n", val, val);
8139 process_arm_specific (FILE *file)
8141 Elf_Internal_Shdr *sect;
8142 unsigned char *contents;
8145 bfd_vma section_len;
8149 /* Find the section header so that we get the size. */
8150 for (i = 0, sect = section_headers;
8151 i < elf_header.e_shnum;
8154 if (sect->sh_type != SHT_ARM_ATTRIBUTES)
8157 contents = get_data (NULL, file, sect->sh_offset, 1, sect->sh_size,
8165 len = sect->sh_size - 1;
8170 bfd_boolean public_section;
8172 section_len = byte_get (p, 4);
8174 if (section_len > len)
8176 printf (_("ERROR: Bad section length (%d > %d)\n"),
8177 (int)section_len, (int)len);
8181 printf ("Attribute Section: %s\n", p);
8182 if (strcmp ((char *)p, "aeabi") == 0)
8183 public_section = TRUE;
8185 public_section = FALSE;
8186 namelen = strlen ((char *)p) + 1;
8188 section_len -= namelen + 4;
8189 while (section_len > 0)
8194 size = byte_get (p, 4);
8195 if (size > section_len)
8197 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
8198 (int)size, (int)section_len);
8201 section_len -= size;
8207 printf ("File Attributes\n");
8210 printf ("Section Attributes:");
8213 printf ("Symbol Attributes:");
8218 val = read_uleb128 (p, &i);
8222 printf (" %d", val);
8227 printf ("Unknown tag: %d\n", tag);
8228 public_section = FALSE;
8234 p = display_arm_attribute(p);
8238 /* ??? Do something sensible, like dump hex. */
8239 printf (" Unknown section contexts\n");
8247 printf (_("Unknown format '%c'\n"), *p);
8256 process_mips_specific (FILE *file)
8258 Elf_Internal_Dyn *entry;
8259 size_t liblist_offset = 0;
8260 size_t liblistno = 0;
8261 size_t conflictsno = 0;
8262 size_t options_offset = 0;
8263 size_t conflicts_offset = 0;
8265 /* We have a lot of special sections. Thanks SGI! */
8266 if (dynamic_section == NULL)
8267 /* No information available. */
8270 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
8271 switch (entry->d_tag)
8273 case DT_MIPS_LIBLIST:
8275 = offset_from_vma (file, entry->d_un.d_val,
8276 liblistno * sizeof (Elf32_External_Lib));
8278 case DT_MIPS_LIBLISTNO:
8279 liblistno = entry->d_un.d_val;
8281 case DT_MIPS_OPTIONS:
8282 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
8284 case DT_MIPS_CONFLICT:
8286 = offset_from_vma (file, entry->d_un.d_val,
8287 conflictsno * sizeof (Elf32_External_Conflict));
8289 case DT_MIPS_CONFLICTNO:
8290 conflictsno = entry->d_un.d_val;
8296 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
8298 Elf32_External_Lib *elib;
8301 elib = get_data (NULL, file, liblist_offset,
8302 liblistno, sizeof (Elf32_External_Lib),
8306 printf ("\nSection '.liblist' contains %lu entries:\n",
8307 (unsigned long) liblistno);
8308 fputs (" Library Time Stamp Checksum Version Flags\n",
8311 for (cnt = 0; cnt < liblistno; ++cnt)
8318 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8319 time = BYTE_GET (elib[cnt].l_time_stamp);
8320 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8321 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8322 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8324 tmp = gmtime (&time);
8325 snprintf (timebuf, sizeof (timebuf),
8326 "%04u-%02u-%02uT%02u:%02u:%02u",
8327 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8328 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8330 printf ("%3lu: ", (unsigned long) cnt);
8331 if (VALID_DYNAMIC_NAME (liblist.l_name))
8332 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
8334 printf ("<corrupt: %9ld>", liblist.l_name);
8335 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
8338 if (liblist.l_flags == 0)
8349 { " EXACT_MATCH", LL_EXACT_MATCH },
8350 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
8351 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
8352 { " EXPORTS", LL_EXPORTS },
8353 { " DELAY_LOAD", LL_DELAY_LOAD },
8354 { " DELTA", LL_DELTA }
8356 int flags = liblist.l_flags;
8360 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
8362 if ((flags & l_flags_vals[fcnt].bit) != 0)
8364 fputs (l_flags_vals[fcnt].name, stdout);
8365 flags ^= l_flags_vals[fcnt].bit;
8368 printf (" %#x", (unsigned int) flags);
8378 if (options_offset != 0)
8380 Elf_External_Options *eopt;
8381 Elf_Internal_Shdr *sect = section_headers;
8382 Elf_Internal_Options *iopt;
8383 Elf_Internal_Options *option;
8387 /* Find the section header so that we get the size. */
8388 while (sect->sh_type != SHT_MIPS_OPTIONS)
8391 eopt = get_data (NULL, file, options_offset, 1, sect->sh_size,
8395 iopt = cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (*iopt));
8398 error (_("Out of memory"));
8405 while (offset < sect->sh_size)
8407 Elf_External_Options *eoption;
8409 eoption = (Elf_External_Options *) ((char *) eopt + offset);
8411 option->kind = BYTE_GET (eoption->kind);
8412 option->size = BYTE_GET (eoption->size);
8413 option->section = BYTE_GET (eoption->section);
8414 option->info = BYTE_GET (eoption->info);
8416 offset += option->size;
8422 printf (_("\nSection '%s' contains %d entries:\n"),
8423 SECTION_NAME (sect), cnt);
8431 switch (option->kind)
8434 /* This shouldn't happen. */
8435 printf (" NULL %d %lx", option->section, option->info);
8438 printf (" REGINFO ");
8439 if (elf_header.e_machine == EM_MIPS)
8442 Elf32_External_RegInfo *ereg;
8443 Elf32_RegInfo reginfo;
8445 ereg = (Elf32_External_RegInfo *) (option + 1);
8446 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8447 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8448 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8449 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8450 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8451 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8453 printf ("GPR %08lx GP 0x%lx\n",
8455 (unsigned long) reginfo.ri_gp_value);
8456 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8457 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8458 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8463 Elf64_External_RegInfo *ereg;
8464 Elf64_Internal_RegInfo reginfo;
8466 ereg = (Elf64_External_RegInfo *) (option + 1);
8467 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
8468 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
8469 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
8470 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
8471 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
8472 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
8474 printf ("GPR %08lx GP 0x",
8475 reginfo.ri_gprmask);
8476 printf_vma (reginfo.ri_gp_value);
8479 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8480 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
8481 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
8485 case ODK_EXCEPTIONS:
8486 fputs (" EXCEPTIONS fpe_min(", stdout);
8487 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
8488 fputs (") fpe_max(", stdout);
8489 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
8490 fputs (")", stdout);
8492 if (option->info & OEX_PAGE0)
8493 fputs (" PAGE0", stdout);
8494 if (option->info & OEX_SMM)
8495 fputs (" SMM", stdout);
8496 if (option->info & OEX_FPDBUG)
8497 fputs (" FPDBUG", stdout);
8498 if (option->info & OEX_DISMISS)
8499 fputs (" DISMISS", stdout);
8502 fputs (" PAD ", stdout);
8503 if (option->info & OPAD_PREFIX)
8504 fputs (" PREFIX", stdout);
8505 if (option->info & OPAD_POSTFIX)
8506 fputs (" POSTFIX", stdout);
8507 if (option->info & OPAD_SYMBOL)
8508 fputs (" SYMBOL", stdout);
8511 fputs (" HWPATCH ", stdout);
8512 if (option->info & OHW_R4KEOP)
8513 fputs (" R4KEOP", stdout);
8514 if (option->info & OHW_R8KPFETCH)
8515 fputs (" R8KPFETCH", stdout);
8516 if (option->info & OHW_R5KEOP)
8517 fputs (" R5KEOP", stdout);
8518 if (option->info & OHW_R5KCVTL)
8519 fputs (" R5KCVTL", stdout);
8522 fputs (" FILL ", stdout);
8523 /* XXX Print content of info word? */
8526 fputs (" TAGS ", stdout);
8527 /* XXX Print content of info word? */
8530 fputs (" HWAND ", stdout);
8531 if (option->info & OHWA0_R4KEOP_CHECKED)
8532 fputs (" R4KEOP_CHECKED", stdout);
8533 if (option->info & OHWA0_R4KEOP_CLEAN)
8534 fputs (" R4KEOP_CLEAN", stdout);
8537 fputs (" HWOR ", stdout);
8538 if (option->info & OHWA0_R4KEOP_CHECKED)
8539 fputs (" R4KEOP_CHECKED", stdout);
8540 if (option->info & OHWA0_R4KEOP_CLEAN)
8541 fputs (" R4KEOP_CLEAN", stdout);
8544 printf (" GP_GROUP %#06lx self-contained %#06lx",
8545 option->info & OGP_GROUP,
8546 (option->info & OGP_SELF) >> 16);
8549 printf (" IDENT %#06lx self-contained %#06lx",
8550 option->info & OGP_GROUP,
8551 (option->info & OGP_SELF) >> 16);
8554 /* This shouldn't happen. */
8555 printf (" %3d ??? %d %lx",
8556 option->kind, option->section, option->info);
8560 len = sizeof (*eopt);
8561 while (len < option->size)
8562 if (((char *) option)[len] >= ' '
8563 && ((char *) option)[len] < 0x7f)
8564 printf ("%c", ((char *) option)[len++]);
8566 printf ("\\%03o", ((char *) option)[len++]);
8568 fputs ("\n", stdout);
8576 if (conflicts_offset != 0 && conflictsno != 0)
8578 Elf32_Conflict *iconf;
8581 if (dynamic_symbols == NULL)
8583 error (_("conflict list found without a dynamic symbol table"));
8587 iconf = cmalloc (conflictsno, sizeof (*iconf));
8590 error (_("Out of memory"));
8596 Elf32_External_Conflict *econf32;
8598 econf32 = get_data (NULL, file, conflicts_offset,
8599 conflictsno, sizeof (*econf32), _("conflict"));
8603 for (cnt = 0; cnt < conflictsno; ++cnt)
8604 iconf[cnt] = BYTE_GET (econf32[cnt]);
8610 Elf64_External_Conflict *econf64;
8612 econf64 = get_data (NULL, file, conflicts_offset,
8613 conflictsno, sizeof (*econf64), _("conflict"));
8617 for (cnt = 0; cnt < conflictsno; ++cnt)
8618 iconf[cnt] = BYTE_GET (econf64[cnt]);
8623 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8624 (unsigned long) conflictsno);
8625 puts (_(" Num: Index Value Name"));
8627 for (cnt = 0; cnt < conflictsno; ++cnt)
8629 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
8631 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
8632 print_vma (psym->st_value, FULL_HEX);
8634 if (VALID_DYNAMIC_NAME (psym->st_name))
8635 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
8637 printf ("<corrupt: %14ld>", psym->st_name);
8648 process_gnu_liblist (FILE *file)
8650 Elf_Internal_Shdr *section, *string_sec;
8651 Elf32_External_Lib *elib;
8660 for (i = 0, section = section_headers;
8661 i < elf_header.e_shnum;
8664 switch (section->sh_type)
8666 case SHT_GNU_LIBLIST:
8667 if (SECTION_HEADER_INDEX (section->sh_link) >= elf_header.e_shnum)
8670 elib = get_data (NULL, file, section->sh_offset, 1, section->sh_size,
8675 string_sec = SECTION_HEADER (section->sh_link);
8677 strtab = get_data (NULL, file, string_sec->sh_offset, 1,
8678 string_sec->sh_size, _("liblist string table"));
8679 strtab_size = string_sec->sh_size;
8682 || section->sh_entsize != sizeof (Elf32_External_Lib))
8688 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8689 SECTION_NAME (section),
8690 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
8692 puts (" Library Time Stamp Checksum Version Flags");
8694 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
8702 liblist.l_name = BYTE_GET (elib[cnt].l_name);
8703 time = BYTE_GET (elib[cnt].l_time_stamp);
8704 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
8705 liblist.l_version = BYTE_GET (elib[cnt].l_version);
8706 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
8708 tmp = gmtime (&time);
8709 snprintf (timebuf, sizeof (timebuf),
8710 "%04u-%02u-%02uT%02u:%02u:%02u",
8711 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8712 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8714 printf ("%3lu: ", (unsigned long) cnt);
8716 printf ("%-20s", liblist.l_name < strtab_size
8717 ? strtab + liblist.l_name : "<corrupt>");
8719 printf ("%-20.20s", liblist.l_name < strtab_size
8720 ? strtab + liblist.l_name : "<corrupt>");
8721 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
8722 liblist.l_version, liblist.l_flags);
8733 get_note_type (unsigned e_type)
8735 static char buff[64];
8737 if (elf_header.e_type == ET_CORE)
8741 return _("NT_AUXV (auxiliary vector)");
8743 return _("NT_PRSTATUS (prstatus structure)");
8745 return _("NT_FPREGSET (floating point registers)");
8747 return _("NT_PRPSINFO (prpsinfo structure)");
8749 return _("NT_TASKSTRUCT (task structure)");
8751 return _("NT_PRXFPREG (user_xfpregs structure)");
8753 return _("NT_PSTATUS (pstatus structure)");
8755 return _("NT_FPREGS (floating point registers)");
8757 return _("NT_PSINFO (psinfo structure)");
8759 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8761 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8762 case NT_WIN32PSTATUS:
8763 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8771 return _("NT_VERSION (version)");
8773 return _("NT_ARCH (architecture)");
8778 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
8783 get_netbsd_elfcore_note_type (unsigned e_type)
8785 static char buff[64];
8787 if (e_type == NT_NETBSDCORE_PROCINFO)
8789 /* NetBSD core "procinfo" structure. */
8790 return _("NetBSD procinfo structure");
8793 /* As of Jan 2002 there are no other machine-independent notes
8794 defined for NetBSD core files. If the note type is less
8795 than the start of the machine-dependent note types, we don't
8798 if (e_type < NT_NETBSDCORE_FIRSTMACH)
8800 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
8804 switch (elf_header.e_machine)
8806 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8807 and PT_GETFPREGS == mach+2. */
8812 case EM_SPARC32PLUS:
8816 case NT_NETBSDCORE_FIRSTMACH+0:
8817 return _("PT_GETREGS (reg structure)");
8818 case NT_NETBSDCORE_FIRSTMACH+2:
8819 return _("PT_GETFPREGS (fpreg structure)");
8825 /* On all other arch's, PT_GETREGS == mach+1 and
8826 PT_GETFPREGS == mach+3. */
8830 case NT_NETBSDCORE_FIRSTMACH+1:
8831 return _("PT_GETREGS (reg structure)");
8832 case NT_NETBSDCORE_FIRSTMACH+3:
8833 return _("PT_GETFPREGS (fpreg structure)");
8839 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
8840 e_type - NT_NETBSDCORE_FIRSTMACH);
8844 /* Note that by the ELF standard, the name field is already null byte
8845 terminated, and namesz includes the terminating null byte.
8846 I.E. the value of namesz for the name "FSF" is 4.
8848 If the value of namesz is zero, there is no name present. */
8850 process_note (Elf_Internal_Note *pnote)
8854 if (pnote->namesz == 0)
8855 /* If there is no note name, then use the default set of
8856 note type strings. */
8857 nt = get_note_type (pnote->type);
8859 else if (strneq (pnote->namedata, "NetBSD-CORE", 11))
8860 /* NetBSD-specific core file notes. */
8861 nt = get_netbsd_elfcore_note_type (pnote->type);
8864 /* Don't recognize this note name; just use the default set of
8865 note type strings. */
8866 nt = get_note_type (pnote->type);
8868 printf (" %s\t\t0x%08lx\t%s\n",
8869 pnote->namesz ? pnote->namedata : "(NONE)",
8876 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
8878 Elf_External_Note *pnotes;
8879 Elf_External_Note *external;
8885 pnotes = get_data (NULL, file, offset, 1, length, _("notes"));
8891 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
8892 (unsigned long) offset, (unsigned long) length);
8893 printf (_(" Owner\t\tData size\tDescription\n"));
8895 while (external < (Elf_External_Note *)((char *) pnotes + length))
8897 Elf_External_Note *next;
8898 Elf_Internal_Note inote;
8901 inote.type = BYTE_GET (external->type);
8902 inote.namesz = BYTE_GET (external->namesz);
8903 inote.namedata = external->name;
8904 inote.descsz = BYTE_GET (external->descsz);
8905 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
8906 inote.descpos = offset + (inote.descdata - (char *) pnotes);
8908 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
8910 if (((char *) next) > (((char *) pnotes) + length))
8912 warn (_("corrupt note found at offset %lx into core notes\n"),
8913 (long)((char *)external - (char *)pnotes));
8914 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
8915 inote.type, inote.namesz, inote.descsz);
8921 /* Verify that name is null terminated. It appears that at least
8922 one version of Linux (RedHat 6.0) generates corefiles that don't
8923 comply with the ELF spec by failing to include the null byte in
8925 if (inote.namedata[inote.namesz] != '\0')
8927 temp = malloc (inote.namesz + 1);
8931 error (_("Out of memory\n"));
8936 strncpy (temp, inote.namedata, inote.namesz);
8937 temp[inote.namesz] = 0;
8939 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
8940 inote.namedata = temp;
8943 res &= process_note (& inote);
8958 process_corefile_note_segments (FILE *file)
8960 Elf_Internal_Phdr *segment;
8964 if (! get_program_headers (file))
8967 for (i = 0, segment = program_headers;
8968 i < elf_header.e_phnum;
8971 if (segment->p_type == PT_NOTE)
8972 res &= process_corefile_note_segment (file,
8973 (bfd_vma) segment->p_offset,
8974 (bfd_vma) segment->p_filesz);
8981 process_note_sections (FILE *file)
8983 Elf_Internal_Shdr *section;
8987 for (i = 0, section = section_headers;
8988 i < elf_header.e_shnum;
8990 if (section->sh_type == SHT_NOTE)
8991 res &= process_corefile_note_segment (file,
8992 (bfd_vma) section->sh_offset,
8993 (bfd_vma) section->sh_size);
8999 process_notes (FILE *file)
9001 /* If we have not been asked to display the notes then do nothing. */
9005 if (elf_header.e_type != ET_CORE)
9006 return process_note_sections (file);
9008 /* No program headers means no NOTE segment. */
9009 if (elf_header.e_phnum > 0)
9010 return process_corefile_note_segments (file);
9012 printf (_("No note segments present in the core file.\n"));
9017 process_arch_specific (FILE *file)
9022 switch (elf_header.e_machine)
9025 return process_arm_specific (file);
9027 case EM_MIPS_RS3_LE:
9028 return process_mips_specific (file);
9037 get_file_header (FILE *file)
9039 /* Read in the identity array. */
9040 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9043 /* Determine how to read the rest of the header. */
9044 switch (elf_header.e_ident[EI_DATA])
9046 default: /* fall through */
9047 case ELFDATANONE: /* fall through */
9049 byte_get = byte_get_little_endian;
9050 byte_put = byte_put_little_endian;
9053 byte_get = byte_get_big_endian;
9054 byte_put = byte_put_big_endian;
9058 /* For now we only support 32 bit and 64 bit ELF files. */
9059 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
9061 /* Read in the rest of the header. */
9064 Elf32_External_Ehdr ehdr32;
9066 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9069 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9070 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9071 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9072 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9073 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9074 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9075 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9076 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9077 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9078 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9079 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9080 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9081 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9085 Elf64_External_Ehdr ehdr64;
9087 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9088 we will not be able to cope with the 64bit data found in
9089 64 ELF files. Detect this now and abort before we start
9090 overwriting things. */
9091 if (sizeof (bfd_vma) < 8)
9093 error (_("This instance of readelf has been built without support for a\n\
9094 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9098 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9101 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9102 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9103 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9104 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
9105 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
9106 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
9107 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9108 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9109 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9110 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9111 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9112 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9113 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9116 if (elf_header.e_shoff)
9118 /* There may be some extensions in the first section header. Don't
9119 bomb if we can't read it. */
9121 get_32bit_section_headers (file, 1);
9123 get_64bit_section_headers (file, 1);
9126 is_relocatable = elf_header.e_type == ET_REL;
9131 /* Process one ELF object file according to the command line options.
9132 This file may actually be stored in an archive. The file is
9133 positioned at the start of the ELF object. */
9136 process_object (char *file_name, FILE *file)
9140 if (! get_file_header (file))
9142 error (_("%s: Failed to read file header\n"), file_name);
9146 /* Initialise per file variables. */
9147 for (i = NUM_ELEM (version_info); i--;)
9148 version_info[i] = 0;
9150 for (i = NUM_ELEM (dynamic_info); i--;)
9151 dynamic_info[i] = 0;
9153 /* Process the file. */
9155 printf (_("\nFile: %s\n"), file_name);
9157 /* Initialise the dump_sects array from the cmdline_dump_sects array.
9158 Note we do this even if cmdline_dump_sects is empty because we
9159 must make sure that the dump_sets array is zeroed out before each
9160 object file is processed. */
9161 if (num_dump_sects > num_cmdline_dump_sects)
9162 memset (dump_sects, 0, num_dump_sects);
9164 if (num_cmdline_dump_sects > 0)
9166 if (num_dump_sects == 0)
9167 /* A sneaky way of allocating the dump_sects array. */
9168 request_dump (num_cmdline_dump_sects, 0);
9170 assert (num_dump_sects >= num_cmdline_dump_sects);
9171 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
9174 if (! process_file_header ())
9177 if (! process_section_headers (file))
9179 /* Without loaded section headers we cannot process lots of
9181 do_unwind = do_version = do_dump = do_arch = 0;
9183 if (! do_using_dynamic)
9184 do_syms = do_reloc = 0;
9187 if (! process_section_groups (file))
9189 /* Without loaded section groups we cannot process unwind. */
9193 if (process_program_headers (file))
9194 process_dynamic_section (file);
9196 process_relocs (file);
9198 process_unwind (file);
9200 process_symbol_table (file);
9202 process_syminfo (file);
9204 process_version_sections (file);
9206 process_section_contents (file);
9208 process_notes (file);
9210 process_gnu_liblist (file);
9212 process_arch_specific (file);
9214 if (program_headers)
9216 free (program_headers);
9217 program_headers = NULL;
9220 if (section_headers)
9222 free (section_headers);
9223 section_headers = NULL;
9228 free (string_table);
9229 string_table = NULL;
9230 string_table_length = 0;
9233 if (dynamic_strings)
9235 free (dynamic_strings);
9236 dynamic_strings = NULL;
9237 dynamic_strings_length = 0;
9240 if (dynamic_symbols)
9242 free (dynamic_symbols);
9243 dynamic_symbols = NULL;
9244 num_dynamic_syms = 0;
9247 if (dynamic_syminfo)
9249 free (dynamic_syminfo);
9250 dynamic_syminfo = NULL;
9253 if (section_headers_groups)
9255 free (section_headers_groups);
9256 section_headers_groups = NULL;
9261 struct group_list *g, *next;
9263 for (i = 0; i < group_count; i++)
9265 for (g = section_groups [i].root; g != NULL; g = next)
9272 free (section_groups);
9273 section_groups = NULL;
9276 free_debug_memory ();
9281 /* Process an ELF archive. The file is positioned just after the
9285 process_archive (char *file_name, FILE *file)
9287 struct ar_hdr arhdr;
9290 char *longnames = NULL;
9291 unsigned long longnames_size = 0;
9292 size_t file_name_size;
9297 got = fread (&arhdr, 1, sizeof arhdr, file);
9298 if (got != sizeof arhdr)
9303 error (_("%s: failed to read archive header\n"), file_name);
9307 if (memcmp (arhdr.ar_name, "/ ", 16) == 0)
9309 /* This is the archive symbol table. Skip it.
9310 FIXME: We should have an option to dump it. */
9311 size = strtoul (arhdr.ar_size, NULL, 10);
9312 if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
9314 error (_("%s: failed to skip archive symbol table\n"), file_name);
9318 got = fread (&arhdr, 1, sizeof arhdr, file);
9319 if (got != sizeof arhdr)
9324 error (_("%s: failed to read archive header\n"), file_name);
9329 if (memcmp (arhdr.ar_name, "// ", 16) == 0)
9331 /* This is the archive string table holding long member
9334 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
9336 longnames = malloc (longnames_size);
9337 if (longnames == NULL)
9339 error (_("Out of memory\n"));
9343 if (fread (longnames, longnames_size, 1, file) != 1)
9346 error (_("%s: failed to read string table\n"), file_name);
9350 if ((longnames_size & 1) != 0)
9353 got = fread (&arhdr, 1, sizeof arhdr, file);
9354 if (got != sizeof arhdr)
9361 error (_("%s: failed to read archive header\n"), file_name);
9366 file_name_size = strlen (file_name);
9375 if (arhdr.ar_name[0] == '/')
9379 off = strtoul (arhdr.ar_name + 1, NULL, 10);
9380 if (off >= longnames_size)
9382 error (_("%s: invalid archive string table offset %lu\n"), file_name, off);
9387 name = longnames + off;
9388 nameend = memchr (name, '/', longnames_size - off);
9392 name = arhdr.ar_name;
9393 nameend = memchr (name, '/', 16);
9396 if (nameend == NULL)
9398 error (_("%s: bad archive file name\n"), file_name);
9403 namealc = malloc (file_name_size + (nameend - name) + 3);
9404 if (namealc == NULL)
9406 error (_("Out of memory\n"));
9411 memcpy (namealc, file_name, file_name_size);
9412 namealc[file_name_size] = '(';
9413 memcpy (namealc + file_name_size + 1, name, nameend - name);
9414 namealc[file_name_size + 1 + (nameend - name)] = ')';
9415 namealc[file_name_size + 2 + (nameend - name)] = '\0';
9417 archive_file_offset = ftell (file);
9418 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
9420 ret |= process_object (namealc, file);
9425 (archive_file_offset
9427 + (archive_file_size & 1)),
9430 error (_("%s: failed to seek to next archive header\n"), file_name);
9435 got = fread (&arhdr, 1, sizeof arhdr, file);
9436 if (got != sizeof arhdr)
9441 error (_("%s: failed to read archive header\n"), file_name);
9454 process_file (char *file_name)
9457 struct stat statbuf;
9461 if (stat (file_name, &statbuf) < 0)
9463 if (errno == ENOENT)
9464 error (_("'%s': No such file\n"), file_name);
9466 error (_("Could not locate '%s'. System error message: %s\n"),
9467 file_name, strerror (errno));
9471 if (! S_ISREG (statbuf.st_mode))
9473 error (_("'%s' is not an ordinary file\n"), file_name);
9477 file = fopen (file_name, "rb");
9480 error (_("Input file '%s' is not readable.\n"), file_name);
9484 if (fread (armag, SARMAG, 1, file) != 1)
9486 error (_("%s: Failed to read file header\n"), file_name);
9491 if (memcmp (armag, ARMAG, SARMAG) == 0)
9492 ret = process_archive (file_name, file);
9496 archive_file_size = archive_file_offset = 0;
9497 ret = process_object (file_name, file);
9505 #ifdef SUPPORT_DISASSEMBLY
9506 /* Needed by the i386 disassembler. For extra credit, someone could
9507 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9511 print_address (unsigned int addr, FILE *outfile)
9513 fprintf (outfile,"0x%8.8x", addr);
9516 /* Needed by the i386 disassembler. */
9518 db_task_printsym (unsigned int addr)
9520 print_address (addr, stderr);
9525 main (int argc, char **argv)
9529 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9530 setlocale (LC_MESSAGES, "");
9532 #if defined (HAVE_SETLOCALE)
9533 setlocale (LC_CTYPE, "");
9535 bindtextdomain (PACKAGE, LOCALEDIR);
9536 textdomain (PACKAGE);
9538 expandargv (&argc, &argv);
9540 parse_args (argc, argv);
9542 if (num_dump_sects > 0)
9544 /* Make a copy of the dump_sects array. */
9545 cmdline_dump_sects = malloc (num_dump_sects);
9546 if (cmdline_dump_sects == NULL)
9547 error (_("Out of memory allocating dump request table."));
9550 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
9551 num_cmdline_dump_sects = num_dump_sects;
9555 if (optind < (argc - 1))
9559 while (optind < argc)
9560 err |= process_file (argv[optind++]);
9562 if (dump_sects != NULL)
9564 if (cmdline_dump_sects != NULL)
9565 free (cmdline_dump_sects);