1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24 /* The difference between readelf and objdump:
26 Both programs are capabale of displaying the contents of ELF format files,
27 so why does the binutils project have two file dumpers ?
29 The reason is that objdump sees an ELF file through a BFD filter of the
30 world; if BFD has a bug where, say, it disagrees about a machine constant
31 in e_flags, then the odds are good that it will remain internally
32 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
33 GAS sees it the BFD way. There was need for a tool to go find out what
34 the file actually says.
36 This is why the readelf program does not link against the BFD library - it
37 exists as an independent program to help verify the correct working of BFD.
39 There is also the case that readelf can provide more information about an
40 ELF file than is provided by objdump. In particular it can display DWARF
41 debugging information which (at the moment) objdump cannot. */
44 #include <sys/types.h>
50 /* Define BFD64 here, even if our default architecture is 32 bit ELF
51 as this will allow us to read in and parse 64bit and 32bit ELF files.
52 Only do this if we believe that the compiler can support a 64 bit
53 data type. For now we only rely on GCC being able to do this. */
59 #include "elf/common.h"
60 #include "elf/external.h"
61 #include "elf/internal.h"
62 #include "elf/dwarf2.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"
90 #include "elf/m68hc11.h"
91 #include "elf/mcore.h"
94 #include "elf/mn10200.h"
95 #include "elf/mn10300.h"
96 #include "elf/msp430.h"
100 #include "elf/ppc64.h"
101 #include "elf/s390.h"
103 #include "elf/sparc.h"
104 #include "elf/v850.h"
106 #include "elf/x86-64.h"
107 #include "elf/xstormy16.h"
108 #include "elf/iq2000.h"
109 #include "elf/xtensa.h"
115 #include "libiberty.h"
117 char *program_name = "readelf";
118 long archive_file_offset;
119 unsigned long archive_file_size;
120 unsigned long dynamic_addr;
121 bfd_size_type dynamic_size;
122 char *dynamic_strings;
124 unsigned long string_table_length;
125 unsigned long num_dynamic_syms;
126 Elf_Internal_Sym *dynamic_symbols;
127 Elf_Internal_Syminfo *dynamic_syminfo;
128 unsigned long dynamic_syminfo_offset;
129 unsigned int dynamic_syminfo_nent;
130 char program_interpreter[64];
131 bfd_vma dynamic_info[DT_JMPREL + 1];
132 bfd_vma version_info[16];
133 Elf_Internal_Ehdr elf_header;
134 Elf_Internal_Shdr *section_headers;
135 Elf_Internal_Phdr *program_headers;
136 Elf_Internal_Dyn *dynamic_segment;
137 Elf_Internal_Shdr *symtab_shndx_hdr;
143 int do_section_groups;
146 int do_using_dynamic;
154 int do_debug_abbrevs;
156 int do_debug_pubnames;
157 int do_debug_aranges;
159 int do_debug_frames_interp;
160 int do_debug_macinfo;
169 struct group_list *next;
170 unsigned int section_index;
175 struct group_list *root;
176 unsigned int group_index;
179 struct group *section_groups;
180 size_t group_count = 0;
182 struct group **section_headers_groups;
184 /* A dynamic array of flags indicating which sections require dumping. */
185 char *dump_sects = NULL;
186 unsigned int num_dump_sects = 0;
188 #define HEX_DUMP (1 << 0)
189 #define DISASS_DUMP (1 << 1)
190 #define DEBUG_DUMP (1 << 2)
192 /* How to rpint a vma value. */
193 typedef enum print_mode
205 static bfd_vma (*byte_get) (unsigned char *, int);
206 static void (*byte_put) (unsigned char *, bfd_vma, int);
208 typedef int Elf32_Word;
212 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
213 ((X)->sh_name >= string_table_length \
214 ? "<corrupt>" : string_table + (X)->sh_name))
216 /* Given st_shndx I, map to section_headers index. */
217 #define SECTION_HEADER_INDEX(I) \
218 ((I) < SHN_LORESERVE \
220 : ((I) <= SHN_HIRESERVE \
222 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
224 /* Reverse of the above. */
225 #define SECTION_HEADER_NUM(N) \
226 ((N) < SHN_LORESERVE \
228 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
230 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extract all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
245 #define BYTE_GET8(field) byte_get (field, -8)
247 #define BYTE_GET8(field) byte_get (field, 8)
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_ELF_SYMBOLS(file, section) \
253 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
254 : get_64bit_elf_symbols (file, section))
258 error (const char *message, ...)
262 va_start (args, message);
263 fprintf (stderr, _("%s: Error: "), program_name);
264 vfprintf (stderr, message, args);
269 warn (const char *message, ...)
273 va_start (args, message);
274 fprintf (stderr, _("%s: Warning: "), program_name);
275 vfprintf (stderr, message, args);
280 get_data (void *var, FILE *file, long offset, size_t size, const char *reason)
287 if (fseek (file, archive_file_offset + offset, SEEK_SET))
289 error (_("Unable to seek to 0x%x for %s\n"),
290 archive_file_offset + offset, reason);
297 mvar = malloc (size);
301 error (_("Out of memory allocating 0x%x bytes for %s\n"),
307 if (fread (mvar, size, 1, file) != 1)
309 error (_("Unable to read in 0x%x bytes of %s\n"), size, reason);
319 byte_get_little_endian (unsigned char *field, int size)
327 return ((unsigned int) (field[0]))
328 | (((unsigned int) (field[1])) << 8);
332 /* We want to extract data from an 8 byte wide field and
333 place it into a 4 byte wide field. Since this is a little
334 endian source we can just use the 4 byte extraction code. */
338 return ((unsigned long) (field[0]))
339 | (((unsigned long) (field[1])) << 8)
340 | (((unsigned long) (field[2])) << 16)
341 | (((unsigned long) (field[3])) << 24);
346 /* This is a special case, generated by the BYTE_GET8 macro.
347 It means that we are loading an 8 byte value from a field
348 in an external structure into an 8 byte value in a field
349 in an internal structure. */
350 return ((bfd_vma) (field[0]))
351 | (((bfd_vma) (field[1])) << 8)
352 | (((bfd_vma) (field[2])) << 16)
353 | (((bfd_vma) (field[3])) << 24)
354 | (((bfd_vma) (field[4])) << 32)
355 | (((bfd_vma) (field[5])) << 40)
356 | (((bfd_vma) (field[6])) << 48)
357 | (((bfd_vma) (field[7])) << 56);
360 error (_("Unhandled data length: %d\n"), size);
366 byte_get_signed (unsigned char *field, int size)
368 bfd_vma x = byte_get (field, size);
373 return (x ^ 0x80) - 0x80;
375 return (x ^ 0x8000) - 0x8000;
377 return (x ^ 0x80000000) - 0x80000000;
387 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
392 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
393 field[6] = ((value >> 24) >> 24) & 0xff;
394 field[5] = ((value >> 24) >> 16) & 0xff;
395 field[4] = ((value >> 24) >> 8) & 0xff;
398 field[3] = (value >> 24) & 0xff;
399 field[2] = (value >> 16) & 0xff;
402 field[1] = (value >> 8) & 0xff;
405 field[0] = value & 0xff;
409 error (_("Unhandled data length: %d\n"), size);
414 /* Print a VMA value. */
416 print_vma (bfd_vma vma, print_mode mode)
428 printf ("%8.8lx", (unsigned long) vma);
434 printf ("%5ld", (long) vma);
442 printf ("%lx", (unsigned long) vma);
446 printf ("%ld", (unsigned long) vma);
450 printf ("%lu", (unsigned long) vma);
472 #if BFD_HOST_64BIT_LONG
475 if (_bfd_int64_high (vma))
476 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
478 printf ("%lx", _bfd_int64_low (vma));
483 #if BFD_HOST_64BIT_LONG
486 if (_bfd_int64_high (vma))
488 printf ("++%ld", _bfd_int64_low (vma));
490 printf ("%ld", _bfd_int64_low (vma));
495 #if BFD_HOST_64BIT_LONG
497 printf ("%5ld", vma);
499 printf ("%#lx", vma);
501 if (_bfd_int64_high (vma))
503 printf ("++%ld", _bfd_int64_low (vma));
504 else if (vma <= 99999)
505 printf ("%5ld", _bfd_int64_low (vma));
507 printf ("%#lx", _bfd_int64_low (vma));
512 #if BFD_HOST_64BIT_LONG
515 if (_bfd_int64_high (vma))
517 printf ("++%lu", _bfd_int64_low (vma));
519 printf ("%lu", _bfd_int64_low (vma));
527 /* Display a symbol on stdout. If do_wide is not true then
528 format the symbol to be at most WIDTH characters,
529 truncating as necessary. If WIDTH is negative then
530 format the string to be exactly - WIDTH characters,
531 truncating or padding as necessary. */
534 print_symbol (int width, const char *symbol)
537 printf ("%s", symbol);
539 printf ("%-*.*s", width, width, symbol);
541 printf ("%-.*s", width, symbol);
545 byte_get_big_endian (unsigned char *field, int size)
553 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
556 return ((unsigned long) (field[3]))
557 | (((unsigned long) (field[2])) << 8)
558 | (((unsigned long) (field[1])) << 16)
559 | (((unsigned long) (field[0])) << 24);
563 /* Although we are extracing data from an 8 byte wide field, we
564 are returning only 4 bytes of data. */
565 return ((unsigned long) (field[7]))
566 | (((unsigned long) (field[6])) << 8)
567 | (((unsigned long) (field[5])) << 16)
568 | (((unsigned long) (field[4])) << 24);
572 /* This is a special case, generated by the BYTE_GET8 macro.
573 It means that we are loading an 8 byte value from a field
574 in an external structure into an 8 byte value in a field
575 in an internal structure. */
576 return ((bfd_vma) (field[7]))
577 | (((bfd_vma) (field[6])) << 8)
578 | (((bfd_vma) (field[5])) << 16)
579 | (((bfd_vma) (field[4])) << 24)
580 | (((bfd_vma) (field[3])) << 32)
581 | (((bfd_vma) (field[2])) << 40)
582 | (((bfd_vma) (field[1])) << 48)
583 | (((bfd_vma) (field[0])) << 56);
587 error (_("Unhandled data length: %d\n"), size);
593 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
598 field[7] = value & 0xff;
599 field[6] = (value >> 8) & 0xff;
600 field[5] = (value >> 16) & 0xff;
601 field[4] = (value >> 24) & 0xff;
606 field[3] = value & 0xff;
607 field[2] = (value >> 8) & 0xff;
611 field[1] = value & 0xff;
615 field[0] = value & 0xff;
619 error (_("Unhandled data length: %d\n"), size);
624 /* Guess the relocation size commonly used by the specific machines. */
627 guess_is_rela (unsigned long e_machine)
631 /* Targets that use REL relocations. */
646 /* Targets that use RELA relocations. */
661 case EM_CYGNUS_MN10200:
663 case EM_CYGNUS_MN10300:
709 warn (_("Don't know about relocations on this machine architecture\n"));
715 slurp_rela_relocs (FILE *file,
716 unsigned long rel_offset,
717 unsigned long rel_size,
718 Elf_Internal_Rela **relasp,
719 unsigned long *nrelasp)
721 Elf_Internal_Rela *relas;
722 unsigned long nrelas;
727 Elf32_External_Rela *erelas;
729 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
733 nrelas = rel_size / sizeof (Elf32_External_Rela);
735 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
739 error(_("out of memory parsing relocs"));
743 for (i = 0; i < nrelas; i++)
745 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
746 relas[i].r_info = BYTE_GET (erelas[i].r_info);
747 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
754 Elf64_External_Rela *erelas;
756 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
760 nrelas = rel_size / sizeof (Elf64_External_Rela);
762 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
766 error(_("out of memory parsing relocs"));
770 for (i = 0; i < nrelas; i++)
772 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
773 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
774 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
785 slurp_rel_relocs (FILE *file,
786 unsigned long rel_offset,
787 unsigned long rel_size,
788 Elf_Internal_Rela **relsp,
789 unsigned long *nrelsp)
791 Elf_Internal_Rela *rels;
797 Elf32_External_Rel *erels;
799 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
803 nrels = rel_size / sizeof (Elf32_External_Rel);
805 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
809 error(_("out of memory parsing relocs"));
813 for (i = 0; i < nrels; i++)
815 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
816 rels[i].r_info = BYTE_GET (erels[i].r_info);
817 rels[i].r_addend = 0;
824 Elf64_External_Rel *erels;
826 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
830 nrels = rel_size / sizeof (Elf64_External_Rel);
832 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
836 error(_("out of memory parsing relocs"));
840 for (i = 0; i < nrels; i++)
842 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
843 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
844 rels[i].r_addend = 0;
854 /* Display the contents of the relocation data found at the specified
858 dump_relocations (FILE *file,
859 unsigned long rel_offset,
860 unsigned long rel_size,
861 Elf_Internal_Sym *symtab,
867 Elf_Internal_Rela *rels;
870 if (is_rela == UNKNOWN)
871 is_rela = guess_is_rela (elf_header.e_machine);
875 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
880 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
889 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
891 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
896 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
898 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
906 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
908 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
913 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
915 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
919 for (i = 0; i < rel_size; i++)
922 const char *rtype2 = NULL;
923 const char *rtype3 = NULL;
926 bfd_vma symtab_index;
931 offset = rels[i].r_offset;
932 info = rels[i].r_info;
936 type = ELF32_R_TYPE (info);
937 symtab_index = ELF32_R_SYM (info);
941 /* The #ifdef BFD64 below is to prevent a compile time warning.
942 We know that if we do not have a 64 bit data type that we
943 will never execute this code anyway. */
945 if (elf_header.e_machine == EM_MIPS)
947 /* In little-endian objects, r_info isn't really a 64-bit
948 little-endian value: it has a 32-bit little-endian
949 symbol index followed by four individual byte fields.
950 Reorder INFO accordingly. */
951 if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
952 info = (((info & 0xffffffff) << 32)
953 | ((info >> 56) & 0xff)
954 | ((info >> 40) & 0xff00)
955 | ((info >> 24) & 0xff0000)
956 | ((info >> 8) & 0xff000000));
957 type = ELF64_MIPS_R_TYPE (info);
958 type2 = ELF64_MIPS_R_TYPE2 (info);
959 type3 = ELF64_MIPS_R_TYPE3 (info);
961 else if (elf_header.e_machine == EM_SPARCV9)
962 type = ELF64_R_TYPE_ID (info);
964 type = ELF64_R_TYPE (info);
966 symtab_index = ELF64_R_SYM (info);
972 #ifdef _bfd_int64_low
973 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
975 printf ("%8.8lx %8.8lx ", offset, info);
980 #ifdef _bfd_int64_low
982 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
983 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
984 _bfd_int64_high (offset),
985 _bfd_int64_low (offset),
986 _bfd_int64_high (info),
987 _bfd_int64_low (info));
990 ? "%16.16lx %16.16lx "
991 : "%12.12lx %12.12lx ",
996 switch (elf_header.e_machine)
1003 case EM_CYGNUS_M32R:
1004 rtype = elf_m32r_reloc_type (type);
1009 rtype = elf_i386_reloc_type (type);
1014 rtype = elf_m68hc11_reloc_type (type);
1018 rtype = elf_m68k_reloc_type (type);
1022 rtype = elf_i960_reloc_type (type);
1027 rtype = elf_avr_reloc_type (type);
1030 case EM_OLD_SPARCV9:
1031 case EM_SPARC32PLUS:
1034 rtype = elf_sparc_reloc_type (type);
1038 case EM_CYGNUS_V850:
1039 rtype = v850_reloc_type (type);
1043 case EM_CYGNUS_D10V:
1044 rtype = elf_d10v_reloc_type (type);
1048 case EM_CYGNUS_D30V:
1049 rtype = elf_d30v_reloc_type (type);
1053 rtype = elf_dlx_reloc_type (type);
1057 rtype = elf_sh_reloc_type (type);
1061 case EM_CYGNUS_MN10300:
1062 rtype = elf_mn10300_reloc_type (type);
1066 case EM_CYGNUS_MN10200:
1067 rtype = elf_mn10200_reloc_type (type);
1071 case EM_CYGNUS_FR30:
1072 rtype = elf_fr30_reloc_type (type);
1076 rtype = elf_frv_reloc_type (type);
1080 rtype = elf_mcore_reloc_type (type);
1084 rtype = elf_mmix_reloc_type (type);
1089 rtype = elf_msp430_reloc_type (type);
1093 rtype = elf_ppc_reloc_type (type);
1097 rtype = elf_ppc64_reloc_type (type);
1101 case EM_MIPS_RS3_LE:
1102 rtype = elf_mips_reloc_type (type);
1105 rtype2 = elf_mips_reloc_type (type2);
1106 rtype3 = elf_mips_reloc_type (type3);
1111 rtype = elf_alpha_reloc_type (type);
1115 rtype = elf_arm_reloc_type (type);
1119 rtype = elf_arc_reloc_type (type);
1123 rtype = elf_hppa_reloc_type (type);
1129 rtype = elf_h8_reloc_type (type);
1134 rtype = elf_or32_reloc_type (type);
1139 rtype = elf_pj_reloc_type (type);
1142 rtype = elf_ia64_reloc_type (type);
1146 rtype = elf_cris_reloc_type (type);
1150 rtype = elf_i860_reloc_type (type);
1154 rtype = elf_x86_64_reloc_type (type);
1158 rtype = i370_reloc_type (type);
1163 rtype = elf_s390_reloc_type (type);
1167 rtype = elf_xstormy16_reloc_type (type);
1171 rtype = elf_vax_reloc_type (type);
1176 rtype = elf_ip2k_reloc_type (type);
1180 rtype = elf_iq2000_reloc_type (type);
1185 rtype = elf_xtensa_reloc_type (type);
1190 #ifdef _bfd_int64_low
1191 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1193 printf (_("unrecognized: %-7lx"), type);
1196 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1200 if (symtab == NULL || symtab_index >= nsyms)
1201 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1204 Elf_Internal_Sym *psym;
1206 psym = symtab + symtab_index;
1209 print_vma (psym->st_value, LONG_HEX);
1210 printf (is_32bit_elf ? " " : " ");
1212 if (psym->st_name == 0)
1214 const char *sec_name = "<null>";
1217 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1219 bfd_vma sec_index = (bfd_vma) -1;
1221 if (psym->st_shndx < SHN_LORESERVE)
1222 sec_index = psym->st_shndx;
1223 else if (psym->st_shndx > SHN_LORESERVE)
1224 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1227 if (sec_index != (bfd_vma) -1)
1228 sec_name = SECTION_NAME (section_headers + sec_index);
1229 else if (psym->st_shndx == SHN_ABS)
1231 else if (psym->st_shndx == SHN_COMMON)
1232 sec_name = "COMMON";
1233 else if (elf_header.e_machine == EM_IA_64
1234 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1235 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1236 sec_name = "ANSI_COM";
1239 sprintf (name_buf, "<section 0x%x>",
1240 (unsigned int) psym->st_shndx);
1241 sec_name = name_buf;
1244 print_symbol (22, sec_name);
1246 else if (strtab == NULL)
1247 printf (_("<string table index %3ld>"), psym->st_name);
1249 print_symbol (22, strtab + psym->st_name);
1252 printf (" + %lx", (unsigned long) rels[i].r_addend);
1257 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1258 print_vma (rels[i].r_addend, LONG_HEX);
1261 if (elf_header.e_machine == EM_SPARCV9
1262 && !strcmp (rtype, "R_SPARC_OLO10"))
1263 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1267 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1269 printf (" Type2: ");
1272 #ifdef _bfd_int64_low
1273 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1275 printf (_("unrecognized: %-7lx"), type2);
1278 printf ("%-17.17s", rtype2);
1280 printf("\n Type3: ");
1283 #ifdef _bfd_int64_low
1284 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1286 printf (_("unrecognized: %-7lx"), type3);
1289 printf ("%-17.17s", rtype3);
1301 get_mips_dynamic_type (unsigned long type)
1305 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1306 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1307 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1308 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1309 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1310 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1311 case DT_MIPS_MSYM: return "MIPS_MSYM";
1312 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1313 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1314 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1315 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1316 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1317 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1318 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1319 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1320 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1321 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1322 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1323 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1324 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1325 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1326 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1327 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1328 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1329 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1330 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1331 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1332 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1333 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1334 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1335 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1336 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1337 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1338 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1339 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1340 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1341 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1342 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1343 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1344 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1345 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1346 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1347 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1354 get_sparc64_dynamic_type (unsigned long type)
1358 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1365 get_ppc64_dynamic_type (unsigned long type)
1369 case DT_PPC64_GLINK: return "PPC64_GLINK";
1370 case DT_PPC64_OPD: return "PPC64_OPD";
1371 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1378 get_parisc_dynamic_type (unsigned long type)
1382 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1383 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1384 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1385 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1386 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1387 case DT_HP_PREINIT: return "HP_PREINIT";
1388 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1389 case DT_HP_NEEDED: return "HP_NEEDED";
1390 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1391 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1392 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1393 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1394 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1401 get_ia64_dynamic_type (unsigned long type)
1405 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1412 get_dynamic_type (unsigned long type)
1414 static char buff[32];
1418 case DT_NULL: return "NULL";
1419 case DT_NEEDED: return "NEEDED";
1420 case DT_PLTRELSZ: return "PLTRELSZ";
1421 case DT_PLTGOT: return "PLTGOT";
1422 case DT_HASH: return "HASH";
1423 case DT_STRTAB: return "STRTAB";
1424 case DT_SYMTAB: return "SYMTAB";
1425 case DT_RELA: return "RELA";
1426 case DT_RELASZ: return "RELASZ";
1427 case DT_RELAENT: return "RELAENT";
1428 case DT_STRSZ: return "STRSZ";
1429 case DT_SYMENT: return "SYMENT";
1430 case DT_INIT: return "INIT";
1431 case DT_FINI: return "FINI";
1432 case DT_SONAME: return "SONAME";
1433 case DT_RPATH: return "RPATH";
1434 case DT_SYMBOLIC: return "SYMBOLIC";
1435 case DT_REL: return "REL";
1436 case DT_RELSZ: return "RELSZ";
1437 case DT_RELENT: return "RELENT";
1438 case DT_PLTREL: return "PLTREL";
1439 case DT_DEBUG: return "DEBUG";
1440 case DT_TEXTREL: return "TEXTREL";
1441 case DT_JMPREL: return "JMPREL";
1442 case DT_BIND_NOW: return "BIND_NOW";
1443 case DT_INIT_ARRAY: return "INIT_ARRAY";
1444 case DT_FINI_ARRAY: return "FINI_ARRAY";
1445 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1446 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1447 case DT_RUNPATH: return "RUNPATH";
1448 case DT_FLAGS: return "FLAGS";
1450 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1451 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1453 case DT_CHECKSUM: return "CHECKSUM";
1454 case DT_PLTPADSZ: return "PLTPADSZ";
1455 case DT_MOVEENT: return "MOVEENT";
1456 case DT_MOVESZ: return "MOVESZ";
1457 case DT_FEATURE: return "FEATURE";
1458 case DT_POSFLAG_1: return "POSFLAG_1";
1459 case DT_SYMINSZ: return "SYMINSZ";
1460 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1462 case DT_ADDRRNGLO: return "ADDRRNGLO";
1463 case DT_CONFIG: return "CONFIG";
1464 case DT_DEPAUDIT: return "DEPAUDIT";
1465 case DT_AUDIT: return "AUDIT";
1466 case DT_PLTPAD: return "PLTPAD";
1467 case DT_MOVETAB: return "MOVETAB";
1468 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1470 case DT_VERSYM: return "VERSYM";
1472 case DT_RELACOUNT: return "RELACOUNT";
1473 case DT_RELCOUNT: return "RELCOUNT";
1474 case DT_FLAGS_1: return "FLAGS_1";
1475 case DT_VERDEF: return "VERDEF";
1476 case DT_VERDEFNUM: return "VERDEFNUM";
1477 case DT_VERNEED: return "VERNEED";
1478 case DT_VERNEEDNUM: return "VERNEEDNUM";
1480 case DT_AUXILIARY: return "AUXILIARY";
1481 case DT_USED: return "USED";
1482 case DT_FILTER: return "FILTER";
1484 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1485 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1486 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1487 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1488 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1491 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1495 switch (elf_header.e_machine)
1498 case EM_MIPS_RS3_LE:
1499 result = get_mips_dynamic_type (type);
1502 result = get_sparc64_dynamic_type (type);
1505 result = get_ppc64_dynamic_type (type);
1508 result = get_ia64_dynamic_type (type);
1518 sprintf (buff, _("Processor Specific: %lx"), type);
1520 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1524 switch (elf_header.e_machine)
1527 result = get_parisc_dynamic_type (type);
1537 sprintf (buff, _("Operating System specific: %lx"), type);
1540 sprintf (buff, _("<unknown>: %lx"), type);
1547 get_file_type (unsigned e_type)
1549 static char buff[32];
1553 case ET_NONE: return _("NONE (None)");
1554 case ET_REL: return _("REL (Relocatable file)");
1555 case ET_EXEC: return _("EXEC (Executable file)");
1556 case ET_DYN: return _("DYN (Shared object file)");
1557 case ET_CORE: return _("CORE (Core file)");
1560 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1561 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1562 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1563 sprintf (buff, _("OS Specific: (%x)"), e_type);
1565 sprintf (buff, _("<unknown>: %x"), e_type);
1571 get_machine_name (unsigned e_machine)
1573 static char buff[64]; /* XXX */
1577 case EM_NONE: return _("None");
1578 case EM_M32: return "WE32100";
1579 case EM_SPARC: return "Sparc";
1580 case EM_386: return "Intel 80386";
1581 case EM_68K: return "MC68000";
1582 case EM_88K: return "MC88000";
1583 case EM_486: return "Intel 80486";
1584 case EM_860: return "Intel 80860";
1585 case EM_MIPS: return "MIPS R3000";
1586 case EM_S370: return "IBM System/370";
1587 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1588 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1589 case EM_PARISC: return "HPPA";
1590 case EM_PPC_OLD: return "Power PC (old)";
1591 case EM_SPARC32PLUS: return "Sparc v8+" ;
1592 case EM_960: return "Intel 90860";
1593 case EM_PPC: return "PowerPC";
1594 case EM_PPC64: return "PowerPC64";
1595 case EM_V800: return "NEC V800";
1596 case EM_FR20: return "Fujitsu FR20";
1597 case EM_RH32: return "TRW RH32";
1598 case EM_MCORE: return "MCORE";
1599 case EM_ARM: return "ARM";
1600 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1601 case EM_SH: return "Renesas / SuperH SH";
1602 case EM_SPARCV9: return "Sparc v9";
1603 case EM_TRICORE: return "Siemens Tricore";
1604 case EM_ARC: return "ARC";
1605 case EM_H8_300: return "Renesas H8/300";
1606 case EM_H8_300H: return "Renesas H8/300H";
1607 case EM_H8S: return "Renesas H8S";
1608 case EM_H8_500: return "Renesas H8/500";
1609 case EM_IA_64: return "Intel IA-64";
1610 case EM_MIPS_X: return "Stanford MIPS-X";
1611 case EM_COLDFIRE: return "Motorola Coldfire";
1612 case EM_68HC12: return "Motorola M68HC12";
1613 case EM_ALPHA: return "Alpha";
1614 case EM_CYGNUS_D10V:
1615 case EM_D10V: return "d10v";
1616 case EM_CYGNUS_D30V:
1617 case EM_D30V: return "d30v";
1618 case EM_CYGNUS_M32R:
1619 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1620 case EM_CYGNUS_V850:
1621 case EM_V850: return "NEC v850";
1622 case EM_CYGNUS_MN10300:
1623 case EM_MN10300: return "mn10300";
1624 case EM_CYGNUS_MN10200:
1625 case EM_MN10200: return "mn10200";
1626 case EM_CYGNUS_FR30:
1627 case EM_FR30: return "Fujitsu FR30";
1628 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1630 case EM_PJ: return "picoJava";
1631 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1632 case EM_PCP: return "Siemens PCP";
1633 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1634 case EM_NDR1: return "Denso NDR1 microprocesspr";
1635 case EM_STARCORE: return "Motorola Star*Core processor";
1636 case EM_ME16: return "Toyota ME16 processor";
1637 case EM_ST100: return "STMicroelectronics ST100 processor";
1638 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1639 case EM_FX66: return "Siemens FX66 microcontroller";
1640 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1641 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1642 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1643 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1644 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1645 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1646 case EM_SVX: return "Silicon Graphics SVx";
1647 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1648 case EM_VAX: return "Digital VAX";
1650 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1651 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1652 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1653 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1654 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1655 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1656 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1657 case EM_PRISM: return "Vitesse Prism";
1658 case EM_X86_64: return "Advanced Micro Devices X86-64";
1660 case EM_S390: return "IBM S/390";
1661 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1663 case EM_OR32: return "OpenRISC";
1664 case EM_DLX: return "OpenDLX";
1666 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1667 case EM_IQ2000: return "Vitesse IQ2000";
1669 case EM_XTENSA: return "Tensilica Xtensa Processor";
1671 sprintf (buff, _("<unknown>: %x"), e_machine);
1677 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1682 eabi = EF_ARM_EABI_VERSION (e_flags);
1683 e_flags &= ~ EF_ARM_EABIMASK;
1685 /* Handle "generic" ARM flags. */
1686 if (e_flags & EF_ARM_RELEXEC)
1688 strcat (buf, ", relocatable executable");
1689 e_flags &= ~ EF_ARM_RELEXEC;
1692 if (e_flags & EF_ARM_HASENTRY)
1694 strcat (buf, ", has entry point");
1695 e_flags &= ~ EF_ARM_HASENTRY;
1698 /* Now handle EABI specific flags. */
1702 strcat (buf, ", <unrecognized EABI>");
1707 case EF_ARM_EABI_VER1:
1708 strcat (buf, ", Version1 EABI");
1713 /* Process flags one bit at a time. */
1714 flag = e_flags & - e_flags;
1719 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1720 strcat (buf, ", sorted symbol tables");
1730 case EF_ARM_EABI_VER2:
1731 strcat (buf, ", Version2 EABI");
1736 /* Process flags one bit at a time. */
1737 flag = e_flags & - e_flags;
1742 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1743 strcat (buf, ", sorted symbol tables");
1746 case EF_ARM_DYNSYMSUSESEGIDX:
1747 strcat (buf, ", dynamic symbols use segment index");
1750 case EF_ARM_MAPSYMSFIRST:
1751 strcat (buf, ", mapping symbols precede others");
1761 case EF_ARM_EABI_VER3:
1762 strcat (buf, ", Version3 EABI");
1767 /* Process flags one bit at a time. */
1768 flag = e_flags & - e_flags;
1774 strcat (buf, ", BE8");
1778 strcat (buf, ", LE8");
1788 case EF_ARM_EABI_UNKNOWN:
1789 strcat (buf, ", GNU EABI");
1794 /* Process flags one bit at a time. */
1795 flag = e_flags & - e_flags;
1800 case EF_ARM_INTERWORK:
1801 strcat (buf, ", interworking enabled");
1804 case EF_ARM_APCS_26:
1805 strcat (buf, ", uses APCS/26");
1808 case EF_ARM_APCS_FLOAT:
1809 strcat (buf, ", uses APCS/float");
1813 strcat (buf, ", position independent");
1817 strcat (buf, ", 8 bit structure alignment");
1820 case EF_ARM_NEW_ABI:
1821 strcat (buf, ", uses new ABI");
1824 case EF_ARM_OLD_ABI:
1825 strcat (buf, ", uses old ABI");
1828 case EF_ARM_SOFT_FLOAT:
1829 strcat (buf, ", software FP");
1832 case EF_ARM_MAVERICK_FLOAT:
1833 strcat (buf, ", Maverick FP");
1844 strcat (buf,", <unknown>");
1848 get_machine_flags (unsigned e_flags, unsigned e_machine)
1850 static char buf[1024];
1862 decode_ARM_machine_flags (e_flags, buf);
1866 if (e_flags & EF_CPU32)
1867 strcat (buf, ", cpu32");
1868 if (e_flags & EF_M68000)
1869 strcat (buf, ", m68000");
1873 if (e_flags & EF_PPC_EMB)
1874 strcat (buf, ", emb");
1876 if (e_flags & EF_PPC_RELOCATABLE)
1877 strcat (buf, ", relocatable");
1879 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1880 strcat (buf, ", relocatable-lib");
1884 case EM_CYGNUS_V850:
1885 switch (e_flags & EF_V850_ARCH)
1888 strcat (buf, ", v850e1");
1891 strcat (buf, ", v850e");
1894 strcat (buf, ", v850");
1897 strcat (buf, ", unknown v850 architecture variant");
1903 case EM_CYGNUS_M32R:
1904 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1905 strcat (buf, ", m32r");
1910 case EM_MIPS_RS3_LE:
1911 if (e_flags & EF_MIPS_NOREORDER)
1912 strcat (buf, ", noreorder");
1914 if (e_flags & EF_MIPS_PIC)
1915 strcat (buf, ", pic");
1917 if (e_flags & EF_MIPS_CPIC)
1918 strcat (buf, ", cpic");
1920 if (e_flags & EF_MIPS_UCODE)
1921 strcat (buf, ", ugen_reserved");
1923 if (e_flags & EF_MIPS_ABI2)
1924 strcat (buf, ", abi2");
1926 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1927 strcat (buf, ", odk first");
1929 if (e_flags & EF_MIPS_32BITMODE)
1930 strcat (buf, ", 32bitmode");
1932 switch ((e_flags & EF_MIPS_MACH))
1934 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1935 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1936 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1937 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1938 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1939 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1940 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1941 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1942 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1944 /* We simply ignore the field in this case to avoid confusion:
1945 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1948 default: strcat (buf, ", unknown CPU"); break;
1951 switch ((e_flags & EF_MIPS_ABI))
1953 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1954 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1955 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1956 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1958 /* We simply ignore the field in this case to avoid confusion:
1959 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1960 This means it is likely to be an o32 file, but not for
1963 default: strcat (buf, ", unknown ABI"); break;
1966 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1967 strcat (buf, ", mdmx");
1969 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1970 strcat (buf, ", mips16");
1972 switch ((e_flags & EF_MIPS_ARCH))
1974 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1975 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1976 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1977 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1978 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1979 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1980 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
1981 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1982 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
1983 default: strcat (buf, ", unknown ISA"); break;
1989 if (e_flags & EF_SPARC_32PLUS)
1990 strcat (buf, ", v8+");
1992 if (e_flags & EF_SPARC_SUN_US1)
1993 strcat (buf, ", ultrasparcI");
1995 if (e_flags & EF_SPARC_SUN_US3)
1996 strcat (buf, ", ultrasparcIII");
1998 if (e_flags & EF_SPARC_HAL_R1)
1999 strcat (buf, ", halr1");
2001 if (e_flags & EF_SPARC_LEDATA)
2002 strcat (buf, ", ledata");
2004 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2005 strcat (buf, ", tso");
2007 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2008 strcat (buf, ", pso");
2010 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2011 strcat (buf, ", rmo");
2015 switch (e_flags & EF_PARISC_ARCH)
2017 case EFA_PARISC_1_0:
2018 strcpy (buf, ", PA-RISC 1.0");
2020 case EFA_PARISC_1_1:
2021 strcpy (buf, ", PA-RISC 1.1");
2023 case EFA_PARISC_2_0:
2024 strcpy (buf, ", PA-RISC 2.0");
2029 if (e_flags & EF_PARISC_TRAPNIL)
2030 strcat (buf, ", trapnil");
2031 if (e_flags & EF_PARISC_EXT)
2032 strcat (buf, ", ext");
2033 if (e_flags & EF_PARISC_LSB)
2034 strcat (buf, ", lsb");
2035 if (e_flags & EF_PARISC_WIDE)
2036 strcat (buf, ", wide");
2037 if (e_flags & EF_PARISC_NO_KABP)
2038 strcat (buf, ", no kabp");
2039 if (e_flags & EF_PARISC_LAZYSWAP)
2040 strcat (buf, ", lazyswap");
2045 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2046 strcat (buf, ", new calling convention");
2048 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2049 strcat (buf, ", gnu calling convention");
2053 if ((e_flags & EF_IA_64_ABI64))
2054 strcat (buf, ", 64-bit");
2056 strcat (buf, ", 32-bit");
2057 if ((e_flags & EF_IA_64_REDUCEDFP))
2058 strcat (buf, ", reduced fp model");
2059 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2060 strcat (buf, ", no function descriptors, constant gp");
2061 else if ((e_flags & EF_IA_64_CONS_GP))
2062 strcat (buf, ", constant gp");
2063 if ((e_flags & EF_IA_64_ABSOLUTE))
2064 strcat (buf, ", absolute");
2068 if ((e_flags & EF_VAX_NONPIC))
2069 strcat (buf, ", non-PIC");
2070 if ((e_flags & EF_VAX_DFLOAT))
2071 strcat (buf, ", D-Float");
2072 if ((e_flags & EF_VAX_GFLOAT))
2073 strcat (buf, ", G-Float");
2082 get_osabi_name (unsigned int osabi)
2084 static char buff[32];
2088 case ELFOSABI_NONE: return "UNIX - System V";
2089 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2090 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2091 case ELFOSABI_LINUX: return "UNIX - Linux";
2092 case ELFOSABI_HURD: return "GNU/Hurd";
2093 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2094 case ELFOSABI_AIX: return "UNIX - AIX";
2095 case ELFOSABI_IRIX: return "UNIX - IRIX";
2096 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2097 case ELFOSABI_TRU64: return "UNIX - TRU64";
2098 case ELFOSABI_MODESTO: return "Novell - Modesto";
2099 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2100 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2101 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2102 case ELFOSABI_AROS: return "Amiga Research OS";
2103 case ELFOSABI_STANDALONE: return _("Standalone App");
2104 case ELFOSABI_ARM: return "ARM";
2106 sprintf (buff, _("<unknown: %x>"), osabi);
2112 get_mips_segment_type (unsigned long type)
2116 case PT_MIPS_REGINFO:
2118 case PT_MIPS_RTPROC:
2120 case PT_MIPS_OPTIONS:
2130 get_parisc_segment_type (unsigned long type)
2134 case PT_HP_TLS: return "HP_TLS";
2135 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2136 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2137 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2138 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2139 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2140 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2141 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2142 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2143 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2144 case PT_HP_PARALLEL: return "HP_PARALLEL";
2145 case PT_HP_FASTBIND: return "HP_FASTBIND";
2146 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2147 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2156 get_ia64_segment_type (unsigned long type)
2160 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2161 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2162 case PT_HP_TLS: return "HP_TLS";
2163 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2164 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2165 case PT_IA_64_HP_STACK: return "HP_STACK";
2174 get_segment_type (unsigned long p_type)
2176 static char buff[32];
2180 case PT_NULL: return "NULL";
2181 case PT_LOAD: return "LOAD";
2182 case PT_DYNAMIC: return "DYNAMIC";
2183 case PT_INTERP: return "INTERP";
2184 case PT_NOTE: return "NOTE";
2185 case PT_SHLIB: return "SHLIB";
2186 case PT_PHDR: return "PHDR";
2187 case PT_TLS: return "TLS";
2189 case PT_GNU_EH_FRAME:
2190 return "GNU_EH_FRAME";
2191 case PT_GNU_STACK: return "STACK";
2194 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2198 switch (elf_header.e_machine)
2201 case EM_MIPS_RS3_LE:
2202 result = get_mips_segment_type (p_type);
2205 result = get_parisc_segment_type (p_type);
2208 result = get_ia64_segment_type (p_type);
2218 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2220 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2224 switch (elf_header.e_machine)
2227 result = get_parisc_segment_type (p_type);
2230 result = get_ia64_segment_type (p_type);
2240 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2243 sprintf (buff, _("<unknown>: %lx"), p_type);
2250 get_mips_section_type_name (unsigned int sh_type)
2254 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2255 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2256 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2257 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2258 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2259 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2260 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2261 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2262 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2263 case SHT_MIPS_RELD: return "MIPS_RELD";
2264 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2265 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2266 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2267 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2268 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2269 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2270 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2271 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2272 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2273 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2274 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2275 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2276 case SHT_MIPS_LINE: return "MIPS_LINE";
2277 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2278 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2279 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2280 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2281 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2282 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2283 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2284 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2285 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2286 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2287 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2288 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2289 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2290 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2291 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2292 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2300 get_parisc_section_type_name (unsigned int sh_type)
2304 case SHT_PARISC_EXT: return "PARISC_EXT";
2305 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2306 case SHT_PARISC_DOC: return "PARISC_DOC";
2314 get_ia64_section_type_name (unsigned int sh_type)
2316 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2317 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2318 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2322 case SHT_IA_64_EXT: return "IA_64_EXT";
2323 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2324 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2332 get_section_type_name (unsigned int sh_type)
2334 static char buff[32];
2338 case SHT_NULL: return "NULL";
2339 case SHT_PROGBITS: return "PROGBITS";
2340 case SHT_SYMTAB: return "SYMTAB";
2341 case SHT_STRTAB: return "STRTAB";
2342 case SHT_RELA: return "RELA";
2343 case SHT_HASH: return "HASH";
2344 case SHT_DYNAMIC: return "DYNAMIC";
2345 case SHT_NOTE: return "NOTE";
2346 case SHT_NOBITS: return "NOBITS";
2347 case SHT_REL: return "REL";
2348 case SHT_SHLIB: return "SHLIB";
2349 case SHT_DYNSYM: return "DYNSYM";
2350 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2351 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2352 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2353 case SHT_GROUP: return "GROUP";
2354 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2355 case SHT_GNU_verdef: return "VERDEF";
2356 case SHT_GNU_verneed: return "VERNEED";
2357 case SHT_GNU_versym: return "VERSYM";
2358 case 0x6ffffff0: return "VERSYM";
2359 case 0x6ffffffc: return "VERDEF";
2360 case 0x7ffffffd: return "AUXILIARY";
2361 case 0x7fffffff: return "FILTER";
2362 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2365 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2369 switch (elf_header.e_machine)
2372 case EM_MIPS_RS3_LE:
2373 result = get_mips_section_type_name (sh_type);
2376 result = get_parisc_section_type_name (sh_type);
2379 result = get_ia64_section_type_name (sh_type);
2389 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2391 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2392 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2393 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2394 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2396 sprintf (buff, _("<unknown>: %x"), sh_type);
2402 #define OPTION_DEBUG_DUMP 512
2404 struct option options[] =
2406 {"all", no_argument, 0, 'a'},
2407 {"file-header", no_argument, 0, 'h'},
2408 {"program-headers", no_argument, 0, 'l'},
2409 {"headers", no_argument, 0, 'e'},
2410 {"histogram", no_argument, 0, 'I'},
2411 {"segments", no_argument, 0, 'l'},
2412 {"sections", no_argument, 0, 'S'},
2413 {"section-headers", no_argument, 0, 'S'},
2414 {"section-groups", no_argument, 0, 'g'},
2415 {"symbols", no_argument, 0, 's'},
2416 {"syms", no_argument, 0, 's'},
2417 {"relocs", no_argument, 0, 'r'},
2418 {"notes", no_argument, 0, 'n'},
2419 {"dynamic", no_argument, 0, 'd'},
2420 {"arch-specific", no_argument, 0, 'A'},
2421 {"version-info", no_argument, 0, 'V'},
2422 {"use-dynamic", no_argument, 0, 'D'},
2423 {"hex-dump", required_argument, 0, 'x'},
2424 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2425 {"unwind", no_argument, 0, 'u'},
2426 #ifdef SUPPORT_DISASSEMBLY
2427 {"instruction-dump", required_argument, 0, 'i'},
2430 {"version", no_argument, 0, 'v'},
2431 {"wide", no_argument, 0, 'W'},
2432 {"help", no_argument, 0, 'H'},
2433 {0, no_argument, 0, 0}
2439 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2440 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2441 fprintf (stdout, _(" Options are:\n\
2442 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2443 -h --file-header Display the ELF file header\n\
2444 -l --program-headers Display the program headers\n\
2445 --segments An alias for --program-headers\n\
2446 -S --section-headers Display the sections' header\n\
2447 --sections An alias for --section-headers\n\
2448 -g --section-groups Display the section groups\n\
2449 -e --headers Equivalent to: -h -l -S\n\
2450 -s --syms Display the symbol table\n\
2451 --symbols An alias for --syms\n\
2452 -n --notes Display the core notes (if present)\n\
2453 -r --relocs Display the relocations (if present)\n\
2454 -u --unwind Display the unwind info (if present)\n\
2455 -d --dynamic Display the dynamic segment (if present)\n\
2456 -V --version-info Display the version sections (if present)\n\
2457 -A --arch-specific Display architecture specific information (if any).\n\
2458 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2459 -x --hex-dump=<number> Dump the contents of section <number>\n\
2460 -w[liaprmfFso] or\n\
2461 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2462 Display the contents of DWARF2 debug sections\n"));
2463 #ifdef SUPPORT_DISASSEMBLY
2464 fprintf (stdout, _("\
2465 -i --instruction-dump=<number>\n\
2466 Disassemble the contents of section <number>\n"));
2468 fprintf (stdout, _("\
2469 -I --histogram Display histogram of bucket list lengths\n\
2470 -W --wide Allow output width to exceed 80 characters\n\
2471 -H --help Display this information\n\
2472 -v --version Display the version number of readelf\n"));
2473 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2479 request_dump (unsigned int section, int type)
2481 if (section >= num_dump_sects)
2483 char *new_dump_sects;
2485 new_dump_sects = calloc (section + 1, 1);
2487 if (new_dump_sects == NULL)
2488 error (_("Out of memory allocating dump request table."));
2491 /* Copy current flag settings. */
2492 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2496 dump_sects = new_dump_sects;
2497 num_dump_sects = section + 1;
2502 dump_sects[section] |= type;
2508 parse_args (int argc, char **argv)
2515 while ((c = getopt_long
2516 (argc, argv, "ersuahnldSDAIgw::x:i:vVWH", options, NULL)) != EOF)
2537 do_section_groups++;
2545 do_section_groups++;
2587 section = strtoul (optarg, & cp, 0);
2588 if (! *cp && section >= 0)
2590 request_dump (section, HEX_DUMP);
2600 unsigned int index = 0;
2604 while (optarg[index])
2605 switch (optarg[index++])
2614 do_debug_abbrevs = 1;
2624 do_debug_pubnames = 1;
2629 do_debug_aranges = 1;
2633 do_debug_frames_interp = 1;
2635 do_debug_frames = 1;
2640 do_debug_macinfo = 1;
2654 warn (_("Unrecognized debug option '%s'\n"), optarg);
2659 case OPTION_DEBUG_DUMP:
2665 static const char *debug_dump_opt[]
2666 = { "line", "info", "abbrev", "pubnames", "ranges",
2667 "macro", "frames", "frames-interp", "str", "loc", NULL };
2676 for (index = 0; debug_dump_opt[index]; index++)
2678 size_t len = strlen (debug_dump_opt[index]);
2680 if (strncmp (p, debug_dump_opt[index], len) == 0
2681 && (p[len] == ',' || p[len] == '\0'))
2690 do_debug_abbrevs = 1;
2701 do_debug_pubnames = 1;
2705 do_debug_aranges = 1;
2710 do_debug_frames_interp = 1;
2711 do_debug_frames = 1;
2715 do_debug_macinfo = 1;
2728 if (debug_dump_opt[index] == NULL)
2730 warn (_("Unrecognized debug option '%s'\n"), p);
2731 p = strchr (p, ',');
2741 #ifdef SUPPORT_DISASSEMBLY
2744 section = strtoul (optarg, & cp, 0);
2745 if (! *cp && section >= 0)
2747 request_dump (section, DISASS_DUMP);
2753 print_version (program_name);
2763 /* xgettext:c-format */
2764 error (_("Invalid option '-%c'\n"), c);
2771 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2772 && !do_segments && !do_header && !do_dump && !do_version
2773 && !do_histogram && !do_debugging && !do_arch && !do_notes
2774 && !do_section_groups)
2778 warn (_("Nothing to do.\n"));
2784 get_elf_class (unsigned int elf_class)
2786 static char buff[32];
2790 case ELFCLASSNONE: return _("none");
2791 case ELFCLASS32: return "ELF32";
2792 case ELFCLASS64: return "ELF64";
2794 sprintf (buff, _("<unknown: %x>"), elf_class);
2800 get_data_encoding (unsigned int encoding)
2802 static char buff[32];
2806 case ELFDATANONE: return _("none");
2807 case ELFDATA2LSB: return _("2's complement, little endian");
2808 case ELFDATA2MSB: return _("2's complement, big endian");
2810 sprintf (buff, _("<unknown: %x>"), encoding);
2815 /* Decode the data held in 'elf_header'. */
2818 process_file_header (void)
2820 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2821 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2822 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2823 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2826 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2834 printf (_("ELF Header:\n"));
2835 printf (_(" Magic: "));
2836 for (i = 0; i < EI_NIDENT; i++)
2837 printf ("%2.2x ", elf_header.e_ident[i]);
2839 printf (_(" Class: %s\n"),
2840 get_elf_class (elf_header.e_ident[EI_CLASS]));
2841 printf (_(" Data: %s\n"),
2842 get_data_encoding (elf_header.e_ident[EI_DATA]));
2843 printf (_(" Version: %d %s\n"),
2844 elf_header.e_ident[EI_VERSION],
2845 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2847 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2850 printf (_(" OS/ABI: %s\n"),
2851 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2852 printf (_(" ABI Version: %d\n"),
2853 elf_header.e_ident[EI_ABIVERSION]);
2854 printf (_(" Type: %s\n"),
2855 get_file_type (elf_header.e_type));
2856 printf (_(" Machine: %s\n"),
2857 get_machine_name (elf_header.e_machine));
2858 printf (_(" Version: 0x%lx\n"),
2859 (unsigned long) elf_header.e_version);
2861 printf (_(" Entry point address: "));
2862 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2863 printf (_("\n Start of program headers: "));
2864 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2865 printf (_(" (bytes into file)\n Start of section headers: "));
2866 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2867 printf (_(" (bytes into file)\n"));
2869 printf (_(" Flags: 0x%lx%s\n"),
2870 (unsigned long) elf_header.e_flags,
2871 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2872 printf (_(" Size of this header: %ld (bytes)\n"),
2873 (long) elf_header.e_ehsize);
2874 printf (_(" Size of program headers: %ld (bytes)\n"),
2875 (long) elf_header.e_phentsize);
2876 printf (_(" Number of program headers: %ld\n"),
2877 (long) elf_header.e_phnum);
2878 printf (_(" Size of section headers: %ld (bytes)\n"),
2879 (long) elf_header.e_shentsize);
2880 printf (_(" Number of section headers: %ld"),
2881 (long) elf_header.e_shnum);
2882 if (section_headers != NULL && elf_header.e_shnum == 0)
2883 printf (" (%ld)", (long) section_headers[0].sh_size);
2884 putc ('\n', stdout);
2885 printf (_(" Section header string table index: %ld"),
2886 (long) elf_header.e_shstrndx);
2887 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2888 printf (" (%ld)", (long) section_headers[0].sh_link);
2889 putc ('\n', stdout);
2892 if (section_headers != NULL)
2894 if (elf_header.e_shnum == 0)
2895 elf_header.e_shnum = section_headers[0].sh_size;
2896 if (elf_header.e_shstrndx == SHN_XINDEX)
2897 elf_header.e_shstrndx = section_headers[0].sh_link;
2898 free (section_headers);
2899 section_headers = NULL;
2907 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
2909 Elf32_External_Phdr *phdrs;
2910 Elf32_External_Phdr *external;
2911 Elf_Internal_Phdr *internal;
2914 phdrs = get_data (NULL, file, elf_header.e_phoff,
2915 elf_header.e_phentsize * elf_header.e_phnum,
2916 _("program headers"));
2920 for (i = 0, internal = program_headers, external = phdrs;
2921 i < elf_header.e_phnum;
2922 i++, internal++, external++)
2924 internal->p_type = BYTE_GET (external->p_type);
2925 internal->p_offset = BYTE_GET (external->p_offset);
2926 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2927 internal->p_paddr = BYTE_GET (external->p_paddr);
2928 internal->p_filesz = BYTE_GET (external->p_filesz);
2929 internal->p_memsz = BYTE_GET (external->p_memsz);
2930 internal->p_flags = BYTE_GET (external->p_flags);
2931 internal->p_align = BYTE_GET (external->p_align);
2940 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
2942 Elf64_External_Phdr *phdrs;
2943 Elf64_External_Phdr *external;
2944 Elf_Internal_Phdr *internal;
2947 phdrs = get_data (NULL, file, elf_header.e_phoff,
2948 elf_header.e_phentsize * elf_header.e_phnum,
2949 _("program headers"));
2953 for (i = 0, internal = program_headers, external = phdrs;
2954 i < elf_header.e_phnum;
2955 i++, internal++, external++)
2957 internal->p_type = BYTE_GET (external->p_type);
2958 internal->p_flags = BYTE_GET (external->p_flags);
2959 internal->p_offset = BYTE_GET8 (external->p_offset);
2960 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2961 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2962 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2963 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2964 internal->p_align = BYTE_GET8 (external->p_align);
2972 /* Returns 1 if the program headers were read into `program_headers'. */
2975 get_program_headers (FILE *file)
2977 Elf_Internal_Phdr *phdrs;
2979 /* Check cache of prior read. */
2980 if (program_headers != NULL)
2983 phdrs = malloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2987 error (_("Out of memory\n"));
2992 ? get_32bit_program_headers (file, phdrs)
2993 : get_64bit_program_headers (file, phdrs))
2995 program_headers = phdrs;
3003 /* Returns 1 if the program headers were loaded. */
3006 process_program_headers (FILE *file)
3008 Elf_Internal_Phdr *segment;
3011 if (elf_header.e_phnum == 0)
3014 printf (_("\nThere are no program headers in this file.\n"));
3018 if (do_segments && !do_header)
3020 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3021 printf (_("Entry point "));
3022 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3023 printf (_("\nThere are %d program headers, starting at offset "),
3024 elf_header.e_phnum);
3025 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3029 if (! get_program_headers (file))
3034 if (elf_header.e_phnum > 1)
3035 printf (_("\nProgram Headers:\n"));
3037 printf (_("\nProgram Headers:\n"));
3041 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3044 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3048 (_(" Type Offset VirtAddr PhysAddr\n"));
3050 (_(" FileSiz MemSiz Flags Align\n"));
3057 for (i = 0, segment = program_headers;
3058 i < elf_header.e_phnum;
3063 printf (" %-14.14s ", get_segment_type (segment->p_type));
3067 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3068 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3069 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3070 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3071 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3073 (segment->p_flags & PF_R ? 'R' : ' '),
3074 (segment->p_flags & PF_W ? 'W' : ' '),
3075 (segment->p_flags & PF_X ? 'E' : ' '));
3076 printf ("%#lx", (unsigned long) segment->p_align);
3080 if ((unsigned long) segment->p_offset == segment->p_offset)
3081 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3084 print_vma (segment->p_offset, FULL_HEX);
3088 print_vma (segment->p_vaddr, FULL_HEX);
3090 print_vma (segment->p_paddr, FULL_HEX);
3093 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3094 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3097 print_vma (segment->p_filesz, FULL_HEX);
3101 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3102 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3105 print_vma (segment->p_offset, FULL_HEX);
3109 (segment->p_flags & PF_R ? 'R' : ' '),
3110 (segment->p_flags & PF_W ? 'W' : ' '),
3111 (segment->p_flags & PF_X ? 'E' : ' '));
3113 if ((unsigned long) segment->p_align == segment->p_align)
3114 printf ("%#lx", (unsigned long) segment->p_align);
3117 print_vma (segment->p_align, PREFIX_HEX);
3122 print_vma (segment->p_offset, FULL_HEX);
3124 print_vma (segment->p_vaddr, FULL_HEX);
3126 print_vma (segment->p_paddr, FULL_HEX);
3128 print_vma (segment->p_filesz, FULL_HEX);
3130 print_vma (segment->p_memsz, FULL_HEX);
3132 (segment->p_flags & PF_R ? 'R' : ' '),
3133 (segment->p_flags & PF_W ? 'W' : ' '),
3134 (segment->p_flags & PF_X ? 'E' : ' '));
3135 print_vma (segment->p_align, HEX);
3139 switch (segment->p_type)
3143 error (_("more than one dynamic segment\n"));
3145 dynamic_addr = segment->p_offset;
3146 dynamic_size = segment->p_filesz;
3150 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3152 error (_("Unable to find program interpreter name\n"));
3155 program_interpreter[0] = 0;
3156 fscanf (file, "%63s", program_interpreter);
3159 printf (_("\n [Requesting program interpreter: %s]"),
3160 program_interpreter);
3166 putc ('\n', stdout);
3169 if (do_segments && section_headers != NULL)
3171 printf (_("\n Section to Segment mapping:\n"));
3172 printf (_(" Segment Sections...\n"));
3174 assert (string_table != NULL);
3176 for (i = 0; i < elf_header.e_phnum; i++)
3179 Elf_Internal_Shdr *section;
3181 segment = program_headers + i;
3182 section = section_headers;
3184 printf (" %2.2d ", i);
3186 for (j = 1; j < elf_header.e_shnum; j++, section++)
3188 if (section->sh_size > 0
3189 /* Compare allocated sections by VMA, unallocated
3190 sections by file offset. */
3191 && (section->sh_flags & SHF_ALLOC
3192 ? (section->sh_addr >= segment->p_vaddr
3193 && section->sh_addr + section->sh_size
3194 <= segment->p_vaddr + segment->p_memsz)
3195 : ((bfd_vma) section->sh_offset >= segment->p_offset
3196 && (section->sh_offset + section->sh_size
3197 <= segment->p_offset + segment->p_filesz))))
3198 printf ("%s ", SECTION_NAME (section));
3209 /* Find the file offset corresponding to VMA by using the program headers. */
3212 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3214 Elf_Internal_Phdr *seg;
3216 if (! get_program_headers (file))
3218 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3222 for (seg = program_headers;
3223 seg < program_headers + elf_header.e_phnum;
3226 if (seg->p_type != PT_LOAD)
3229 if (vma >= (seg->p_vaddr & -seg->p_align)
3230 && vma + size <= seg->p_vaddr + seg->p_filesz)
3231 return vma - seg->p_vaddr + seg->p_offset;
3234 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3241 get_32bit_section_headers (FILE *file, unsigned int num)
3243 Elf32_External_Shdr *shdrs;
3244 Elf_Internal_Shdr *internal;
3247 shdrs = get_data (NULL, file, elf_header.e_shoff,
3248 elf_header.e_shentsize * num, _("section headers"));
3252 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3254 if (section_headers == NULL)
3256 error (_("Out of memory\n"));
3260 for (i = 0, internal = section_headers;
3264 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3265 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3266 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3267 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3268 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3269 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3270 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3271 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3272 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3273 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3282 get_64bit_section_headers (FILE *file, unsigned int num)
3284 Elf64_External_Shdr *shdrs;
3285 Elf_Internal_Shdr *internal;
3288 shdrs = get_data (NULL, file, elf_header.e_shoff,
3289 elf_header.e_shentsize * num, _("section headers"));
3293 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3295 if (section_headers == NULL)
3297 error (_("Out of memory\n"));
3301 for (i = 0, internal = section_headers;
3305 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3306 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3307 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3308 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3309 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3310 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3311 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3312 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3313 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3314 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3322 static Elf_Internal_Sym *
3323 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3325 unsigned long number;
3326 Elf32_External_Sym *esyms;
3327 Elf_External_Sym_Shndx *shndx;
3328 Elf_Internal_Sym *isyms;
3329 Elf_Internal_Sym *psym;
3332 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3338 if (symtab_shndx_hdr != NULL
3339 && (symtab_shndx_hdr->sh_link
3340 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3342 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3343 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3351 number = section->sh_size / section->sh_entsize;
3352 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3356 error (_("Out of memory\n"));
3363 for (j = 0, psym = isyms;
3367 psym->st_name = BYTE_GET (esyms[j].st_name);
3368 psym->st_value = BYTE_GET (esyms[j].st_value);
3369 psym->st_size = BYTE_GET (esyms[j].st_size);
3370 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3371 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3373 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3374 psym->st_info = BYTE_GET (esyms[j].st_info);
3375 psym->st_other = BYTE_GET (esyms[j].st_other);
3385 static Elf_Internal_Sym *
3386 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3388 unsigned long number;
3389 Elf64_External_Sym *esyms;
3390 Elf_External_Sym_Shndx *shndx;
3391 Elf_Internal_Sym *isyms;
3392 Elf_Internal_Sym *psym;
3395 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3401 if (symtab_shndx_hdr != NULL
3402 && (symtab_shndx_hdr->sh_link
3403 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3405 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3406 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3414 number = section->sh_size / section->sh_entsize;
3415 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3419 error (_("Out of memory\n"));
3426 for (j = 0, psym = isyms;
3430 psym->st_name = BYTE_GET (esyms[j].st_name);
3431 psym->st_info = BYTE_GET (esyms[j].st_info);
3432 psym->st_other = BYTE_GET (esyms[j].st_other);
3433 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3434 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3436 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3437 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3438 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3449 get_elf_section_flags (bfd_vma sh_flags)
3451 static char buff[32];
3459 flag = sh_flags & - sh_flags;
3464 case SHF_WRITE: strcat (buff, "W"); break;
3465 case SHF_ALLOC: strcat (buff, "A"); break;
3466 case SHF_EXECINSTR: strcat (buff, "X"); break;
3467 case SHF_MERGE: strcat (buff, "M"); break;
3468 case SHF_STRINGS: strcat (buff, "S"); break;
3469 case SHF_INFO_LINK: strcat (buff, "I"); break;
3470 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3471 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3472 case SHF_GROUP: strcat (buff, "G"); break;
3473 case SHF_TLS: strcat (buff, "T"); break;
3476 if (flag & SHF_MASKOS)
3479 sh_flags &= ~ SHF_MASKOS;
3481 else if (flag & SHF_MASKPROC)
3484 sh_flags &= ~ SHF_MASKPROC;
3496 process_section_headers (FILE *file)
3498 Elf_Internal_Shdr *section;
3501 section_headers = NULL;
3503 if (elf_header.e_shnum == 0)
3506 printf (_("\nThere are no sections in this file.\n"));
3511 if (do_sections && !do_header)
3512 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3513 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3517 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3520 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3523 /* Read in the string table, so that we have names to display. */
3524 section = SECTION_HEADER (elf_header.e_shstrndx);
3526 if (section->sh_size != 0)
3528 string_table = get_data (NULL, file, section->sh_offset,
3529 section->sh_size, _("string table"));
3531 if (string_table == NULL)
3534 string_table_length = section->sh_size;
3537 /* Scan the sections for the dynamic symbol table
3538 and dynamic string table and debug sections. */
3539 dynamic_symbols = NULL;
3540 dynamic_strings = NULL;
3541 dynamic_syminfo = NULL;
3542 symtab_shndx_hdr = NULL;
3544 for (i = 0, section = section_headers;
3545 i < elf_header.e_shnum;
3548 char *name = SECTION_NAME (section);
3550 if (section->sh_type == SHT_DYNSYM)
3552 if (dynamic_symbols != NULL)
3554 error (_("File contains multiple dynamic symbol tables\n"));
3558 num_dynamic_syms = section->sh_size / section->sh_entsize;
3559 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3561 else if (section->sh_type == SHT_STRTAB
3562 && strcmp (name, ".dynstr") == 0)
3564 if (dynamic_strings != NULL)
3566 error (_("File contains multiple dynamic string tables\n"));
3570 dynamic_strings = get_data (NULL, file, section->sh_offset,
3571 section->sh_size, _("dynamic strings"));
3573 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3575 if (symtab_shndx_hdr != NULL)
3577 error (_("File contains multiple symtab shndx tables\n"));
3580 symtab_shndx_hdr = section;
3582 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3583 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3584 || do_debug_frames || do_debug_macinfo || do_debug_str
3586 && strncmp (name, ".debug_", 7) == 0)
3591 || (do_debug_info && (strcmp (name, "info") == 0))
3592 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3593 || (do_debug_lines && (strcmp (name, "line") == 0))
3594 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3595 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3596 || (do_debug_frames && (strcmp (name, "frame") == 0))
3597 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3598 || (do_debug_str && (strcmp (name, "str") == 0))
3599 || (do_debug_loc && (strcmp (name, "loc") == 0))
3601 request_dump (i, DEBUG_DUMP);
3603 /* linkonce section to be combined with .debug_info at link time. */
3604 else if ((do_debugging || do_debug_info)
3605 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3606 request_dump (i, DEBUG_DUMP);
3607 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3608 request_dump (i, DEBUG_DUMP);
3614 if (elf_header.e_shnum > 1)
3615 printf (_("\nSection Headers:\n"));
3617 printf (_("\nSection Header:\n"));
3621 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3624 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3627 printf (_(" [Nr] Name Type Address Offset\n"));
3628 printf (_(" Size EntSize Flags Link Info Align\n"));
3631 for (i = 0, section = section_headers;
3632 i < elf_header.e_shnum;
3635 printf (" [%2u] %-17.17s %-15.15s ",
3636 SECTION_HEADER_NUM (i),
3637 SECTION_NAME (section),
3638 get_section_type_name (section->sh_type));
3642 print_vma (section->sh_addr, LONG_HEX);
3644 printf ( " %6.6lx %6.6lx %2.2lx",
3645 (unsigned long) section->sh_offset,
3646 (unsigned long) section->sh_size,
3647 (unsigned long) section->sh_entsize);
3649 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3651 printf ("%2ld %3lu %2ld\n",
3652 (unsigned long) section->sh_link,
3653 (unsigned long) section->sh_info,
3654 (unsigned long) section->sh_addralign);
3658 print_vma (section->sh_addr, LONG_HEX);
3660 if ((long) section->sh_offset == section->sh_offset)
3661 printf (" %6.6lx", (unsigned long) section->sh_offset);
3665 print_vma (section->sh_offset, LONG_HEX);
3668 if ((unsigned long) section->sh_size == section->sh_size)
3669 printf (" %6.6lx", (unsigned long) section->sh_size);
3673 print_vma (section->sh_size, LONG_HEX);
3676 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3677 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3681 print_vma (section->sh_entsize, LONG_HEX);
3684 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3686 printf ("%2ld %3lu ",
3687 (unsigned long) section->sh_link,
3688 (unsigned long) section->sh_info);
3690 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3691 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3694 print_vma (section->sh_addralign, DEC);
3701 print_vma (section->sh_addr, LONG_HEX);
3702 if ((long) section->sh_offset == section->sh_offset)
3703 printf (" %8.8lx", (unsigned long) section->sh_offset);
3707 print_vma (section->sh_offset, LONG_HEX);
3710 print_vma (section->sh_size, LONG_HEX);
3712 print_vma (section->sh_entsize, LONG_HEX);
3714 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3716 printf (" %2ld %3lu %ld\n",
3717 (unsigned long) section->sh_link,
3718 (unsigned long) section->sh_info,
3719 (unsigned long) section->sh_addralign);
3723 printf (_("Key to Flags:\n\
3724 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3725 I (info), L (link order), G (group), x (unknown)\n\
3726 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3732 get_group_flags (unsigned int flags)
3734 static char buff[32];
3741 sprintf (buff, _("[<unknown>: 0x%x]"), flags);
3748 process_section_groups (FILE *file)
3750 Elf_Internal_Shdr *section;
3752 struct group *group;
3754 if (elf_header.e_shnum == 0)
3756 if (do_section_groups)
3757 printf (_("\nThere are no section groups in this file.\n"));
3762 if (section_headers == NULL)
3764 error (_("Section headers are not available!\n"));
3768 section_headers_groups = calloc (elf_header.e_shnum,
3769 sizeof (struct group *));
3771 if (section_headers_groups == NULL)
3773 error (_("Out of memory\n"));
3777 /* Scan the sections for the group section. */
3778 for (i = 0, section = section_headers;
3779 i < elf_header.e_shnum;
3781 if (section->sh_type == SHT_GROUP)
3784 section_groups = calloc (group_count, sizeof (struct group));
3786 if (section_groups == NULL)
3788 error (_("Out of memory\n"));
3792 for (i = 0, section = section_headers, group = section_groups;
3793 i < elf_header.e_shnum;
3796 if (section->sh_type == SHT_GROUP)
3798 char *name = SECTION_NAME (section);
3799 char *group_name, *strtab, *start, *indices;
3800 unsigned int entry, j, size;
3801 Elf_Internal_Sym *sym;
3802 Elf_Internal_Shdr *symtab_sec, *strtab_sec, *sec;
3803 Elf_Internal_Sym *symtab;
3805 /* Get the symbol table. */
3806 symtab_sec = SECTION_HEADER (section->sh_link);
3807 if (symtab_sec->sh_type != SHT_SYMTAB)
3809 error (_("Bad sh_link in group section `%s'\n"), name);
3812 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
3814 sym = symtab + section->sh_info;
3816 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3818 bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
3821 error (_("Bad sh_info in group section `%s'\n"), name);
3825 group_name = SECTION_NAME (section_headers + sec_index);
3830 /* Get the string table. */
3831 strtab_sec = SECTION_HEADER (symtab_sec->sh_link);
3832 strtab = get_data (NULL, file, strtab_sec->sh_offset,
3833 strtab_sec->sh_size,
3836 group_name = strtab + sym->st_name;
3839 start = get_data (NULL, file, section->sh_offset,
3840 section->sh_size, _("section data"));
3843 size = (section->sh_size / section->sh_entsize) - 1;
3844 entry = byte_get (indices, 4);
3847 if (do_section_groups)
3849 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
3850 get_group_flags (entry), name, group_name, size);
3852 printf (_(" [Index] Name\n"));
3855 group->group_index = i;
3857 for (j = 0; j < size; j++)
3859 struct group_list *g;
3861 entry = byte_get (indices, 4);
3864 if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
3867 error (_("section [%5u] already in group section [%5u]\n"),
3868 entry, section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
3872 section_headers_groups [SECTION_HEADER_INDEX (entry)]
3875 if (do_section_groups)
3877 sec = SECTION_HEADER (entry);
3878 printf (" [%5u] %s\n",
3879 entry, SECTION_NAME (sec));
3882 g = xmalloc (sizeof (struct group_list));
3883 g->section_index = entry;
3884 g->next = group->root;
3906 } dynamic_relocations [] =
3908 { "REL", DT_REL, DT_RELSZ, FALSE },
3909 { "RELA", DT_RELA, DT_RELASZ, TRUE },
3910 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
3913 /* Process the reloc section. */
3915 process_relocs (FILE *file)
3917 unsigned long rel_size;
3918 unsigned long rel_offset;
3924 if (do_using_dynamic)
3928 int has_dynamic_reloc;
3931 has_dynamic_reloc = 0;
3933 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
3935 is_rela = dynamic_relocations [i].rela;
3936 name = dynamic_relocations [i].name;
3937 rel_size = dynamic_info [dynamic_relocations [i].size];
3938 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
3940 has_dynamic_reloc |= rel_size;
3942 if (is_rela == UNKNOWN)
3944 if (dynamic_relocations [i].reloc == DT_JMPREL)
3945 switch (dynamic_info[DT_PLTREL])
3959 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3960 name, rel_offset, rel_size);
3962 dump_relocations (file,
3963 offset_from_vma (file, rel_offset, rel_size),
3965 dynamic_symbols, num_dynamic_syms,
3966 dynamic_strings, is_rela);
3970 if (! has_dynamic_reloc)
3971 printf (_("\nThere are no dynamic relocations in this file.\n"));
3975 Elf_Internal_Shdr *section;
3979 for (i = 0, section = section_headers;
3980 i < elf_header.e_shnum;
3983 if ( section->sh_type != SHT_RELA
3984 && section->sh_type != SHT_REL)
3987 rel_offset = section->sh_offset;
3988 rel_size = section->sh_size;
3992 Elf_Internal_Shdr *strsec;
3993 Elf_Internal_Sym *symtab;
3996 unsigned long nsyms;
3998 printf (_("\nRelocation section "));
4000 if (string_table == NULL)
4001 printf ("%d", section->sh_name);
4003 printf (_("'%s'"), SECTION_NAME (section));
4005 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4006 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4011 if (section->sh_link)
4013 Elf_Internal_Shdr *symsec;
4015 symsec = SECTION_HEADER (section->sh_link);
4016 nsyms = symsec->sh_size / symsec->sh_entsize;
4017 symtab = GET_ELF_SYMBOLS (file, symsec);
4022 strsec = SECTION_HEADER (symsec->sh_link);
4024 strtab = get_data (NULL, file, strsec->sh_offset,
4025 strsec->sh_size, _("string table"));
4027 is_rela = section->sh_type == SHT_RELA;
4029 dump_relocations (file, rel_offset, rel_size,
4030 symtab, nsyms, strtab, is_rela);
4042 printf (_("\nThere are no relocations in this file.\n"));
4048 #include "unwind-ia64.h"
4050 /* An absolute address consists of a section and an offset. If the
4051 section is NULL, the offset itself is the address, otherwise, the
4052 address equals to LOAD_ADDRESS(section) + offset. */
4056 unsigned short section;
4062 struct unw_table_entry
4064 struct absaddr start;
4066 struct absaddr info;
4068 *table; /* Unwind table. */
4069 unsigned long table_len; /* Length of unwind table. */
4070 unsigned char *info; /* Unwind info. */
4071 unsigned long info_size; /* Size of unwind info. */
4072 bfd_vma info_addr; /* starting address of unwind info. */
4073 bfd_vma seg_base; /* Starting address of segment. */
4074 Elf_Internal_Sym *symtab; /* The symbol table. */
4075 unsigned long nsyms; /* Number of symbols. */
4076 char *strtab; /* The string table. */
4077 unsigned long strtab_size; /* Size of string table. */
4081 find_symbol_for_address (struct unw_aux_info *aux,
4082 struct absaddr addr,
4083 const char **symname,
4086 bfd_vma dist = 0x100000;
4087 Elf_Internal_Sym *sym, *best = NULL;
4090 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
4092 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4093 && sym->st_name != 0
4094 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4095 && addr.offset >= sym->st_value
4096 && addr.offset - sym->st_value < dist)
4099 dist = addr.offset - sym->st_value;
4106 *symname = (best->st_name >= aux->strtab_size
4107 ? "<corrupt>" : aux->strtab + best->st_name);
4112 *offset = addr.offset;
4116 dump_ia64_unwind (struct unw_aux_info *aux)
4119 struct unw_table_entry *tp;
4122 addr_size = is_32bit_elf ? 4 : 8;
4124 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4128 const unsigned char *dp;
4129 const unsigned char *head;
4130 const char *procname;
4132 find_symbol_for_address (aux, tp->start, &procname, &offset);
4134 fputs ("\n<", stdout);
4138 fputs (procname, stdout);
4141 printf ("+%lx", (unsigned long) offset);
4144 fputs (">: [", stdout);
4145 print_vma (tp->start.offset, PREFIX_HEX);
4146 fputc ('-', stdout);
4147 print_vma (tp->end.offset, PREFIX_HEX);
4148 printf ("], info at +0x%lx\n",
4149 (unsigned long) (tp->info.offset - aux->seg_base));
4151 head = aux->info + (tp->info.offset - aux->info_addr);
4152 stamp = BYTE_GET8 ((unsigned char *) head);
4154 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4155 (unsigned) UNW_VER (stamp),
4156 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4157 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4158 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4159 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
4161 if (UNW_VER (stamp) != 1)
4163 printf ("\tUnknown version.\n");
4168 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4169 dp = unw_decode (dp, in_body, & in_body);
4174 slurp_ia64_unwind_table (FILE *file,
4175 struct unw_aux_info *aux,
4176 Elf_Internal_Shdr *sec)
4178 unsigned long size, addr_size, nrelas, i;
4179 Elf_Internal_Phdr *seg;
4180 struct unw_table_entry *tep;
4181 Elf_Internal_Shdr *relsec;
4182 Elf_Internal_Rela *rela, *rp;
4183 unsigned char *table, *tp;
4184 Elf_Internal_Sym *sym;
4185 const char *relname;
4187 addr_size = is_32bit_elf ? 4 : 8;
4189 /* First, find the starting address of the segment that includes
4192 if (elf_header.e_phnum)
4194 if (! get_program_headers (file))
4197 for (seg = program_headers;
4198 seg < program_headers + elf_header.e_phnum;
4201 if (seg->p_type != PT_LOAD)
4204 if (sec->sh_addr >= seg->p_vaddr
4205 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4207 aux->seg_base = seg->p_vaddr;
4213 /* Second, build the unwind table from the contents of the unwind section: */
4214 size = sec->sh_size;
4215 table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
4219 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4220 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4222 tep->start.section = SHN_UNDEF;
4223 tep->end.section = SHN_UNDEF;
4224 tep->info.section = SHN_UNDEF;
4227 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4228 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4229 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4233 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4234 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4235 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4237 tep->start.offset += aux->seg_base;
4238 tep->end.offset += aux->seg_base;
4239 tep->info.offset += aux->seg_base;
4243 /* Third, apply any relocations to the unwind table: */
4245 for (relsec = section_headers;
4246 relsec < section_headers + elf_header.e_shnum;
4249 if (relsec->sh_type != SHT_RELA
4250 || SECTION_HEADER (relsec->sh_info) != sec)
4253 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4257 for (rp = rela; rp < rela + nrelas; ++rp)
4261 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4262 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4264 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4266 warn (_("Skipping unexpected symbol type %u\n"),
4267 ELF32_ST_TYPE (sym->st_info));
4273 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4274 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4276 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4278 warn (_("Skipping unexpected symbol type %u\n"),
4279 ELF64_ST_TYPE (sym->st_info));
4284 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4286 warn (_("Skipping unexpected relocation type %s\n"), relname);
4290 i = rp->r_offset / (3 * addr_size);
4292 switch (rp->r_offset/addr_size % 3)
4295 aux->table[i].start.section = sym->st_shndx;
4296 aux->table[i].start.offset += rp->r_addend;
4299 aux->table[i].end.section = sym->st_shndx;
4300 aux->table[i].end.offset += rp->r_addend;
4303 aux->table[i].info.section = sym->st_shndx;
4304 aux->table[i].info.offset += rp->r_addend;
4314 aux->table_len = size / (3 * addr_size);
4319 process_unwind (FILE *file)
4321 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4322 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4323 struct unw_aux_info aux;
4328 if (elf_header.e_machine != EM_IA_64)
4330 printf (_("\nThere are no unwind sections in this file.\n"));
4334 memset (& aux, 0, sizeof (aux));
4336 addr_size = is_32bit_elf ? 4 : 8;
4338 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4340 if (sec->sh_type == SHT_SYMTAB)
4342 aux.nsyms = sec->sh_size / sec->sh_entsize;
4343 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4345 strsec = SECTION_HEADER (sec->sh_link);
4346 aux.strtab_size = strsec->sh_size;
4347 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4348 aux.strtab_size, _("string table"));
4350 else if (sec->sh_type == SHT_IA_64_UNWIND)
4355 printf (_("\nThere are no unwind sections in this file.\n"));
4357 while (unwcount-- > 0)
4362 for (i = unwstart, sec = section_headers + unwstart;
4363 i < elf_header.e_shnum; ++i, ++sec)
4364 if (sec->sh_type == SHT_IA_64_UNWIND)
4371 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4373 if ((unwsec->sh_flags & SHF_GROUP) != 0)
4375 /* We need to find which section group it is in. */
4376 struct group_list *g = section_headers_groups [i]->root;
4378 for (; g != NULL; g = g->next)
4380 sec = SECTION_HEADER (g->section_index);
4381 if (strcmp (SECTION_NAME (sec),
4382 ELF_STRING_ia64_unwind_info) == 0)
4387 i = elf_header.e_shnum;
4389 else if (strncmp (SECTION_NAME (unwsec),
4390 ELF_STRING_ia64_unwind_once, len) == 0)
4392 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4393 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4394 suffix = SECTION_NAME (unwsec) + len;
4395 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4397 if (strncmp (SECTION_NAME (sec),
4398 ELF_STRING_ia64_unwind_info_once, len2) == 0
4399 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4404 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4405 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4406 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4407 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4409 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4411 suffix = SECTION_NAME (unwsec) + len;
4412 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4414 if (strncmp (SECTION_NAME (sec),
4415 ELF_STRING_ia64_unwind_info, len2) == 0
4416 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4420 if (i == elf_header.e_shnum)
4422 printf (_("\nCould not find unwind info section for "));
4424 if (string_table == NULL)
4425 printf ("%d", unwsec->sh_name);
4427 printf (_("'%s'"), SECTION_NAME (unwsec));
4431 aux.info_size = sec->sh_size;
4432 aux.info_addr = sec->sh_addr;
4433 aux.info = get_data (NULL, file, sec->sh_offset, aux.info_size,
4436 printf (_("\nUnwind section "));
4438 if (string_table == NULL)
4439 printf ("%d", unwsec->sh_name);
4441 printf (_("'%s'"), SECTION_NAME (unwsec));
4443 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4444 (unsigned long) unwsec->sh_offset,
4445 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4447 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4449 if (aux.table_len > 0)
4450 dump_ia64_unwind (& aux);
4453 free ((char *) aux.table);
4455 free ((char *) aux.info);
4464 free ((char *) aux.strtab);
4470 dynamic_segment_mips_val (Elf_Internal_Dyn *entry)
4472 switch (entry->d_tag)
4475 if (entry->d_un.d_val == 0)
4479 static const char * opts[] =
4481 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4482 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4483 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4484 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4489 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
4490 if (entry->d_un.d_val & (1 << cnt))
4492 printf ("%s%s", first ? "" : " ", opts[cnt]);
4499 case DT_MIPS_IVERSION:
4500 if (dynamic_strings != NULL)
4501 printf ("Interface Version: %s\n",
4502 dynamic_strings + entry->d_un.d_val);
4504 printf ("%ld\n", (long) entry->d_un.d_ptr);
4507 case DT_MIPS_TIME_STAMP:
4512 time_t time = entry->d_un.d_val;
4513 tmp = gmtime (&time);
4514 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4515 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4516 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4517 printf ("Time Stamp: %s\n", timebuf);
4521 case DT_MIPS_RLD_VERSION:
4522 case DT_MIPS_LOCAL_GOTNO:
4523 case DT_MIPS_CONFLICTNO:
4524 case DT_MIPS_LIBLISTNO:
4525 case DT_MIPS_SYMTABNO:
4526 case DT_MIPS_UNREFEXTNO:
4527 case DT_MIPS_HIPAGENO:
4528 case DT_MIPS_DELTA_CLASS_NO:
4529 case DT_MIPS_DELTA_INSTANCE_NO:
4530 case DT_MIPS_DELTA_RELOC_NO:
4531 case DT_MIPS_DELTA_SYM_NO:
4532 case DT_MIPS_DELTA_CLASSSYM_NO:
4533 case DT_MIPS_COMPACT_SIZE:
4534 printf ("%ld\n", (long) entry->d_un.d_ptr);
4538 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4544 dynamic_segment_parisc_val (Elf_Internal_Dyn *entry)
4546 switch (entry->d_tag)
4548 case DT_HP_DLD_FLAGS:
4557 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4558 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4559 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4560 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4561 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4562 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4563 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4564 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4565 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4566 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4567 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4571 bfd_vma val = entry->d_un.d_val;
4573 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4574 if (val & flags[cnt].bit)
4578 fputs (flags[cnt].str, stdout);
4580 val ^= flags[cnt].bit;
4583 if (val != 0 || first)
4587 print_vma (val, HEX);
4593 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4600 dynamic_segment_ia64_val (Elf_Internal_Dyn *entry)
4602 switch (entry->d_tag)
4604 case DT_IA_64_PLT_RESERVE:
4605 /* First 3 slots reserved. */
4606 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4608 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
4612 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4619 get_32bit_dynamic_segment (FILE *file)
4621 Elf32_External_Dyn *edyn;
4622 Elf_Internal_Dyn *entry;
4625 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
4626 _("dynamic segment"));
4630 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4631 how large this .dynamic is now. We can do this even before the byte
4632 swapping since the DT_NULL tag is recognizable. */
4634 while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
4637 dynamic_segment = malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4639 if (dynamic_segment == NULL)
4641 error (_("Out of memory\n"));
4646 for (i = 0, entry = dynamic_segment;
4650 entry->d_tag = BYTE_GET (edyn[i].d_tag);
4651 entry->d_un.d_val = BYTE_GET (edyn[i].d_un.d_val);
4660 get_64bit_dynamic_segment (FILE *file)
4662 Elf64_External_Dyn *edyn;
4663 Elf_Internal_Dyn *entry;
4666 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
4667 _("dynamic segment"));
4671 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4672 how large this .dynamic is now. We can do this even before the byte
4673 swapping since the DT_NULL tag is recognizable. */
4675 while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
4678 dynamic_segment = malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4680 if (dynamic_segment == NULL)
4682 error (_("Out of memory\n"));
4687 for (i = 0, entry = dynamic_segment;
4691 entry->d_tag = BYTE_GET8 (edyn[i].d_tag);
4692 entry->d_un.d_val = BYTE_GET8 (edyn[i].d_un.d_val);
4701 get_dynamic_flags (bfd_vma flags)
4703 static char buff[128];
4711 flag = flags & - flags;
4719 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4720 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4721 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4722 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4723 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4724 default: strcpy (p, "unknown"); break;
4727 p = strchr (p, '\0');
4732 /* Parse and display the contents of the dynamic segment. */
4734 process_dynamic_segment (FILE *file)
4736 Elf_Internal_Dyn *entry;
4739 if (dynamic_size == 0)
4742 printf (_("\nThere is no dynamic segment in this file.\n"));
4749 if (! get_32bit_dynamic_segment (file))
4752 else if (! get_64bit_dynamic_segment (file))
4755 /* Find the appropriate symbol table. */
4756 if (dynamic_symbols == NULL)
4758 for (i = 0, entry = dynamic_segment;
4762 Elf_Internal_Shdr section;
4764 if (entry->d_tag != DT_SYMTAB)
4767 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4769 /* Since we do not know how big the symbol table is,
4770 we default to reading in the entire file (!) and
4771 processing that. This is overkill, I know, but it
4773 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
4775 if (archive_file_offset != 0)
4776 section.sh_size = archive_file_size - section.sh_offset;
4779 if (fseek (file, 0, SEEK_END))
4780 error (_("Unable to seek to end of file!"));
4782 section.sh_size = ftell (file) - section.sh_offset;
4786 section.sh_entsize = sizeof (Elf32_External_Sym);
4788 section.sh_entsize = sizeof (Elf64_External_Sym);
4790 num_dynamic_syms = section.sh_size / section.sh_entsize;
4791 if (num_dynamic_syms < 1)
4793 error (_("Unable to determine the number of symbols to load\n"));
4797 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4801 /* Similarly find a string table. */
4802 if (dynamic_strings == NULL)
4804 for (i = 0, entry = dynamic_segment;
4808 unsigned long offset;
4811 if (entry->d_tag != DT_STRTAB)
4814 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4816 /* Since we do not know how big the string table is,
4817 we default to reading in the entire file (!) and
4818 processing that. This is overkill, I know, but it
4821 offset = offset_from_vma (file, entry->d_un.d_val, 0);
4823 if (archive_file_offset != 0)
4824 str_tab_len = archive_file_size - offset;
4827 if (fseek (file, 0, SEEK_END))
4828 error (_("Unable to seek to end of file\n"));
4829 str_tab_len = ftell (file) - offset;
4832 if (str_tab_len < 1)
4835 (_("Unable to determine the length of the dynamic string table\n"));
4839 dynamic_strings = get_data (NULL, file, offset, str_tab_len,
4840 _("dynamic string table"));
4845 /* And find the syminfo section if available. */
4846 if (dynamic_syminfo == NULL)
4848 unsigned long syminsz = 0;
4850 for (i = 0, entry = dynamic_segment;
4854 if (entry->d_tag == DT_SYMINENT)
4856 /* Note: these braces are necessary to avoid a syntax
4857 error from the SunOS4 C compiler. */
4858 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4860 else if (entry->d_tag == DT_SYMINSZ)
4861 syminsz = entry->d_un.d_val;
4862 else if (entry->d_tag == DT_SYMINFO)
4863 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
4867 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4869 Elf_External_Syminfo *extsyminfo;
4870 Elf_Internal_Syminfo *syminfo;
4872 /* There is a syminfo section. Read the data. */
4873 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, syminsz,
4874 _("symbol information"));
4878 dynamic_syminfo = malloc (syminsz);
4879 if (dynamic_syminfo == NULL)
4881 error (_("Out of memory\n"));
4885 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4886 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4889 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4890 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4897 if (do_dynamic && dynamic_addr)
4898 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4899 dynamic_addr, (long) dynamic_size);
4901 printf (_(" Tag Type Name/Value\n"));
4903 for (i = 0, entry = dynamic_segment;
4912 print_vma (entry->d_tag, FULL_HEX);
4913 dtype = get_dynamic_type (entry->d_tag);
4914 printf (" (%s)%*s", dtype,
4915 ((is_32bit_elf ? 27 : 19)
4916 - (int) strlen (dtype)),
4920 switch (entry->d_tag)
4924 puts (get_dynamic_flags (entry->d_un.d_val));
4934 switch (entry->d_tag)
4937 printf (_("Auxiliary library"));
4941 printf (_("Filter library"));
4945 printf (_("Configuration file"));
4949 printf (_("Dependency audit library"));
4953 printf (_("Audit library"));
4957 if (dynamic_strings)
4958 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4962 print_vma (entry->d_un.d_val, PREFIX_HEX);
4971 printf (_("Flags:"));
4973 if (entry->d_un.d_val == 0)
4974 printf (_(" None\n"));
4977 unsigned long int val = entry->d_un.d_val;
4979 if (val & DTF_1_PARINIT)
4981 printf (" PARINIT");
4982 val ^= DTF_1_PARINIT;
4984 if (val & DTF_1_CONFEXP)
4986 printf (" CONFEXP");
4987 val ^= DTF_1_CONFEXP;
4990 printf (" %lx", val);
4999 printf (_("Flags:"));
5001 if (entry->d_un.d_val == 0)
5002 printf (_(" None\n"));
5005 unsigned long int val = entry->d_un.d_val;
5007 if (val & DF_P1_LAZYLOAD)
5009 printf (" LAZYLOAD");
5010 val ^= DF_P1_LAZYLOAD;
5012 if (val & DF_P1_GROUPPERM)
5014 printf (" GROUPPERM");
5015 val ^= DF_P1_GROUPPERM;
5018 printf (" %lx", val);
5027 printf (_("Flags:"));
5028 if (entry->d_un.d_val == 0)
5029 printf (_(" None\n"));
5032 unsigned long int val = entry->d_un.d_val;
5039 if (val & DF_1_GLOBAL)
5044 if (val & DF_1_GROUP)
5049 if (val & DF_1_NODELETE)
5051 printf (" NODELETE");
5052 val ^= DF_1_NODELETE;
5054 if (val & DF_1_LOADFLTR)
5056 printf (" LOADFLTR");
5057 val ^= DF_1_LOADFLTR;
5059 if (val & DF_1_INITFIRST)
5061 printf (" INITFIRST");
5062 val ^= DF_1_INITFIRST;
5064 if (val & DF_1_NOOPEN)
5069 if (val & DF_1_ORIGIN)
5074 if (val & DF_1_DIRECT)
5079 if (val & DF_1_TRANS)
5084 if (val & DF_1_INTERPOSE)
5086 printf (" INTERPOSE");
5087 val ^= DF_1_INTERPOSE;
5089 if (val & DF_1_NODEFLIB)
5091 printf (" NODEFLIB");
5092 val ^= DF_1_NODEFLIB;
5094 if (val & DF_1_NODUMP)
5099 if (val & DF_1_CONLFAT)
5101 printf (" CONLFAT");
5102 val ^= DF_1_CONLFAT;
5105 printf (" %lx", val);
5112 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5114 puts (get_dynamic_type (entry->d_un.d_val));
5134 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5140 if (dynamic_strings == NULL)
5143 name = dynamic_strings + entry->d_un.d_val;
5147 switch (entry->d_tag)
5150 printf (_("Shared library: [%s]"), name);
5152 if (strcmp (name, program_interpreter) == 0)
5153 printf (_(" program interpreter"));
5157 printf (_("Library soname: [%s]"), name);
5161 printf (_("Library rpath: [%s]"), name);
5165 printf (_("Library runpath: [%s]"), name);
5169 print_vma (entry->d_un.d_val, PREFIX_HEX);
5174 print_vma (entry->d_un.d_val, PREFIX_HEX);
5187 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5191 case DT_INIT_ARRAYSZ:
5192 case DT_FINI_ARRAYSZ:
5193 case DT_GNU_CONFLICTSZ:
5194 case DT_GNU_LIBLISTSZ:
5197 print_vma (entry->d_un.d_val, UNSIGNED);
5198 printf (" (bytes)\n");
5208 print_vma (entry->d_un.d_val, UNSIGNED);
5221 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
5225 name = dynamic_strings + entry->d_un.d_val;
5229 printf (_("Not needed object: [%s]\n"), name);
5234 print_vma (entry->d_un.d_val, PREFIX_HEX);
5240 /* The value of this entry is ignored. */
5245 case DT_GNU_PRELINKED:
5249 time_t time = entry->d_un.d_val;
5251 tmp = gmtime (&time);
5252 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5253 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5254 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5260 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5261 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5266 switch (elf_header.e_machine)
5269 case EM_MIPS_RS3_LE:
5270 dynamic_segment_mips_val (entry);
5273 dynamic_segment_parisc_val (entry);
5276 dynamic_segment_ia64_val (entry);
5279 print_vma (entry->d_un.d_val, PREFIX_HEX);
5291 get_ver_flags (unsigned int flags)
5293 static char buff[32];
5300 if (flags & VER_FLG_BASE)
5301 strcat (buff, "BASE ");
5303 if (flags & VER_FLG_WEAK)
5305 if (flags & VER_FLG_BASE)
5306 strcat (buff, "| ");
5308 strcat (buff, "WEAK ");
5311 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5312 strcat (buff, "| <unknown>");
5317 /* Display the contents of the version sections. */
5319 process_version_sections (FILE *file)
5321 Elf_Internal_Shdr *section;
5328 for (i = 0, section = section_headers;
5329 i < elf_header.e_shnum;
5332 switch (section->sh_type)
5334 case SHT_GNU_verdef:
5336 Elf_External_Verdef *edefs;
5343 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5344 SECTION_NAME (section), section->sh_info);
5346 printf (_(" Addr: 0x"));
5347 printf_vma (section->sh_addr);
5348 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5349 (unsigned long) section->sh_offset, section->sh_link,
5350 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5352 edefs = get_data (NULL, file, section->sh_offset, section->sh_size,
5353 _("version definition section"));
5357 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5360 Elf_External_Verdef *edef;
5361 Elf_Internal_Verdef ent;
5362 Elf_External_Verdaux *eaux;
5363 Elf_Internal_Verdaux aux;
5367 vstart = ((char *) edefs) + idx;
5369 edef = (Elf_External_Verdef *) vstart;
5371 ent.vd_version = BYTE_GET (edef->vd_version);
5372 ent.vd_flags = BYTE_GET (edef->vd_flags);
5373 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5374 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5375 ent.vd_hash = BYTE_GET (edef->vd_hash);
5376 ent.vd_aux = BYTE_GET (edef->vd_aux);
5377 ent.vd_next = BYTE_GET (edef->vd_next);
5379 printf (_(" %#06x: Rev: %d Flags: %s"),
5380 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5382 printf (_(" Index: %d Cnt: %d "),
5383 ent.vd_ndx, ent.vd_cnt);
5385 vstart += ent.vd_aux;
5387 eaux = (Elf_External_Verdaux *) vstart;
5389 aux.vda_name = BYTE_GET (eaux->vda_name);
5390 aux.vda_next = BYTE_GET (eaux->vda_next);
5392 if (dynamic_strings)
5393 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5395 printf (_("Name index: %ld\n"), aux.vda_name);
5397 isum = idx + ent.vd_aux;
5399 for (j = 1; j < ent.vd_cnt; j++)
5401 isum += aux.vda_next;
5402 vstart += aux.vda_next;
5404 eaux = (Elf_External_Verdaux *) vstart;
5406 aux.vda_name = BYTE_GET (eaux->vda_name);
5407 aux.vda_next = BYTE_GET (eaux->vda_next);
5409 if (dynamic_strings)
5410 printf (_(" %#06x: Parent %d: %s\n"),
5411 isum, j, dynamic_strings + aux.vda_name);
5413 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5414 isum, j, aux.vda_name);
5424 case SHT_GNU_verneed:
5426 Elf_External_Verneed *eneed;
5432 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5433 SECTION_NAME (section), section->sh_info);
5435 printf (_(" Addr: 0x"));
5436 printf_vma (section->sh_addr);
5437 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5438 (unsigned long) section->sh_offset, section->sh_link,
5439 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5441 eneed = get_data (NULL, file, section->sh_offset, section->sh_size,
5442 _("version need section"));
5446 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5448 Elf_External_Verneed *entry;
5449 Elf_Internal_Verneed ent;
5454 vstart = ((char *) eneed) + idx;
5456 entry = (Elf_External_Verneed *) vstart;
5458 ent.vn_version = BYTE_GET (entry->vn_version);
5459 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5460 ent.vn_file = BYTE_GET (entry->vn_file);
5461 ent.vn_aux = BYTE_GET (entry->vn_aux);
5462 ent.vn_next = BYTE_GET (entry->vn_next);
5464 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5466 if (dynamic_strings)
5467 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5469 printf (_(" File: %lx"), ent.vn_file);
5471 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5473 vstart += ent.vn_aux;
5475 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5477 Elf_External_Vernaux *eaux;
5478 Elf_Internal_Vernaux aux;
5480 eaux = (Elf_External_Vernaux *) vstart;
5482 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5483 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5484 aux.vna_other = BYTE_GET (eaux->vna_other);
5485 aux.vna_name = BYTE_GET (eaux->vna_name);
5486 aux.vna_next = BYTE_GET (eaux->vna_next);
5488 if (dynamic_strings)
5489 printf (_(" %#06x: Name: %s"),
5490 isum, dynamic_strings + aux.vna_name);
5492 printf (_(" %#06x: Name index: %lx"),
5493 isum, aux.vna_name);
5495 printf (_(" Flags: %s Version: %d\n"),
5496 get_ver_flags (aux.vna_flags), aux.vna_other);
5498 isum += aux.vna_next;
5499 vstart += aux.vna_next;
5509 case SHT_GNU_versym:
5511 Elf_Internal_Shdr *link_section;
5514 unsigned char *edata;
5515 unsigned short *data;
5517 Elf_Internal_Sym *symbols;
5518 Elf_Internal_Shdr *string_sec;
5521 link_section = SECTION_HEADER (section->sh_link);
5522 total = section->sh_size / section->sh_entsize;
5526 symbols = GET_ELF_SYMBOLS (file, link_section);
5528 string_sec = SECTION_HEADER (link_section->sh_link);
5530 strtab = get_data (NULL, file, string_sec->sh_offset,
5531 string_sec->sh_size, _("version string table"));
5535 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5536 SECTION_NAME (section), total);
5538 printf (_(" Addr: "));
5539 printf_vma (section->sh_addr);
5540 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5541 (unsigned long) section->sh_offset, section->sh_link,
5542 SECTION_NAME (link_section));
5544 off = offset_from_vma (file,
5545 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
5546 total * sizeof (short));
5547 edata = get_data (NULL, file, off, total * sizeof (short),
5548 _("version symbol data"));
5555 data = malloc (total * sizeof (short));
5557 for (cnt = total; cnt --;)
5558 data[cnt] = byte_get (edata + cnt * sizeof (short),
5563 for (cnt = 0; cnt < total; cnt += 4)
5566 int check_def, check_need;
5569 printf (" %03x:", cnt);
5571 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5572 switch (data[cnt + j])
5575 fputs (_(" 0 (*local*) "), stdout);
5579 fputs (_(" 1 (*global*) "), stdout);
5583 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
5584 data[cnt + j] & 0x8000 ? 'h' : ' ');
5588 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
5591 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
5598 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
5600 Elf_Internal_Verneed ivn;
5601 unsigned long offset;
5603 offset = offset_from_vma
5604 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
5605 sizeof (Elf_External_Verneed));
5609 Elf_Internal_Vernaux ivna;
5610 Elf_External_Verneed evn;
5611 Elf_External_Vernaux evna;
5612 unsigned long a_off;
5614 get_data (&evn, file, offset, sizeof (evn),
5617 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5618 ivn.vn_next = BYTE_GET (evn.vn_next);
5620 a_off = offset + ivn.vn_aux;
5624 get_data (&evna, file, a_off, sizeof (evna),
5625 _("version need aux (2)"));
5627 ivna.vna_next = BYTE_GET (evna.vna_next);
5628 ivna.vna_other = BYTE_GET (evna.vna_other);
5630 a_off += ivna.vna_next;
5632 while (ivna.vna_other != data[cnt + j]
5633 && ivna.vna_next != 0);
5635 if (ivna.vna_other == data[cnt + j])
5637 ivna.vna_name = BYTE_GET (evna.vna_name);
5639 name = strtab + ivna.vna_name;
5640 nn += printf ("(%s%-*s",
5642 12 - (int) strlen (name),
5648 offset += ivn.vn_next;
5650 while (ivn.vn_next);
5653 if (check_def && data[cnt + j] != 0x8001
5654 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5656 Elf_Internal_Verdef ivd;
5657 Elf_External_Verdef evd;
5658 unsigned long offset;
5660 offset = offset_from_vma
5661 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
5666 get_data (&evd, file, offset, sizeof (evd),
5669 ivd.vd_next = BYTE_GET (evd.vd_next);
5670 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5672 offset += ivd.vd_next;
5674 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
5675 && ivd.vd_next != 0);
5677 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
5679 Elf_External_Verdaux evda;
5680 Elf_Internal_Verdaux ivda;
5682 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5684 get_data (&evda, file,
5685 offset - ivd.vd_next + ivd.vd_aux,
5686 sizeof (evda), _("version def aux"));
5688 ivda.vda_name = BYTE_GET (evda.vda_name);
5690 name = strtab + ivda.vda_name;
5691 nn += printf ("(%s%-*s",
5693 12 - (int) strlen (name),
5699 printf ("%*c", 18 - nn, ' ');
5717 printf (_("\nNo version information found in this file.\n"));
5723 get_symbol_binding (unsigned int binding)
5725 static char buff[32];
5729 case STB_LOCAL: return "LOCAL";
5730 case STB_GLOBAL: return "GLOBAL";
5731 case STB_WEAK: return "WEAK";
5733 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5734 sprintf (buff, _("<processor specific>: %d"), binding);
5735 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5736 sprintf (buff, _("<OS specific>: %d"), binding);
5738 sprintf (buff, _("<unknown>: %d"), binding);
5744 get_symbol_type (unsigned int type)
5746 static char buff[32];
5750 case STT_NOTYPE: return "NOTYPE";
5751 case STT_OBJECT: return "OBJECT";
5752 case STT_FUNC: return "FUNC";
5753 case STT_SECTION: return "SECTION";
5754 case STT_FILE: return "FILE";
5755 case STT_COMMON: return "COMMON";
5756 case STT_TLS: return "TLS";
5758 if (type >= STT_LOPROC && type <= STT_HIPROC)
5760 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5761 return "THUMB_FUNC";
5763 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5766 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5767 return "PARISC_MILLI";
5769 sprintf (buff, _("<processor specific>: %d"), type);
5771 else if (type >= STT_LOOS && type <= STT_HIOS)
5773 if (elf_header.e_machine == EM_PARISC)
5775 if (type == STT_HP_OPAQUE)
5777 if (type == STT_HP_STUB)
5781 sprintf (buff, _("<OS specific>: %d"), type);
5784 sprintf (buff, _("<unknown>: %d"), type);
5790 get_symbol_visibility (unsigned int visibility)
5794 case STV_DEFAULT: return "DEFAULT";
5795 case STV_INTERNAL: return "INTERNAL";
5796 case STV_HIDDEN: return "HIDDEN";
5797 case STV_PROTECTED: return "PROTECTED";
5803 get_symbol_index_type (unsigned int type)
5805 static char buff[32];
5809 case SHN_UNDEF: return "UND";
5810 case SHN_ABS: return "ABS";
5811 case SHN_COMMON: return "COM";
5813 if (type == SHN_IA_64_ANSI_COMMON
5814 && elf_header.e_machine == EM_IA_64
5815 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
5817 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5818 sprintf (buff, "PRC[0x%04x]", type);
5819 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5820 sprintf (buff, "OS [0x%04x]", type);
5821 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5822 sprintf (buff, "RSV[0x%04x]", type);
5824 sprintf (buff, "%3d", type);
5832 get_dynamic_data (FILE *file, unsigned int number)
5834 unsigned char *e_data;
5837 e_data = malloc (number * 4);
5841 error (_("Out of memory\n"));
5845 if (fread (e_data, 4, number, file) != number)
5847 error (_("Unable to read in dynamic data\n"));
5851 i_data = malloc (number * sizeof (*i_data));
5855 error (_("Out of memory\n"));
5861 i_data[number] = byte_get (e_data + number * 4, 4);
5868 /* Dump the symbol table. */
5870 process_symbol_table (FILE *file)
5872 Elf_Internal_Shdr *section;
5873 unsigned char nb[4];
5874 unsigned char nc[4];
5877 int *buckets = NULL;
5880 if (! do_syms && !do_histogram)
5883 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5887 (archive_file_offset
5888 + offset_from_vma (file, dynamic_info[DT_HASH],
5889 sizeof nb + sizeof nc)),
5892 error (_("Unable to seek to start of dynamic information"));
5896 if (fread (nb, sizeof (nb), 1, file) != 1)
5898 error (_("Failed to read in number of buckets\n"));
5902 if (fread (nc, sizeof (nc), 1, file) != 1)
5904 error (_("Failed to read in number of chains\n"));
5908 nbuckets = byte_get (nb, 4);
5909 nchains = byte_get (nc, 4);
5911 buckets = get_dynamic_data (file, nbuckets);
5912 chains = get_dynamic_data (file, nchains);
5914 if (buckets == NULL || chains == NULL)
5919 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5924 printf (_("\nSymbol table for image:\n"));
5926 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5928 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5930 for (hn = 0; hn < nbuckets; hn++)
5935 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
5937 Elf_Internal_Sym *psym;
5939 psym = dynamic_symbols + si;
5941 printf (" %3d %3d: ", si, hn);
5942 print_vma (psym->st_value, LONG_HEX);
5944 print_vma (psym->st_size, DEC_5);
5946 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5947 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5948 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5949 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5950 print_symbol (25, dynamic_strings + psym->st_name);
5955 else if (do_syms && !do_using_dynamic)
5959 for (i = 0, section = section_headers;
5960 i < elf_header.e_shnum;
5965 Elf_Internal_Sym *symtab;
5966 Elf_Internal_Sym *psym;
5969 if ( section->sh_type != SHT_SYMTAB
5970 && section->sh_type != SHT_DYNSYM)
5973 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5974 SECTION_NAME (section),
5975 (unsigned long) (section->sh_size / section->sh_entsize));
5977 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5979 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5981 symtab = GET_ELF_SYMBOLS (file, section);
5985 if (section->sh_link == elf_header.e_shstrndx)
5986 strtab = string_table;
5989 Elf_Internal_Shdr *string_sec;
5991 string_sec = SECTION_HEADER (section->sh_link);
5993 strtab = get_data (NULL, file, string_sec->sh_offset,
5994 string_sec->sh_size, _("string table"));
5997 for (si = 0, psym = symtab;
5998 si < section->sh_size / section->sh_entsize;
6001 printf ("%6d: ", si);
6002 print_vma (psym->st_value, LONG_HEX);
6004 print_vma (psym->st_size, DEC_5);
6005 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6006 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6007 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6008 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
6009 print_symbol (25, strtab + psym->st_name);
6011 if (section->sh_type == SHT_DYNSYM &&
6012 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
6014 unsigned char data[2];
6015 unsigned short vers_data;
6016 unsigned long offset;
6020 offset = offset_from_vma
6021 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6022 sizeof data + si * sizeof (vers_data));
6024 get_data (&data, file, offset + si * sizeof (vers_data),
6025 sizeof (data), _("version data"));
6027 vers_data = byte_get (data, 2);
6029 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
6032 check_def = (psym->st_shndx != SHN_UNDEF);
6034 if ((vers_data & 0x8000) || vers_data > 1)
6036 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
6037 && (is_nobits || ! check_def))
6039 Elf_External_Verneed evn;
6040 Elf_Internal_Verneed ivn;
6041 Elf_Internal_Vernaux ivna;
6043 /* We must test both. */
6044 offset = offset_from_vma
6045 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6050 unsigned long vna_off;
6052 get_data (&evn, file, offset, sizeof (evn),
6055 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6056 ivn.vn_next = BYTE_GET (evn.vn_next);
6058 vna_off = offset + ivn.vn_aux;
6062 Elf_External_Vernaux evna;
6064 get_data (&evna, file, vna_off,
6066 _("version need aux (3)"));
6068 ivna.vna_other = BYTE_GET (evna.vna_other);
6069 ivna.vna_next = BYTE_GET (evna.vna_next);
6070 ivna.vna_name = BYTE_GET (evna.vna_name);
6072 vna_off += ivna.vna_next;
6074 while (ivna.vna_other != vers_data
6075 && ivna.vna_next != 0);
6077 if (ivna.vna_other == vers_data)
6080 offset += ivn.vn_next;
6082 while (ivn.vn_next != 0);
6084 if (ivna.vna_other == vers_data)
6087 strtab + ivna.vna_name, ivna.vna_other);
6090 else if (! is_nobits)
6091 error (_("bad dynamic symbol"));
6098 if (vers_data != 0x8001
6099 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6101 Elf_Internal_Verdef ivd;
6102 Elf_Internal_Verdaux ivda;
6103 Elf_External_Verdaux evda;
6104 unsigned long offset;
6106 offset = offset_from_vma
6108 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6109 sizeof (Elf_External_Verdef));
6113 Elf_External_Verdef evd;
6115 get_data (&evd, file, offset, sizeof (evd),
6118 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6119 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6120 ivd.vd_next = BYTE_GET (evd.vd_next);
6122 offset += ivd.vd_next;
6124 while (ivd.vd_ndx != (vers_data & 0x7fff)
6125 && ivd.vd_next != 0);
6127 offset -= ivd.vd_next;
6128 offset += ivd.vd_aux;
6130 get_data (&evda, file, offset, sizeof (evda),
6131 _("version def aux"));
6133 ivda.vda_name = BYTE_GET (evda.vda_name);
6135 if (psym->st_name != ivda.vda_name)
6136 printf ((vers_data & 0x8000)
6138 strtab + ivda.vda_name);
6148 if (strtab != string_table)
6154 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6156 if (do_histogram && buckets != NULL)
6163 int nzero_counts = 0;
6166 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6168 printf (_(" Length Number %% of total Coverage\n"));
6170 lengths = calloc (nbuckets, sizeof (int));
6171 if (lengths == NULL)
6173 error (_("Out of memory"));
6176 for (hn = 0; hn < nbuckets; ++hn)
6181 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
6184 if (maxlength < ++lengths[hn])
6189 counts = calloc (maxlength + 1, sizeof (int));
6192 error (_("Out of memory"));
6196 for (hn = 0; hn < nbuckets; ++hn)
6197 ++counts[lengths[hn]];
6201 printf (" 0 %-10d (%5.1f%%)\n",
6202 counts[0], (counts[0] * 100.0) / nbuckets);
6203 for (si = 1; si <= maxlength; ++si)
6205 nzero_counts += counts[si] * si;
6206 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6207 si, counts[si], (counts[si] * 100.0) / nbuckets,
6208 (nzero_counts * 100.0) / nsyms);
6216 if (buckets != NULL)
6226 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
6230 if (dynamic_syminfo == NULL
6232 /* No syminfo, this is ok. */
6235 /* There better should be a dynamic symbol section. */
6236 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6240 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6241 dynamic_syminfo_offset, dynamic_syminfo_nent);
6243 printf (_(" Num: Name BoundTo Flags\n"));
6244 for (i = 0; i < dynamic_syminfo_nent; ++i)
6246 unsigned short int flags = dynamic_syminfo[i].si_flags;
6248 printf ("%4d: ", i);
6249 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
6252 switch (dynamic_syminfo[i].si_boundto)
6254 case SYMINFO_BT_SELF:
6255 fputs ("SELF ", stdout);
6257 case SYMINFO_BT_PARENT:
6258 fputs ("PARENT ", stdout);
6261 if (dynamic_syminfo[i].si_boundto > 0
6262 && dynamic_syminfo[i].si_boundto < dynamic_size)
6267 [dynamic_syminfo[i].si_boundto].d_un.d_val));
6271 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6275 if (flags & SYMINFO_FLG_DIRECT)
6277 if (flags & SYMINFO_FLG_PASSTHRU)
6278 printf (" PASSTHRU");
6279 if (flags & SYMINFO_FLG_COPY)
6281 if (flags & SYMINFO_FLG_LAZYLOAD)
6282 printf (" LAZYLOAD");
6290 #ifdef SUPPORT_DISASSEMBLY
6292 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
6294 printf (_("\nAssembly dump of section %s\n"),
6295 SECTION_NAME (section));
6297 /* XXX -- to be done --- XXX */
6304 dump_section (Elf_Internal_Shdr *section, FILE *file)
6306 bfd_size_type bytes;
6308 unsigned char *data;
6309 unsigned char *start;
6311 bytes = section->sh_size;
6313 if (bytes == 0 || section->sh_type == SHT_NOBITS)
6315 printf (_("\nSection '%s' has no data to dump.\n"),
6316 SECTION_NAME (section));
6320 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6322 addr = section->sh_addr;
6324 start = get_data (NULL, file, section->sh_offset, bytes, _("section data"));
6336 lbytes = (bytes > 16 ? 16 : bytes);
6338 printf (" 0x%8.8lx ", (unsigned long) addr);
6340 switch (elf_header.e_ident[EI_DATA])
6344 for (j = 15; j >= 0; j --)
6347 printf ("%2.2x", data[j]);
6357 for (j = 0; j < 16; j++)
6360 printf ("%2.2x", data[j]);
6370 for (j = 0; j < lbytes; j++)
6373 if (k >= ' ' && k < 0x7f)
6392 static unsigned long int
6393 read_leb128 (unsigned char *data, int *length_return, int sign)
6395 unsigned long int result = 0;
6396 unsigned int num_read = 0;
6405 result |= (byte & 0x7f) << shift;
6410 while (byte & 0x80);
6412 if (length_return != NULL)
6413 *length_return = num_read;
6415 if (sign && (shift < 32) && (byte & 0x40))
6416 result |= -1 << shift;
6421 typedef struct State_Machine_Registers
6423 unsigned long address;
6426 unsigned int column;
6430 /* This variable hold the number of the last entry seen
6431 in the File Table. */
6432 unsigned int last_file_entry;
6435 static SMR state_machine_regs;
6438 reset_state_machine (int is_stmt)
6440 state_machine_regs.address = 0;
6441 state_machine_regs.file = 1;
6442 state_machine_regs.line = 1;
6443 state_machine_regs.column = 0;
6444 state_machine_regs.is_stmt = is_stmt;
6445 state_machine_regs.basic_block = 0;
6446 state_machine_regs.end_sequence = 0;
6447 state_machine_regs.last_file_entry = 0;
6450 /* Handled an extend line op. Returns true if this is the end
6453 process_extended_line_op (unsigned char *data, int is_stmt, int pointer_size)
6455 unsigned char op_code;
6458 unsigned char *name;
6461 len = read_leb128 (data, & bytes_read, 0);
6466 warn (_("badly formed extended line op encountered!\n"));
6473 printf (_(" Extended opcode %d: "), op_code);
6477 case DW_LNE_end_sequence:
6478 printf (_("End of Sequence\n\n"));
6479 reset_state_machine (is_stmt);
6482 case DW_LNE_set_address:
6483 adr = byte_get (data, pointer_size);
6484 printf (_("set Address to 0x%lx\n"), adr);
6485 state_machine_regs.address = adr;
6488 case DW_LNE_define_file:
6489 printf (_(" define new File Table entry\n"));
6490 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6492 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6494 data += strlen ((char *) data) + 1;
6495 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6497 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6499 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6500 printf (_("%s\n\n"), name);
6504 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6511 /* Finds section NAME inside FILE and returns a
6512 pointer to it, or NULL upon failure. */
6514 static Elf_Internal_Shdr *
6515 find_section (const char * name)
6517 Elf_Internal_Shdr *sec;
6520 for (i = elf_header.e_shnum, sec = section_headers + i - 1;
6522 if (strcmp (SECTION_NAME (sec), name) == 0)
6525 if (i && sec && sec->sh_size != 0)
6531 /* Size of pointers in the .debug_line section. This information is not
6532 really present in that section. It's obtained before dumping the debug
6533 sections by doing some pre-scan of the .debug_info section. */
6534 static unsigned int * debug_line_pointer_sizes = NULL;
6535 static unsigned int num_debug_line_pointer_sizes = 0;
6537 /* Locate and scan the .debug_info section in the file and record the pointer
6538 sizes for the compilation units in it. Usually an executable will have
6539 just one pointer size, but this is not guaranteed, and so we try not to
6540 make any assumptions. Returns zero upon failure, or the number of
6541 compilation units upon success. */
6544 get_debug_line_pointer_sizes (FILE * file)
6546 Elf_Internal_Shdr * section;
6547 unsigned char * start;
6548 unsigned char * end;
6549 unsigned char * begin;
6550 unsigned long length;
6551 unsigned int num_units;
6554 section = find_section (".debug_info");
6555 if (section == NULL)
6558 length = section->sh_size;
6559 start = get_data (NULL, file, section->sh_offset, section->sh_size,
6560 _("extracting pointer sizes from .debug_info section"));
6564 end = start + section->sh_size;
6565 /* First scan the section to get the number of comp units. */
6566 for (begin = start, num_units = 0; begin < end; num_units++)
6568 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
6569 be the length. For a 64-bit DWARF section, it'll be the escape
6570 code 0xffffffff followed by an 8 byte length. */
6571 length = byte_get (begin, 4);
6573 if (length == 0xffffffff)
6575 length = byte_get (begin + 4, 8);
6576 begin += length + 12;
6579 begin += length + 4;
6584 error (_("No comp units in .debug_info section ?"));
6589 /* Then allocate an array to hold the pointer sizes. */
6590 debug_line_pointer_sizes = malloc (num_units * sizeof * debug_line_pointer_sizes);
6591 if (debug_line_pointer_sizes == NULL)
6593 error (_("Not enough memory for a pointer size array of %u entries"),
6599 /* Populate the array. */
6600 for (begin = start, unit = 0; begin < end; unit++)
6602 length = byte_get (begin, 4);
6603 if (length == 0xffffffff)
6605 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
6606 from the start of the section. This is computed as follows:
6608 unit_length: 12 bytes
6610 debug_abbrev_offset: 8 bytes
6611 -----------------------------
6614 debug_line_pointer_sizes [unit] = byte_get (begin + 22, 1);
6615 length = byte_get (begin + 4, 8);
6616 begin += length + 12;
6620 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
6621 the start of the section:
6623 unit_length: 4 bytes
6625 debug_abbrev_offset: 4 bytes
6626 -----------------------------
6629 debug_line_pointer_sizes [unit] = byte_get (begin + 10, 1);
6630 begin += length + 4;
6635 num_debug_line_pointer_sizes = num_units;
6640 display_debug_lines (Elf_Internal_Shdr *section,
6641 unsigned char *start, FILE *file)
6643 unsigned char *hdrptr;
6644 DWARF2_Internal_LineInfo info;
6645 unsigned char *standard_opcodes;
6646 unsigned char *data = start;
6647 unsigned char *end = start + section->sh_size;
6648 unsigned char *end_of_sequence;
6651 int initial_length_size;
6652 unsigned int comp_unit = 0;
6654 printf (_("\nDump of debug contents of section %s:\n\n"),
6655 SECTION_NAME (section));
6657 if (num_debug_line_pointer_sizes == 0)
6658 get_debug_line_pointer_sizes (file);
6662 unsigned int pointer_size;
6666 /* Check the length of the block. */
6667 info.li_length = byte_get (hdrptr, 4);
6670 if (info.li_length == 0xffffffff)
6672 /* This section is 64-bit DWARF 3. */
6673 info.li_length = byte_get (hdrptr, 8);
6676 initial_length_size = 12;
6681 initial_length_size = 4;
6684 if (info.li_length + initial_length_size > section->sh_size)
6687 (_("The line info appears to be corrupt - the section is too small\n"));
6691 /* Check its version number. */
6692 info.li_version = byte_get (hdrptr, 2);
6694 if (info.li_version != 2 && info.li_version != 3)
6696 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6700 info.li_prologue_length = byte_get (hdrptr, offset_size);
6701 hdrptr += offset_size;
6702 info.li_min_insn_length = byte_get (hdrptr, 1);
6704 info.li_default_is_stmt = byte_get (hdrptr, 1);
6706 info.li_line_base = byte_get (hdrptr, 1);
6708 info.li_line_range = byte_get (hdrptr, 1);
6710 info.li_opcode_base = byte_get (hdrptr, 1);
6713 /* Sign extend the line base field. */
6714 info.li_line_base <<= 24;
6715 info.li_line_base >>= 24;
6717 /* Get the pointer size from the comp unit associated
6718 with this block of line number information. */
6719 if (comp_unit >= num_debug_line_pointer_sizes)
6721 error (_("Not enough comp units for .debug_lines section\n"));
6726 pointer_size = debug_line_pointer_sizes [comp_unit];
6730 printf (_(" Length: %ld\n"), info.li_length);
6731 printf (_(" DWARF Version: %d\n"), info.li_version);
6732 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6733 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6734 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6735 printf (_(" Line Base: %d\n"), info.li_line_base);
6736 printf (_(" Line Range: %d\n"), info.li_line_range);
6737 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6738 printf (_(" (Pointer size: %u)\n"), pointer_size);
6740 end_of_sequence = data + info.li_length + initial_length_size;
6742 reset_state_machine (info.li_default_is_stmt);
6744 /* Display the contents of the Opcodes table. */
6745 standard_opcodes = hdrptr;
6747 printf (_("\n Opcodes:\n"));
6749 for (i = 1; i < info.li_opcode_base; i++)
6750 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6752 /* Display the contents of the Directory table. */
6753 data = standard_opcodes + info.li_opcode_base - 1;
6756 printf (_("\n The Directory Table is empty.\n"));
6759 printf (_("\n The Directory Table:\n"));
6763 printf (_(" %s\n"), data);
6765 data += strlen ((char *) data) + 1;
6769 /* Skip the NUL at the end of the table. */
6772 /* Display the contents of the File Name table. */
6774 printf (_("\n The File Name Table is empty.\n"));
6777 printf (_("\n The File Name Table:\n"));
6778 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6782 unsigned char *name;
6785 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6788 data += strlen ((char *) data) + 1;
6790 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6792 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6794 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6796 printf (_("%s\n"), name);
6800 /* Skip the NUL at the end of the table. */
6803 /* Now display the statements. */
6804 printf (_("\n Line Number Statements:\n"));
6807 while (data < end_of_sequence)
6809 unsigned char op_code;
6815 if (op_code >= info.li_opcode_base)
6817 op_code -= info.li_opcode_base;
6818 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6819 state_machine_regs.address += adv;
6820 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6821 op_code, adv, state_machine_regs.address);
6822 adv = (op_code % info.li_line_range) + info.li_line_base;
6823 state_machine_regs.line += adv;
6824 printf (_(" and Line by %d to %d\n"),
6825 adv, state_machine_regs.line);
6827 else switch (op_code)
6829 case DW_LNS_extended_op:
6830 data += process_extended_line_op (data, info.li_default_is_stmt,
6835 printf (_(" Copy\n"));
6838 case DW_LNS_advance_pc:
6839 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6841 state_machine_regs.address += adv;
6842 printf (_(" Advance PC by %d to %lx\n"), adv,
6843 state_machine_regs.address);
6846 case DW_LNS_advance_line:
6847 adv = read_leb128 (data, & bytes_read, 1);
6849 state_machine_regs.line += adv;
6850 printf (_(" Advance Line by %d to %d\n"), adv,
6851 state_machine_regs.line);
6854 case DW_LNS_set_file:
6855 adv = read_leb128 (data, & bytes_read, 0);
6857 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6859 state_machine_regs.file = adv;
6862 case DW_LNS_set_column:
6863 adv = read_leb128 (data, & bytes_read, 0);
6865 printf (_(" Set column to %d\n"), adv);
6866 state_machine_regs.column = adv;
6869 case DW_LNS_negate_stmt:
6870 adv = state_machine_regs.is_stmt;
6872 printf (_(" Set is_stmt to %d\n"), adv);
6873 state_machine_regs.is_stmt = adv;
6876 case DW_LNS_set_basic_block:
6877 printf (_(" Set basic block\n"));
6878 state_machine_regs.basic_block = 1;
6881 case DW_LNS_const_add_pc:
6882 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6883 * info.li_min_insn_length);
6884 state_machine_regs.address += adv;
6885 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6886 state_machine_regs.address);
6889 case DW_LNS_fixed_advance_pc:
6890 adv = byte_get (data, 2);
6892 state_machine_regs.address += adv;
6893 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6894 adv, state_machine_regs.address);
6897 case DW_LNS_set_prologue_end:
6898 printf (_(" Set prologue_end to true\n"));
6901 case DW_LNS_set_epilogue_begin:
6902 printf (_(" Set epilogue_begin to true\n"));
6905 case DW_LNS_set_isa:
6906 adv = read_leb128 (data, & bytes_read, 0);
6908 printf (_(" Set ISA to %d\n"), adv);
6912 printf (_(" Unknown opcode %d with operands: "), op_code);
6915 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6917 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6918 i == 1 ? "" : ", ");
6933 display_debug_pubnames (Elf_Internal_Shdr *section,
6934 unsigned char *start,
6935 FILE *file ATTRIBUTE_UNUSED)
6937 DWARF2_Internal_PubNames pubnames;
6940 end = start + section->sh_size;
6942 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6946 unsigned char *data;
6947 unsigned long offset;
6948 int offset_size, initial_length_size;
6952 pubnames.pn_length = byte_get (data, 4);
6954 if (pubnames.pn_length == 0xffffffff)
6956 pubnames.pn_length = byte_get (data, 8);
6959 initial_length_size = 12;
6964 initial_length_size = 4;
6967 pubnames.pn_version = byte_get (data, 2);
6969 pubnames.pn_offset = byte_get (data, offset_size);
6970 data += offset_size;
6971 pubnames.pn_size = byte_get (data, offset_size);
6972 data += offset_size;
6974 start += pubnames.pn_length + initial_length_size;
6976 if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
6978 static int warned = 0;
6982 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
6989 printf (_(" Length: %ld\n"),
6990 pubnames.pn_length);
6991 printf (_(" Version: %d\n"),
6992 pubnames.pn_version);
6993 printf (_(" Offset into .debug_info section: %ld\n"),
6994 pubnames.pn_offset);
6995 printf (_(" Size of area in .debug_info section: %ld\n"),
6998 printf (_("\n Offset\tName\n"));
7002 offset = byte_get (data, offset_size);
7006 data += offset_size;
7007 printf (" %-6ld\t\t%s\n", offset, data);
7008 data += strlen ((char *) data) + 1;
7011 while (offset != 0);
7019 get_TAG_name (unsigned long tag)
7023 case DW_TAG_padding: return "DW_TAG_padding";
7024 case DW_TAG_array_type: return "DW_TAG_array_type";
7025 case DW_TAG_class_type: return "DW_TAG_class_type";
7026 case DW_TAG_entry_point: return "DW_TAG_entry_point";
7027 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
7028 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
7029 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
7030 case DW_TAG_label: return "DW_TAG_label";
7031 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
7032 case DW_TAG_member: return "DW_TAG_member";
7033 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
7034 case DW_TAG_reference_type: return "DW_TAG_reference_type";
7035 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
7036 case DW_TAG_string_type: return "DW_TAG_string_type";
7037 case DW_TAG_structure_type: return "DW_TAG_structure_type";
7038 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
7039 case DW_TAG_typedef: return "DW_TAG_typedef";
7040 case DW_TAG_union_type: return "DW_TAG_union_type";
7041 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
7042 case DW_TAG_variant: return "DW_TAG_variant";
7043 case DW_TAG_common_block: return "DW_TAG_common_block";
7044 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
7045 case DW_TAG_inheritance: return "DW_TAG_inheritance";
7046 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
7047 case DW_TAG_module: return "DW_TAG_module";
7048 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
7049 case DW_TAG_set_type: return "DW_TAG_set_type";
7050 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
7051 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
7052 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
7053 case DW_TAG_base_type: return "DW_TAG_base_type";
7054 case DW_TAG_catch_block: return "DW_TAG_catch_block";
7055 case DW_TAG_const_type: return "DW_TAG_const_type";
7056 case DW_TAG_constant: return "DW_TAG_constant";
7057 case DW_TAG_enumerator: return "DW_TAG_enumerator";
7058 case DW_TAG_file_type: return "DW_TAG_file_type";
7059 case DW_TAG_friend: return "DW_TAG_friend";
7060 case DW_TAG_namelist: return "DW_TAG_namelist";
7061 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
7062 case DW_TAG_packed_type: return "DW_TAG_packed_type";
7063 case DW_TAG_subprogram: return "DW_TAG_subprogram";
7064 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
7065 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
7066 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
7067 case DW_TAG_try_block: return "DW_TAG_try_block";
7068 case DW_TAG_variant_part: return "DW_TAG_variant_part";
7069 case DW_TAG_variable: return "DW_TAG_variable";
7070 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
7071 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
7072 case DW_TAG_format_label: return "DW_TAG_format_label";
7073 case DW_TAG_function_template: return "DW_TAG_function_template";
7074 case DW_TAG_class_template: return "DW_TAG_class_template";
7075 /* DWARF 2.1 values. */
7076 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
7077 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
7078 case DW_TAG_interface_type: return "DW_TAG_interface_type";
7079 case DW_TAG_namespace: return "DW_TAG_namespace";
7080 case DW_TAG_imported_module: return "DW_TAG_imported_module";
7081 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
7082 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
7083 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
7085 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
7086 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
7087 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
7090 static char buffer[100];
7092 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
7099 get_AT_name (unsigned long attribute)
7103 case DW_AT_sibling: return "DW_AT_sibling";
7104 case DW_AT_location: return "DW_AT_location";
7105 case DW_AT_name: return "DW_AT_name";
7106 case DW_AT_ordering: return "DW_AT_ordering";
7107 case DW_AT_subscr_data: return "DW_AT_subscr_data";
7108 case DW_AT_byte_size: return "DW_AT_byte_size";
7109 case DW_AT_bit_offset: return "DW_AT_bit_offset";
7110 case DW_AT_bit_size: return "DW_AT_bit_size";
7111 case DW_AT_element_list: return "DW_AT_element_list";
7112 case DW_AT_stmt_list: return "DW_AT_stmt_list";
7113 case DW_AT_low_pc: return "DW_AT_low_pc";
7114 case DW_AT_high_pc: return "DW_AT_high_pc";
7115 case DW_AT_language: return "DW_AT_language";
7116 case DW_AT_member: return "DW_AT_member";
7117 case DW_AT_discr: return "DW_AT_discr";
7118 case DW_AT_discr_value: return "DW_AT_discr_value";
7119 case DW_AT_visibility: return "DW_AT_visibility";
7120 case DW_AT_import: return "DW_AT_import";
7121 case DW_AT_string_length: return "DW_AT_string_length";
7122 case DW_AT_common_reference: return "DW_AT_common_reference";
7123 case DW_AT_comp_dir: return "DW_AT_comp_dir";
7124 case DW_AT_const_value: return "DW_AT_const_value";
7125 case DW_AT_containing_type: return "DW_AT_containing_type";
7126 case DW_AT_default_value: return "DW_AT_default_value";
7127 case DW_AT_inline: return "DW_AT_inline";
7128 case DW_AT_is_optional: return "DW_AT_is_optional";
7129 case DW_AT_lower_bound: return "DW_AT_lower_bound";
7130 case DW_AT_producer: return "DW_AT_producer";
7131 case DW_AT_prototyped: return "DW_AT_prototyped";
7132 case DW_AT_return_addr: return "DW_AT_return_addr";
7133 case DW_AT_start_scope: return "DW_AT_start_scope";
7134 case DW_AT_stride_size: return "DW_AT_stride_size";
7135 case DW_AT_upper_bound: return "DW_AT_upper_bound";
7136 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
7137 case DW_AT_accessibility: return "DW_AT_accessibility";
7138 case DW_AT_address_class: return "DW_AT_address_class";
7139 case DW_AT_artificial: return "DW_AT_artificial";
7140 case DW_AT_base_types: return "DW_AT_base_types";
7141 case DW_AT_calling_convention: return "DW_AT_calling_convention";
7142 case DW_AT_count: return "DW_AT_count";
7143 case DW_AT_data_member_location: return "DW_AT_data_member_location";
7144 case DW_AT_decl_column: return "DW_AT_decl_column";
7145 case DW_AT_decl_file: return "DW_AT_decl_file";
7146 case DW_AT_decl_line: return "DW_AT_decl_line";
7147 case DW_AT_declaration: return "DW_AT_declaration";
7148 case DW_AT_discr_list: return "DW_AT_discr_list";
7149 case DW_AT_encoding: return "DW_AT_encoding";
7150 case DW_AT_external: return "DW_AT_external";
7151 case DW_AT_frame_base: return "DW_AT_frame_base";
7152 case DW_AT_friend: return "DW_AT_friend";
7153 case DW_AT_identifier_case: return "DW_AT_identifier_case";
7154 case DW_AT_macro_info: return "DW_AT_macro_info";
7155 case DW_AT_namelist_items: return "DW_AT_namelist_items";
7156 case DW_AT_priority: return "DW_AT_priority";
7157 case DW_AT_segment: return "DW_AT_segment";
7158 case DW_AT_specification: return "DW_AT_specification";
7159 case DW_AT_static_link: return "DW_AT_static_link";
7160 case DW_AT_type: return "DW_AT_type";
7161 case DW_AT_use_location: return "DW_AT_use_location";
7162 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
7163 case DW_AT_virtuality: return "DW_AT_virtuality";
7164 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
7165 /* DWARF 2.1 values. */
7166 case DW_AT_allocated: return "DW_AT_allocated";
7167 case DW_AT_associated: return "DW_AT_associated";
7168 case DW_AT_data_location: return "DW_AT_data_location";
7169 case DW_AT_stride: return "DW_AT_stride";
7170 case DW_AT_entry_pc: return "DW_AT_entry_pc";
7171 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
7172 case DW_AT_extension: return "DW_AT_extension";
7173 case DW_AT_ranges: return "DW_AT_ranges";
7174 case DW_AT_trampoline: return "DW_AT_trampoline";
7175 case DW_AT_call_column: return "DW_AT_call_column";
7176 case DW_AT_call_file: return "DW_AT_call_file";
7177 case DW_AT_call_line: return "DW_AT_call_line";
7178 /* SGI/MIPS extensions. */
7179 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
7180 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
7181 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
7182 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
7183 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
7184 case DW_AT_MIPS_software_pipeline_depth:
7185 return "DW_AT_MIPS_software_pipeline_depth";
7186 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
7187 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
7188 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
7189 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
7190 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
7191 /* GNU extensions. */
7192 case DW_AT_sf_names: return "DW_AT_sf_names";
7193 case DW_AT_src_info: return "DW_AT_src_info";
7194 case DW_AT_mac_info: return "DW_AT_mac_info";
7195 case DW_AT_src_coords: return "DW_AT_src_coords";
7196 case DW_AT_body_begin: return "DW_AT_body_begin";
7197 case DW_AT_body_end: return "DW_AT_body_end";
7198 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
7199 /* UPC extension. */
7200 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
7203 static char buffer[100];
7205 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
7212 get_FORM_name (unsigned long form)
7216 case DW_FORM_addr: return "DW_FORM_addr";
7217 case DW_FORM_block2: return "DW_FORM_block2";
7218 case DW_FORM_block4: return "DW_FORM_block4";
7219 case DW_FORM_data2: return "DW_FORM_data2";
7220 case DW_FORM_data4: return "DW_FORM_data4";
7221 case DW_FORM_data8: return "DW_FORM_data8";
7222 case DW_FORM_string: return "DW_FORM_string";
7223 case DW_FORM_block: return "DW_FORM_block";
7224 case DW_FORM_block1: return "DW_FORM_block1";
7225 case DW_FORM_data1: return "DW_FORM_data1";
7226 case DW_FORM_flag: return "DW_FORM_flag";
7227 case DW_FORM_sdata: return "DW_FORM_sdata";
7228 case DW_FORM_strp: return "DW_FORM_strp";
7229 case DW_FORM_udata: return "DW_FORM_udata";
7230 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
7231 case DW_FORM_ref1: return "DW_FORM_ref1";
7232 case DW_FORM_ref2: return "DW_FORM_ref2";
7233 case DW_FORM_ref4: return "DW_FORM_ref4";
7234 case DW_FORM_ref8: return "DW_FORM_ref8";
7235 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
7236 case DW_FORM_indirect: return "DW_FORM_indirect";
7239 static char buffer[100];
7241 sprintf (buffer, _("Unknown FORM value: %lx"), form);
7247 /* FIXME: There are better and more efficient ways to handle
7248 these structures. For now though, I just want something that
7249 is simple to implement. */
7250 typedef struct abbrev_attr
7252 unsigned long attribute;
7254 struct abbrev_attr *next;
7258 typedef struct abbrev_entry
7260 unsigned long entry;
7263 struct abbrev_attr *first_attr;
7264 struct abbrev_attr *last_attr;
7265 struct abbrev_entry *next;
7269 static abbrev_entry *first_abbrev = NULL;
7270 static abbrev_entry *last_abbrev = NULL;
7275 abbrev_entry *abbrev;
7277 for (abbrev = first_abbrev; abbrev;)
7279 abbrev_entry *next = abbrev->next;
7282 for (attr = abbrev->first_attr; attr;)
7284 abbrev_attr *next = attr->next;
7294 last_abbrev = first_abbrev = NULL;
7298 add_abbrev (unsigned long number, unsigned long tag, int children)
7300 abbrev_entry *entry;
7302 entry = malloc (sizeof (*entry));
7308 entry->entry = number;
7310 entry->children = children;
7311 entry->first_attr = NULL;
7312 entry->last_attr = NULL;
7315 if (first_abbrev == NULL)
7316 first_abbrev = entry;
7318 last_abbrev->next = entry;
7320 last_abbrev = entry;
7324 add_abbrev_attr (unsigned long attribute, unsigned long form)
7328 attr = malloc (sizeof (*attr));
7334 attr->attribute = attribute;
7338 if (last_abbrev->first_attr == NULL)
7339 last_abbrev->first_attr = attr;
7341 last_abbrev->last_attr->next = attr;
7343 last_abbrev->last_attr = attr;
7346 /* Processes the (partial) contents of a .debug_abbrev section.
7347 Returns NULL if the end of the section was encountered.
7348 Returns the address after the last byte read if the end of
7349 an abbreviation set was found. */
7351 static unsigned char *
7352 process_abbrev_section (unsigned char *start, unsigned char *end)
7354 if (first_abbrev != NULL)
7360 unsigned long entry;
7362 unsigned long attribute;
7365 entry = read_leb128 (start, & bytes_read, 0);
7366 start += bytes_read;
7368 /* A single zero is supposed to end the section according
7369 to the standard. If there's more, then signal that to
7372 return start == end ? NULL : start;
7374 tag = read_leb128 (start, & bytes_read, 0);
7375 start += bytes_read;
7377 children = *start++;
7379 add_abbrev (entry, tag, children);
7385 attribute = read_leb128 (start, & bytes_read, 0);
7386 start += bytes_read;
7388 form = read_leb128 (start, & bytes_read, 0);
7389 start += bytes_read;
7392 add_abbrev_attr (attribute, form);
7394 while (attribute != 0);
7402 display_debug_macinfo (Elf_Internal_Shdr *section,
7403 unsigned char *start,
7404 FILE *file ATTRIBUTE_UNUSED)
7406 unsigned char *end = start + section->sh_size;
7407 unsigned char *curr = start;
7408 unsigned int bytes_read;
7409 enum dwarf_macinfo_record_type op;
7411 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7415 unsigned int lineno;
7423 case DW_MACINFO_start_file:
7425 unsigned int filenum;
7427 lineno = read_leb128 (curr, & bytes_read, 0);
7429 filenum = read_leb128 (curr, & bytes_read, 0);
7432 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
7436 case DW_MACINFO_end_file:
7437 printf (_(" DW_MACINFO_end_file\n"));
7440 case DW_MACINFO_define:
7441 lineno = read_leb128 (curr, & bytes_read, 0);
7444 curr += strlen (string) + 1;
7445 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7448 case DW_MACINFO_undef:
7449 lineno = read_leb128 (curr, & bytes_read, 0);
7452 curr += strlen (string) + 1;
7453 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7456 case DW_MACINFO_vendor_ext:
7458 unsigned int constant;
7460 constant = read_leb128 (curr, & bytes_read, 0);
7463 curr += strlen (string) + 1;
7464 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7475 display_debug_abbrev (Elf_Internal_Shdr *section,
7476 unsigned char *start,
7477 FILE *file ATTRIBUTE_UNUSED)
7479 abbrev_entry *entry;
7480 unsigned char *end = start + section->sh_size;
7482 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7486 start = process_abbrev_section (start, end);
7488 if (first_abbrev == NULL)
7491 printf (_(" Number TAG\n"));
7493 for (entry = first_abbrev; entry; entry = entry->next)
7497 printf (_(" %ld %s [%s]\n"),
7499 get_TAG_name (entry->tag),
7500 entry->children ? _("has children") : _("no children"));
7502 for (attr = entry->first_attr; attr; attr = attr->next)
7504 printf (_(" %-18s %s\n"),
7505 get_AT_name (attr->attribute),
7506 get_FORM_name (attr->form));
7520 static unsigned char *
7521 display_block (unsigned char *data, unsigned long length)
7523 printf (_(" %lu byte block: "), length);
7526 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7532 decode_location_expression (unsigned char * data,
7533 unsigned int pointer_size,
7534 unsigned long length)
7538 unsigned long uvalue;
7539 unsigned char *end = data + length;
7548 printf ("DW_OP_addr: %lx",
7549 (unsigned long) byte_get (data, pointer_size));
7550 data += pointer_size;
7553 printf ("DW_OP_deref");
7556 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7559 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7562 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7566 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7570 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7574 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7578 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7579 (unsigned long) byte_get (data + 4, 4));
7583 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7584 (long) byte_get (data + 4, 4));
7588 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7592 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7596 printf ("DW_OP_dup");
7599 printf ("DW_OP_drop");
7602 printf ("DW_OP_over");
7605 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7608 printf ("DW_OP_swap");
7611 printf ("DW_OP_rot");
7614 printf ("DW_OP_xderef");
7617 printf ("DW_OP_abs");
7620 printf ("DW_OP_and");
7623 printf ("DW_OP_div");
7626 printf ("DW_OP_minus");
7629 printf ("DW_OP_mod");
7632 printf ("DW_OP_mul");
7635 printf ("DW_OP_neg");
7638 printf ("DW_OP_not");
7641 printf ("DW_OP_or");
7644 printf ("DW_OP_plus");
7646 case DW_OP_plus_uconst:
7647 printf ("DW_OP_plus_uconst: %lu",
7648 read_leb128 (data, &bytes_read, 0));
7652 printf ("DW_OP_shl");
7655 printf ("DW_OP_shr");
7658 printf ("DW_OP_shra");
7661 printf ("DW_OP_xor");
7664 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7668 printf ("DW_OP_eq");
7671 printf ("DW_OP_ge");
7674 printf ("DW_OP_gt");
7677 printf ("DW_OP_le");
7680 printf ("DW_OP_lt");
7683 printf ("DW_OP_ne");
7686 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7722 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7757 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7792 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7793 read_leb128 (data, &bytes_read, 1));
7798 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7802 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7806 uvalue = read_leb128 (data, &bytes_read, 0);
7808 printf ("DW_OP_bregx: %lu %ld", uvalue,
7809 read_leb128 (data, &bytes_read, 1));
7813 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7816 case DW_OP_deref_size:
7817 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7819 case DW_OP_xderef_size:
7820 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7823 printf ("DW_OP_nop");
7826 /* DWARF 3 extensions. */
7827 case DW_OP_push_object_address:
7828 printf ("DW_OP_push_object_address");
7831 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7835 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7838 case DW_OP_call_ref:
7839 printf ("DW_OP_call_ref");
7842 /* GNU extensions. */
7843 case DW_OP_GNU_push_tls_address:
7844 printf ("DW_OP_GNU_push_tls_address");
7848 if (op >= DW_OP_lo_user
7849 && op <= DW_OP_hi_user)
7850 printf (_("(User defined location op)"));
7852 printf (_("(Unknown location op)"));
7853 /* No way to tell where the next op is, so just bail. */
7857 /* Separate the ops. */
7863 static const char *debug_loc_contents;
7864 static bfd_vma debug_loc_size;
7867 load_debug_loc (FILE *file)
7869 Elf_Internal_Shdr *sec;
7871 /* If it is already loaded, do nothing. */
7872 if (debug_loc_contents != NULL)
7875 /* Locate the .debug_loc section. */
7876 sec = find_section (".debug_loc");
7880 debug_loc_size = sec->sh_size;
7882 debug_loc_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7883 _("debug_loc section data"));
7887 free_debug_loc (void)
7889 if (debug_loc_contents == NULL)
7892 free ((char *) debug_loc_contents);
7893 debug_loc_contents = NULL;
7899 display_debug_loc (Elf_Internal_Shdr *section,
7900 unsigned char *start, FILE *file)
7902 unsigned char *section_end;
7903 unsigned long bytes;
7904 unsigned char *section_begin = start;
7906 unsigned int comp_unit = 0;
7908 addr = section->sh_addr;
7909 bytes = section->sh_size;
7910 section_end = start + bytes;
7914 printf (_("\nThe .debug_loc section is empty.\n"));
7918 if (num_debug_line_pointer_sizes == 0)
7919 get_debug_line_pointer_sizes (file);
7921 printf (_("Contents of the .debug_loc section:\n\n"));
7922 printf (_("\n Offset Begin End Expression\n"));
7924 while (start < section_end)
7926 unsigned long begin;
7928 unsigned short length;
7929 unsigned long offset;
7930 unsigned int pointer_size;
7932 offset = start - section_begin;
7934 /* Get the pointer size from the comp unit associated
7935 with this block of location information. */
7936 if (comp_unit >= num_debug_line_pointer_sizes)
7938 error (_("Not enough comp units for .debug_loc section\n"));
7943 pointer_size = debug_line_pointer_sizes [comp_unit];
7949 begin = byte_get (start, pointer_size);
7950 start += pointer_size;
7951 end = byte_get (start, pointer_size);
7952 start += pointer_size;
7954 if (begin == 0 && end == 0)
7957 /* For now, skip any base address specifiers. */
7958 if (begin == 0xffffffff)
7964 length = byte_get (start, 2);
7967 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7968 decode_location_expression (start, pointer_size, length);
7978 static const char *debug_str_contents;
7979 static bfd_vma debug_str_size;
7982 load_debug_str (FILE *file)
7984 Elf_Internal_Shdr *sec;
7986 /* If it is already loaded, do nothing. */
7987 if (debug_str_contents != NULL)
7990 /* Locate the .debug_str section. */
7991 sec = find_section (".debug_str");
7995 debug_str_size = sec->sh_size;
7997 debug_str_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7998 _("debug_str section data"));
8002 free_debug_str (void)
8004 if (debug_str_contents == NULL)
8007 free ((char *) debug_str_contents);
8008 debug_str_contents = NULL;
8013 fetch_indirect_string (unsigned long offset)
8015 if (debug_str_contents == NULL)
8016 return _("<no .debug_str section>");
8018 if (offset > debug_str_size)
8019 return _("<offset is too big>");
8021 return debug_str_contents + offset;
8025 display_debug_str (Elf_Internal_Shdr *section,
8026 unsigned char *start,
8027 FILE *file ATTRIBUTE_UNUSED)
8029 unsigned long bytes;
8032 addr = section->sh_addr;
8033 bytes = section->sh_size;
8037 printf (_("\nThe .debug_str section is empty.\n"));
8041 printf (_("Contents of the .debug_str section:\n\n"));
8049 lbytes = (bytes > 16 ? 16 : bytes);
8051 printf (" 0x%8.8lx ", (unsigned long) addr);
8053 for (j = 0; j < 16; j++)
8056 printf ("%2.2x", start[j]);
8064 for (j = 0; j < lbytes; j++)
8067 if (k >= ' ' && k < 0x80)
8083 static unsigned char *
8084 read_and_display_attr_value (unsigned long attribute,
8086 unsigned char *data,
8087 unsigned long cu_offset,
8088 unsigned long pointer_size,
8089 unsigned long offset_size,
8092 unsigned long uvalue = 0;
8093 unsigned char *block_start = NULL;
8101 case DW_FORM_ref_addr:
8102 if (dwarf_version == 2)
8104 uvalue = byte_get (data, pointer_size);
8105 data += pointer_size;
8107 else if (dwarf_version == 3)
8109 uvalue = byte_get (data, offset_size);
8110 data += offset_size;
8114 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8119 uvalue = byte_get (data, pointer_size);
8120 data += pointer_size;
8124 uvalue = byte_get (data, offset_size);
8125 data += offset_size;
8131 uvalue = byte_get (data++, 1);
8136 uvalue = byte_get (data, 2);
8142 uvalue = byte_get (data, 4);
8147 uvalue = read_leb128 (data, & bytes_read, 1);
8151 case DW_FORM_ref_udata:
8153 uvalue = read_leb128 (data, & bytes_read, 0);
8157 case DW_FORM_indirect:
8158 form = read_leb128 (data, & bytes_read, 0);
8160 printf (" %s", get_FORM_name (form));
8161 return read_and_display_attr_value (attribute, form, data, cu_offset,
8162 pointer_size, offset_size,
8168 case DW_FORM_ref_addr:
8169 printf (" <#%lx>", uvalue);
8175 case DW_FORM_ref_udata:
8176 printf (" <%lx>", uvalue + cu_offset);
8180 printf (" %#lx", uvalue);
8189 printf (" %ld", uvalue);
8194 uvalue = byte_get (data, 4);
8195 printf (" %lx", uvalue);
8196 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
8200 case DW_FORM_string:
8201 printf (" %s", data);
8202 data += strlen ((char *) data) + 1;
8206 uvalue = read_leb128 (data, & bytes_read, 0);
8207 block_start = data + bytes_read;
8208 data = display_block (block_start, uvalue);
8211 case DW_FORM_block1:
8212 uvalue = byte_get (data, 1);
8213 block_start = data + 1;
8214 data = display_block (block_start, uvalue);
8217 case DW_FORM_block2:
8218 uvalue = byte_get (data, 2);
8219 block_start = data + 2;
8220 data = display_block (block_start, uvalue);
8223 case DW_FORM_block4:
8224 uvalue = byte_get (data, 4);
8225 block_start = data + 4;
8226 data = display_block (block_start, uvalue);
8230 printf (_(" (indirect string, offset: 0x%lx): %s"),
8231 uvalue, fetch_indirect_string (uvalue));
8234 case DW_FORM_indirect:
8235 /* Handled above. */
8239 warn (_("Unrecognized form: %d\n"), form);
8243 /* For some attributes we can display further information. */
8252 case DW_INL_not_inlined:
8253 printf (_("(not inlined)"));
8255 case DW_INL_inlined:
8256 printf (_("(inlined)"));
8258 case DW_INL_declared_not_inlined:
8259 printf (_("(declared as inline but ignored)"));
8261 case DW_INL_declared_inlined:
8262 printf (_("(declared as inline and inlined)"));
8265 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
8270 case DW_AT_language:
8273 case DW_LANG_C: printf ("(non-ANSI C)"); break;
8274 case DW_LANG_C89: printf ("(ANSI C)"); break;
8275 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
8276 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
8277 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
8278 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
8279 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
8280 case DW_LANG_Ada83: printf ("(Ada)"); break;
8281 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
8282 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
8283 /* DWARF 2.1 values. */
8284 case DW_LANG_C99: printf ("(ANSI C99)"); break;
8285 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
8286 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
8287 /* MIPS extension. */
8288 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
8289 /* UPC extension. */
8290 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
8292 printf ("(Unknown: %lx)", uvalue);
8297 case DW_AT_encoding:
8300 case DW_ATE_void: printf ("(void)"); break;
8301 case DW_ATE_address: printf ("(machine address)"); break;
8302 case DW_ATE_boolean: printf ("(boolean)"); break;
8303 case DW_ATE_complex_float: printf ("(complex float)"); break;
8304 case DW_ATE_float: printf ("(float)"); break;
8305 case DW_ATE_signed: printf ("(signed)"); break;
8306 case DW_ATE_signed_char: printf ("(signed char)"); break;
8307 case DW_ATE_unsigned: printf ("(unsigned)"); break;
8308 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
8309 /* DWARF 2.1 value. */
8310 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
8312 if (uvalue >= DW_ATE_lo_user
8313 && uvalue <= DW_ATE_hi_user)
8314 printf ("(user defined type)");
8316 printf ("(unknown type)");
8321 case DW_AT_accessibility:
8324 case DW_ACCESS_public: printf ("(public)"); break;
8325 case DW_ACCESS_protected: printf ("(protected)"); break;
8326 case DW_ACCESS_private: printf ("(private)"); break;
8328 printf ("(unknown accessibility)");
8333 case DW_AT_visibility:
8336 case DW_VIS_local: printf ("(local)"); break;
8337 case DW_VIS_exported: printf ("(exported)"); break;
8338 case DW_VIS_qualified: printf ("(qualified)"); break;
8339 default: printf ("(unknown visibility)"); break;
8343 case DW_AT_virtuality:
8346 case DW_VIRTUALITY_none: printf ("(none)"); break;
8347 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8348 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8349 default: printf ("(unknown virtuality)"); break;
8353 case DW_AT_identifier_case:
8356 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8357 case DW_ID_up_case: printf ("(up_case)"); break;
8358 case DW_ID_down_case: printf ("(down_case)"); break;
8359 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8360 default: printf ("(unknown case)"); break;
8364 case DW_AT_calling_convention:
8367 case DW_CC_normal: printf ("(normal)"); break;
8368 case DW_CC_program: printf ("(program)"); break;
8369 case DW_CC_nocall: printf ("(nocall)"); break;
8371 if (uvalue >= DW_CC_lo_user
8372 && uvalue <= DW_CC_hi_user)
8373 printf ("(user defined)");
8375 printf ("(unknown convention)");
8379 case DW_AT_ordering:
8382 case -1: printf ("(undefined)"); break;
8383 case 0: printf ("(row major)"); break;
8384 case 1: printf ("(column major)"); break;
8388 case DW_AT_frame_base:
8389 case DW_AT_location:
8390 case DW_AT_data_member_location:
8391 case DW_AT_vtable_elem_location:
8392 case DW_AT_allocated:
8393 case DW_AT_associated:
8394 case DW_AT_data_location:
8396 case DW_AT_upper_bound:
8397 case DW_AT_lower_bound:
8401 decode_location_expression (block_start, pointer_size, uvalue);
8404 else if (form == DW_FORM_data4 || form == DW_FORM_data8)
8407 printf ("location list");
8419 static unsigned char *
8420 read_and_display_attr (unsigned long attribute,
8422 unsigned char *data,
8423 unsigned long cu_offset,
8424 unsigned long pointer_size,
8425 unsigned long offset_size,
8428 printf (" %-18s:", get_AT_name (attribute));
8429 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8430 pointer_size, offset_size, dwarf_version);
8436 display_debug_info (Elf_Internal_Shdr *section,
8437 unsigned char *start,
8440 unsigned char *end = start + section->sh_size;
8441 unsigned char *section_begin = start;
8443 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8445 load_debug_str (file);
8446 load_debug_loc (file);
8450 DWARF2_Internal_CompUnit compunit;
8451 Elf_Internal_Shdr *relsec;
8452 unsigned char *hdrptr;
8453 unsigned char *cu_abbrev_offset_ptr;
8454 unsigned char *tags;
8456 unsigned long cu_offset;
8458 int initial_length_size;
8462 compunit.cu_length = byte_get (hdrptr, 4);
8465 if (compunit.cu_length == 0xffffffff)
8467 compunit.cu_length = byte_get (hdrptr, 8);
8470 initial_length_size = 12;
8475 initial_length_size = 4;
8478 compunit.cu_version = byte_get (hdrptr, 2);
8481 /* Apply addends of RELA relocations. */
8482 for (relsec = section_headers;
8483 relsec < section_headers + elf_header.e_shnum;
8486 unsigned long nrelas;
8487 Elf_Internal_Rela *rela, *rp;
8488 Elf_Internal_Shdr *symsec;
8489 Elf_Internal_Sym *symtab;
8490 Elf_Internal_Sym *sym;
8492 if (relsec->sh_type != SHT_RELA
8493 || SECTION_HEADER (relsec->sh_info) != section
8494 || relsec->sh_size == 0)
8497 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8501 symsec = SECTION_HEADER (relsec->sh_link);
8502 symtab = GET_ELF_SYMBOLS (file, symsec);
8504 for (rp = rela; rp < rela + nrelas; ++rp)
8508 if (rp->r_offset >= (bfd_vma) (hdrptr - section_begin)
8509 && section->sh_size > (bfd_vma) offset_size
8510 && rp->r_offset <= section->sh_size - offset_size)
8511 loc = section_begin + rp->r_offset;
8517 sym = symtab + ELF32_R_SYM (rp->r_info);
8519 if (ELF32_R_SYM (rp->r_info) != 0
8520 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8522 warn (_("Skipping unexpected symbol type %u\n"),
8523 ELF32_ST_TYPE (sym->st_info));
8529 sym = symtab + ELF64_R_SYM (rp->r_info);
8531 if (ELF64_R_SYM (rp->r_info) != 0
8532 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8534 warn (_("Skipping unexpected symbol type %u\n"),
8535 ELF64_ST_TYPE (sym->st_info));
8540 byte_put (loc, rp->r_addend, offset_size);
8547 cu_abbrev_offset_ptr = hdrptr;
8548 compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
8549 hdrptr += offset_size;
8551 compunit.cu_pointer_size = byte_get (hdrptr, 1);
8555 cu_offset = start - section_begin;
8556 start += compunit.cu_length + initial_length_size;
8558 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8559 printf (_(" Length: %ld\n"), compunit.cu_length);
8560 printf (_(" Version: %d\n"), compunit.cu_version);
8561 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8562 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8564 if (compunit.cu_version != 2 && compunit.cu_version != 3)
8566 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8572 /* Read in the abbrevs used by this compilation unit. */
8574 Elf_Internal_Shdr *sec;
8575 unsigned char *begin;
8577 /* Locate the .debug_abbrev section and process it. */
8578 sec = find_section (".debug_abbrev");
8581 warn (_("Unable to locate .debug_abbrev section!\n"));
8585 begin = get_data (NULL, file, sec->sh_offset, sec->sh_size,
8586 _("debug_abbrev section data"));
8590 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8591 begin + sec->sh_size);
8597 while (tags < start)
8600 unsigned long abbrev_number;
8601 abbrev_entry *entry;
8604 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8607 /* A null DIE marks the end of a list of children. */
8608 if (abbrev_number == 0)
8614 /* Scan through the abbreviation list until we reach the
8616 for (entry = first_abbrev;
8617 entry && entry->entry != abbrev_number;
8618 entry = entry->next)
8623 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8628 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8630 (unsigned long) (tags - section_begin - bytes_read),
8632 get_TAG_name (entry->tag));
8634 for (attr = entry->first_attr; attr; attr = attr->next)
8635 tags = read_and_display_attr (attr->attribute,
8638 compunit.cu_pointer_size,
8640 compunit.cu_version);
8642 if (entry->children)
8656 display_debug_aranges (Elf_Internal_Shdr *section,
8657 unsigned char *start,
8658 FILE *file ATTRIBUTE_UNUSED)
8660 unsigned char *end = start + section->sh_size;
8662 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8666 unsigned char *hdrptr;
8667 DWARF2_Internal_ARange arange;
8668 unsigned char *ranges;
8669 unsigned long length;
8670 unsigned long address;
8673 int initial_length_size;
8677 arange.ar_length = byte_get (hdrptr, 4);
8680 if (arange.ar_length == 0xffffffff)
8682 arange.ar_length = byte_get (hdrptr, 8);
8685 initial_length_size = 12;
8690 initial_length_size = 4;
8693 arange.ar_version = byte_get (hdrptr, 2);
8696 arange.ar_info_offset = byte_get (hdrptr, offset_size);
8697 hdrptr += offset_size;
8699 arange.ar_pointer_size = byte_get (hdrptr, 1);
8702 arange.ar_segment_size = byte_get (hdrptr, 1);
8705 if (arange.ar_version != 2 && arange.ar_version != 3)
8707 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8711 printf (_(" Length: %ld\n"), arange.ar_length);
8712 printf (_(" Version: %d\n"), arange.ar_version);
8713 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8714 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8715 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8717 printf (_("\n Address Length\n"));
8721 /* Must pad to an alignment boundary that is twice the pointer size. */
8722 excess = (hdrptr - start) % (2 * arange.ar_pointer_size);
8724 ranges += (2 * arange.ar_pointer_size) - excess;
8728 address = byte_get (ranges, arange.ar_pointer_size);
8730 ranges += arange.ar_pointer_size;
8732 length = byte_get (ranges, arange.ar_pointer_size);
8734 ranges += arange.ar_pointer_size;
8736 /* A pair of zeros marks the end of the list. */
8737 if (address == 0 && length == 0)
8740 printf (" %8.8lx %lu\n", address, length);
8743 start += arange.ar_length + initial_length_size;
8751 typedef struct Frame_Chunk
8753 struct Frame_Chunk *next;
8754 unsigned char *chunk_start;
8756 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8757 short int *col_type;
8760 unsigned int code_factor;
8762 unsigned long pc_begin;
8763 unsigned long pc_range;
8767 unsigned char fde_encoding;
8768 unsigned char cfa_exp;
8772 /* A marker for a col_type that means this column was never referenced
8773 in the frame info. */
8774 #define DW_CFA_unreferenced (-1)
8777 frame_need_space (Frame_Chunk *fc, int reg)
8779 int prev = fc->ncols;
8781 if (reg < fc->ncols)
8784 fc->ncols = reg + 1;
8785 fc->col_type = xrealloc (fc->col_type, fc->ncols * sizeof (short int));
8786 fc->col_offset = xrealloc (fc->col_offset, fc->ncols * sizeof (int));
8788 while (prev < fc->ncols)
8790 fc->col_type[prev] = DW_CFA_unreferenced;
8791 fc->col_offset[prev] = 0;
8797 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
8802 if (*max_regs < fc->ncols)
8803 *max_regs = fc->ncols;
8805 if (*need_col_headers)
8807 *need_col_headers = 0;
8809 printf (" LOC CFA ");
8811 for (r = 0; r < *max_regs; r++)
8812 if (fc->col_type[r] != DW_CFA_unreferenced)
8817 printf ("r%-4d", r);
8823 printf ("%08lx ", fc->pc_begin);
8825 strcpy (tmp, "exp");
8827 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8828 printf ("%-8s ", tmp);
8830 for (r = 0; r < fc->ncols; r++)
8832 if (fc->col_type[r] != DW_CFA_unreferenced)
8834 switch (fc->col_type[r])
8836 case DW_CFA_undefined:
8839 case DW_CFA_same_value:
8843 sprintf (tmp, "c%+d", fc->col_offset[r]);
8845 case DW_CFA_register:
8846 sprintf (tmp, "r%d", fc->col_offset[r]);
8848 case DW_CFA_expression:
8849 strcpy (tmp, "exp");
8852 strcpy (tmp, "n/a");
8855 printf ("%-5s", tmp);
8862 size_of_encoded_value (int encoding)
8864 switch (encoding & 0x7)
8867 case 0: return is_32bit_elf ? 4 : 8;
8875 get_encoded_value (unsigned char *data, int encoding)
8877 int size = size_of_encoded_value (encoding);
8878 if (encoding & DW_EH_PE_signed)
8879 return byte_get_signed (data, size);
8881 return byte_get (data, size);
8884 #define GET(N) byte_get (start, N); start += N
8885 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8886 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8889 display_debug_frames (Elf_Internal_Shdr *section,
8890 unsigned char *start,
8891 FILE *file ATTRIBUTE_UNUSED)
8893 unsigned char *end = start + section->sh_size;
8894 unsigned char *section_start = start;
8895 Frame_Chunk *chunks = 0;
8896 Frame_Chunk *remembered_state = 0;
8898 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8901 int addr_size = is_32bit_elf ? 4 : 8;
8903 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8907 unsigned char *saved_start;
8908 unsigned char *block_end;
8909 unsigned long length;
8910 unsigned long cie_id;
8913 int need_col_headers = 1;
8914 unsigned char *augmentation_data = NULL;
8915 unsigned long augmentation_data_len = 0;
8916 int encoded_ptr_size = addr_size;
8918 int initial_length_size;
8920 saved_start = start;
8921 length = byte_get (start, 4); start += 4;
8925 printf ("\n%08lx ZERO terminator\n\n",
8926 (unsigned long)(saved_start - section_start));
8930 if (length == 0xffffffff)
8932 length = byte_get (start, 8);
8935 initial_length_size = 12;
8940 initial_length_size = 4;
8943 block_end = saved_start + length + initial_length_size;
8944 cie_id = byte_get (start, offset_size); start += offset_size;
8946 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8950 fc = xmalloc (sizeof (Frame_Chunk));
8951 memset (fc, 0, sizeof (Frame_Chunk));
8955 fc->chunk_start = saved_start;
8957 fc->col_type = xmalloc (sizeof (short int));
8958 fc->col_offset = xmalloc (sizeof (int));
8959 frame_need_space (fc, max_regs-1);
8963 fc->augmentation = start;
8964 start = strchr (start, '\0') + 1;
8966 if (fc->augmentation[0] == 'z')
8968 fc->code_factor = LEB ();
8969 fc->data_factor = SLEB ();
8970 fc->ra = byte_get (start, 1); start += 1;
8971 augmentation_data_len = LEB ();
8972 augmentation_data = start;
8973 start += augmentation_data_len;
8975 else if (strcmp (fc->augmentation, "eh") == 0)
8978 fc->code_factor = LEB ();
8979 fc->data_factor = SLEB ();
8980 fc->ra = byte_get (start, 1); start += 1;
8984 fc->code_factor = LEB ();
8985 fc->data_factor = SLEB ();
8986 fc->ra = byte_get (start, 1); start += 1;
8990 if (do_debug_frames_interp)
8991 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8992 (unsigned long)(saved_start - section_start), length, cie_id,
8993 fc->augmentation, fc->code_factor, fc->data_factor,
8997 printf ("\n%08lx %08lx %08lx CIE\n",
8998 (unsigned long)(saved_start - section_start), length, cie_id);
8999 printf (" Version: %d\n", version);
9000 printf (" Augmentation: \"%s\"\n", fc->augmentation);
9001 printf (" Code alignment factor: %u\n", fc->code_factor);
9002 printf (" Data alignment factor: %d\n", fc->data_factor);
9003 printf (" Return address column: %d\n", fc->ra);
9005 if (augmentation_data_len)
9008 printf (" Augmentation data: ");
9009 for (i = 0; i < augmentation_data_len; ++i)
9010 printf (" %02x", augmentation_data[i]);
9016 if (augmentation_data_len)
9018 unsigned char *p, *q;
9019 p = fc->augmentation + 1;
9020 q = augmentation_data;
9027 q += 1 + size_of_encoded_value (*q);
9029 fc->fde_encoding = *q++;
9035 if (fc->fde_encoding)
9036 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
9039 frame_need_space (fc, fc->ra);
9043 unsigned char *look_for;
9044 static Frame_Chunk fde_fc;
9047 memset (fc, 0, sizeof (Frame_Chunk));
9049 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
9051 for (cie = chunks; cie ; cie = cie->next)
9052 if (cie->chunk_start == look_for)
9057 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9058 cie_id, saved_start);
9061 fc->col_type = xmalloc (sizeof (short int));
9062 fc->col_offset = xmalloc (sizeof (int));
9063 frame_need_space (fc, max_regs - 1);
9065 fc->augmentation = "";
9066 fc->fde_encoding = 0;
9070 fc->ncols = cie->ncols;
9071 fc->col_type = xmalloc (fc->ncols * sizeof (short int));
9072 fc->col_offset = xmalloc (fc->ncols * sizeof (int));
9073 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
9074 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
9075 fc->augmentation = cie->augmentation;
9076 fc->code_factor = cie->code_factor;
9077 fc->data_factor = cie->data_factor;
9078 fc->cfa_reg = cie->cfa_reg;
9079 fc->cfa_offset = cie->cfa_offset;
9081 frame_need_space (fc, max_regs-1);
9082 fc->fde_encoding = cie->fde_encoding;
9085 if (fc->fde_encoding)
9086 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
9088 fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
9089 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
9090 fc->pc_begin += section->sh_addr + (start - section_start);
9091 start += encoded_ptr_size;
9092 fc->pc_range = byte_get (start, encoded_ptr_size);
9093 start += encoded_ptr_size;
9095 if (cie->augmentation[0] == 'z')
9097 augmentation_data_len = LEB ();
9098 augmentation_data = start;
9099 start += augmentation_data_len;
9102 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9103 (unsigned long)(saved_start - section_start), length, cie_id,
9104 (unsigned long)(cie->chunk_start - section_start),
9105 fc->pc_begin, fc->pc_begin + fc->pc_range);
9106 if (! do_debug_frames_interp && augmentation_data_len)
9109 printf (" Augmentation data: ");
9110 for (i = 0; i < augmentation_data_len; ++i)
9111 printf (" %02x", augmentation_data[i]);
9117 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9118 about to interpret instructions for the chunk. */
9119 /* ??? At present we need to do this always, since this sizes the
9120 fc->col_type and fc->col_offset arrays, which we write into always.
9121 We should probably split the interpreted and non-interpreted bits
9122 into two different routines, since there's so much that doesn't
9123 really overlap between them. */
9124 if (1 || do_debug_frames_interp)
9126 /* Start by making a pass over the chunk, allocating storage
9127 and taking note of what registers are used. */
9128 unsigned char *tmp = start;
9130 while (start < block_end)
9133 unsigned long reg, tmp;
9140 /* Warning: if you add any more cases to this switch, be
9141 sure to add them to the corresponding switch below. */
9144 case DW_CFA_advance_loc:
9148 frame_need_space (fc, opa);
9149 fc->col_type[opa] = DW_CFA_undefined;
9151 case DW_CFA_restore:
9152 frame_need_space (fc, opa);
9153 fc->col_type[opa] = DW_CFA_undefined;
9155 case DW_CFA_set_loc:
9156 start += encoded_ptr_size;
9158 case DW_CFA_advance_loc1:
9161 case DW_CFA_advance_loc2:
9164 case DW_CFA_advance_loc4:
9167 case DW_CFA_offset_extended:
9168 reg = LEB (); LEB ();
9169 frame_need_space (fc, reg);
9170 fc->col_type[reg] = DW_CFA_undefined;
9172 case DW_CFA_restore_extended:
9174 frame_need_space (fc, reg);
9175 fc->col_type[reg] = DW_CFA_undefined;
9177 case DW_CFA_undefined:
9179 frame_need_space (fc, reg);
9180 fc->col_type[reg] = DW_CFA_undefined;
9182 case DW_CFA_same_value:
9184 frame_need_space (fc, reg);
9185 fc->col_type[reg] = DW_CFA_undefined;
9187 case DW_CFA_register:
9188 reg = LEB (); LEB ();
9189 frame_need_space (fc, reg);
9190 fc->col_type[reg] = DW_CFA_undefined;
9192 case DW_CFA_def_cfa:
9195 case DW_CFA_def_cfa_register:
9198 case DW_CFA_def_cfa_offset:
9201 case DW_CFA_def_cfa_expression:
9205 case DW_CFA_expression:
9209 frame_need_space (fc, reg);
9210 fc->col_type[reg] = DW_CFA_undefined;
9212 case DW_CFA_offset_extended_sf:
9213 reg = LEB (); SLEB ();
9214 frame_need_space (fc, reg);
9215 fc->col_type[reg] = DW_CFA_undefined;
9217 case DW_CFA_def_cfa_sf:
9220 case DW_CFA_def_cfa_offset_sf:
9223 case DW_CFA_MIPS_advance_loc8:
9226 case DW_CFA_GNU_args_size:
9229 case DW_CFA_GNU_negative_offset_extended:
9230 reg = LEB (); LEB ();
9231 frame_need_space (fc, reg);
9232 fc->col_type[reg] = DW_CFA_undefined;
9241 /* Now we know what registers are used, make a second pass over
9242 the chunk, this time actually printing out the info. */
9244 while (start < block_end)
9247 unsigned long ul, reg, roffs;
9256 /* Warning: if you add any more cases to this switch, be
9257 sure to add them to the corresponding switch above. */
9260 case DW_CFA_advance_loc:
9261 if (do_debug_frames_interp)
9262 frame_display_row (fc, &need_col_headers, &max_regs);
9264 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9265 opa * fc->code_factor,
9266 fc->pc_begin + opa * fc->code_factor);
9267 fc->pc_begin += opa * fc->code_factor;
9272 if (! do_debug_frames_interp)
9273 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9274 opa, roffs * fc->data_factor);
9275 fc->col_type[opa] = DW_CFA_offset;
9276 fc->col_offset[opa] = roffs * fc->data_factor;
9279 case DW_CFA_restore:
9280 if (! do_debug_frames_interp)
9281 printf (" DW_CFA_restore: r%d\n", opa);
9282 fc->col_type[opa] = cie->col_type[opa];
9283 fc->col_offset[opa] = cie->col_offset[opa];
9286 case DW_CFA_set_loc:
9287 vma = get_encoded_value (start, fc->fde_encoding);
9288 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
9289 vma += section->sh_addr + (start - section_start);
9290 start += encoded_ptr_size;
9291 if (do_debug_frames_interp)
9292 frame_display_row (fc, &need_col_headers, &max_regs);
9294 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
9298 case DW_CFA_advance_loc1:
9299 ofs = byte_get (start, 1); start += 1;
9300 if (do_debug_frames_interp)
9301 frame_display_row (fc, &need_col_headers, &max_regs);
9303 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9304 ofs * fc->code_factor,
9305 fc->pc_begin + ofs * fc->code_factor);
9306 fc->pc_begin += ofs * fc->code_factor;
9309 case DW_CFA_advance_loc2:
9310 ofs = byte_get (start, 2); start += 2;
9311 if (do_debug_frames_interp)
9312 frame_display_row (fc, &need_col_headers, &max_regs);
9314 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9315 ofs * fc->code_factor,
9316 fc->pc_begin + ofs * fc->code_factor);
9317 fc->pc_begin += ofs * fc->code_factor;
9320 case DW_CFA_advance_loc4:
9321 ofs = byte_get (start, 4); start += 4;
9322 if (do_debug_frames_interp)
9323 frame_display_row (fc, &need_col_headers, &max_regs);
9325 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9326 ofs * fc->code_factor,
9327 fc->pc_begin + ofs * fc->code_factor);
9328 fc->pc_begin += ofs * fc->code_factor;
9331 case DW_CFA_offset_extended:
9334 if (! do_debug_frames_interp)
9335 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9336 reg, roffs * fc->data_factor);
9337 fc->col_type[reg] = DW_CFA_offset;
9338 fc->col_offset[reg] = roffs * fc->data_factor;
9341 case DW_CFA_restore_extended:
9343 if (! do_debug_frames_interp)
9344 printf (" DW_CFA_restore_extended: r%ld\n", reg);
9345 fc->col_type[reg] = cie->col_type[reg];
9346 fc->col_offset[reg] = cie->col_offset[reg];
9349 case DW_CFA_undefined:
9351 if (! do_debug_frames_interp)
9352 printf (" DW_CFA_undefined: r%ld\n", reg);
9353 fc->col_type[reg] = DW_CFA_undefined;
9354 fc->col_offset[reg] = 0;
9357 case DW_CFA_same_value:
9359 if (! do_debug_frames_interp)
9360 printf (" DW_CFA_same_value: r%ld\n", reg);
9361 fc->col_type[reg] = DW_CFA_same_value;
9362 fc->col_offset[reg] = 0;
9365 case DW_CFA_register:
9368 if (! do_debug_frames_interp)
9369 printf (" DW_CFA_register: r%ld in r%ld\n", reg, roffs);
9370 fc->col_type[reg] = DW_CFA_register;
9371 fc->col_offset[reg] = roffs;
9374 case DW_CFA_remember_state:
9375 if (! do_debug_frames_interp)
9376 printf (" DW_CFA_remember_state\n");
9377 rs = xmalloc (sizeof (Frame_Chunk));
9378 rs->ncols = fc->ncols;
9379 rs->col_type = xmalloc (rs->ncols * sizeof (short int));
9380 rs->col_offset = xmalloc (rs->ncols * sizeof (int));
9381 memcpy (rs->col_type, fc->col_type, rs->ncols);
9382 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
9383 rs->next = remembered_state;
9384 remembered_state = rs;
9387 case DW_CFA_restore_state:
9388 if (! do_debug_frames_interp)
9389 printf (" DW_CFA_restore_state\n");
9390 rs = remembered_state;
9393 remembered_state = rs->next;
9394 frame_need_space (fc, rs->ncols-1);
9395 memcpy (fc->col_type, rs->col_type, rs->ncols);
9396 memcpy (fc->col_offset, rs->col_offset,
9397 rs->ncols * sizeof (int));
9398 free (rs->col_type);
9399 free (rs->col_offset);
9402 else if (do_debug_frames_interp)
9403 printf ("Mismatched DW_CFA_restore_state\n");
9406 case DW_CFA_def_cfa:
9407 fc->cfa_reg = LEB ();
9408 fc->cfa_offset = LEB ();
9410 if (! do_debug_frames_interp)
9411 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9412 fc->cfa_reg, fc->cfa_offset);
9415 case DW_CFA_def_cfa_register:
9416 fc->cfa_reg = LEB ();
9418 if (! do_debug_frames_interp)
9419 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
9422 case DW_CFA_def_cfa_offset:
9423 fc->cfa_offset = LEB ();
9424 if (! do_debug_frames_interp)
9425 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
9429 if (! do_debug_frames_interp)
9430 printf (" DW_CFA_nop\n");
9433 case DW_CFA_def_cfa_expression:
9435 if (! do_debug_frames_interp)
9437 printf (" DW_CFA_def_cfa_expression (");
9438 decode_location_expression (start, addr_size, ul);
9445 case DW_CFA_expression:
9448 if (! do_debug_frames_interp)
9450 printf (" DW_CFA_expression: r%ld (", reg);
9451 decode_location_expression (start, addr_size, ul);
9454 fc->col_type[reg] = DW_CFA_expression;
9458 case DW_CFA_offset_extended_sf:
9461 frame_need_space (fc, reg);
9462 if (! do_debug_frames_interp)
9463 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9464 reg, l * fc->data_factor);
9465 fc->col_type[reg] = DW_CFA_offset;
9466 fc->col_offset[reg] = l * fc->data_factor;
9469 case DW_CFA_def_cfa_sf:
9470 fc->cfa_reg = LEB ();
9471 fc->cfa_offset = SLEB ();
9473 if (! do_debug_frames_interp)
9474 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9475 fc->cfa_reg, fc->cfa_offset);
9478 case DW_CFA_def_cfa_offset_sf:
9479 fc->cfa_offset = SLEB ();
9480 if (! do_debug_frames_interp)
9481 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
9484 case DW_CFA_MIPS_advance_loc8:
9485 ofs = byte_get (start, 8); start += 8;
9486 if (do_debug_frames_interp)
9487 frame_display_row (fc, &need_col_headers, &max_regs);
9489 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9490 ofs * fc->code_factor,
9491 fc->pc_begin + ofs * fc->code_factor);
9492 fc->pc_begin += ofs * fc->code_factor;
9495 case DW_CFA_GNU_window_save:
9496 if (! do_debug_frames_interp)
9497 printf (" DW_CFA_GNU_window_save\n");
9500 case DW_CFA_GNU_args_size:
9502 if (! do_debug_frames_interp)
9503 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9506 case DW_CFA_GNU_negative_offset_extended:
9509 frame_need_space (fc, reg);
9510 if (! do_debug_frames_interp)
9511 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9512 reg, l * fc->data_factor);
9513 fc->col_type[reg] = DW_CFA_offset;
9514 fc->col_offset[reg] = l * fc->data_factor;
9518 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
9523 if (do_debug_frames_interp)
9524 frame_display_row (fc, &need_col_headers, &max_regs);
9539 display_debug_not_supported (Elf_Internal_Shdr *section,
9540 unsigned char *start ATTRIBUTE_UNUSED,
9541 FILE *file ATTRIBUTE_UNUSED)
9543 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9544 SECTION_NAME (section));
9549 /* A structure containing the name of a debug section
9550 and a pointer to a function that can decode it. */
9553 const char *const name;
9554 int (*display) (Elf_Internal_Shdr *, unsigned char *, FILE *);
9558 { ".debug_abbrev", display_debug_abbrev },
9559 { ".debug_aranges", display_debug_aranges },
9560 { ".debug_frame", display_debug_frames },
9561 { ".debug_info", display_debug_info },
9562 { ".debug_line", display_debug_lines },
9563 { ".debug_pubnames", display_debug_pubnames },
9564 { ".eh_frame", display_debug_frames },
9565 { ".debug_macinfo", display_debug_macinfo },
9566 { ".debug_str", display_debug_str },
9567 { ".debug_loc", display_debug_loc },
9568 { ".debug_pubtypes", display_debug_pubnames },
9569 { ".debug_ranges", display_debug_not_supported },
9570 { ".debug_static_func", display_debug_not_supported },
9571 { ".debug_static_vars", display_debug_not_supported },
9572 { ".debug_types", display_debug_not_supported },
9573 { ".debug_weaknames", display_debug_not_supported }
9577 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
9579 char *name = SECTION_NAME (section);
9580 bfd_size_type length;
9581 unsigned char *start;
9584 length = section->sh_size;
9587 printf (_("\nSection '%s' has no debugging data.\n"), name);
9591 start = get_data (NULL, file, section->sh_offset, length,
9592 _("debug section data"));
9596 /* See if we know how to display the contents of this section. */
9597 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9598 name = ".debug_info";
9600 for (i = NUM_ELEM (debug_displays); i--;)
9601 if (strcmp (debug_displays[i].name, name) == 0)
9603 debug_displays[i].display (section, start, file);
9608 printf (_("Unrecognized debug section: %s\n"), name);
9612 /* If we loaded in the abbrev section at some point,
9613 we must release it here. */
9620 process_section_contents (FILE *file)
9622 Elf_Internal_Shdr *section;
9628 for (i = 0, section = section_headers;
9629 i < elf_header.e_shnum && i < num_dump_sects;
9632 #ifdef SUPPORT_DISASSEMBLY
9633 if (dump_sects[i] & DISASS_DUMP)
9634 disassemble_section (section, file);
9636 if (dump_sects[i] & HEX_DUMP)
9637 dump_section (section, file);
9639 if (dump_sects[i] & DEBUG_DUMP)
9640 display_debug_section (section, file);
9643 if (i < num_dump_sects)
9644 warn (_("Some sections were not dumped because they do not exist!\n"));
9650 process_mips_fpe_exception (int mask)
9655 if (mask & OEX_FPU_INEX)
9656 fputs ("INEX", stdout), first = 0;
9657 if (mask & OEX_FPU_UFLO)
9658 printf ("%sUFLO", first ? "" : "|"), first = 0;
9659 if (mask & OEX_FPU_OFLO)
9660 printf ("%sOFLO", first ? "" : "|"), first = 0;
9661 if (mask & OEX_FPU_DIV0)
9662 printf ("%sDIV0", first ? "" : "|"), first = 0;
9663 if (mask & OEX_FPU_INVAL)
9664 printf ("%sINVAL", first ? "" : "|");
9667 fputs ("0", stdout);
9671 process_mips_specific (FILE *file)
9673 Elf_Internal_Dyn *entry;
9674 size_t liblist_offset = 0;
9675 size_t liblistno = 0;
9676 size_t conflictsno = 0;
9677 size_t options_offset = 0;
9678 size_t conflicts_offset = 0;
9680 /* We have a lot of special sections. Thanks SGI! */
9681 if (dynamic_segment == NULL)
9682 /* No information available. */
9685 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9686 switch (entry->d_tag)
9688 case DT_MIPS_LIBLIST:
9690 = offset_from_vma (file, entry->d_un.d_val,
9691 liblistno * sizeof (Elf32_External_Lib));
9693 case DT_MIPS_LIBLISTNO:
9694 liblistno = entry->d_un.d_val;
9696 case DT_MIPS_OPTIONS:
9697 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9699 case DT_MIPS_CONFLICT:
9701 = offset_from_vma (file, entry->d_un.d_val,
9702 conflictsno * sizeof (Elf32_External_Conflict));
9704 case DT_MIPS_CONFLICTNO:
9705 conflictsno = entry->d_un.d_val;
9711 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9713 Elf32_External_Lib *elib;
9716 elib = get_data (NULL, file, liblist_offset,
9717 liblistno * sizeof (Elf32_External_Lib),
9721 printf ("\nSection '.liblist' contains %lu entries:\n",
9722 (unsigned long) liblistno);
9723 fputs (" Library Time Stamp Checksum Version Flags\n",
9726 for (cnt = 0; cnt < liblistno; ++cnt)
9733 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9734 time = BYTE_GET (elib[cnt].l_time_stamp);
9735 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9736 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9737 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9739 tmp = gmtime (&time);
9740 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9741 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9742 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9744 printf ("%3lu: ", (unsigned long) cnt);
9745 print_symbol (20, dynamic_strings + liblist.l_name);
9746 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9749 if (liblist.l_flags == 0)
9760 { " EXACT_MATCH", LL_EXACT_MATCH },
9761 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9762 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9763 { " EXPORTS", LL_EXPORTS },
9764 { " DELAY_LOAD", LL_DELAY_LOAD },
9765 { " DELTA", LL_DELTA }
9767 int flags = liblist.l_flags;
9771 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9773 if ((flags & l_flags_vals[fcnt].bit) != 0)
9775 fputs (l_flags_vals[fcnt].name, stdout);
9776 flags ^= l_flags_vals[fcnt].bit;
9779 printf (" %#x", (unsigned int) flags);
9789 if (options_offset != 0)
9791 Elf_External_Options *eopt;
9792 Elf_Internal_Shdr *sect = section_headers;
9793 Elf_Internal_Options *iopt;
9794 Elf_Internal_Options *option;
9798 /* Find the section header so that we get the size. */
9799 while (sect->sh_type != SHT_MIPS_OPTIONS)
9802 eopt = get_data (NULL, file, options_offset, sect->sh_size,
9806 iopt = malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt));
9809 error (_("Out of memory"));
9816 while (offset < sect->sh_size)
9818 Elf_External_Options *eoption;
9820 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9822 option->kind = BYTE_GET (eoption->kind);
9823 option->size = BYTE_GET (eoption->size);
9824 option->section = BYTE_GET (eoption->section);
9825 option->info = BYTE_GET (eoption->info);
9827 offset += option->size;
9833 printf (_("\nSection '%s' contains %d entries:\n"),
9834 SECTION_NAME (sect), cnt);
9842 switch (option->kind)
9845 /* This shouldn't happen. */
9846 printf (" NULL %d %lx", option->section, option->info);
9849 printf (" REGINFO ");
9850 if (elf_header.e_machine == EM_MIPS)
9853 Elf32_External_RegInfo *ereg;
9854 Elf32_RegInfo reginfo;
9856 ereg = (Elf32_External_RegInfo *) (option + 1);
9857 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9858 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9859 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9860 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9861 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9862 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9864 printf ("GPR %08lx GP 0x%lx\n",
9866 (unsigned long) reginfo.ri_gp_value);
9867 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9868 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9869 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9874 Elf64_External_RegInfo *ereg;
9875 Elf64_Internal_RegInfo reginfo;
9877 ereg = (Elf64_External_RegInfo *) (option + 1);
9878 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9879 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9880 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9881 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9882 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9883 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9885 printf ("GPR %08lx GP 0x",
9886 reginfo.ri_gprmask);
9887 printf_vma (reginfo.ri_gp_value);
9890 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9891 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9892 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9896 case ODK_EXCEPTIONS:
9897 fputs (" EXCEPTIONS fpe_min(", stdout);
9898 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9899 fputs (") fpe_max(", stdout);
9900 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9901 fputs (")", stdout);
9903 if (option->info & OEX_PAGE0)
9904 fputs (" PAGE0", stdout);
9905 if (option->info & OEX_SMM)
9906 fputs (" SMM", stdout);
9907 if (option->info & OEX_FPDBUG)
9908 fputs (" FPDBUG", stdout);
9909 if (option->info & OEX_DISMISS)
9910 fputs (" DISMISS", stdout);
9913 fputs (" PAD ", stdout);
9914 if (option->info & OPAD_PREFIX)
9915 fputs (" PREFIX", stdout);
9916 if (option->info & OPAD_POSTFIX)
9917 fputs (" POSTFIX", stdout);
9918 if (option->info & OPAD_SYMBOL)
9919 fputs (" SYMBOL", stdout);
9922 fputs (" HWPATCH ", stdout);
9923 if (option->info & OHW_R4KEOP)
9924 fputs (" R4KEOP", stdout);
9925 if (option->info & OHW_R8KPFETCH)
9926 fputs (" R8KPFETCH", stdout);
9927 if (option->info & OHW_R5KEOP)
9928 fputs (" R5KEOP", stdout);
9929 if (option->info & OHW_R5KCVTL)
9930 fputs (" R5KCVTL", stdout);
9933 fputs (" FILL ", stdout);
9934 /* XXX Print content of info word? */
9937 fputs (" TAGS ", stdout);
9938 /* XXX Print content of info word? */
9941 fputs (" HWAND ", stdout);
9942 if (option->info & OHWA0_R4KEOP_CHECKED)
9943 fputs (" R4KEOP_CHECKED", stdout);
9944 if (option->info & OHWA0_R4KEOP_CLEAN)
9945 fputs (" R4KEOP_CLEAN", stdout);
9948 fputs (" HWOR ", stdout);
9949 if (option->info & OHWA0_R4KEOP_CHECKED)
9950 fputs (" R4KEOP_CHECKED", stdout);
9951 if (option->info & OHWA0_R4KEOP_CLEAN)
9952 fputs (" R4KEOP_CLEAN", stdout);
9955 printf (" GP_GROUP %#06lx self-contained %#06lx",
9956 option->info & OGP_GROUP,
9957 (option->info & OGP_SELF) >> 16);
9960 printf (" IDENT %#06lx self-contained %#06lx",
9961 option->info & OGP_GROUP,
9962 (option->info & OGP_SELF) >> 16);
9965 /* This shouldn't happen. */
9966 printf (" %3d ??? %d %lx",
9967 option->kind, option->section, option->info);
9971 len = sizeof (*eopt);
9972 while (len < option->size)
9973 if (((char *) option)[len] >= ' '
9974 && ((char *) option)[len] < 0x7f)
9975 printf ("%c", ((char *) option)[len++]);
9977 printf ("\\%03o", ((char *) option)[len++]);
9979 fputs ("\n", stdout);
9987 if (conflicts_offset != 0 && conflictsno != 0)
9989 Elf32_Conflict *iconf;
9992 if (dynamic_symbols == NULL)
9994 error (_("conflict list found without a dynamic symbol table"));
9998 iconf = malloc (conflictsno * sizeof (*iconf));
10001 error (_("Out of memory"));
10007 Elf32_External_Conflict *econf32;
10009 econf32 = get_data (NULL, file, conflicts_offset,
10010 conflictsno * sizeof (*econf32), _("conflict"));
10014 for (cnt = 0; cnt < conflictsno; ++cnt)
10015 iconf[cnt] = BYTE_GET (econf32[cnt]);
10021 Elf64_External_Conflict *econf64;
10023 econf64 = get_data (NULL, file, conflicts_offset,
10024 conflictsno * sizeof (*econf64), _("conflict"));
10028 for (cnt = 0; cnt < conflictsno; ++cnt)
10029 iconf[cnt] = BYTE_GET (econf64[cnt]);
10034 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10035 (unsigned long) conflictsno);
10036 puts (_(" Num: Index Value Name"));
10038 for (cnt = 0; cnt < conflictsno; ++cnt)
10040 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
10042 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
10043 print_vma (psym->st_value, FULL_HEX);
10045 print_symbol (25, dynamic_strings + psym->st_name);
10056 process_gnu_liblist (FILE *file)
10058 Elf_Internal_Shdr *section, *string_sec;
10059 Elf32_External_Lib *elib;
10067 for (i = 0, section = section_headers;
10068 i < elf_header.e_shnum;
10071 switch (section->sh_type)
10073 case SHT_GNU_LIBLIST:
10074 elib = get_data (NULL, file, section->sh_offset, section->sh_size,
10079 string_sec = SECTION_HEADER (section->sh_link);
10081 strtab = get_data (NULL, file, string_sec->sh_offset,
10082 string_sec->sh_size, _("liblist string table"));
10085 || section->sh_entsize != sizeof (Elf32_External_Lib))
10091 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10092 SECTION_NAME (section),
10093 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
10095 puts (" Library Time Stamp Checksum Version Flags");
10097 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
10105 liblist.l_name = BYTE_GET (elib[cnt].l_name);
10106 time = BYTE_GET (elib[cnt].l_time_stamp);
10107 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
10108 liblist.l_version = BYTE_GET (elib[cnt].l_version);
10109 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
10111 tmp = gmtime (&time);
10112 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
10113 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10114 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10116 printf ("%3lu: ", (unsigned long) cnt);
10118 printf ("%-20s", strtab + liblist.l_name);
10120 printf ("%-20.20s", strtab + liblist.l_name);
10121 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
10122 liblist.l_version, liblist.l_flags);
10132 static const char *
10133 get_note_type (unsigned e_type)
10135 static char buff[64];
10139 case NT_AUXV: return _("NT_AUXV (auxiliary vector)");
10140 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
10141 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
10142 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
10143 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
10144 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
10145 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
10146 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
10147 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
10148 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10149 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10150 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10152 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
10157 static const char *
10158 get_netbsd_elfcore_note_type (unsigned e_type)
10160 static char buff[64];
10162 if (e_type == NT_NETBSDCORE_PROCINFO)
10164 /* NetBSD core "procinfo" structure. */
10165 return _("NetBSD procinfo structure");
10168 /* As of Jan 2002 there are no other machine-independent notes
10169 defined for NetBSD core files. If the note type is less
10170 than the start of the machine-dependent note types, we don't
10173 if (e_type < NT_NETBSDCORE_FIRSTMACH)
10175 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
10179 switch (elf_header.e_machine)
10181 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10182 and PT_GETFPREGS == mach+2. */
10187 case EM_SPARC32PLUS:
10191 case NT_NETBSDCORE_FIRSTMACH+0:
10192 return _("PT_GETREGS (reg structure)");
10193 case NT_NETBSDCORE_FIRSTMACH+2:
10194 return _("PT_GETFPREGS (fpreg structure)");
10200 /* On all other arch's, PT_GETREGS == mach+1 and
10201 PT_GETFPREGS == mach+3. */
10205 case NT_NETBSDCORE_FIRSTMACH+1:
10206 return _("PT_GETREGS (reg structure)");
10207 case NT_NETBSDCORE_FIRSTMACH+3:
10208 return _("PT_GETFPREGS (fpreg structure)");
10214 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
10218 /* Note that by the ELF standard, the name field is already null byte
10219 terminated, and namesz includes the terminating null byte.
10220 I.E. the value of namesz for the name "FSF" is 4.
10222 If the value of namesz is zero, there is no name present. */
10224 process_note (Elf_Internal_Note *pnote)
10228 if (pnote->namesz == 0)
10230 /* If there is no note name, then use the default set of
10231 note type strings. */
10232 nt = get_note_type (pnote->type);
10234 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
10236 /* NetBSD-specific core file notes. */
10237 nt = get_netbsd_elfcore_note_type (pnote->type);
10241 /* Don't recognize this note name; just use the default set of
10242 note type strings. */
10243 nt = get_note_type (pnote->type);
10246 printf (" %s\t\t0x%08lx\t%s\n",
10247 pnote->namesz ? pnote->namedata : "(NONE)",
10248 pnote->descsz, nt);
10254 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
10256 Elf_External_Note *pnotes;
10257 Elf_External_Note *external;
10263 pnotes = get_data (NULL, file, offset, length, _("notes"));
10269 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10270 (unsigned long) offset, (unsigned long) length);
10271 printf (_(" Owner\t\tData size\tDescription\n"));
10273 while (external < (Elf_External_Note *)((char *) pnotes + length))
10275 Elf_External_Note *next;
10276 Elf_Internal_Note inote;
10279 inote.type = BYTE_GET (external->type);
10280 inote.namesz = BYTE_GET (external->namesz);
10281 inote.namedata = external->name;
10282 inote.descsz = BYTE_GET (external->descsz);
10283 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
10284 inote.descpos = offset + (inote.descdata - (char *) pnotes);
10286 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
10288 if (((char *) next) > (((char *) pnotes) + length))
10290 warn (_("corrupt note found at offset %x into core notes\n"),
10291 ((char *) external) - ((char *) pnotes));
10292 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10293 inote.type, inote.namesz, inote.descsz);
10299 /* Verify that name is null terminated. It appears that at least
10300 one version of Linux (RedHat 6.0) generates corefiles that don't
10301 comply with the ELF spec by failing to include the null byte in
10303 if (inote.namedata[inote.namesz] != '\0')
10305 temp = malloc (inote.namesz + 1);
10309 error (_("Out of memory\n"));
10314 strncpy (temp, inote.namedata, inote.namesz);
10315 temp[inote.namesz] = 0;
10317 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10318 inote.namedata = temp;
10321 res &= process_note (& inote);
10336 process_corefile_note_segments (FILE *file)
10338 Elf_Internal_Phdr *segment;
10342 if (! get_program_headers (file))
10345 for (i = 0, segment = program_headers;
10346 i < elf_header.e_phnum;
10349 if (segment->p_type == PT_NOTE)
10350 res &= process_corefile_note_segment (file,
10351 (bfd_vma) segment->p_offset,
10352 (bfd_vma) segment->p_filesz);
10359 process_corefile_contents (FILE *file)
10361 /* If we have not been asked to display the notes then do nothing. */
10365 /* If file is not a core file then exit. */
10366 if (elf_header.e_type != ET_CORE)
10369 /* No program headers means no NOTE segment. */
10370 if (elf_header.e_phnum == 0)
10372 printf (_("No note segments present in the core file.\n"));
10376 return process_corefile_note_segments (file);
10380 process_arch_specific (FILE *file)
10385 switch (elf_header.e_machine)
10388 case EM_MIPS_RS3_LE:
10389 return process_mips_specific (file);
10398 get_file_header (FILE *file)
10400 /* Read in the identity array. */
10401 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10404 /* Determine how to read the rest of the header. */
10405 switch (elf_header.e_ident[EI_DATA])
10407 default: /* fall through */
10408 case ELFDATANONE: /* fall through */
10410 byte_get = byte_get_little_endian;
10411 byte_put = byte_put_little_endian;
10414 byte_get = byte_get_big_endian;
10415 byte_put = byte_put_big_endian;
10419 /* For now we only support 32 bit and 64 bit ELF files. */
10420 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10422 /* Read in the rest of the header. */
10425 Elf32_External_Ehdr ehdr32;
10427 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10430 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10431 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10432 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10433 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10434 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10435 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10436 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10437 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10438 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10439 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10440 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10441 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10442 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10446 Elf64_External_Ehdr ehdr64;
10448 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10449 we will not be able to cope with the 64bit data found in
10450 64 ELF files. Detect this now and abort before we start
10451 overwriting things. */
10452 if (sizeof (bfd_vma) < 8)
10454 error (_("This instance of readelf has been built without support for a\n\
10455 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10459 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10462 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10463 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10464 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10465 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
10466 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
10467 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
10468 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10469 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10470 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10471 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10472 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10473 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10474 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10477 if (elf_header.e_shoff)
10479 /* There may be some extensions in the first section header. Don't
10480 bomb if we can't read it. */
10482 get_32bit_section_headers (file, 1);
10484 get_64bit_section_headers (file, 1);
10490 /* Process one ELF object file according to the command line options.
10491 This file may actually be stored in an archive. The file is
10492 positioned at the start of the ELF object. */
10495 process_object (char *file_name, FILE *file)
10499 if (! get_file_header (file))
10501 error (_("%s: Failed to read file header\n"), file_name);
10505 /* Initialise per file variables. */
10506 for (i = NUM_ELEM (version_info); i--;)
10507 version_info[i] = 0;
10509 for (i = NUM_ELEM (dynamic_info); i--;)
10510 dynamic_info[i] = 0;
10512 /* Process the file. */
10514 printf (_("\nFile: %s\n"), file_name);
10516 if (! process_file_header ())
10519 if (! process_section_headers (file)
10520 || ! process_section_groups (file))
10522 /* Without loaded section headers and section groups we
10523 cannot process lots of things. */
10524 do_unwind = do_version = do_dump = do_arch = 0;
10526 if (! do_using_dynamic)
10527 do_syms = do_reloc = 0;
10530 if (process_program_headers (file))
10531 process_dynamic_segment (file);
10533 process_relocs (file);
10535 process_unwind (file);
10537 process_symbol_table (file);
10539 process_syminfo (file);
10541 process_version_sections (file);
10543 process_section_contents (file);
10545 process_corefile_contents (file);
10547 process_gnu_liblist (file);
10549 process_arch_specific (file);
10551 if (program_headers)
10553 free (program_headers);
10554 program_headers = NULL;
10557 if (section_headers)
10559 free (section_headers);
10560 section_headers = NULL;
10565 free (string_table);
10566 string_table = NULL;
10567 string_table_length = 0;
10570 if (dynamic_strings)
10572 free (dynamic_strings);
10573 dynamic_strings = NULL;
10576 if (dynamic_symbols)
10578 free (dynamic_symbols);
10579 dynamic_symbols = NULL;
10580 num_dynamic_syms = 0;
10583 if (dynamic_syminfo)
10585 free (dynamic_syminfo);
10586 dynamic_syminfo = NULL;
10589 if (section_headers_groups)
10591 free (section_headers_groups);
10592 section_headers_groups = NULL;
10595 if (section_groups)
10597 struct group_list *g, *next;
10599 for (i = 0; i < group_count; i++)
10601 for (g = section_groups [i].root; g != NULL; g = next)
10608 free (section_groups);
10609 section_groups = NULL;
10615 /* Process an ELF archive. The file is positioned just after the
10619 process_archive (char *file_name, FILE *file)
10621 struct ar_hdr arhdr;
10623 unsigned long size;
10624 char *longnames = NULL;
10625 unsigned long longnames_size = 0;
10626 size_t file_name_size;
10631 got = fread (&arhdr, 1, sizeof arhdr, file);
10632 if (got != sizeof arhdr)
10637 error (_("%s: failed to read archive header\n"), file_name);
10641 if (memcmp (arhdr.ar_name, "/ ", 16) == 0)
10643 /* This is the archive symbol table. Skip it.
10644 FIXME: We should have an option to dump it. */
10645 size = strtoul (arhdr.ar_size, NULL, 10);
10646 if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
10648 error (_("%s: failed to skip archive symbol table\n"), file_name);
10652 got = fread (&arhdr, 1, sizeof arhdr, file);
10653 if (got != sizeof arhdr)
10658 error (_("%s: failed to read archive header\n"), file_name);
10663 if (memcmp (arhdr.ar_name, "// ", 16) == 0)
10665 /* This is the archive string table holding long member
10668 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
10670 longnames = malloc (longnames_size);
10671 if (longnames == NULL)
10673 error (_("Out of memory\n"));
10677 if (fread (longnames, longnames_size, 1, file) != 1)
10680 error(_("%s: failed to read string table\n"), file_name);
10684 if ((longnames_size & 1) != 0)
10687 got = fread (&arhdr, 1, sizeof arhdr, file);
10688 if (got != sizeof arhdr)
10695 error (_("%s: failed to read archive header\n"), file_name);
10700 file_name_size = strlen (file_name);
10709 if (arhdr.ar_name[0] == '/')
10713 off = strtoul (arhdr.ar_name + 1, NULL, 10);
10714 if (off >= longnames_size)
10716 error (_("%s: invalid archive string table offset %lu\n"), off);
10721 name = longnames + off;
10722 nameend = memchr (name, '/', longnames_size - off);
10726 name = arhdr.ar_name;
10727 nameend = memchr (name, '/', 16);
10730 if (nameend == NULL)
10732 error (_("%s: bad archive file name\n"));
10737 namealc = malloc (file_name_size + (nameend - name) + 3);
10738 if (namealc == NULL)
10740 error (_("Out of memory\n"));
10745 memcpy (namealc, file_name, file_name_size);
10746 namealc[file_name_size] = '(';
10747 memcpy (namealc + file_name_size + 1, name, nameend - name);
10748 namealc[file_name_size + 1 + (nameend - name)] = ')';
10749 namealc[file_name_size + 2 + (nameend - name)] = '\0';
10751 archive_file_offset = ftell (file);
10752 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
10754 ret |= process_object (namealc, file);
10759 (archive_file_offset
10760 + archive_file_size
10761 + (archive_file_size & 1)),
10764 error (_("%s: failed to seek to next archive header\n"), file_name);
10769 got = fread (&arhdr, 1, sizeof arhdr, file);
10770 if (got != sizeof arhdr)
10775 error (_("%s: failed to read archive header\n"), file_name);
10781 if (longnames != 0)
10788 process_file (char *file_name)
10791 struct stat statbuf;
10792 char armag[SARMAG];
10795 if (stat (file_name, &statbuf) < 0)
10797 if (errno == ENOENT)
10798 error (_("'%s': No such file\n"), file_name);
10800 error (_("Could not locate '%s'. System error message: %s\n"),
10801 file_name, strerror (errno));
10805 if (! S_ISREG (statbuf.st_mode))
10807 error (_("'%s' is not an ordinary file\n"), file_name);
10811 file = fopen (file_name, "rb");
10814 error (_("Input file '%s' is not readable.\n"), file_name);
10818 if (fread (armag, SARMAG, 1, file) != 1)
10820 error (_("%s: Failed to read file header\n"), file_name);
10825 if (memcmp (armag, ARMAG, SARMAG) == 0)
10826 ret = process_archive (file_name, file);
10830 archive_file_size = archive_file_offset = 0;
10831 ret = process_object (file_name, file);
10839 #ifdef SUPPORT_DISASSEMBLY
10840 /* Needed by the i386 disassembler. For extra credit, someone could
10841 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10845 print_address (unsigned int addr, FILE *outfile)
10847 fprintf (outfile,"0x%8.8x", addr);
10850 /* Needed by the i386 disassembler. */
10852 db_task_printsym (unsigned int addr)
10854 print_address (addr, stderr);
10859 main (int argc, char **argv)
10862 char *cmdline_dump_sects = NULL;
10863 unsigned num_cmdline_dump_sects = 0;
10865 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10866 setlocale (LC_MESSAGES, "");
10868 #if defined (HAVE_SETLOCALE)
10869 setlocale (LC_CTYPE, "");
10871 bindtextdomain (PACKAGE, LOCALEDIR);
10872 textdomain (PACKAGE);
10874 parse_args (argc, argv);
10876 if (optind < (argc - 1))
10879 /* When processing more than one file remember the dump requests
10880 issued on command line to reset them after each file. */
10881 if (optind + 1 < argc && dump_sects != NULL)
10883 cmdline_dump_sects = malloc (num_dump_sects);
10884 if (cmdline_dump_sects == NULL)
10885 error (_("Out of memory allocating dump request table."));
10888 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
10889 num_cmdline_dump_sects = num_dump_sects;
10894 while (optind < argc)
10896 err |= process_file (argv[optind++]);
10898 /* Reset dump requests. */
10899 if (optind < argc && dump_sects != NULL)
10901 num_dump_sects = num_cmdline_dump_sects;
10902 if (num_cmdline_dump_sects > 0)
10903 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
10907 if (dump_sects != NULL)
10909 if (cmdline_dump_sects != NULL)
10910 free (cmdline_dump_sects);