1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
63 #include "elf/dwarf2.h"
65 /* The following headers use the elf/reloc-macros.h file to
66 automatically generate relocation recognition functions
67 such as elf_mips_reloc_type() */
69 #define RELOC_MACROS_GEN_FUNC
71 #include "elf/alpha.h"
91 #include "elf/m68hc11.h"
92 #include "elf/mcore.h"
95 #include "elf/mn10200.h"
96 #include "elf/mn10300.h"
97 #include "elf/msp430.h"
101 #include "elf/ppc64.h"
102 #include "elf/s390.h"
104 #include "elf/sparc.h"
105 #include "elf/v850.h"
107 #include "elf/x86-64.h"
108 #include "elf/xstormy16.h"
110 #include "elf/iq2000.h"
111 #include "elf/xtensa.h"
117 #include "libiberty.h"
119 char *program_name = "readelf";
120 static long archive_file_offset;
121 static unsigned long archive_file_size;
122 static unsigned long dynamic_addr;
123 static bfd_size_type dynamic_size;
124 static unsigned int dynamic_nent;
125 static char *dynamic_strings;
126 static unsigned long dynamic_strings_length;
127 static char *string_table;
128 static unsigned long string_table_length;
129 static unsigned long num_dynamic_syms;
130 static Elf_Internal_Sym *dynamic_symbols;
131 static Elf_Internal_Syminfo *dynamic_syminfo;
132 static unsigned long dynamic_syminfo_offset;
133 static unsigned int dynamic_syminfo_nent;
134 static char program_interpreter[64];
135 static bfd_vma dynamic_info[DT_JMPREL + 1];
136 static bfd_vma version_info[16];
137 static Elf_Internal_Ehdr elf_header;
138 static Elf_Internal_Shdr *section_headers;
139 static Elf_Internal_Phdr *program_headers;
140 static Elf_Internal_Dyn *dynamic_section;
141 static Elf_Internal_Shdr *symtab_shndx_hdr;
142 static int show_name;
143 static int do_dynamic;
146 static int do_sections;
147 static int do_section_groups;
148 static int do_full_section_name;
149 static int do_segments;
150 static int do_unwind;
151 static int do_using_dynamic;
152 static int do_header;
154 static int do_version;
156 static int do_histogram;
157 static int do_debugging;
158 static int do_debug_info;
159 static int do_debug_abbrevs;
160 static int do_debug_lines;
161 static int do_debug_pubnames;
162 static int do_debug_aranges;
163 static int do_debug_ranges;
164 static int do_debug_frames;
165 static int do_debug_frames_interp;
166 static int do_debug_macinfo;
167 static int do_debug_str;
168 static int do_debug_loc;
171 static int is_32bit_elf;
172 static int have_frame_base;
173 static int need_base_address;
174 static bfd_vma eh_addr_size;
178 struct group_list *next;
179 unsigned int section_index;
184 struct group_list *root;
185 unsigned int group_index;
188 static size_t group_count;
189 static struct group *section_groups;
190 static struct group **section_headers_groups;
192 /* A dynamic array of flags indicating for which sections a hex dump
193 has been requested (via the -x switch) and/or a disassembly dump
194 (via the -i switch). */
195 char *cmdline_dump_sects = NULL;
196 unsigned num_cmdline_dump_sects = 0;
198 /* A dynamic array of flags indicating for which sections a dump of
199 some kind has been requested. It is reset on a per-object file
200 basis and then initialised from the cmdline_dump_sects array and
201 the results of interpreting the -w switch. */
202 char *dump_sects = NULL;
203 unsigned int num_dump_sects = 0;
205 #define HEX_DUMP (1 << 0)
206 #define DISASS_DUMP (1 << 1)
207 #define DEBUG_DUMP (1 << 2)
209 /* How to rpint a vma value. */
210 typedef enum print_mode
222 static bfd_vma (*byte_get) (unsigned char *, int);
223 static void (*byte_put) (unsigned char *, bfd_vma, int);
227 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
228 ((X)->sh_name >= string_table_length \
229 ? "<corrupt>" : string_table + (X)->sh_name))
231 /* Given st_shndx I, map to section_headers index. */
232 #define SECTION_HEADER_INDEX(I) \
233 ((I) < SHN_LORESERVE \
235 : ((I) <= SHN_HIRESERVE \
237 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
239 /* Reverse of the above. */
240 #define SECTION_HEADER_NUM(N) \
241 ((N) < SHN_LORESERVE \
243 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
245 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
247 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
249 #define BYTE_GET(field) byte_get (field, sizeof (field))
251 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
253 #define GET_ELF_SYMBOLS(file, section) \
254 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
255 : get_64bit_elf_symbols (file, section))
257 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
258 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
259 already been called and verified that the string exists. */
260 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
262 /* This is just a bit of syntatic sugar. */
263 #define streq(a,b) (strcmp ((a), (b)) == 0)
264 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
267 error (const char *message, ...)
271 va_start (args, message);
272 fprintf (stderr, _("%s: Error: "), program_name);
273 vfprintf (stderr, message, args);
278 warn (const char *message, ...)
282 va_start (args, message);
283 fprintf (stderr, _("%s: Warning: "), program_name);
284 vfprintf (stderr, message, args);
289 get_data (void *var, FILE *file, long offset, size_t size, const char *reason)
296 if (fseek (file, archive_file_offset + offset, SEEK_SET))
298 error (_("Unable to seek to 0x%x for %s\n"),
299 archive_file_offset + offset, reason);
306 mvar = malloc (size);
310 error (_("Out of memory allocating 0x%x bytes for %s\n"),
316 if (fread (mvar, size, 1, file) != 1)
318 error (_("Unable to read in 0x%x bytes of %s\n"), size, reason);
328 byte_get_little_endian (unsigned char *field, int size)
336 return ((unsigned int) (field[0]))
337 | (((unsigned int) (field[1])) << 8);
341 /* We want to extract data from an 8 byte wide field and
342 place it into a 4 byte wide field. Since this is a little
343 endian source we can just use the 4 byte extraction code. */
347 return ((unsigned long) (field[0]))
348 | (((unsigned long) (field[1])) << 8)
349 | (((unsigned long) (field[2])) << 16)
350 | (((unsigned long) (field[3])) << 24);
354 return ((bfd_vma) (field[0]))
355 | (((bfd_vma) (field[1])) << 8)
356 | (((bfd_vma) (field[2])) << 16)
357 | (((bfd_vma) (field[3])) << 24)
358 | (((bfd_vma) (field[4])) << 32)
359 | (((bfd_vma) (field[5])) << 40)
360 | (((bfd_vma) (field[6])) << 48)
361 | (((bfd_vma) (field[7])) << 56);
364 error (_("Unhandled data length: %d\n"), size);
370 byte_get_signed (unsigned char *field, int size)
372 bfd_vma x = byte_get (field, size);
377 return (x ^ 0x80) - 0x80;
379 return (x ^ 0x8000) - 0x8000;
381 return (x ^ 0x80000000) - 0x80000000;
390 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
395 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
396 field[6] = ((value >> 24) >> 24) & 0xff;
397 field[5] = ((value >> 24) >> 16) & 0xff;
398 field[4] = ((value >> 24) >> 8) & 0xff;
401 field[3] = (value >> 24) & 0xff;
402 field[2] = (value >> 16) & 0xff;
405 field[1] = (value >> 8) & 0xff;
408 field[0] = value & 0xff;
412 error (_("Unhandled data length: %d\n"), size);
417 #if defined BFD64 && !BFD_HOST_64BIT_LONG
419 print_dec_vma (bfd_vma vma, int is_signed)
425 if (is_signed && (bfd_signed_vma) vma < 0)
434 *bufp++ = '0' + vma % 10;
446 print_hex_vma (bfd_vma vma)
454 char digit = '0' + (vma & 0x0f);
456 digit += 'a' - '0' - 10;
469 /* Print a VMA value. */
471 print_vma (bfd_vma vma, print_mode mode)
480 return printf ("0x%8.8lx", (unsigned long) vma);
483 return printf ("%8.8lx", (unsigned long) vma);
487 return printf ("%5ld", (long) vma);
491 return printf ("0x%lx", (unsigned long) vma);
494 return printf ("%lx", (unsigned long) vma);
497 return printf ("%ld", (unsigned long) vma);
500 return printf ("%lu", (unsigned long) vma);
523 #if BFD_HOST_64BIT_LONG
524 return nc + printf ("%lx", vma);
526 return nc + print_hex_vma (vma);
530 #if BFD_HOST_64BIT_LONG
531 return printf ("%ld", vma);
533 return print_dec_vma (vma, 1);
537 #if BFD_HOST_64BIT_LONG
539 return printf ("%5ld", vma);
541 return printf ("%#lx", vma);
544 return printf ("%5ld", _bfd_int64_low (vma));
546 return print_hex_vma (vma);
550 #if BFD_HOST_64BIT_LONG
551 return printf ("%lu", vma);
553 return print_dec_vma (vma, 0);
561 /* Display a symbol on stdout. If do_wide is not true then
562 format the symbol to be at most WIDTH characters,
563 truncating as necessary. If WIDTH is negative then
564 format the string to be exactly - WIDTH characters,
565 truncating or padding as necessary. */
568 print_symbol (int width, const char *symbol)
571 printf ("%s", symbol);
573 printf ("%-*.*s", width, width, symbol);
575 printf ("%-.*s", width, symbol);
579 byte_get_big_endian (unsigned char *field, int size)
587 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
591 /* Although we are extracing data from an 8 byte wide field,
592 we are returning only 4 bytes of data. */
597 return ((unsigned long) (field[3]))
598 | (((unsigned long) (field[2])) << 8)
599 | (((unsigned long) (field[1])) << 16)
600 | (((unsigned long) (field[0])) << 24);
604 return ((bfd_vma) (field[7]))
605 | (((bfd_vma) (field[6])) << 8)
606 | (((bfd_vma) (field[5])) << 16)
607 | (((bfd_vma) (field[4])) << 24)
608 | (((bfd_vma) (field[3])) << 32)
609 | (((bfd_vma) (field[2])) << 40)
610 | (((bfd_vma) (field[1])) << 48)
611 | (((bfd_vma) (field[0])) << 56);
615 error (_("Unhandled data length: %d\n"), size);
621 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
626 field[7] = value & 0xff;
627 field[6] = (value >> 8) & 0xff;
628 field[5] = (value >> 16) & 0xff;
629 field[4] = (value >> 24) & 0xff;
634 field[3] = value & 0xff;
635 field[2] = (value >> 8) & 0xff;
639 field[1] = value & 0xff;
643 field[0] = value & 0xff;
647 error (_("Unhandled data length: %d\n"), size);
652 /* Return a pointer to section NAME, or NULL if no such section exists. */
654 static Elf_Internal_Shdr *
655 find_section (const char *name)
659 for (i = 0; i < elf_header.e_shnum; i++)
660 if (streq (SECTION_NAME (section_headers + i), name))
661 return section_headers + i;
666 /* Guess the relocation size commonly used by the specific machines. */
669 guess_is_rela (unsigned long e_machine)
673 /* Targets that use REL relocations. */
688 /* Targets that use RELA relocations. */
703 case EM_CYGNUS_MN10200:
705 case EM_CYGNUS_MN10300:
752 warn (_("Don't know about relocations on this machine architecture\n"));
758 slurp_rela_relocs (FILE *file,
759 unsigned long rel_offset,
760 unsigned long rel_size,
761 Elf_Internal_Rela **relasp,
762 unsigned long *nrelasp)
764 Elf_Internal_Rela *relas;
765 unsigned long nrelas;
770 Elf32_External_Rela *erelas;
772 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
776 nrelas = rel_size / sizeof (Elf32_External_Rela);
778 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
782 error (_("out of memory parsing relocs"));
786 for (i = 0; i < nrelas; i++)
788 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
789 relas[i].r_info = BYTE_GET (erelas[i].r_info);
790 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
797 Elf64_External_Rela *erelas;
799 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
803 nrelas = rel_size / sizeof (Elf64_External_Rela);
805 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
809 error (_("out of memory parsing relocs"));
813 for (i = 0; i < nrelas; i++)
815 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
816 relas[i].r_info = BYTE_GET (erelas[i].r_info);
817 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
828 slurp_rel_relocs (FILE *file,
829 unsigned long rel_offset,
830 unsigned long rel_size,
831 Elf_Internal_Rela **relsp,
832 unsigned long *nrelsp)
834 Elf_Internal_Rela *rels;
840 Elf32_External_Rel *erels;
842 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
846 nrels = rel_size / sizeof (Elf32_External_Rel);
848 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
852 error (_("out of memory parsing relocs"));
856 for (i = 0; i < nrels; i++)
858 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
859 rels[i].r_info = BYTE_GET (erels[i].r_info);
860 rels[i].r_addend = 0;
867 Elf64_External_Rel *erels;
869 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
873 nrels = rel_size / sizeof (Elf64_External_Rel);
875 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
879 error (_("out of memory parsing relocs"));
883 for (i = 0; i < nrels; i++)
885 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
886 rels[i].r_info = BYTE_GET (erels[i].r_info);
887 rels[i].r_addend = 0;
897 /* Display the contents of the relocation data found at the specified
901 dump_relocations (FILE *file,
902 unsigned long rel_offset,
903 unsigned long rel_size,
904 Elf_Internal_Sym *symtab,
907 unsigned long strtablen,
911 Elf_Internal_Rela *rels;
914 if (is_rela == UNKNOWN)
915 is_rela = guess_is_rela (elf_header.e_machine);
919 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
924 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
933 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
935 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
940 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
942 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
950 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
952 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
957 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
959 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
963 for (i = 0; i < rel_size; i++)
966 const char *rtype2 = NULL;
967 const char *rtype3 = NULL;
970 bfd_vma symtab_index;
975 offset = rels[i].r_offset;
976 info = rels[i].r_info;
980 type = ELF32_R_TYPE (info);
981 symtab_index = ELF32_R_SYM (info);
985 /* The #ifdef BFD64 below is to prevent a compile time warning.
986 We know that if we do not have a 64 bit data type that we
987 will never execute this code anyway. */
989 if (elf_header.e_machine == EM_MIPS)
991 /* In little-endian objects, r_info isn't really a 64-bit
992 little-endian value: it has a 32-bit little-endian
993 symbol index followed by four individual byte fields.
994 Reorder INFO accordingly. */
995 if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
996 info = (((info & 0xffffffff) << 32)
997 | ((info >> 56) & 0xff)
998 | ((info >> 40) & 0xff00)
999 | ((info >> 24) & 0xff0000)
1000 | ((info >> 8) & 0xff000000));
1001 type = ELF64_MIPS_R_TYPE (info);
1002 type2 = ELF64_MIPS_R_TYPE2 (info);
1003 type3 = ELF64_MIPS_R_TYPE3 (info);
1005 else if (elf_header.e_machine == EM_SPARCV9)
1006 type = ELF64_R_TYPE_ID (info);
1008 type = ELF64_R_TYPE (info);
1010 symtab_index = ELF64_R_SYM (info);
1016 #ifdef _bfd_int64_low
1017 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1019 printf ("%8.8lx %8.8lx ", offset, info);
1024 #ifdef _bfd_int64_low
1026 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1027 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1028 _bfd_int64_high (offset),
1029 _bfd_int64_low (offset),
1030 _bfd_int64_high (info),
1031 _bfd_int64_low (info));
1034 ? "%16.16lx %16.16lx "
1035 : "%12.12lx %12.12lx ",
1040 switch (elf_header.e_machine)
1047 case EM_CYGNUS_M32R:
1048 rtype = elf_m32r_reloc_type (type);
1053 rtype = elf_i386_reloc_type (type);
1058 rtype = elf_m68hc11_reloc_type (type);
1062 rtype = elf_m68k_reloc_type (type);
1066 rtype = elf_i960_reloc_type (type);
1071 rtype = elf_avr_reloc_type (type);
1074 case EM_OLD_SPARCV9:
1075 case EM_SPARC32PLUS:
1078 rtype = elf_sparc_reloc_type (type);
1082 case EM_CYGNUS_V850:
1083 rtype = v850_reloc_type (type);
1087 case EM_CYGNUS_D10V:
1088 rtype = elf_d10v_reloc_type (type);
1092 case EM_CYGNUS_D30V:
1093 rtype = elf_d30v_reloc_type (type);
1097 rtype = elf_dlx_reloc_type (type);
1101 rtype = elf_sh_reloc_type (type);
1105 case EM_CYGNUS_MN10300:
1106 rtype = elf_mn10300_reloc_type (type);
1110 case EM_CYGNUS_MN10200:
1111 rtype = elf_mn10200_reloc_type (type);
1115 case EM_CYGNUS_FR30:
1116 rtype = elf_fr30_reloc_type (type);
1120 rtype = elf_frv_reloc_type (type);
1124 rtype = elf_mcore_reloc_type (type);
1128 rtype = elf_mmix_reloc_type (type);
1133 rtype = elf_msp430_reloc_type (type);
1137 rtype = elf_ppc_reloc_type (type);
1141 rtype = elf_ppc64_reloc_type (type);
1145 case EM_MIPS_RS3_LE:
1146 rtype = elf_mips_reloc_type (type);
1149 rtype2 = elf_mips_reloc_type (type2);
1150 rtype3 = elf_mips_reloc_type (type3);
1155 rtype = elf_alpha_reloc_type (type);
1159 rtype = elf_arm_reloc_type (type);
1163 rtype = elf_arc_reloc_type (type);
1167 rtype = elf_hppa_reloc_type (type);
1173 rtype = elf_h8_reloc_type (type);
1178 rtype = elf_or32_reloc_type (type);
1183 rtype = elf_pj_reloc_type (type);
1186 rtype = elf_ia64_reloc_type (type);
1190 rtype = elf_cris_reloc_type (type);
1194 rtype = elf_i860_reloc_type (type);
1198 rtype = elf_x86_64_reloc_type (type);
1202 rtype = i370_reloc_type (type);
1207 rtype = elf_s390_reloc_type (type);
1211 rtype = elf_xstormy16_reloc_type (type);
1215 rtype = elf_crx_reloc_type (type);
1219 rtype = elf_vax_reloc_type (type);
1224 rtype = elf_ip2k_reloc_type (type);
1228 rtype = elf_iq2000_reloc_type (type);
1233 rtype = elf_xtensa_reloc_type (type);
1238 #ifdef _bfd_int64_low
1239 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1241 printf (_("unrecognized: %-7lx"), type);
1244 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1248 if (symtab == NULL || symtab_index >= nsyms)
1249 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1252 Elf_Internal_Sym *psym;
1254 psym = symtab + symtab_index;
1257 print_vma (psym->st_value, LONG_HEX);
1258 printf (is_32bit_elf ? " " : " ");
1260 if (psym->st_name == 0)
1262 const char *sec_name = "<null>";
1265 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1267 bfd_vma sec_index = (bfd_vma) -1;
1269 if (psym->st_shndx < SHN_LORESERVE)
1270 sec_index = psym->st_shndx;
1271 else if (psym->st_shndx > SHN_HIRESERVE)
1272 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1275 if (sec_index != (bfd_vma) -1)
1276 sec_name = SECTION_NAME (section_headers + sec_index);
1277 else if (psym->st_shndx == SHN_ABS)
1279 else if (psym->st_shndx == SHN_COMMON)
1280 sec_name = "COMMON";
1281 else if (elf_header.e_machine == EM_IA_64
1282 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1283 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1284 sec_name = "ANSI_COM";
1287 sprintf (name_buf, "<section 0x%x>",
1288 (unsigned int) psym->st_shndx);
1289 sec_name = name_buf;
1292 print_symbol (22, sec_name);
1294 else if (strtab == NULL)
1295 printf (_("<string table index: %3ld>"), psym->st_name);
1296 else if (psym->st_name > strtablen)
1297 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1299 print_symbol (22, strtab + psym->st_name);
1302 printf (" + %lx", (unsigned long) rels[i].r_addend);
1307 printf ("%*c", is_32bit_elf ?
1308 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1309 print_vma (rels[i].r_addend, LONG_HEX);
1312 if (elf_header.e_machine == EM_SPARCV9
1313 && streq (rtype, "R_SPARC_OLO10"))
1314 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1318 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1320 printf (" Type2: ");
1323 #ifdef _bfd_int64_low
1324 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1326 printf (_("unrecognized: %-7lx"), type2);
1329 printf ("%-17.17s", rtype2);
1331 printf ("\n Type3: ");
1334 #ifdef _bfd_int64_low
1335 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1337 printf (_("unrecognized: %-7lx"), type3);
1340 printf ("%-17.17s", rtype3);
1352 get_mips_dynamic_type (unsigned long type)
1356 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1357 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1358 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1359 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1360 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1361 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1362 case DT_MIPS_MSYM: return "MIPS_MSYM";
1363 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1364 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1365 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1366 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1367 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1368 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1369 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1370 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1371 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1372 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1373 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1374 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1375 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1376 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1377 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1378 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1379 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1380 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1381 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1382 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1383 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1384 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1385 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1386 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1387 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1388 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1389 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1390 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1391 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1392 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1393 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1394 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1395 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1396 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1397 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1398 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1405 get_sparc64_dynamic_type (unsigned long type)
1409 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1416 get_ppc64_dynamic_type (unsigned long type)
1420 case DT_PPC64_GLINK: return "PPC64_GLINK";
1421 case DT_PPC64_OPD: return "PPC64_OPD";
1422 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1429 get_parisc_dynamic_type (unsigned long type)
1433 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1434 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1435 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1436 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1437 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1438 case DT_HP_PREINIT: return "HP_PREINIT";
1439 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1440 case DT_HP_NEEDED: return "HP_NEEDED";
1441 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1442 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1443 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1444 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1445 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1452 get_ia64_dynamic_type (unsigned long type)
1456 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1463 get_dynamic_type (unsigned long type)
1465 static char buff[64];
1469 case DT_NULL: return "NULL";
1470 case DT_NEEDED: return "NEEDED";
1471 case DT_PLTRELSZ: return "PLTRELSZ";
1472 case DT_PLTGOT: return "PLTGOT";
1473 case DT_HASH: return "HASH";
1474 case DT_STRTAB: return "STRTAB";
1475 case DT_SYMTAB: return "SYMTAB";
1476 case DT_RELA: return "RELA";
1477 case DT_RELASZ: return "RELASZ";
1478 case DT_RELAENT: return "RELAENT";
1479 case DT_STRSZ: return "STRSZ";
1480 case DT_SYMENT: return "SYMENT";
1481 case DT_INIT: return "INIT";
1482 case DT_FINI: return "FINI";
1483 case DT_SONAME: return "SONAME";
1484 case DT_RPATH: return "RPATH";
1485 case DT_SYMBOLIC: return "SYMBOLIC";
1486 case DT_REL: return "REL";
1487 case DT_RELSZ: return "RELSZ";
1488 case DT_RELENT: return "RELENT";
1489 case DT_PLTREL: return "PLTREL";
1490 case DT_DEBUG: return "DEBUG";
1491 case DT_TEXTREL: return "TEXTREL";
1492 case DT_JMPREL: return "JMPREL";
1493 case DT_BIND_NOW: return "BIND_NOW";
1494 case DT_INIT_ARRAY: return "INIT_ARRAY";
1495 case DT_FINI_ARRAY: return "FINI_ARRAY";
1496 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1497 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1498 case DT_RUNPATH: return "RUNPATH";
1499 case DT_FLAGS: return "FLAGS";
1501 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1502 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1504 case DT_CHECKSUM: return "CHECKSUM";
1505 case DT_PLTPADSZ: return "PLTPADSZ";
1506 case DT_MOVEENT: return "MOVEENT";
1507 case DT_MOVESZ: return "MOVESZ";
1508 case DT_FEATURE: return "FEATURE";
1509 case DT_POSFLAG_1: return "POSFLAG_1";
1510 case DT_SYMINSZ: return "SYMINSZ";
1511 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1513 case DT_ADDRRNGLO: return "ADDRRNGLO";
1514 case DT_CONFIG: return "CONFIG";
1515 case DT_DEPAUDIT: return "DEPAUDIT";
1516 case DT_AUDIT: return "AUDIT";
1517 case DT_PLTPAD: return "PLTPAD";
1518 case DT_MOVETAB: return "MOVETAB";
1519 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1521 case DT_VERSYM: return "VERSYM";
1523 case DT_RELACOUNT: return "RELACOUNT";
1524 case DT_RELCOUNT: return "RELCOUNT";
1525 case DT_FLAGS_1: return "FLAGS_1";
1526 case DT_VERDEF: return "VERDEF";
1527 case DT_VERDEFNUM: return "VERDEFNUM";
1528 case DT_VERNEED: return "VERNEED";
1529 case DT_VERNEEDNUM: return "VERNEEDNUM";
1531 case DT_AUXILIARY: return "AUXILIARY";
1532 case DT_USED: return "USED";
1533 case DT_FILTER: return "FILTER";
1535 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1536 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1537 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1538 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1539 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1542 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1546 switch (elf_header.e_machine)
1549 case EM_MIPS_RS3_LE:
1550 result = get_mips_dynamic_type (type);
1553 result = get_sparc64_dynamic_type (type);
1556 result = get_ppc64_dynamic_type (type);
1559 result = get_ia64_dynamic_type (type);
1569 snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
1571 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1575 switch (elf_header.e_machine)
1578 result = get_parisc_dynamic_type (type);
1588 snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
1592 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
1599 get_file_type (unsigned e_type)
1601 static char buff[32];
1605 case ET_NONE: return _("NONE (None)");
1606 case ET_REL: return _("REL (Relocatable file)");
1607 case ET_EXEC: return _("EXEC (Executable file)");
1608 case ET_DYN: return _("DYN (Shared object file)");
1609 case ET_CORE: return _("CORE (Core file)");
1612 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1613 snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
1614 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1615 snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
1617 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
1623 get_machine_name (unsigned e_machine)
1625 static char buff[64]; /* XXX */
1629 case EM_NONE: return _("None");
1630 case EM_M32: return "WE32100";
1631 case EM_SPARC: return "Sparc";
1632 case EM_386: return "Intel 80386";
1633 case EM_68K: return "MC68000";
1634 case EM_88K: return "MC88000";
1635 case EM_486: return "Intel 80486";
1636 case EM_860: return "Intel 80860";
1637 case EM_MIPS: return "MIPS R3000";
1638 case EM_S370: return "IBM System/370";
1639 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1640 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1641 case EM_PARISC: return "HPPA";
1642 case EM_PPC_OLD: return "Power PC (old)";
1643 case EM_SPARC32PLUS: return "Sparc v8+" ;
1644 case EM_960: return "Intel 90860";
1645 case EM_PPC: return "PowerPC";
1646 case EM_PPC64: return "PowerPC64";
1647 case EM_V800: return "NEC V800";
1648 case EM_FR20: return "Fujitsu FR20";
1649 case EM_RH32: return "TRW RH32";
1650 case EM_MCORE: return "MCORE";
1651 case EM_ARM: return "ARM";
1652 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1653 case EM_SH: return "Renesas / SuperH SH";
1654 case EM_SPARCV9: return "Sparc v9";
1655 case EM_TRICORE: return "Siemens Tricore";
1656 case EM_ARC: return "ARC";
1657 case EM_H8_300: return "Renesas H8/300";
1658 case EM_H8_300H: return "Renesas H8/300H";
1659 case EM_H8S: return "Renesas H8S";
1660 case EM_H8_500: return "Renesas H8/500";
1661 case EM_IA_64: return "Intel IA-64";
1662 case EM_MIPS_X: return "Stanford MIPS-X";
1663 case EM_COLDFIRE: return "Motorola Coldfire";
1664 case EM_68HC12: return "Motorola M68HC12";
1665 case EM_ALPHA: return "Alpha";
1666 case EM_CYGNUS_D10V:
1667 case EM_D10V: return "d10v";
1668 case EM_CYGNUS_D30V:
1669 case EM_D30V: return "d30v";
1670 case EM_CYGNUS_M32R:
1671 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1672 case EM_CYGNUS_V850:
1673 case EM_V850: return "NEC v850";
1674 case EM_CYGNUS_MN10300:
1675 case EM_MN10300: return "mn10300";
1676 case EM_CYGNUS_MN10200:
1677 case EM_MN10200: return "mn10200";
1678 case EM_CYGNUS_FR30:
1679 case EM_FR30: return "Fujitsu FR30";
1680 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1682 case EM_PJ: return "picoJava";
1683 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1684 case EM_PCP: return "Siemens PCP";
1685 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1686 case EM_NDR1: return "Denso NDR1 microprocesspr";
1687 case EM_STARCORE: return "Motorola Star*Core processor";
1688 case EM_ME16: return "Toyota ME16 processor";
1689 case EM_ST100: return "STMicroelectronics ST100 processor";
1690 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1691 case EM_FX66: return "Siemens FX66 microcontroller";
1692 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1693 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1694 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1695 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1696 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1697 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1698 case EM_SVX: return "Silicon Graphics SVx";
1699 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1700 case EM_VAX: return "Digital VAX";
1702 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1703 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1704 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1705 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1706 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1707 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1708 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1709 case EM_PRISM: return "Vitesse Prism";
1710 case EM_X86_64: return "Advanced Micro Devices X86-64";
1712 case EM_S390: return "IBM S/390";
1713 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1715 case EM_OR32: return "OpenRISC";
1716 case EM_CRX: return "National Semiconductor CRX microprocessor";
1717 case EM_DLX: return "OpenDLX";
1719 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1720 case EM_IQ2000: return "Vitesse IQ2000";
1722 case EM_XTENSA: return "Tensilica Xtensa Processor";
1724 snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_machine);
1730 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1735 eabi = EF_ARM_EABI_VERSION (e_flags);
1736 e_flags &= ~ EF_ARM_EABIMASK;
1738 /* Handle "generic" ARM flags. */
1739 if (e_flags & EF_ARM_RELEXEC)
1741 strcat (buf, ", relocatable executable");
1742 e_flags &= ~ EF_ARM_RELEXEC;
1745 if (e_flags & EF_ARM_HASENTRY)
1747 strcat (buf, ", has entry point");
1748 e_flags &= ~ EF_ARM_HASENTRY;
1751 /* Now handle EABI specific flags. */
1755 strcat (buf, ", <unrecognized EABI>");
1760 case EF_ARM_EABI_VER1:
1761 strcat (buf, ", Version1 EABI");
1766 /* Process flags one bit at a time. */
1767 flag = e_flags & - e_flags;
1772 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1773 strcat (buf, ", sorted symbol tables");
1783 case EF_ARM_EABI_VER2:
1784 strcat (buf, ", Version2 EABI");
1789 /* Process flags one bit at a time. */
1790 flag = e_flags & - e_flags;
1795 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1796 strcat (buf, ", sorted symbol tables");
1799 case EF_ARM_DYNSYMSUSESEGIDX:
1800 strcat (buf, ", dynamic symbols use segment index");
1803 case EF_ARM_MAPSYMSFIRST:
1804 strcat (buf, ", mapping symbols precede others");
1814 case EF_ARM_EABI_VER3:
1815 strcat (buf, ", Version3 EABI");
1818 case EF_ARM_EABI_VER4:
1819 strcat (buf, ", Version4 EABI");
1824 /* Process flags one bit at a time. */
1825 flag = e_flags & - e_flags;
1831 strcat (buf, ", BE8");
1835 strcat (buf, ", LE8");
1845 case EF_ARM_EABI_UNKNOWN:
1846 strcat (buf, ", GNU EABI");
1851 /* Process flags one bit at a time. */
1852 flag = e_flags & - e_flags;
1857 case EF_ARM_INTERWORK:
1858 strcat (buf, ", interworking enabled");
1861 case EF_ARM_APCS_26:
1862 strcat (buf, ", uses APCS/26");
1865 case EF_ARM_APCS_FLOAT:
1866 strcat (buf, ", uses APCS/float");
1870 strcat (buf, ", position independent");
1874 strcat (buf, ", 8 bit structure alignment");
1877 case EF_ARM_NEW_ABI:
1878 strcat (buf, ", uses new ABI");
1881 case EF_ARM_OLD_ABI:
1882 strcat (buf, ", uses old ABI");
1885 case EF_ARM_SOFT_FLOAT:
1886 strcat (buf, ", software FP");
1889 case EF_ARM_VFP_FLOAT:
1890 strcat (buf, ", VFP");
1893 case EF_ARM_MAVERICK_FLOAT:
1894 strcat (buf, ", Maverick FP");
1905 strcat (buf,", <unknown>");
1909 get_machine_flags (unsigned e_flags, unsigned e_machine)
1911 static char buf[1024];
1923 decode_ARM_machine_flags (e_flags, buf);
1927 switch (e_flags & EF_FRV_CPU_MASK)
1929 case EF_FRV_CPU_GENERIC:
1933 strcat (buf, ", fr???");
1936 case EF_FRV_CPU_FR300:
1937 strcat (buf, ", fr300");
1940 case EF_FRV_CPU_FR400:
1941 strcat (buf, ", fr400");
1943 case EF_FRV_CPU_FR405:
1944 strcat (buf, ", fr405");
1947 case EF_FRV_CPU_FR450:
1948 strcat (buf, ", fr450");
1951 case EF_FRV_CPU_FR500:
1952 strcat (buf, ", fr500");
1954 case EF_FRV_CPU_FR550:
1955 strcat (buf, ", fr550");
1958 case EF_FRV_CPU_SIMPLE:
1959 strcat (buf, ", simple");
1961 case EF_FRV_CPU_TOMCAT:
1962 strcat (buf, ", tomcat");
1968 if (e_flags & EF_CPU32)
1969 strcat (buf, ", cpu32");
1970 if (e_flags & EF_M68000)
1971 strcat (buf, ", m68000");
1975 if (e_flags & EF_PPC_EMB)
1976 strcat (buf, ", emb");
1978 if (e_flags & EF_PPC_RELOCATABLE)
1979 strcat (buf, ", relocatable");
1981 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1982 strcat (buf, ", relocatable-lib");
1986 case EM_CYGNUS_V850:
1987 switch (e_flags & EF_V850_ARCH)
1990 strcat (buf, ", v850e1");
1993 strcat (buf, ", v850e");
1996 strcat (buf, ", v850");
1999 strcat (buf, ", unknown v850 architecture variant");
2005 case EM_CYGNUS_M32R:
2006 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
2007 strcat (buf, ", m32r");
2012 case EM_MIPS_RS3_LE:
2013 if (e_flags & EF_MIPS_NOREORDER)
2014 strcat (buf, ", noreorder");
2016 if (e_flags & EF_MIPS_PIC)
2017 strcat (buf, ", pic");
2019 if (e_flags & EF_MIPS_CPIC)
2020 strcat (buf, ", cpic");
2022 if (e_flags & EF_MIPS_UCODE)
2023 strcat (buf, ", ugen_reserved");
2025 if (e_flags & EF_MIPS_ABI2)
2026 strcat (buf, ", abi2");
2028 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2029 strcat (buf, ", odk first");
2031 if (e_flags & EF_MIPS_32BITMODE)
2032 strcat (buf, ", 32bitmode");
2034 switch ((e_flags & EF_MIPS_MACH))
2036 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2037 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2038 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2039 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2040 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2041 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2042 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2043 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2044 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2045 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2047 /* We simply ignore the field in this case to avoid confusion:
2048 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2051 default: strcat (buf, ", unknown CPU"); break;
2054 switch ((e_flags & EF_MIPS_ABI))
2056 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2057 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2058 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2059 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2061 /* We simply ignore the field in this case to avoid confusion:
2062 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2063 This means it is likely to be an o32 file, but not for
2066 default: strcat (buf, ", unknown ABI"); break;
2069 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2070 strcat (buf, ", mdmx");
2072 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2073 strcat (buf, ", mips16");
2075 switch ((e_flags & EF_MIPS_ARCH))
2077 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2078 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2079 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2080 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2081 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2082 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2083 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2084 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2085 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2086 default: strcat (buf, ", unknown ISA"); break;
2092 switch ((e_flags & EF_SH_MACH_MASK))
2094 case EF_SH1: strcat (buf, ", sh1"); break;
2095 case EF_SH2: strcat (buf, ", sh2"); break;
2096 case EF_SH3: strcat (buf, ", sh3"); break;
2097 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2098 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2099 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2100 case EF_SH3E: strcat (buf, ", sh3e"); break;
2101 case EF_SH4: strcat (buf, ", sh4"); break;
2102 case EF_SH5: strcat (buf, ", sh5"); break;
2103 case EF_SH2E: strcat (buf, ", sh2e"); break;
2104 case EF_SH4A: strcat (buf, ", sh4a"); break;
2105 case EF_SH2A: strcat (buf, ", sh2a"); break;
2106 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2107 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2108 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2109 default: strcat (buf, ", unknown ISA"); break;
2115 if (e_flags & EF_SPARC_32PLUS)
2116 strcat (buf, ", v8+");
2118 if (e_flags & EF_SPARC_SUN_US1)
2119 strcat (buf, ", ultrasparcI");
2121 if (e_flags & EF_SPARC_SUN_US3)
2122 strcat (buf, ", ultrasparcIII");
2124 if (e_flags & EF_SPARC_HAL_R1)
2125 strcat (buf, ", halr1");
2127 if (e_flags & EF_SPARC_LEDATA)
2128 strcat (buf, ", ledata");
2130 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2131 strcat (buf, ", tso");
2133 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2134 strcat (buf, ", pso");
2136 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2137 strcat (buf, ", rmo");
2141 switch (e_flags & EF_PARISC_ARCH)
2143 case EFA_PARISC_1_0:
2144 strcpy (buf, ", PA-RISC 1.0");
2146 case EFA_PARISC_1_1:
2147 strcpy (buf, ", PA-RISC 1.1");
2149 case EFA_PARISC_2_0:
2150 strcpy (buf, ", PA-RISC 2.0");
2155 if (e_flags & EF_PARISC_TRAPNIL)
2156 strcat (buf, ", trapnil");
2157 if (e_flags & EF_PARISC_EXT)
2158 strcat (buf, ", ext");
2159 if (e_flags & EF_PARISC_LSB)
2160 strcat (buf, ", lsb");
2161 if (e_flags & EF_PARISC_WIDE)
2162 strcat (buf, ", wide");
2163 if (e_flags & EF_PARISC_NO_KABP)
2164 strcat (buf, ", no kabp");
2165 if (e_flags & EF_PARISC_LAZYSWAP)
2166 strcat (buf, ", lazyswap");
2171 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2172 strcat (buf, ", new calling convention");
2174 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2175 strcat (buf, ", gnu calling convention");
2179 if ((e_flags & EF_IA_64_ABI64))
2180 strcat (buf, ", 64-bit");
2182 strcat (buf, ", 32-bit");
2183 if ((e_flags & EF_IA_64_REDUCEDFP))
2184 strcat (buf, ", reduced fp model");
2185 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2186 strcat (buf, ", no function descriptors, constant gp");
2187 else if ((e_flags & EF_IA_64_CONS_GP))
2188 strcat (buf, ", constant gp");
2189 if ((e_flags & EF_IA_64_ABSOLUTE))
2190 strcat (buf, ", absolute");
2194 if ((e_flags & EF_VAX_NONPIC))
2195 strcat (buf, ", non-PIC");
2196 if ((e_flags & EF_VAX_DFLOAT))
2197 strcat (buf, ", D-Float");
2198 if ((e_flags & EF_VAX_GFLOAT))
2199 strcat (buf, ", G-Float");
2208 get_osabi_name (unsigned int osabi)
2210 static char buff[32];
2214 case ELFOSABI_NONE: return "UNIX - System V";
2215 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2216 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2217 case ELFOSABI_LINUX: return "UNIX - Linux";
2218 case ELFOSABI_HURD: return "GNU/Hurd";
2219 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2220 case ELFOSABI_AIX: return "UNIX - AIX";
2221 case ELFOSABI_IRIX: return "UNIX - IRIX";
2222 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2223 case ELFOSABI_TRU64: return "UNIX - TRU64";
2224 case ELFOSABI_MODESTO: return "Novell - Modesto";
2225 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2226 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2227 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2228 case ELFOSABI_AROS: return "Amiga Research OS";
2229 case ELFOSABI_STANDALONE: return _("Standalone App");
2230 case ELFOSABI_ARM: return "ARM";
2232 snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
2238 get_arm_segment_type (unsigned long type)
2252 get_mips_segment_type (unsigned long type)
2256 case PT_MIPS_REGINFO:
2258 case PT_MIPS_RTPROC:
2260 case PT_MIPS_OPTIONS:
2270 get_parisc_segment_type (unsigned long type)
2274 case PT_HP_TLS: return "HP_TLS";
2275 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2276 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2277 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2278 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2279 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2280 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2281 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2282 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2283 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2284 case PT_HP_PARALLEL: return "HP_PARALLEL";
2285 case PT_HP_FASTBIND: return "HP_FASTBIND";
2286 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2287 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2296 get_ia64_segment_type (unsigned long type)
2300 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2301 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2302 case PT_HP_TLS: return "HP_TLS";
2303 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2304 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2305 case PT_IA_64_HP_STACK: return "HP_STACK";
2314 get_segment_type (unsigned long p_type)
2316 static char buff[32];
2320 case PT_NULL: return "NULL";
2321 case PT_LOAD: return "LOAD";
2322 case PT_DYNAMIC: return "DYNAMIC";
2323 case PT_INTERP: return "INTERP";
2324 case PT_NOTE: return "NOTE";
2325 case PT_SHLIB: return "SHLIB";
2326 case PT_PHDR: return "PHDR";
2327 case PT_TLS: return "TLS";
2329 case PT_GNU_EH_FRAME:
2330 return "GNU_EH_FRAME";
2331 case PT_GNU_STACK: return "GNU_STACK";
2332 case PT_GNU_RELRO: return "GNU_RELRO";
2335 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2339 switch (elf_header.e_machine)
2342 result = get_arm_segment_type (p_type);
2345 case EM_MIPS_RS3_LE:
2346 result = get_mips_segment_type (p_type);
2349 result = get_parisc_segment_type (p_type);
2352 result = get_ia64_segment_type (p_type);
2362 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2364 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2368 switch (elf_header.e_machine)
2371 result = get_parisc_segment_type (p_type);
2374 result = get_ia64_segment_type (p_type);
2384 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2387 snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
2394 get_mips_section_type_name (unsigned int sh_type)
2398 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2399 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2400 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2401 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2402 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2403 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2404 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2405 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2406 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2407 case SHT_MIPS_RELD: return "MIPS_RELD";
2408 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2409 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2410 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2411 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2412 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2413 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2414 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2415 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2416 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2417 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2418 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2419 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2420 case SHT_MIPS_LINE: return "MIPS_LINE";
2421 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2422 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2423 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2424 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2425 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2426 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2427 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2428 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2429 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2430 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2431 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2432 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2433 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2434 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2435 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2436 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2444 get_parisc_section_type_name (unsigned int sh_type)
2448 case SHT_PARISC_EXT: return "PARISC_EXT";
2449 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2450 case SHT_PARISC_DOC: return "PARISC_DOC";
2458 get_ia64_section_type_name (unsigned int sh_type)
2460 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2461 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2462 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2466 case SHT_IA_64_EXT: return "IA_64_EXT";
2467 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2468 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2476 get_x86_64_section_type_name (unsigned int sh_type)
2480 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2488 get_arm_section_type_name (unsigned int sh_type)
2501 get_section_type_name (unsigned int sh_type)
2503 static char buff[32];
2507 case SHT_NULL: return "NULL";
2508 case SHT_PROGBITS: return "PROGBITS";
2509 case SHT_SYMTAB: return "SYMTAB";
2510 case SHT_STRTAB: return "STRTAB";
2511 case SHT_RELA: return "RELA";
2512 case SHT_HASH: return "HASH";
2513 case SHT_DYNAMIC: return "DYNAMIC";
2514 case SHT_NOTE: return "NOTE";
2515 case SHT_NOBITS: return "NOBITS";
2516 case SHT_REL: return "REL";
2517 case SHT_SHLIB: return "SHLIB";
2518 case SHT_DYNSYM: return "DYNSYM";
2519 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2520 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2521 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2522 case SHT_GROUP: return "GROUP";
2523 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2524 case SHT_GNU_verdef: return "VERDEF";
2525 case SHT_GNU_verneed: return "VERNEED";
2526 case SHT_GNU_versym: return "VERSYM";
2527 case 0x6ffffff0: return "VERSYM";
2528 case 0x6ffffffc: return "VERDEF";
2529 case 0x7ffffffd: return "AUXILIARY";
2530 case 0x7fffffff: return "FILTER";
2531 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2534 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2538 switch (elf_header.e_machine)
2541 case EM_MIPS_RS3_LE:
2542 result = get_mips_section_type_name (sh_type);
2545 result = get_parisc_section_type_name (sh_type);
2548 result = get_ia64_section_type_name (sh_type);
2551 result = get_x86_64_section_type_name (sh_type);
2554 result = get_arm_section_type_name (sh_type);
2564 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2566 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2567 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2568 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2569 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2571 snprintf (buff, sizeof (buff), _("<unknown>: %x"), sh_type);
2577 #define OPTION_DEBUG_DUMP 512
2579 static struct option options[] =
2581 {"all", no_argument, 0, 'a'},
2582 {"file-header", no_argument, 0, 'h'},
2583 {"program-headers", no_argument, 0, 'l'},
2584 {"headers", no_argument, 0, 'e'},
2585 {"histogram", no_argument, 0, 'I'},
2586 {"segments", no_argument, 0, 'l'},
2587 {"sections", no_argument, 0, 'S'},
2588 {"section-headers", no_argument, 0, 'S'},
2589 {"section-groups", no_argument, 0, 'g'},
2590 {"full-section-name",no_argument, 0, 'N'},
2591 {"symbols", no_argument, 0, 's'},
2592 {"syms", no_argument, 0, 's'},
2593 {"relocs", no_argument, 0, 'r'},
2594 {"notes", no_argument, 0, 'n'},
2595 {"dynamic", no_argument, 0, 'd'},
2596 {"arch-specific", no_argument, 0, 'A'},
2597 {"version-info", no_argument, 0, 'V'},
2598 {"use-dynamic", no_argument, 0, 'D'},
2599 {"hex-dump", required_argument, 0, 'x'},
2600 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2601 {"unwind", no_argument, 0, 'u'},
2602 #ifdef SUPPORT_DISASSEMBLY
2603 {"instruction-dump", required_argument, 0, 'i'},
2606 {"version", no_argument, 0, 'v'},
2607 {"wide", no_argument, 0, 'W'},
2608 {"help", no_argument, 0, 'H'},
2609 {0, no_argument, 0, 0}
2615 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2616 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2617 fprintf (stdout, _(" Options are:\n\
2618 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2619 -h --file-header Display the ELF file header\n\
2620 -l --program-headers Display the program headers\n\
2621 --segments An alias for --program-headers\n\
2622 -S --section-headers Display the sections' header\n\
2623 --sections An alias for --section-headers\n\
2624 -g --section-groups Display the section groups\n\
2625 -N --full-section-name\n\
2626 Display the full section name\n\
2627 -e --headers Equivalent to: -h -l -S\n\
2628 -s --syms Display the symbol table\n\
2629 --symbols An alias for --syms\n\
2630 -n --notes Display the core notes (if present)\n\
2631 -r --relocs Display the relocations (if present)\n\
2632 -u --unwind Display the unwind info (if present)\n\
2633 -d --dynamic Display the dynamic section (if present)\n\
2634 -V --version-info Display the version sections (if present)\n\
2635 -A --arch-specific Display architecture specific information (if any).\n\
2636 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2637 -x --hex-dump=<number> Dump the contents of section <number>\n\
2638 -w[liaprmfFsoR] or\n\
2639 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2640 Display the contents of DWARF2 debug sections\n"));
2641 #ifdef SUPPORT_DISASSEMBLY
2642 fprintf (stdout, _("\
2643 -i --instruction-dump=<number>\n\
2644 Disassemble the contents of section <number>\n"));
2646 fprintf (stdout, _("\
2647 -I --histogram Display histogram of bucket list lengths\n\
2648 -W --wide Allow output width to exceed 80 characters\n\
2649 -H --help Display this information\n\
2650 -v --version Display the version number of readelf\n"));
2651 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2656 /* Record the fact that the user wants the contents of section number
2657 SECTION to be displayed using the method(s) encoded as flags bits
2658 in TYPE. Note, TYPE can be zero if we are creating the array for
2662 request_dump (unsigned int section, int type)
2664 if (section >= num_dump_sects)
2666 char *new_dump_sects;
2668 new_dump_sects = calloc (section + 1, 1);
2670 if (new_dump_sects == NULL)
2671 error (_("Out of memory allocating dump request table."));
2674 /* Copy current flag settings. */
2675 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2679 dump_sects = new_dump_sects;
2680 num_dump_sects = section + 1;
2685 dump_sects[section] |= type;
2691 parse_args (int argc, char **argv)
2698 while ((c = getopt_long
2699 (argc, argv, "ersuahnldSDAINgw::x:i:vVWH", options, NULL)) != EOF)
2720 do_section_groups++;
2728 do_section_groups++;
2731 do_full_section_name++;
2773 section = strtoul (optarg, & cp, 0);
2774 if (! *cp && section >= 0)
2776 request_dump (section, HEX_DUMP);
2786 unsigned int index = 0;
2790 while (optarg[index])
2791 switch (optarg[index++])
2800 do_debug_abbrevs = 1;
2810 do_debug_pubnames = 1;
2814 do_debug_aranges = 1;
2818 do_debug_ranges = 1;
2822 do_debug_frames_interp = 1;
2824 do_debug_frames = 1;
2829 do_debug_macinfo = 1;
2843 warn (_("Unrecognized debug option '%s'\n"), optarg);
2848 case OPTION_DEBUG_DUMP:
2856 const char * option;
2859 debug_dump_long_opts;
2861 debug_dump_long_opts opts_table [] =
2863 /* Please keep this table alpha- sorted. */
2864 { "Ranges", & do_debug_ranges },
2865 { "abbrev", & do_debug_abbrevs },
2866 { "aranges", & do_debug_aranges },
2867 { "frames", & do_debug_frames },
2868 { "frames-interp", & do_debug_frames_interp },
2869 { "info", & do_debug_info },
2870 { "line", & do_debug_lines },
2871 { "loc", & do_debug_loc },
2872 { "macro", & do_debug_macinfo },
2873 { "pubnames", & do_debug_pubnames },
2874 /* This entry is for compatability
2875 with earlier versions of readelf. */
2876 { "ranges", & do_debug_aranges },
2877 { "str", & do_debug_str },
2888 debug_dump_long_opts * entry;
2890 for (entry = opts_table; entry->option; entry++)
2892 size_t len = strlen (entry->option);
2894 if (strneq (p, entry->option, len)
2895 && (p[len] == ',' || p[len] == '\0'))
2897 * entry->variable = 1;
2899 /* The --debug-dump=frames-interp option also
2900 enables the --debug-dump=frames option. */
2901 if (do_debug_frames_interp)
2902 do_debug_frames = 1;
2909 if (entry->option == NULL)
2911 warn (_("Unrecognized debug option '%s'\n"), p);
2912 p = strchr (p, ',');
2922 #ifdef SUPPORT_DISASSEMBLY
2925 section = strtoul (optarg, & cp, 0);
2926 if (! *cp && section >= 0)
2928 request_dump (section, DISASS_DUMP);
2934 print_version (program_name);
2944 /* xgettext:c-format */
2945 error (_("Invalid option '-%c'\n"), c);
2952 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2953 && !do_segments && !do_header && !do_dump && !do_version
2954 && !do_histogram && !do_debugging && !do_arch && !do_notes
2955 && !do_section_groups)
2959 warn (_("Nothing to do.\n"));
2965 get_elf_class (unsigned int elf_class)
2967 static char buff[32];
2971 case ELFCLASSNONE: return _("none");
2972 case ELFCLASS32: return "ELF32";
2973 case ELFCLASS64: return "ELF64";
2975 snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
2981 get_data_encoding (unsigned int encoding)
2983 static char buff[32];
2987 case ELFDATANONE: return _("none");
2988 case ELFDATA2LSB: return _("2's complement, little endian");
2989 case ELFDATA2MSB: return _("2's complement, big endian");
2991 snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
2996 /* Decode the data held in 'elf_header'. */
2999 process_file_header (void)
3001 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
3002 || elf_header.e_ident[EI_MAG1] != ELFMAG1
3003 || elf_header.e_ident[EI_MAG2] != ELFMAG2
3004 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
3007 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3015 printf (_("ELF Header:\n"));
3016 printf (_(" Magic: "));
3017 for (i = 0; i < EI_NIDENT; i++)
3018 printf ("%2.2x ", elf_header.e_ident[i]);
3020 printf (_(" Class: %s\n"),
3021 get_elf_class (elf_header.e_ident[EI_CLASS]));
3022 printf (_(" Data: %s\n"),
3023 get_data_encoding (elf_header.e_ident[EI_DATA]));
3024 printf (_(" Version: %d %s\n"),
3025 elf_header.e_ident[EI_VERSION],
3026 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
3028 : (elf_header.e_ident[EI_VERSION] != EV_NONE
3031 printf (_(" OS/ABI: %s\n"),
3032 get_osabi_name (elf_header.e_ident[EI_OSABI]));
3033 printf (_(" ABI Version: %d\n"),
3034 elf_header.e_ident[EI_ABIVERSION]);
3035 printf (_(" Type: %s\n"),
3036 get_file_type (elf_header.e_type));
3037 printf (_(" Machine: %s\n"),
3038 get_machine_name (elf_header.e_machine));
3039 printf (_(" Version: 0x%lx\n"),
3040 (unsigned long) elf_header.e_version);
3042 printf (_(" Entry point address: "));
3043 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3044 printf (_("\n Start of program headers: "));
3045 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3046 printf (_(" (bytes into file)\n Start of section headers: "));
3047 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3048 printf (_(" (bytes into file)\n"));
3050 printf (_(" Flags: 0x%lx%s\n"),
3051 (unsigned long) elf_header.e_flags,
3052 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3053 printf (_(" Size of this header: %ld (bytes)\n"),
3054 (long) elf_header.e_ehsize);
3055 printf (_(" Size of program headers: %ld (bytes)\n"),
3056 (long) elf_header.e_phentsize);
3057 printf (_(" Number of program headers: %ld\n"),
3058 (long) elf_header.e_phnum);
3059 printf (_(" Size of section headers: %ld (bytes)\n"),
3060 (long) elf_header.e_shentsize);
3061 printf (_(" Number of section headers: %ld"),
3062 (long) elf_header.e_shnum);
3063 if (section_headers != NULL && elf_header.e_shnum == 0)
3064 printf (" (%ld)", (long) section_headers[0].sh_size);
3065 putc ('\n', stdout);
3066 printf (_(" Section header string table index: %ld"),
3067 (long) elf_header.e_shstrndx);
3068 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
3069 printf (" (%ld)", (long) section_headers[0].sh_link);
3070 putc ('\n', stdout);
3073 if (section_headers != NULL)
3075 if (elf_header.e_shnum == 0)
3076 elf_header.e_shnum = section_headers[0].sh_size;
3077 if (elf_header.e_shstrndx == SHN_XINDEX)
3078 elf_header.e_shstrndx = section_headers[0].sh_link;
3079 free (section_headers);
3080 section_headers = NULL;
3088 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3090 Elf32_External_Phdr *phdrs;
3091 Elf32_External_Phdr *external;
3092 Elf_Internal_Phdr *internal;
3095 phdrs = get_data (NULL, file, elf_header.e_phoff,
3096 elf_header.e_phentsize * elf_header.e_phnum,
3097 _("program headers"));
3101 for (i = 0, internal = program_headers, external = phdrs;
3102 i < elf_header.e_phnum;
3103 i++, internal++, external++)
3105 internal->p_type = BYTE_GET (external->p_type);
3106 internal->p_offset = BYTE_GET (external->p_offset);
3107 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3108 internal->p_paddr = BYTE_GET (external->p_paddr);
3109 internal->p_filesz = BYTE_GET (external->p_filesz);
3110 internal->p_memsz = BYTE_GET (external->p_memsz);
3111 internal->p_flags = BYTE_GET (external->p_flags);
3112 internal->p_align = BYTE_GET (external->p_align);
3121 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3123 Elf64_External_Phdr *phdrs;
3124 Elf64_External_Phdr *external;
3125 Elf_Internal_Phdr *internal;
3128 phdrs = get_data (NULL, file, elf_header.e_phoff,
3129 elf_header.e_phentsize * elf_header.e_phnum,
3130 _("program headers"));
3134 for (i = 0, internal = program_headers, external = phdrs;
3135 i < elf_header.e_phnum;
3136 i++, internal++, external++)
3138 internal->p_type = BYTE_GET (external->p_type);
3139 internal->p_flags = BYTE_GET (external->p_flags);
3140 internal->p_offset = BYTE_GET (external->p_offset);
3141 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3142 internal->p_paddr = BYTE_GET (external->p_paddr);
3143 internal->p_filesz = BYTE_GET (external->p_filesz);
3144 internal->p_memsz = BYTE_GET (external->p_memsz);
3145 internal->p_align = BYTE_GET (external->p_align);
3153 /* Returns 1 if the program headers were read into `program_headers'. */
3156 get_program_headers (FILE *file)
3158 Elf_Internal_Phdr *phdrs;
3160 /* Check cache of prior read. */
3161 if (program_headers != NULL)
3164 phdrs = malloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3168 error (_("Out of memory\n"));
3173 ? get_32bit_program_headers (file, phdrs)
3174 : get_64bit_program_headers (file, phdrs))
3176 program_headers = phdrs;
3184 /* Returns 1 if the program headers were loaded. */
3187 process_program_headers (FILE *file)
3189 Elf_Internal_Phdr *segment;
3192 if (elf_header.e_phnum == 0)
3195 printf (_("\nThere are no program headers in this file.\n"));
3199 if (do_segments && !do_header)
3201 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3202 printf (_("Entry point "));
3203 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3204 printf (_("\nThere are %d program headers, starting at offset "),
3205 elf_header.e_phnum);
3206 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3210 if (! get_program_headers (file))
3215 if (elf_header.e_phnum > 1)
3216 printf (_("\nProgram Headers:\n"));
3218 printf (_("\nProgram Headers:\n"));
3222 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3225 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3229 (_(" Type Offset VirtAddr PhysAddr\n"));
3231 (_(" FileSiz MemSiz Flags Align\n"));
3238 for (i = 0, segment = program_headers;
3239 i < elf_header.e_phnum;
3244 printf (" %-14.14s ", get_segment_type (segment->p_type));
3248 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3249 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3250 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3251 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3252 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3254 (segment->p_flags & PF_R ? 'R' : ' '),
3255 (segment->p_flags & PF_W ? 'W' : ' '),
3256 (segment->p_flags & PF_X ? 'E' : ' '));
3257 printf ("%#lx", (unsigned long) segment->p_align);
3261 if ((unsigned long) segment->p_offset == segment->p_offset)
3262 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3265 print_vma (segment->p_offset, FULL_HEX);
3269 print_vma (segment->p_vaddr, FULL_HEX);
3271 print_vma (segment->p_paddr, FULL_HEX);
3274 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3275 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3278 print_vma (segment->p_filesz, FULL_HEX);
3282 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3283 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3286 print_vma (segment->p_offset, FULL_HEX);
3290 (segment->p_flags & PF_R ? 'R' : ' '),
3291 (segment->p_flags & PF_W ? 'W' : ' '),
3292 (segment->p_flags & PF_X ? 'E' : ' '));
3294 if ((unsigned long) segment->p_align == segment->p_align)
3295 printf ("%#lx", (unsigned long) segment->p_align);
3298 print_vma (segment->p_align, PREFIX_HEX);
3303 print_vma (segment->p_offset, FULL_HEX);
3305 print_vma (segment->p_vaddr, FULL_HEX);
3307 print_vma (segment->p_paddr, FULL_HEX);
3309 print_vma (segment->p_filesz, FULL_HEX);
3311 print_vma (segment->p_memsz, FULL_HEX);
3313 (segment->p_flags & PF_R ? 'R' : ' '),
3314 (segment->p_flags & PF_W ? 'W' : ' '),
3315 (segment->p_flags & PF_X ? 'E' : ' '));
3316 print_vma (segment->p_align, HEX);
3320 switch (segment->p_type)
3324 error (_("more than one dynamic segment\n"));
3326 /* Try to locate the .dynamic section. If there is
3327 a section header table, we can easily locate it. */
3328 if (section_headers != NULL)
3330 Elf_Internal_Shdr *sec;
3332 sec = find_section (".dynamic");
3333 if (sec == NULL || sec->sh_size == 0)
3335 error (_("no .dynamic section in the dynamic segment"));
3339 dynamic_addr = sec->sh_offset;
3340 dynamic_size = sec->sh_size;
3342 if (dynamic_addr < segment->p_offset
3343 || dynamic_addr > segment->p_offset + segment->p_filesz)
3344 warn (_("the .dynamic section is not contained within the dynamic segment"));
3345 else if (dynamic_addr > segment->p_offset)
3346 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3350 /* Otherwise, we can only assume that the .dynamic
3351 section is the first section in the DYNAMIC segment. */
3352 dynamic_addr = segment->p_offset;
3353 dynamic_size = segment->p_filesz;
3358 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3360 error (_("Unable to find program interpreter name\n"));
3363 program_interpreter[0] = 0;
3364 fscanf (file, "%63s", program_interpreter);
3367 printf (_("\n [Requesting program interpreter: %s]"),
3368 program_interpreter);
3374 putc ('\n', stdout);
3377 if (do_segments && section_headers != NULL)
3379 printf (_("\n Section to Segment mapping:\n"));
3380 printf (_(" Segment Sections...\n"));
3382 assert (string_table != NULL);
3384 for (i = 0; i < elf_header.e_phnum; i++)
3387 Elf_Internal_Shdr *section;
3389 segment = program_headers + i;
3390 section = section_headers;
3392 printf (" %2.2d ", i);
3394 for (j = 1; j < elf_header.e_shnum; j++, section++)
3396 if (section->sh_size > 0
3397 /* Compare allocated sections by VMA, unallocated
3398 sections by file offset. */
3399 && (section->sh_flags & SHF_ALLOC
3400 ? (section->sh_addr >= segment->p_vaddr
3401 && section->sh_addr + section->sh_size
3402 <= segment->p_vaddr + segment->p_memsz)
3403 : ((bfd_vma) section->sh_offset >= segment->p_offset
3404 && (section->sh_offset + section->sh_size
3405 <= segment->p_offset + segment->p_filesz)))
3406 /* .tbss is special. It doesn't contribute memory space
3407 to normal segments. */
3408 && (!((section->sh_flags & SHF_TLS) != 0
3409 && section->sh_type == SHT_NOBITS)
3410 || segment->p_type == PT_TLS))
3411 printf ("%s ", SECTION_NAME (section));
3422 /* Find the file offset corresponding to VMA by using the program headers. */
3425 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3427 Elf_Internal_Phdr *seg;
3429 if (! get_program_headers (file))
3431 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3435 for (seg = program_headers;
3436 seg < program_headers + elf_header.e_phnum;
3439 if (seg->p_type != PT_LOAD)
3442 if (vma >= (seg->p_vaddr & -seg->p_align)
3443 && vma + size <= seg->p_vaddr + seg->p_filesz)
3444 return vma - seg->p_vaddr + seg->p_offset;
3447 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3454 get_32bit_section_headers (FILE *file, unsigned int num)
3456 Elf32_External_Shdr *shdrs;
3457 Elf_Internal_Shdr *internal;
3460 shdrs = get_data (NULL, file, elf_header.e_shoff,
3461 elf_header.e_shentsize * num, _("section headers"));
3465 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3467 if (section_headers == NULL)
3469 error (_("Out of memory\n"));
3473 for (i = 0, internal = section_headers;
3477 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3478 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3479 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3480 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3481 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3482 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3483 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3484 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3485 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3486 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3495 get_64bit_section_headers (FILE *file, unsigned int num)
3497 Elf64_External_Shdr *shdrs;
3498 Elf_Internal_Shdr *internal;
3501 shdrs = get_data (NULL, file, elf_header.e_shoff,
3502 elf_header.e_shentsize * num, _("section headers"));
3506 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3508 if (section_headers == NULL)
3510 error (_("Out of memory\n"));
3514 for (i = 0, internal = section_headers;
3518 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3519 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3520 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3521 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3522 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3523 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3524 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3525 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3526 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3527 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3535 static Elf_Internal_Sym *
3536 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3538 unsigned long number;
3539 Elf32_External_Sym *esyms;
3540 Elf_External_Sym_Shndx *shndx;
3541 Elf_Internal_Sym *isyms;
3542 Elf_Internal_Sym *psym;
3545 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3551 if (symtab_shndx_hdr != NULL
3552 && (symtab_shndx_hdr->sh_link
3553 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3555 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3556 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3564 number = section->sh_size / section->sh_entsize;
3565 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3569 error (_("Out of memory\n"));
3576 for (j = 0, psym = isyms;
3580 psym->st_name = BYTE_GET (esyms[j].st_name);
3581 psym->st_value = BYTE_GET (esyms[j].st_value);
3582 psym->st_size = BYTE_GET (esyms[j].st_size);
3583 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3584 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3586 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3587 psym->st_info = BYTE_GET (esyms[j].st_info);
3588 psym->st_other = BYTE_GET (esyms[j].st_other);
3598 static Elf_Internal_Sym *
3599 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3601 unsigned long number;
3602 Elf64_External_Sym *esyms;
3603 Elf_External_Sym_Shndx *shndx;
3604 Elf_Internal_Sym *isyms;
3605 Elf_Internal_Sym *psym;
3608 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3614 if (symtab_shndx_hdr != NULL
3615 && (symtab_shndx_hdr->sh_link
3616 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3618 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3619 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3627 number = section->sh_size / section->sh_entsize;
3628 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3632 error (_("Out of memory\n"));
3639 for (j = 0, psym = isyms;
3643 psym->st_name = BYTE_GET (esyms[j].st_name);
3644 psym->st_info = BYTE_GET (esyms[j].st_info);
3645 psym->st_other = BYTE_GET (esyms[j].st_other);
3646 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3647 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3649 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3650 psym->st_value = BYTE_GET (esyms[j].st_value);
3651 psym->st_size = BYTE_GET (esyms[j].st_size);
3662 get_elf_section_flags (bfd_vma sh_flags)
3664 static char buff[33];
3671 flag = sh_flags & - sh_flags;
3676 case SHF_WRITE: *p = 'W'; break;
3677 case SHF_ALLOC: *p = 'A'; break;
3678 case SHF_EXECINSTR: *p = 'X'; break;
3679 case SHF_MERGE: *p = 'M'; break;
3680 case SHF_STRINGS: *p = 'S'; break;
3681 case SHF_INFO_LINK: *p = 'I'; break;
3682 case SHF_LINK_ORDER: *p = 'L'; break;
3683 case SHF_OS_NONCONFORMING: *p = 'O'; break;
3684 case SHF_GROUP: *p = 'G'; break;
3685 case SHF_TLS: *p = 'T'; break;
3688 if (flag & SHF_MASKOS)
3691 sh_flags &= ~ SHF_MASKOS;
3693 else if (flag & SHF_MASKPROC)
3696 sh_flags &= ~ SHF_MASKPROC;
3710 process_section_headers (FILE *file)
3712 Elf_Internal_Shdr *section;
3715 section_headers = NULL;
3717 if (elf_header.e_shnum == 0)
3720 printf (_("\nThere are no sections in this file.\n"));
3725 if (do_sections && !do_header)
3726 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3727 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3731 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3734 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3737 /* Read in the string table, so that we have names to display. */
3738 section = SECTION_HEADER (elf_header.e_shstrndx);
3740 if (section->sh_size != 0)
3742 string_table = get_data (NULL, file, section->sh_offset,
3743 section->sh_size, _("string table"));
3745 if (string_table == NULL)
3748 string_table_length = section->sh_size;
3751 /* Scan the sections for the dynamic symbol table
3752 and dynamic string table and debug sections. */
3753 dynamic_symbols = NULL;
3754 dynamic_strings = NULL;
3755 dynamic_syminfo = NULL;
3756 symtab_shndx_hdr = NULL;
3758 eh_addr_size = is_32bit_elf ? 4 : 8;
3759 switch (elf_header.e_machine)
3762 case EM_MIPS_RS3_LE:
3763 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3764 FDE addresses. However, the ABI also has a semi-official ILP32
3765 variant for which the normal FDE address size rules apply.
3767 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3768 section, where XX is the size of longs in bits. Unfortunately,
3769 earlier compilers provided no way of distinguishing ILP32 objects
3770 from LP64 objects, so if there's any doubt, we should assume that
3771 the official LP64 form is being used. */
3772 if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
3773 && find_section (".gcc_compiled_long32") == NULL)
3778 for (i = 0, section = section_headers;
3779 i < elf_header.e_shnum;
3782 char *name = SECTION_NAME (section);
3784 if (section->sh_type == SHT_DYNSYM)
3786 if (dynamic_symbols != NULL)
3788 error (_("File contains multiple dynamic symbol tables\n"));
3792 num_dynamic_syms = section->sh_size / section->sh_entsize;
3793 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3795 else if (section->sh_type == SHT_STRTAB
3796 && streq (name, ".dynstr"))
3798 if (dynamic_strings != NULL)
3800 error (_("File contains multiple dynamic string tables\n"));
3804 dynamic_strings = get_data (NULL, file, section->sh_offset,
3805 section->sh_size, _("dynamic strings"));
3806 dynamic_strings_length = section->sh_size;
3808 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3810 if (symtab_shndx_hdr != NULL)
3812 error (_("File contains multiple symtab shndx tables\n"));
3815 symtab_shndx_hdr = section;
3817 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3818 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3819 || do_debug_frames || do_debug_macinfo || do_debug_str
3820 || do_debug_loc || do_debug_ranges)
3821 && strneq (name, ".debug_", 7))
3826 || (do_debug_info && streq (name, "info"))
3827 || (do_debug_abbrevs && streq (name, "abbrev"))
3828 || (do_debug_lines && streq (name, "line"))
3829 || (do_debug_pubnames && streq (name, "pubnames"))
3830 || (do_debug_aranges && streq (name, "aranges"))
3831 || (do_debug_ranges && streq (name, "ranges"))
3832 || (do_debug_frames && streq (name, "frame"))
3833 || (do_debug_macinfo && streq (name, "macinfo"))
3834 || (do_debug_str && streq (name, "str"))
3835 || (do_debug_loc && streq (name, "loc"))
3837 request_dump (i, DEBUG_DUMP);
3839 /* linkonce section to be combined with .debug_info at link time. */
3840 else if ((do_debugging || do_debug_info)
3841 && strneq (name, ".gnu.linkonce.wi.", 17))
3842 request_dump (i, DEBUG_DUMP);
3843 else if (do_debug_frames && streq (name, ".eh_frame"))
3844 request_dump (i, DEBUG_DUMP);
3850 if (elf_header.e_shnum > 1)
3851 printf (_("\nSection Headers:\n"));
3853 printf (_("\nSection Header:\n"));
3857 if (do_full_section_name)
3859 printf (_(" [Nr] Name\n"));
3860 printf (_(" Type Addr Off Size ES Flg Lk Inf Al\n"));
3864 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3868 if (do_full_section_name)
3870 printf (_(" [Nr] Name\n"));
3871 printf (_(" Type Address Off Size ES Flg Lk Inf Al\n"));
3875 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3879 if (do_full_section_name)
3881 printf (_(" [Nr] Name\n"));
3882 printf (_(" Flags Type Address Offset\n"));
3883 printf (_(" Size EntSize Link Info Align\n"));
3887 printf (_(" [Nr] Name Type Address Offset\n"));
3888 printf (_(" Size EntSize Flags Link Info Align\n"));
3892 for (i = 0, section = section_headers;
3893 i < elf_header.e_shnum;
3896 if (do_full_section_name)
3898 printf (" [%2u] %s\n",
3899 SECTION_HEADER_NUM (i),
3900 SECTION_NAME (section));
3901 if (is_32bit_elf || do_wide)
3902 printf (" %-15.15s ",
3903 get_section_type_name (section->sh_type));
3906 printf (" [%2u] %-17.17s %-15.15s ",
3907 SECTION_HEADER_NUM (i),
3908 SECTION_NAME (section),
3909 get_section_type_name (section->sh_type));
3913 print_vma (section->sh_addr, LONG_HEX);
3915 printf ( " %6.6lx %6.6lx %2.2lx",
3916 (unsigned long) section->sh_offset,
3917 (unsigned long) section->sh_size,
3918 (unsigned long) section->sh_entsize);
3920 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3922 printf ("%2ld %3lu %2ld\n",
3923 (unsigned long) section->sh_link,
3924 (unsigned long) section->sh_info,
3925 (unsigned long) section->sh_addralign);
3929 print_vma (section->sh_addr, LONG_HEX);
3931 if ((long) section->sh_offset == section->sh_offset)
3932 printf (" %6.6lx", (unsigned long) section->sh_offset);
3936 print_vma (section->sh_offset, LONG_HEX);
3939 if ((unsigned long) section->sh_size == section->sh_size)
3940 printf (" %6.6lx", (unsigned long) section->sh_size);
3944 print_vma (section->sh_size, LONG_HEX);
3947 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3948 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3952 print_vma (section->sh_entsize, LONG_HEX);
3955 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3957 printf ("%2ld %3lu ",
3958 (unsigned long) section->sh_link,
3959 (unsigned long) section->sh_info);
3961 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3962 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3965 print_vma (section->sh_addralign, DEC);
3969 else if (do_full_section_name)
3971 printf (" %-15.15s %-15.15s ",
3972 get_elf_section_flags (section->sh_flags),
3973 get_section_type_name (section->sh_type));
3975 print_vma (section->sh_addr, LONG_HEX);
3976 if ((long) section->sh_offset == section->sh_offset)
3977 printf (" %8.8lx", (unsigned long) section->sh_offset);
3981 print_vma (section->sh_offset, LONG_HEX);
3984 print_vma (section->sh_size, LONG_HEX);
3986 print_vma (section->sh_entsize, LONG_HEX);
3988 printf (" %2ld %3lu %ld\n",
3989 (unsigned long) section->sh_link,
3990 (unsigned long) section->sh_info,
3991 (unsigned long) section->sh_addralign);
3996 print_vma (section->sh_addr, LONG_HEX);
3997 if ((long) section->sh_offset == section->sh_offset)
3998 printf (" %8.8lx", (unsigned long) section->sh_offset);
4002 print_vma (section->sh_offset, LONG_HEX);
4005 print_vma (section->sh_size, LONG_HEX);
4007 print_vma (section->sh_entsize, LONG_HEX);
4009 printf (" %3s ", get_elf_section_flags (section->sh_flags));
4011 printf (" %2ld %3lu %ld\n",
4012 (unsigned long) section->sh_link,
4013 (unsigned long) section->sh_info,
4014 (unsigned long) section->sh_addralign);
4018 printf (_("Key to Flags:\n\
4019 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4020 I (info), L (link order), G (group), x (unknown)\n\
4021 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4027 get_group_flags (unsigned int flags)
4029 static char buff[32];
4036 snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x]"), flags);
4043 process_section_groups (FILE *file)
4045 Elf_Internal_Shdr *section;
4047 struct group *group;
4048 Elf_Internal_Shdr *symtab_sec, *strtab_sec;
4049 Elf_Internal_Sym *symtab;
4052 /* Don't process section groups unless needed. */
4053 if (!do_unwind && !do_section_groups)
4056 if (elf_header.e_shnum == 0)
4058 if (do_section_groups)
4059 printf (_("\nThere are no sections in this file.\n"));
4064 if (section_headers == NULL)
4066 error (_("Section headers are not available!\n"));
4070 section_headers_groups = calloc (elf_header.e_shnum,
4071 sizeof (struct group *));
4073 if (section_headers_groups == NULL)
4075 error (_("Out of memory\n"));
4079 /* Scan the sections for the group section. */
4081 for (i = 0, section = section_headers;
4082 i < elf_header.e_shnum;
4084 if (section->sh_type == SHT_GROUP)
4087 if (group_count == 0)
4089 if (do_section_groups)
4090 printf (_("\nThere are no section groups in this file.\n"));
4095 section_groups = calloc (group_count, sizeof (struct group));
4097 if (section_groups == NULL)
4099 error (_("Out of memory\n"));
4107 for (i = 0, section = section_headers, group = section_groups;
4108 i < elf_header.e_shnum;
4111 if (section->sh_type == SHT_GROUP)
4113 char *name = SECTION_NAME (section);
4115 unsigned char *start, *indices;
4116 unsigned int entry, j, size;
4117 Elf_Internal_Shdr *sec;
4118 Elf_Internal_Sym *sym;
4120 /* Get the symbol table. */
4121 sec = SECTION_HEADER (section->sh_link);
4122 if (sec->sh_type != SHT_SYMTAB)
4124 error (_("Bad sh_link in group section `%s'\n"), name);
4128 if (symtab_sec != sec)
4133 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
4136 sym = symtab + section->sh_info;
4138 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4140 bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
4143 error (_("Bad sh_info in group section `%s'\n"), name);
4147 group_name = SECTION_NAME (section_headers + sec_index);
4152 /* Get the string table. */
4153 sec = SECTION_HEADER (symtab_sec->sh_link);
4154 if (strtab_sec != sec)
4159 strtab = get_data (NULL, file, strtab_sec->sh_offset,
4160 strtab_sec->sh_size,
4163 group_name = strtab + sym->st_name;
4166 start = get_data (NULL, file, section->sh_offset,
4167 section->sh_size, _("section data"));
4170 size = (section->sh_size / section->sh_entsize) - 1;
4171 entry = byte_get (indices, 4);
4174 if (do_section_groups)
4176 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
4177 get_group_flags (entry), name, group_name, size);
4179 printf (_(" [Index] Name\n"));
4182 group->group_index = i;
4184 for (j = 0; j < size; j++)
4186 struct group_list *g;
4188 entry = byte_get (indices, 4);
4191 if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
4196 error (_("section [%5u] already in group section [%5u]\n"),
4198 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4203 /* Intel C/C++ compiler may put section 0 in a
4204 section group. We just warn it the first time
4205 and ignore it afterwards. */
4206 static int warned = 0;
4209 error (_("section 0 in group section [%5u]\n"),
4210 section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4216 section_headers_groups [SECTION_HEADER_INDEX (entry)]
4219 if (do_section_groups)
4221 sec = SECTION_HEADER (entry);
4222 printf (" [%5u] %s\n",
4223 entry, SECTION_NAME (sec));
4226 g = xmalloc (sizeof (struct group_list));
4227 g->section_index = entry;
4228 g->next = group->root;
4252 } dynamic_relocations [] =
4254 { "REL", DT_REL, DT_RELSZ, FALSE },
4255 { "RELA", DT_RELA, DT_RELASZ, TRUE },
4256 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4259 /* Process the reloc section. */
4262 process_relocs (FILE *file)
4264 unsigned long rel_size;
4265 unsigned long rel_offset;
4271 if (do_using_dynamic)
4275 int has_dynamic_reloc;
4278 has_dynamic_reloc = 0;
4280 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4282 is_rela = dynamic_relocations [i].rela;
4283 name = dynamic_relocations [i].name;
4284 rel_size = dynamic_info [dynamic_relocations [i].size];
4285 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4287 has_dynamic_reloc |= rel_size;
4289 if (is_rela == UNKNOWN)
4291 if (dynamic_relocations [i].reloc == DT_JMPREL)
4292 switch (dynamic_info[DT_PLTREL])
4306 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4307 name, rel_offset, rel_size);
4309 dump_relocations (file,
4310 offset_from_vma (file, rel_offset, rel_size),
4312 dynamic_symbols, num_dynamic_syms,
4313 dynamic_strings, dynamic_strings_length, is_rela);
4317 if (! has_dynamic_reloc)
4318 printf (_("\nThere are no dynamic relocations in this file.\n"));
4322 Elf_Internal_Shdr *section;
4326 for (i = 0, section = section_headers;
4327 i < elf_header.e_shnum;
4330 if ( section->sh_type != SHT_RELA
4331 && section->sh_type != SHT_REL)
4334 rel_offset = section->sh_offset;
4335 rel_size = section->sh_size;
4339 Elf_Internal_Shdr *strsec;
4342 printf (_("\nRelocation section "));
4344 if (string_table == NULL)
4345 printf ("%d", section->sh_name);
4347 printf (_("'%s'"), SECTION_NAME (section));
4349 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4350 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4352 is_rela = section->sh_type == SHT_RELA;
4354 if (section->sh_link)
4356 Elf_Internal_Shdr *symsec;
4357 Elf_Internal_Sym *symtab;
4358 unsigned long nsyms;
4359 unsigned long strtablen;
4360 char *strtab = NULL;
4362 symsec = SECTION_HEADER (section->sh_link);
4363 nsyms = symsec->sh_size / symsec->sh_entsize;
4364 symtab = GET_ELF_SYMBOLS (file, symsec);
4369 strsec = SECTION_HEADER (symsec->sh_link);
4371 strtab = get_data (NULL, file, strsec->sh_offset,
4372 strsec->sh_size, _("string table"));
4373 strtablen = strtab == NULL ? 0 : strsec->sh_size;
4375 dump_relocations (file, rel_offset, rel_size,
4376 symtab, nsyms, strtab, strtablen, is_rela);
4382 dump_relocations (file, rel_offset, rel_size,
4383 NULL, 0, NULL, 0, is_rela);
4390 printf (_("\nThere are no relocations in this file.\n"));
4396 /* Process the unwind section. */
4398 #include "unwind-ia64.h"
4400 /* An absolute address consists of a section and an offset. If the
4401 section is NULL, the offset itself is the address, otherwise, the
4402 address equals to LOAD_ADDRESS(section) + offset. */
4406 unsigned short section;
4410 struct ia64_unw_aux_info
4412 struct ia64_unw_table_entry
4414 struct absaddr start;
4416 struct absaddr info;
4418 *table; /* Unwind table. */
4419 unsigned long table_len; /* Length of unwind table. */
4420 unsigned char *info; /* Unwind info. */
4421 unsigned long info_size; /* Size of unwind info. */
4422 bfd_vma info_addr; /* starting address of unwind info. */
4423 bfd_vma seg_base; /* Starting address of segment. */
4424 Elf_Internal_Sym *symtab; /* The symbol table. */
4425 unsigned long nsyms; /* Number of symbols. */
4426 char *strtab; /* The string table. */
4427 unsigned long strtab_size; /* Size of string table. */
4431 find_symbol_for_address (Elf_Internal_Sym *symtab,
4432 unsigned long nsyms,
4434 unsigned long strtab_size,
4435 struct absaddr addr,
4436 const char **symname,
4439 bfd_vma dist = 0x100000;
4440 Elf_Internal_Sym *sym, *best = NULL;
4443 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4445 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4446 && sym->st_name != 0
4447 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4448 && addr.offset >= sym->st_value
4449 && addr.offset - sym->st_value < dist)
4452 dist = addr.offset - sym->st_value;
4459 *symname = (best->st_name >= strtab_size
4460 ? "<corrupt>" : strtab + best->st_name);
4465 *offset = addr.offset;
4469 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4471 struct ia64_unw_table_entry *tp;
4474 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4478 const unsigned char *dp;
4479 const unsigned char *head;
4480 const char *procname;
4482 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4483 aux->strtab_size, tp->start, &procname, &offset);
4485 fputs ("\n<", stdout);
4489 fputs (procname, stdout);
4492 printf ("+%lx", (unsigned long) offset);
4495 fputs (">: [", stdout);
4496 print_vma (tp->start.offset, PREFIX_HEX);
4497 fputc ('-', stdout);
4498 print_vma (tp->end.offset, PREFIX_HEX);
4499 printf ("], info at +0x%lx\n",
4500 (unsigned long) (tp->info.offset - aux->seg_base));
4502 head = aux->info + (tp->info.offset - aux->info_addr);
4503 stamp = BYTE_GET ((unsigned char *) head);
4505 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4506 (unsigned) UNW_VER (stamp),
4507 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4508 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4509 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4510 (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
4512 if (UNW_VER (stamp) != 1)
4514 printf ("\tUnknown version.\n");
4519 for (dp = head + 8; dp < head + 8 + eh_addr_size * UNW_LENGTH (stamp);)
4520 dp = unw_decode (dp, in_body, & in_body);
4525 slurp_ia64_unwind_table (FILE *file,
4526 struct ia64_unw_aux_info *aux,
4527 Elf_Internal_Shdr *sec)
4529 unsigned long size, nrelas, i;
4530 Elf_Internal_Phdr *seg;
4531 struct ia64_unw_table_entry *tep;
4532 Elf_Internal_Shdr *relsec;
4533 Elf_Internal_Rela *rela, *rp;
4534 unsigned char *table, *tp;
4535 Elf_Internal_Sym *sym;
4536 const char *relname;
4538 /* First, find the starting address of the segment that includes
4541 if (elf_header.e_phnum)
4543 if (! get_program_headers (file))
4546 for (seg = program_headers;
4547 seg < program_headers + elf_header.e_phnum;
4550 if (seg->p_type != PT_LOAD)
4553 if (sec->sh_addr >= seg->p_vaddr
4554 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4556 aux->seg_base = seg->p_vaddr;
4562 /* Second, build the unwind table from the contents of the unwind section: */
4563 size = sec->sh_size;
4564 table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
4568 aux->table = xmalloc (size / (3 * eh_addr_size) * sizeof (aux->table[0]));
4570 for (tp = table; tp < table + size; tp += 3 * eh_addr_size, ++tep)
4572 tep->start.section = SHN_UNDEF;
4573 tep->end.section = SHN_UNDEF;
4574 tep->info.section = SHN_UNDEF;
4577 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4578 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4579 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4583 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
4584 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
4585 tep->info.offset = BYTE_GET ((unsigned char *) tp + 16);
4587 tep->start.offset += aux->seg_base;
4588 tep->end.offset += aux->seg_base;
4589 tep->info.offset += aux->seg_base;
4593 /* Third, apply any relocations to the unwind table: */
4595 for (relsec = section_headers;
4596 relsec < section_headers + elf_header.e_shnum;
4599 if (relsec->sh_type != SHT_RELA
4600 || SECTION_HEADER (relsec->sh_info) != sec)
4603 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4607 for (rp = rela; rp < rela + nrelas; ++rp)
4611 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4612 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4616 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4617 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4620 if (! strneq (relname, "R_IA64_SEGREL", 13))
4622 warn (_("Skipping unexpected relocation type %s\n"), relname);
4626 i = rp->r_offset / (3 * eh_addr_size);
4628 switch (rp->r_offset/eh_addr_size % 3)
4631 aux->table[i].start.section = sym->st_shndx;
4632 aux->table[i].start.offset += rp->r_addend + sym->st_value;
4635 aux->table[i].end.section = sym->st_shndx;
4636 aux->table[i].end.offset += rp->r_addend + sym->st_value;
4639 aux->table[i].info.section = sym->st_shndx;
4640 aux->table[i].info.offset += rp->r_addend + sym->st_value;
4650 aux->table_len = size / (3 * eh_addr_size);
4655 ia64_process_unwind (FILE *file)
4657 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4658 unsigned long i, unwcount = 0, unwstart = 0;
4659 struct ia64_unw_aux_info aux;
4661 memset (& aux, 0, sizeof (aux));
4663 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4665 if (sec->sh_type == SHT_SYMTAB)
4667 aux.nsyms = sec->sh_size / sec->sh_entsize;
4668 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4670 strsec = SECTION_HEADER (sec->sh_link);
4671 aux.strtab_size = strsec->sh_size;
4672 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4673 aux.strtab_size, _("string table"));
4675 else if (sec->sh_type == SHT_IA_64_UNWIND)
4680 printf (_("\nThere are no unwind sections in this file.\n"));
4682 while (unwcount-- > 0)
4687 for (i = unwstart, sec = section_headers + unwstart;
4688 i < elf_header.e_shnum; ++i, ++sec)
4689 if (sec->sh_type == SHT_IA_64_UNWIND)
4696 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4698 if ((unwsec->sh_flags & SHF_GROUP) != 0)
4700 /* We need to find which section group it is in. */
4701 struct group_list *g = section_headers_groups [i]->root;
4703 for (; g != NULL; g = g->next)
4705 sec = SECTION_HEADER (g->section_index);
4707 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
4712 i = elf_header.e_shnum;
4714 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
4716 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4717 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4718 suffix = SECTION_NAME (unwsec) + len;
4719 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4721 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
4722 && streq (SECTION_NAME (sec) + len2, suffix))
4727 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4728 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4729 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4730 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4732 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
4733 suffix = SECTION_NAME (unwsec) + len;
4734 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4736 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
4737 && streq (SECTION_NAME (sec) + len2, suffix))
4741 if (i == elf_header.e_shnum)
4743 printf (_("\nCould not find unwind info section for "));
4745 if (string_table == NULL)
4746 printf ("%d", unwsec->sh_name);
4748 printf (_("'%s'"), SECTION_NAME (unwsec));
4752 aux.info_size = sec->sh_size;
4753 aux.info_addr = sec->sh_addr;
4754 aux.info = get_data (NULL, file, sec->sh_offset, aux.info_size,
4757 printf (_("\nUnwind section "));
4759 if (string_table == NULL)
4760 printf ("%d", unwsec->sh_name);
4762 printf (_("'%s'"), SECTION_NAME (unwsec));
4764 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4765 (unsigned long) unwsec->sh_offset,
4766 (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
4768 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4770 if (aux.table_len > 0)
4771 dump_ia64_unwind (& aux);
4774 free ((char *) aux.table);
4776 free ((char *) aux.info);
4785 free ((char *) aux.strtab);
4790 struct hppa_unw_aux_info
4792 struct hppa_unw_table_entry
4794 struct absaddr start;
4796 unsigned int Cannot_unwind:1; /* 0 */
4797 unsigned int Millicode:1; /* 1 */
4798 unsigned int Millicode_save_sr0:1; /* 2 */
4799 unsigned int Region_description:2; /* 3..4 */
4800 unsigned int reserved1:1; /* 5 */
4801 unsigned int Entry_SR:1; /* 6 */
4802 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
4803 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
4804 unsigned int Args_stored:1; /* 16 */
4805 unsigned int Variable_Frame:1; /* 17 */
4806 unsigned int Separate_Package_Body:1; /* 18 */
4807 unsigned int Frame_Extension_Millicode:1; /* 19 */
4808 unsigned int Stack_Overflow_Check:1; /* 20 */
4809 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
4810 unsigned int Ada_Region:1; /* 22 */
4811 unsigned int cxx_info:1; /* 23 */
4812 unsigned int cxx_try_catch:1; /* 24 */
4813 unsigned int sched_entry_seq:1; /* 25 */
4814 unsigned int reserved2:1; /* 26 */
4815 unsigned int Save_SP:1; /* 27 */
4816 unsigned int Save_RP:1; /* 28 */
4817 unsigned int Save_MRP_in_frame:1; /* 29 */
4818 unsigned int extn_ptr_defined:1; /* 30 */
4819 unsigned int Cleanup_defined:1; /* 31 */
4821 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
4822 unsigned int HP_UX_interrupt_marker:1; /* 1 */
4823 unsigned int Large_frame:1; /* 2 */
4824 unsigned int Pseudo_SP_Set:1; /* 3 */
4825 unsigned int reserved4:1; /* 4 */
4826 unsigned int Total_frame_size:27; /* 5..31 */
4828 *table; /* Unwind table. */
4829 unsigned long table_len; /* Length of unwind table. */
4830 bfd_vma seg_base; /* Starting address of segment. */
4831 Elf_Internal_Sym *symtab; /* The symbol table. */
4832 unsigned long nsyms; /* Number of symbols. */
4833 char *strtab; /* The string table. */
4834 unsigned long strtab_size; /* Size of string table. */
4838 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
4840 struct hppa_unw_table_entry *tp;
4842 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4845 const char *procname;
4847 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4848 aux->strtab_size, tp->start, &procname,
4851 fputs ("\n<", stdout);
4855 fputs (procname, stdout);
4858 printf ("+%lx", (unsigned long) offset);
4861 fputs (">: [", stdout);
4862 print_vma (tp->start.offset, PREFIX_HEX);
4863 fputc ('-', stdout);
4864 print_vma (tp->end.offset, PREFIX_HEX);
4867 #define PF(_m) if (tp->_m) printf (#_m " ");
4868 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
4871 PF(Millicode_save_sr0);
4872 /* PV(Region_description); */
4878 PF(Separate_Package_Body);
4879 PF(Frame_Extension_Millicode);
4880 PF(Stack_Overflow_Check);
4881 PF(Two_Instruction_SP_Increment);
4885 PF(sched_entry_seq);
4888 PF(Save_MRP_in_frame);
4889 PF(extn_ptr_defined);
4890 PF(Cleanup_defined);
4891 PF(MPE_XL_interrupt_marker);
4892 PF(HP_UX_interrupt_marker);
4895 PV(Total_frame_size);
4904 slurp_hppa_unwind_table (FILE *file,
4905 struct hppa_unw_aux_info *aux,
4906 Elf_Internal_Shdr *sec)
4908 unsigned long size, unw_ent_size, nrelas, i;
4909 Elf_Internal_Phdr *seg;
4910 struct hppa_unw_table_entry *tep;
4911 Elf_Internal_Shdr *relsec;
4912 Elf_Internal_Rela *rela, *rp;
4913 unsigned char *table, *tp;
4914 Elf_Internal_Sym *sym;
4915 const char *relname;
4917 /* First, find the starting address of the segment that includes
4920 if (elf_header.e_phnum)
4922 if (! get_program_headers (file))
4925 for (seg = program_headers;
4926 seg < program_headers + elf_header.e_phnum;
4929 if (seg->p_type != PT_LOAD)
4932 if (sec->sh_addr >= seg->p_vaddr
4933 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4935 aux->seg_base = seg->p_vaddr;
4941 /* Second, build the unwind table from the contents of the unwind
4943 size = sec->sh_size;
4944 table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
4948 unw_ent_size = 2 * eh_addr_size + 8;
4950 tep = aux->table = xmalloc (size / unw_ent_size * sizeof (aux->table[0]));
4952 for (tp = table; tp < table + size; tp += (2 * eh_addr_size + 8), ++tep)
4954 unsigned int tmp1, tmp2;
4956 tep->start.section = SHN_UNDEF;
4957 tep->end.section = SHN_UNDEF;
4961 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4962 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4963 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
4964 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
4968 tep->start.offset = BYTE_GET ((unsigned char *) tp + 0);
4969 tep->end.offset = BYTE_GET ((unsigned char *) tp + 8);
4970 tmp1 = byte_get ((unsigned char *) tp + 16, 4);
4971 tmp2 = byte_get ((unsigned char *) tp + 20, 4);
4974 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
4975 tep->Millicode = (tmp1 >> 30) & 0x1;
4976 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
4977 tep->Region_description = (tmp1 >> 27) & 0x3;
4978 tep->reserved1 = (tmp1 >> 26) & 0x1;
4979 tep->Entry_SR = (tmp1 >> 25) & 0x1;
4980 tep->Entry_FR = (tmp1 >> 21) & 0xf;
4981 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
4982 tep->Args_stored = (tmp1 >> 15) & 0x1;
4983 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
4984 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
4985 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
4986 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
4987 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
4988 tep->Ada_Region = (tmp1 >> 9) & 0x1;
4989 tep->cxx_info = (tmp1 >> 8) & 0x1;
4990 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
4991 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
4992 tep->reserved2 = (tmp1 >> 5) & 0x1;
4993 tep->Save_SP = (tmp1 >> 4) & 0x1;
4994 tep->Save_RP = (tmp1 >> 3) & 0x1;
4995 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
4996 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
4997 tep->Cleanup_defined = tmp1 & 0x1;
4999 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
5000 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
5001 tep->Large_frame = (tmp2 >> 29) & 0x1;
5002 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
5003 tep->reserved4 = (tmp2 >> 27) & 0x1;
5004 tep->Total_frame_size = tmp2 & 0x7ffffff;
5006 tep->start.offset += aux->seg_base;
5007 tep->end.offset += aux->seg_base;
5011 /* Third, apply any relocations to the unwind table. */
5013 for (relsec = section_headers;
5014 relsec < section_headers + elf_header.e_shnum;
5017 if (relsec->sh_type != SHT_RELA
5018 || SECTION_HEADER (relsec->sh_info) != sec)
5021 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
5025 for (rp = rela; rp < rela + nrelas; ++rp)
5029 relname = elf_hppa_reloc_type (ELF32_R_TYPE (rp->r_info));
5030 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
5034 relname = elf_hppa_reloc_type (ELF64_R_TYPE (rp->r_info));
5035 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
5038 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5039 if (strncmp (relname, "R_PARISC_SEGREL", 15) != 0)
5041 warn (_("Skipping unexpected relocation type %s\n"), relname);
5045 i = rp->r_offset / unw_ent_size;
5047 switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
5050 aux->table[i].start.section = sym->st_shndx;
5051 aux->table[i].start.offset += sym->st_value + rp->r_addend;
5054 aux->table[i].end.section = sym->st_shndx;
5055 aux->table[i].end.offset += sym->st_value + rp->r_addend;
5065 aux->table_len = size / unw_ent_size;
5071 hppa_process_unwind (FILE *file)
5073 struct hppa_unw_aux_info aux;
5074 Elf_Internal_Shdr *unwsec = NULL;
5075 Elf_Internal_Shdr *strsec;
5076 Elf_Internal_Shdr *sec;
5079 memset (& aux, 0, sizeof (aux));
5081 assert (string_table != NULL);
5083 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5085 if (sec->sh_type == SHT_SYMTAB)
5087 aux.nsyms = sec->sh_size / sec->sh_entsize;
5088 aux.symtab = GET_ELF_SYMBOLS (file, sec);
5090 strsec = SECTION_HEADER (sec->sh_link);
5091 aux.strtab_size = strsec->sh_size;
5092 aux.strtab = get_data (NULL, file, strsec->sh_offset,
5093 aux.strtab_size, _("string table"));
5095 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5100 printf (_("\nThere are no unwind sections in this file.\n"));
5102 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
5104 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
5106 printf (_("\nUnwind section "));
5107 printf (_("'%s'"), SECTION_NAME (sec));
5109 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5110 (unsigned long) sec->sh_offset,
5111 (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
5113 slurp_hppa_unwind_table (file, &aux, sec);
5114 if (aux.table_len > 0)
5115 dump_hppa_unwind (&aux);
5118 free ((char *) aux.table);
5126 free ((char *) aux.strtab);
5132 process_unwind (FILE *file)
5134 struct unwind_handler {
5136 int (*handler)(FILE *file);
5138 { EM_IA_64, ia64_process_unwind },
5139 { EM_PARISC, hppa_process_unwind },
5147 for (i = 0; handlers[i].handler != NULL; i++)
5148 if (elf_header.e_machine == handlers[i].machtype)
5149 return handlers[i].handler (file);
5151 printf (_("\nThere are no unwind sections in this file.\n"));
5156 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5158 switch (entry->d_tag)
5161 if (entry->d_un.d_val == 0)
5165 static const char * opts[] =
5167 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5168 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5169 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5170 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5175 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
5176 if (entry->d_un.d_val & (1 << cnt))
5178 printf ("%s%s", first ? "" : " ", opts[cnt]);
5185 case DT_MIPS_IVERSION:
5186 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5187 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5189 printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5192 case DT_MIPS_TIME_STAMP:
5197 time_t time = entry->d_un.d_val;
5198 tmp = gmtime (&time);
5199 snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
5200 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5201 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5202 printf ("Time Stamp: %s\n", timebuf);
5206 case DT_MIPS_RLD_VERSION:
5207 case DT_MIPS_LOCAL_GOTNO:
5208 case DT_MIPS_CONFLICTNO:
5209 case DT_MIPS_LIBLISTNO:
5210 case DT_MIPS_SYMTABNO:
5211 case DT_MIPS_UNREFEXTNO:
5212 case DT_MIPS_HIPAGENO:
5213 case DT_MIPS_DELTA_CLASS_NO:
5214 case DT_MIPS_DELTA_INSTANCE_NO:
5215 case DT_MIPS_DELTA_RELOC_NO:
5216 case DT_MIPS_DELTA_SYM_NO:
5217 case DT_MIPS_DELTA_CLASSSYM_NO:
5218 case DT_MIPS_COMPACT_SIZE:
5219 printf ("%ld\n", (long) entry->d_un.d_ptr);
5223 printf ("%#lx\n", (long) entry->d_un.d_ptr);
5229 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5231 switch (entry->d_tag)
5233 case DT_HP_DLD_FLAGS:
5242 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5243 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5244 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5245 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5246 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5247 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5248 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5249 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5250 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5251 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5252 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
5256 bfd_vma val = entry->d_un.d_val;
5258 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
5259 if (val & flags[cnt].bit)
5263 fputs (flags[cnt].str, stdout);
5265 val ^= flags[cnt].bit;
5268 if (val != 0 || first)
5272 print_vma (val, HEX);
5278 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5285 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5287 switch (entry->d_tag)
5289 case DT_IA_64_PLT_RESERVE:
5290 /* First 3 slots reserved. */
5291 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5293 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5297 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5304 get_32bit_dynamic_section (FILE *file)
5306 Elf32_External_Dyn *edyn, *ext;
5307 Elf_Internal_Dyn *entry;
5309 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
5310 _("dynamic section"));
5314 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5315 might not have the luxury of section headers. Look for the DT_NULL
5316 terminator to determine the number of entries. */
5317 for (ext = edyn, dynamic_nent = 0;
5318 (char *) ext < (char *) edyn + dynamic_size;
5322 if (BYTE_GET (ext->d_tag) == DT_NULL)
5326 dynamic_section = malloc (dynamic_nent * sizeof (*entry));
5327 if (dynamic_section == NULL)
5329 error (_("Out of memory\n"));
5334 for (ext = edyn, entry = dynamic_section;
5335 entry < dynamic_section + dynamic_nent;
5338 entry->d_tag = BYTE_GET (ext->d_tag);
5339 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5348 get_64bit_dynamic_section (FILE *file)
5350 Elf64_External_Dyn *edyn, *ext;
5351 Elf_Internal_Dyn *entry;
5353 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
5354 _("dynamic section"));
5358 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5359 might not have the luxury of section headers. Look for the DT_NULL
5360 terminator to determine the number of entries. */
5361 for (ext = edyn, dynamic_nent = 0;
5362 (char *) ext < (char *) edyn + dynamic_size;
5366 if (BYTE_GET (ext->d_tag) == DT_NULL)
5370 dynamic_section = malloc (dynamic_nent * sizeof (*entry));
5371 if (dynamic_section == NULL)
5373 error (_("Out of memory\n"));
5378 for (ext = edyn, entry = dynamic_section;
5379 entry < dynamic_section + dynamic_nent;
5382 entry->d_tag = BYTE_GET (ext->d_tag);
5383 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5392 print_dynamic_flags (bfd_vma flags)
5400 flag = flags & - flags;
5410 case DF_ORIGIN: fputs ("ORIGIN", stdout); break;
5411 case DF_SYMBOLIC: fputs ("SYMBOLIC", stdout); break;
5412 case DF_TEXTREL: fputs ("TEXTREL", stdout); break;
5413 case DF_BIND_NOW: fputs ("BIND_NOW", stdout); break;
5414 case DF_STATIC_TLS: fputs ("STATIC_TLS", stdout); break;
5415 default: fputs ("unknown", stdout); break;
5421 /* Parse and display the contents of the dynamic section. */
5424 process_dynamic_section (FILE *file)
5426 Elf_Internal_Dyn *entry;
5428 if (dynamic_size == 0)
5431 printf (_("\nThere is no dynamic section in this file.\n"));
5438 if (! get_32bit_dynamic_section (file))
5441 else if (! get_64bit_dynamic_section (file))
5444 /* Find the appropriate symbol table. */
5445 if (dynamic_symbols == NULL)
5447 for (entry = dynamic_section;
5448 entry < dynamic_section + dynamic_nent;
5451 Elf_Internal_Shdr section;
5453 if (entry->d_tag != DT_SYMTAB)
5456 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5458 /* Since we do not know how big the symbol table is,
5459 we default to reading in the entire file (!) and
5460 processing that. This is overkill, I know, but it
5462 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5464 if (archive_file_offset != 0)
5465 section.sh_size = archive_file_size - section.sh_offset;
5468 if (fseek (file, 0, SEEK_END))
5469 error (_("Unable to seek to end of file!"));
5471 section.sh_size = ftell (file) - section.sh_offset;
5475 section.sh_entsize = sizeof (Elf32_External_Sym);
5477 section.sh_entsize = sizeof (Elf64_External_Sym);
5479 num_dynamic_syms = section.sh_size / section.sh_entsize;
5480 if (num_dynamic_syms < 1)
5482 error (_("Unable to determine the number of symbols to load\n"));
5486 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
5490 /* Similarly find a string table. */
5491 if (dynamic_strings == NULL)
5493 for (entry = dynamic_section;
5494 entry < dynamic_section + dynamic_nent;
5497 unsigned long offset;
5500 if (entry->d_tag != DT_STRTAB)
5503 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5505 /* Since we do not know how big the string table is,
5506 we default to reading in the entire file (!) and
5507 processing that. This is overkill, I know, but it
5510 offset = offset_from_vma (file, entry->d_un.d_val, 0);
5512 if (archive_file_offset != 0)
5513 str_tab_len = archive_file_size - offset;
5516 if (fseek (file, 0, SEEK_END))
5517 error (_("Unable to seek to end of file\n"));
5518 str_tab_len = ftell (file) - offset;
5521 if (str_tab_len < 1)
5524 (_("Unable to determine the length of the dynamic string table\n"));
5528 dynamic_strings = get_data (NULL, file, offset, str_tab_len,
5529 _("dynamic string table"));
5530 dynamic_strings_length = str_tab_len;
5535 /* And find the syminfo section if available. */
5536 if (dynamic_syminfo == NULL)
5538 unsigned long syminsz = 0;
5540 for (entry = dynamic_section;
5541 entry < dynamic_section + dynamic_nent;
5544 if (entry->d_tag == DT_SYMINENT)
5546 /* Note: these braces are necessary to avoid a syntax
5547 error from the SunOS4 C compiler. */
5548 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
5550 else if (entry->d_tag == DT_SYMINSZ)
5551 syminsz = entry->d_un.d_val;
5552 else if (entry->d_tag == DT_SYMINFO)
5553 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
5557 if (dynamic_syminfo_offset != 0 && syminsz != 0)
5559 Elf_External_Syminfo *extsyminfo, *extsym;
5560 Elf_Internal_Syminfo *syminfo;
5562 /* There is a syminfo section. Read the data. */
5563 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, syminsz,
5564 _("symbol information"));
5568 dynamic_syminfo = malloc (syminsz);
5569 if (dynamic_syminfo == NULL)
5571 error (_("Out of memory\n"));
5575 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
5576 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
5577 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
5578 ++syminfo, ++extsym)
5580 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
5581 syminfo->si_flags = BYTE_GET (extsym->si_flags);
5588 if (do_dynamic && dynamic_addr)
5589 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5590 dynamic_addr, dynamic_nent);
5592 printf (_(" Tag Type Name/Value\n"));
5594 for (entry = dynamic_section;
5595 entry < dynamic_section + dynamic_nent;
5603 print_vma (entry->d_tag, FULL_HEX);
5604 dtype = get_dynamic_type (entry->d_tag);
5605 printf (" (%s)%*s", dtype,
5606 ((is_32bit_elf ? 27 : 19)
5607 - (int) strlen (dtype)),
5611 switch (entry->d_tag)
5615 print_dynamic_flags (entry->d_un.d_val);
5625 switch (entry->d_tag)
5628 printf (_("Auxiliary library"));
5632 printf (_("Filter library"));
5636 printf (_("Configuration file"));
5640 printf (_("Dependency audit library"));
5644 printf (_("Audit library"));
5648 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5649 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5653 print_vma (entry->d_un.d_val, PREFIX_HEX);
5662 printf (_("Flags:"));
5664 if (entry->d_un.d_val == 0)
5665 printf (_(" None\n"));
5668 unsigned long int val = entry->d_un.d_val;
5670 if (val & DTF_1_PARINIT)
5672 printf (" PARINIT");
5673 val ^= DTF_1_PARINIT;
5675 if (val & DTF_1_CONFEXP)
5677 printf (" CONFEXP");
5678 val ^= DTF_1_CONFEXP;
5681 printf (" %lx", val);
5690 printf (_("Flags:"));
5692 if (entry->d_un.d_val == 0)
5693 printf (_(" None\n"));
5696 unsigned long int val = entry->d_un.d_val;
5698 if (val & DF_P1_LAZYLOAD)
5700 printf (" LAZYLOAD");
5701 val ^= DF_P1_LAZYLOAD;
5703 if (val & DF_P1_GROUPPERM)
5705 printf (" GROUPPERM");
5706 val ^= DF_P1_GROUPPERM;
5709 printf (" %lx", val);
5718 printf (_("Flags:"));
5719 if (entry->d_un.d_val == 0)
5720 printf (_(" None\n"));
5723 unsigned long int val = entry->d_un.d_val;
5730 if (val & DF_1_GLOBAL)
5735 if (val & DF_1_GROUP)
5740 if (val & DF_1_NODELETE)
5742 printf (" NODELETE");
5743 val ^= DF_1_NODELETE;
5745 if (val & DF_1_LOADFLTR)
5747 printf (" LOADFLTR");
5748 val ^= DF_1_LOADFLTR;
5750 if (val & DF_1_INITFIRST)
5752 printf (" INITFIRST");
5753 val ^= DF_1_INITFIRST;
5755 if (val & DF_1_NOOPEN)
5760 if (val & DF_1_ORIGIN)
5765 if (val & DF_1_DIRECT)
5770 if (val & DF_1_TRANS)
5775 if (val & DF_1_INTERPOSE)
5777 printf (" INTERPOSE");
5778 val ^= DF_1_INTERPOSE;
5780 if (val & DF_1_NODEFLIB)
5782 printf (" NODEFLIB");
5783 val ^= DF_1_NODEFLIB;
5785 if (val & DF_1_NODUMP)
5790 if (val & DF_1_CONLFAT)
5792 printf (" CONLFAT");
5793 val ^= DF_1_CONLFAT;
5796 printf (" %lx", val);
5803 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5805 puts (get_dynamic_type (entry->d_un.d_val));
5825 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5831 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5832 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
5838 switch (entry->d_tag)
5841 printf (_("Shared library: [%s]"), name);
5843 if (streq (name, program_interpreter))
5844 printf (_(" program interpreter"));
5848 printf (_("Library soname: [%s]"), name);
5852 printf (_("Library rpath: [%s]"), name);
5856 printf (_("Library runpath: [%s]"), name);
5860 print_vma (entry->d_un.d_val, PREFIX_HEX);
5865 print_vma (entry->d_un.d_val, PREFIX_HEX);
5878 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5882 case DT_INIT_ARRAYSZ:
5883 case DT_FINI_ARRAYSZ:
5884 case DT_GNU_CONFLICTSZ:
5885 case DT_GNU_LIBLISTSZ:
5888 print_vma (entry->d_un.d_val, UNSIGNED);
5889 printf (" (bytes)\n");
5899 print_vma (entry->d_un.d_val, UNSIGNED);
5912 if (entry->d_tag == DT_USED
5913 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
5915 char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
5919 printf (_("Not needed object: [%s]\n"), name);
5924 print_vma (entry->d_un.d_val, PREFIX_HEX);
5930 /* The value of this entry is ignored. */
5935 case DT_GNU_PRELINKED:
5939 time_t time = entry->d_un.d_val;
5941 tmp = gmtime (&time);
5942 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5943 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5944 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5950 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5951 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5956 switch (elf_header.e_machine)
5959 case EM_MIPS_RS3_LE:
5960 dynamic_section_mips_val (entry);
5963 dynamic_section_parisc_val (entry);
5966 dynamic_section_ia64_val (entry);
5969 print_vma (entry->d_un.d_val, PREFIX_HEX);
5981 get_ver_flags (unsigned int flags)
5983 static char buff[32];
5990 if (flags & VER_FLG_BASE)
5991 strcat (buff, "BASE ");
5993 if (flags & VER_FLG_WEAK)
5995 if (flags & VER_FLG_BASE)
5996 strcat (buff, "| ");
5998 strcat (buff, "WEAK ");
6001 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
6002 strcat (buff, "| <unknown>");
6007 /* Display the contents of the version sections. */
6009 process_version_sections (FILE *file)
6011 Elf_Internal_Shdr *section;
6018 for (i = 0, section = section_headers;
6019 i < elf_header.e_shnum;
6022 switch (section->sh_type)
6024 case SHT_GNU_verdef:
6026 Elf_External_Verdef *edefs;
6033 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6034 SECTION_NAME (section), section->sh_info);
6036 printf (_(" Addr: 0x"));
6037 printf_vma (section->sh_addr);
6038 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6039 (unsigned long) section->sh_offset, section->sh_link,
6040 SECTION_NAME (SECTION_HEADER (section->sh_link)));
6042 edefs = get_data (NULL, file, section->sh_offset, section->sh_size,
6043 _("version definition section"));
6047 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6050 Elf_External_Verdef *edef;
6051 Elf_Internal_Verdef ent;
6052 Elf_External_Verdaux *eaux;
6053 Elf_Internal_Verdaux aux;
6057 vstart = ((char *) edefs) + idx;
6059 edef = (Elf_External_Verdef *) vstart;
6061 ent.vd_version = BYTE_GET (edef->vd_version);
6062 ent.vd_flags = BYTE_GET (edef->vd_flags);
6063 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
6064 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
6065 ent.vd_hash = BYTE_GET (edef->vd_hash);
6066 ent.vd_aux = BYTE_GET (edef->vd_aux);
6067 ent.vd_next = BYTE_GET (edef->vd_next);
6069 printf (_(" %#06x: Rev: %d Flags: %s"),
6070 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
6072 printf (_(" Index: %d Cnt: %d "),
6073 ent.vd_ndx, ent.vd_cnt);
6075 vstart += ent.vd_aux;
6077 eaux = (Elf_External_Verdaux *) vstart;
6079 aux.vda_name = BYTE_GET (eaux->vda_name);
6080 aux.vda_next = BYTE_GET (eaux->vda_next);
6082 if (VALID_DYNAMIC_NAME (aux.vda_name))
6083 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
6085 printf (_("Name index: %ld\n"), aux.vda_name);
6087 isum = idx + ent.vd_aux;
6089 for (j = 1; j < ent.vd_cnt; j++)
6091 isum += aux.vda_next;
6092 vstart += aux.vda_next;
6094 eaux = (Elf_External_Verdaux *) vstart;
6096 aux.vda_name = BYTE_GET (eaux->vda_name);
6097 aux.vda_next = BYTE_GET (eaux->vda_next);
6099 if (VALID_DYNAMIC_NAME (aux.vda_name))
6100 printf (_(" %#06x: Parent %d: %s\n"),
6101 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
6103 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6104 isum, j, aux.vda_name);
6114 case SHT_GNU_verneed:
6116 Elf_External_Verneed *eneed;
6122 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6123 SECTION_NAME (section), section->sh_info);
6125 printf (_(" Addr: 0x"));
6126 printf_vma (section->sh_addr);
6127 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6128 (unsigned long) section->sh_offset, section->sh_link,
6129 SECTION_NAME (SECTION_HEADER (section->sh_link)));
6131 eneed = get_data (NULL, file, section->sh_offset, section->sh_size,
6132 _("version need section"));
6136 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
6138 Elf_External_Verneed *entry;
6139 Elf_Internal_Verneed ent;
6144 vstart = ((char *) eneed) + idx;
6146 entry = (Elf_External_Verneed *) vstart;
6148 ent.vn_version = BYTE_GET (entry->vn_version);
6149 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
6150 ent.vn_file = BYTE_GET (entry->vn_file);
6151 ent.vn_aux = BYTE_GET (entry->vn_aux);
6152 ent.vn_next = BYTE_GET (entry->vn_next);
6154 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
6156 if (VALID_DYNAMIC_NAME (ent.vn_file))
6157 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6159 printf (_(" File: %lx"), ent.vn_file);
6161 printf (_(" Cnt: %d\n"), ent.vn_cnt);
6163 vstart += ent.vn_aux;
6165 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6167 Elf_External_Vernaux *eaux;
6168 Elf_Internal_Vernaux aux;
6170 eaux = (Elf_External_Vernaux *) vstart;
6172 aux.vna_hash = BYTE_GET (eaux->vna_hash);
6173 aux.vna_flags = BYTE_GET (eaux->vna_flags);
6174 aux.vna_other = BYTE_GET (eaux->vna_other);
6175 aux.vna_name = BYTE_GET (eaux->vna_name);
6176 aux.vna_next = BYTE_GET (eaux->vna_next);
6178 if (VALID_DYNAMIC_NAME (aux.vna_name))
6179 printf (_(" %#06x: Name: %s"),
6180 isum, GET_DYNAMIC_NAME (aux.vna_name));
6182 printf (_(" %#06x: Name index: %lx"),
6183 isum, aux.vna_name);
6185 printf (_(" Flags: %s Version: %d\n"),
6186 get_ver_flags (aux.vna_flags), aux.vna_other);
6188 isum += aux.vna_next;
6189 vstart += aux.vna_next;
6199 case SHT_GNU_versym:
6201 Elf_Internal_Shdr *link_section;
6204 unsigned char *edata;
6205 unsigned short *data;
6207 Elf_Internal_Sym *symbols;
6208 Elf_Internal_Shdr *string_sec;
6211 link_section = SECTION_HEADER (section->sh_link);
6212 total = section->sh_size / section->sh_entsize;
6216 symbols = GET_ELF_SYMBOLS (file, link_section);
6218 string_sec = SECTION_HEADER (link_section->sh_link);
6220 strtab = get_data (NULL, file, string_sec->sh_offset,
6221 string_sec->sh_size, _("version string table"));
6225 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6226 SECTION_NAME (section), total);
6228 printf (_(" Addr: "));
6229 printf_vma (section->sh_addr);
6230 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6231 (unsigned long) section->sh_offset, section->sh_link,
6232 SECTION_NAME (link_section));
6234 off = offset_from_vma (file,
6235 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6236 total * sizeof (short));
6237 edata = get_data (NULL, file, off, total * sizeof (short),
6238 _("version symbol data"));
6245 data = malloc (total * sizeof (short));
6247 for (cnt = total; cnt --;)
6248 data[cnt] = byte_get (edata + cnt * sizeof (short),
6253 for (cnt = 0; cnt < total; cnt += 4)
6256 int check_def, check_need;
6259 printf (" %03x:", cnt);
6261 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6262 switch (data[cnt + j])
6265 fputs (_(" 0 (*local*) "), stdout);
6269 fputs (_(" 1 (*global*) "), stdout);
6273 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6274 data[cnt + j] & 0x8000 ? 'h' : ' ');
6278 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
6281 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6288 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6290 Elf_Internal_Verneed ivn;
6291 unsigned long offset;
6293 offset = offset_from_vma
6294 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6295 sizeof (Elf_External_Verneed));
6299 Elf_Internal_Vernaux ivna;
6300 Elf_External_Verneed evn;
6301 Elf_External_Vernaux evna;
6302 unsigned long a_off;
6304 get_data (&evn, file, offset, sizeof (evn),
6307 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6308 ivn.vn_next = BYTE_GET (evn.vn_next);
6310 a_off = offset + ivn.vn_aux;
6314 get_data (&evna, file, a_off, sizeof (evna),
6315 _("version need aux (2)"));
6317 ivna.vna_next = BYTE_GET (evna.vna_next);
6318 ivna.vna_other = BYTE_GET (evna.vna_other);
6320 a_off += ivna.vna_next;
6322 while (ivna.vna_other != data[cnt + j]
6323 && ivna.vna_next != 0);
6325 if (ivna.vna_other == data[cnt + j])
6327 ivna.vna_name = BYTE_GET (evna.vna_name);
6329 name = strtab + ivna.vna_name;
6330 nn += printf ("(%s%-*s",
6332 12 - (int) strlen (name),
6338 offset += ivn.vn_next;
6340 while (ivn.vn_next);
6343 if (check_def && data[cnt + j] != 0x8001
6344 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6346 Elf_Internal_Verdef ivd;
6347 Elf_External_Verdef evd;
6348 unsigned long offset;
6350 offset = offset_from_vma
6351 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6356 get_data (&evd, file, offset, sizeof (evd),
6359 ivd.vd_next = BYTE_GET (evd.vd_next);
6360 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6362 offset += ivd.vd_next;
6364 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6365 && ivd.vd_next != 0);
6367 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6369 Elf_External_Verdaux evda;
6370 Elf_Internal_Verdaux ivda;
6372 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6374 get_data (&evda, file,
6375 offset - ivd.vd_next + ivd.vd_aux,
6376 sizeof (evda), _("version def aux"));
6378 ivda.vda_name = BYTE_GET (evda.vda_name);
6380 name = strtab + ivda.vda_name;
6381 nn += printf ("(%s%-*s",
6383 12 - (int) strlen (name),
6389 printf ("%*c", 18 - nn, ' ');
6407 printf (_("\nNo version information found in this file.\n"));
6413 get_symbol_binding (unsigned int binding)
6415 static char buff[32];
6419 case STB_LOCAL: return "LOCAL";
6420 case STB_GLOBAL: return "GLOBAL";
6421 case STB_WEAK: return "WEAK";
6423 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6424 snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
6426 else if (binding >= STB_LOOS && binding <= STB_HIOS)
6427 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
6429 snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
6435 get_symbol_type (unsigned int type)
6437 static char buff[32];
6441 case STT_NOTYPE: return "NOTYPE";
6442 case STT_OBJECT: return "OBJECT";
6443 case STT_FUNC: return "FUNC";
6444 case STT_SECTION: return "SECTION";
6445 case STT_FILE: return "FILE";
6446 case STT_COMMON: return "COMMON";
6447 case STT_TLS: return "TLS";
6449 if (type >= STT_LOPROC && type <= STT_HIPROC)
6451 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6452 return "THUMB_FUNC";
6454 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6457 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6458 return "PARISC_MILLI";
6460 snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
6462 else if (type >= STT_LOOS && type <= STT_HIOS)
6464 if (elf_header.e_machine == EM_PARISC)
6466 if (type == STT_HP_OPAQUE)
6468 if (type == STT_HP_STUB)
6472 snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
6475 snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
6481 get_symbol_visibility (unsigned int visibility)
6485 case STV_DEFAULT: return "DEFAULT";
6486 case STV_INTERNAL: return "INTERNAL";
6487 case STV_HIDDEN: return "HIDDEN";
6488 case STV_PROTECTED: return "PROTECTED";
6494 get_symbol_index_type (unsigned int type)
6496 static char buff[32];
6500 case SHN_UNDEF: return "UND";
6501 case SHN_ABS: return "ABS";
6502 case SHN_COMMON: return "COM";
6504 if (type == SHN_IA_64_ANSI_COMMON
6505 && elf_header.e_machine == EM_IA_64
6506 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
6508 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
6509 sprintf (buff, "PRC[0x%04x]", type);
6510 else if (type >= SHN_LOOS && type <= SHN_HIOS)
6511 sprintf (buff, "OS [0x%04x]", type);
6512 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
6513 sprintf (buff, "RSV[0x%04x]", type);
6515 sprintf (buff, "%3d", type);
6523 get_dynamic_data (FILE *file, unsigned int number, unsigned int ent_size)
6525 unsigned char *e_data;
6528 e_data = malloc (number * ent_size);
6532 error (_("Out of memory\n"));
6536 if (fread (e_data, ent_size, number, file) != number)
6538 error (_("Unable to read in dynamic data\n"));
6542 i_data = malloc (number * sizeof (*i_data));
6546 error (_("Out of memory\n"));
6552 i_data[number] = byte_get (e_data + number * ent_size, ent_size);
6559 /* Dump the symbol table. */
6561 process_symbol_table (FILE *file)
6563 Elf_Internal_Shdr *section;
6564 bfd_vma nbuckets = 0;
6565 bfd_vma nchains = 0;
6566 bfd_vma *buckets = NULL;
6567 bfd_vma *chains = NULL;
6569 if (! do_syms && !do_histogram)
6572 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
6575 unsigned char nb[8];
6576 unsigned char nc[8];
6577 int hash_ent_size = 4;
6579 if ((elf_header.e_machine == EM_ALPHA
6580 || elf_header.e_machine == EM_S390
6581 || elf_header.e_machine == EM_S390_OLD)
6582 && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
6586 (archive_file_offset
6587 + offset_from_vma (file, dynamic_info[DT_HASH],
6588 sizeof nb + sizeof nc)),
6591 error (_("Unable to seek to start of dynamic information"));
6595 if (fread (nb, hash_ent_size, 1, file) != 1)
6597 error (_("Failed to read in number of buckets\n"));
6601 if (fread (nc, hash_ent_size, 1, file) != 1)
6603 error (_("Failed to read in number of chains\n"));
6607 nbuckets = byte_get (nb, hash_ent_size);
6608 nchains = byte_get (nc, hash_ent_size);
6610 buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
6611 chains = get_dynamic_data (file, nchains, hash_ent_size);
6613 if (buckets == NULL || chains == NULL)
6618 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
6623 printf (_("\nSymbol table for image:\n"));
6625 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6627 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6629 for (hn = 0; hn < nbuckets; hn++)
6634 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
6636 Elf_Internal_Sym *psym;
6639 psym = dynamic_symbols + si;
6641 n = print_vma (si, DEC_5);
6643 fputs (" " + n, stdout);
6644 printf (" %3lu: ", hn);
6645 print_vma (psym->st_value, LONG_HEX);
6647 print_vma (psym->st_size, DEC_5);
6649 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6650 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6651 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6652 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
6653 if (VALID_DYNAMIC_NAME (psym->st_name))
6654 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
6656 printf (" <corrupt: %14ld>", psym->st_name);
6661 else if (do_syms && !do_using_dynamic)
6665 for (i = 0, section = section_headers;
6666 i < elf_header.e_shnum;
6671 Elf_Internal_Sym *symtab;
6672 Elf_Internal_Sym *psym;
6675 if ( section->sh_type != SHT_SYMTAB
6676 && section->sh_type != SHT_DYNSYM)
6679 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6680 SECTION_NAME (section),
6681 (unsigned long) (section->sh_size / section->sh_entsize));
6683 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6685 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6687 symtab = GET_ELF_SYMBOLS (file, section);
6691 if (section->sh_link == elf_header.e_shstrndx)
6692 strtab = string_table;
6695 Elf_Internal_Shdr *string_sec;
6697 string_sec = SECTION_HEADER (section->sh_link);
6699 strtab = get_data (NULL, file, string_sec->sh_offset,
6700 string_sec->sh_size, _("string table"));
6703 for (si = 0, psym = symtab;
6704 si < section->sh_size / section->sh_entsize;
6707 printf ("%6d: ", si);
6708 print_vma (psym->st_value, LONG_HEX);
6710 print_vma (psym->st_size, DEC_5);
6711 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6712 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6713 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6714 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
6715 print_symbol (25, strtab + psym->st_name);
6717 if (section->sh_type == SHT_DYNSYM &&
6718 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
6720 unsigned char data[2];
6721 unsigned short vers_data;
6722 unsigned long offset;
6726 offset = offset_from_vma
6727 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6728 sizeof data + si * sizeof (vers_data));
6730 get_data (&data, file, offset + si * sizeof (vers_data),
6731 sizeof (data), _("version data"));
6733 vers_data = byte_get (data, 2);
6735 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
6738 check_def = (psym->st_shndx != SHN_UNDEF);
6740 if ((vers_data & 0x8000) || vers_data > 1)
6742 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
6743 && (is_nobits || ! check_def))
6745 Elf_External_Verneed evn;
6746 Elf_Internal_Verneed ivn;
6747 Elf_Internal_Vernaux ivna;
6749 /* We must test both. */
6750 offset = offset_from_vma
6751 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6756 unsigned long vna_off;
6758 get_data (&evn, file, offset, sizeof (evn),
6761 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6762 ivn.vn_next = BYTE_GET (evn.vn_next);
6764 vna_off = offset + ivn.vn_aux;
6768 Elf_External_Vernaux evna;
6770 get_data (&evna, file, vna_off,
6772 _("version need aux (3)"));
6774 ivna.vna_other = BYTE_GET (evna.vna_other);
6775 ivna.vna_next = BYTE_GET (evna.vna_next);
6776 ivna.vna_name = BYTE_GET (evna.vna_name);
6778 vna_off += ivna.vna_next;
6780 while (ivna.vna_other != vers_data
6781 && ivna.vna_next != 0);
6783 if (ivna.vna_other == vers_data)
6786 offset += ivn.vn_next;
6788 while (ivn.vn_next != 0);
6790 if (ivna.vna_other == vers_data)
6793 strtab + ivna.vna_name, ivna.vna_other);
6796 else if (! is_nobits)
6797 error (_("bad dynamic symbol"));
6804 if (vers_data != 0x8001
6805 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6807 Elf_Internal_Verdef ivd;
6808 Elf_Internal_Verdaux ivda;
6809 Elf_External_Verdaux evda;
6810 unsigned long offset;
6812 offset = offset_from_vma
6814 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6815 sizeof (Elf_External_Verdef));
6819 Elf_External_Verdef evd;
6821 get_data (&evd, file, offset, sizeof (evd),
6824 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6825 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6826 ivd.vd_next = BYTE_GET (evd.vd_next);
6828 offset += ivd.vd_next;
6830 while (ivd.vd_ndx != (vers_data & 0x7fff)
6831 && ivd.vd_next != 0);
6833 offset -= ivd.vd_next;
6834 offset += ivd.vd_aux;
6836 get_data (&evda, file, offset, sizeof (evda),
6837 _("version def aux"));
6839 ivda.vda_name = BYTE_GET (evda.vda_name);
6841 if (psym->st_name != ivda.vda_name)
6842 printf ((vers_data & 0x8000)
6844 strtab + ivda.vda_name);
6854 if (strtab != string_table)
6860 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6862 if (do_histogram && buckets != NULL)
6864 unsigned long *lengths;
6865 unsigned long *counts;
6868 unsigned long maxlength = 0;
6869 unsigned long nzero_counts = 0;
6870 unsigned long nsyms = 0;
6872 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
6873 (unsigned long) nbuckets);
6874 printf (_(" Length Number %% of total Coverage\n"));
6876 lengths = calloc (nbuckets, sizeof (*lengths));
6877 if (lengths == NULL)
6879 error (_("Out of memory"));
6882 for (hn = 0; hn < nbuckets; ++hn)
6884 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
6887 if (maxlength < ++lengths[hn])
6892 counts = calloc (maxlength + 1, sizeof (*counts));
6895 error (_("Out of memory"));
6899 for (hn = 0; hn < nbuckets; ++hn)
6900 ++counts[lengths[hn]];
6905 printf (" 0 %-10lu (%5.1f%%)\n",
6906 counts[0], (counts[0] * 100.0) / nbuckets);
6907 for (i = 1; i <= maxlength; ++i)
6909 nzero_counts += counts[i] * i;
6910 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
6911 i, counts[i], (counts[i] * 100.0) / nbuckets,
6912 (nzero_counts * 100.0) / nsyms);
6920 if (buckets != NULL)
6930 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
6934 if (dynamic_syminfo == NULL
6936 /* No syminfo, this is ok. */
6939 /* There better should be a dynamic symbol section. */
6940 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6944 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6945 dynamic_syminfo_offset, dynamic_syminfo_nent);
6947 printf (_(" Num: Name BoundTo Flags\n"));
6948 for (i = 0; i < dynamic_syminfo_nent; ++i)
6950 unsigned short int flags = dynamic_syminfo[i].si_flags;
6952 printf ("%4d: ", i);
6953 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
6954 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
6956 printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
6959 switch (dynamic_syminfo[i].si_boundto)
6961 case SYMINFO_BT_SELF:
6962 fputs ("SELF ", stdout);
6964 case SYMINFO_BT_PARENT:
6965 fputs ("PARENT ", stdout);
6968 if (dynamic_syminfo[i].si_boundto > 0
6969 && dynamic_syminfo[i].si_boundto < dynamic_nent
6970 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
6972 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
6976 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6980 if (flags & SYMINFO_FLG_DIRECT)
6982 if (flags & SYMINFO_FLG_PASSTHRU)
6983 printf (" PASSTHRU");
6984 if (flags & SYMINFO_FLG_COPY)
6986 if (flags & SYMINFO_FLG_LAZYLOAD)
6987 printf (" LAZYLOAD");
6995 #ifdef SUPPORT_DISASSEMBLY
6997 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
6999 printf (_("\nAssembly dump of section %s\n"),
7000 SECTION_NAME (section));
7002 /* XXX -- to be done --- XXX */
7009 dump_section (Elf_Internal_Shdr *section, FILE *file)
7011 bfd_size_type bytes;
7013 unsigned char *data;
7014 unsigned char *start;
7016 bytes = section->sh_size;
7018 if (bytes == 0 || section->sh_type == SHT_NOBITS)
7020 printf (_("\nSection '%s' has no data to dump.\n"),
7021 SECTION_NAME (section));
7025 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
7027 addr = section->sh_addr;
7029 start = get_data (NULL, file, section->sh_offset, bytes, _("section data"));
7041 lbytes = (bytes > 16 ? 16 : bytes);
7043 printf (" 0x%8.8lx ", (unsigned long) addr);
7045 switch (elf_header.e_ident[EI_DATA])
7049 for (j = 15; j >= 0; j --)
7052 printf ("%2.2x", data[j]);
7062 for (j = 0; j < 16; j++)
7065 printf ("%2.2x", data[j]);
7075 for (j = 0; j < lbytes; j++)
7078 if (k >= ' ' && k < 0x7f)
7097 static unsigned long int
7098 read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
7100 unsigned long int result = 0;
7101 unsigned int num_read = 0;
7102 unsigned int shift = 0;
7110 result |= ((unsigned long int) (byte & 0x7f)) << shift;
7115 while (byte & 0x80);
7117 if (length_return != NULL)
7118 *length_return = num_read;
7120 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
7121 result |= -1L << shift;
7126 typedef struct State_Machine_Registers
7128 unsigned long address;
7131 unsigned int column;
7135 /* This variable hold the number of the last entry seen
7136 in the File Table. */
7137 unsigned int last_file_entry;
7140 static SMR state_machine_regs;
7143 reset_state_machine (int is_stmt)
7145 state_machine_regs.address = 0;
7146 state_machine_regs.file = 1;
7147 state_machine_regs.line = 1;
7148 state_machine_regs.column = 0;
7149 state_machine_regs.is_stmt = is_stmt;
7150 state_machine_regs.basic_block = 0;
7151 state_machine_regs.end_sequence = 0;
7152 state_machine_regs.last_file_entry = 0;
7155 /* Handled an extend line op. Returns true if this is the end
7159 process_extended_line_op (unsigned char *data, int is_stmt, int pointer_size)
7161 unsigned char op_code;
7162 unsigned int bytes_read;
7164 unsigned char *name;
7167 len = read_leb128 (data, & bytes_read, 0);
7172 warn (_("badly formed extended line op encountered!\n"));
7179 printf (_(" Extended opcode %d: "), op_code);
7183 case DW_LNE_end_sequence:
7184 printf (_("End of Sequence\n\n"));
7185 reset_state_machine (is_stmt);
7188 case DW_LNE_set_address:
7189 adr = byte_get (data, pointer_size);
7190 printf (_("set Address to 0x%lx\n"), adr);
7191 state_machine_regs.address = adr;
7194 case DW_LNE_define_file:
7195 printf (_(" define new File Table entry\n"));
7196 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7198 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
7200 data += strlen ((char *) data) + 1;
7201 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7203 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7205 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7206 printf (_("%s\n\n"), name);
7210 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
7217 static const char *debug_str_contents;
7218 static bfd_vma debug_str_size;
7221 load_debug_str (FILE *file)
7223 Elf_Internal_Shdr *sec;
7225 /* If it is already loaded, do nothing. */
7226 if (debug_str_contents != NULL)
7229 /* Locate the .debug_str section. */
7230 sec = find_section (".debug_str");
7234 debug_str_size = sec->sh_size;
7236 debug_str_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7237 _("debug_str section data"));
7241 free_debug_str (void)
7243 if (debug_str_contents == NULL)
7246 free ((char *) debug_str_contents);
7247 debug_str_contents = NULL;
7252 fetch_indirect_string (unsigned long offset)
7254 if (debug_str_contents == NULL)
7255 return _("<no .debug_str section>");
7257 if (offset > debug_str_size)
7258 return _("<offset is too big>");
7260 return debug_str_contents + offset;
7263 static const char *debug_loc_contents;
7264 static bfd_vma debug_loc_size;
7267 load_debug_loc (FILE *file)
7269 Elf_Internal_Shdr *sec;
7271 /* If it is already loaded, do nothing. */
7272 if (debug_loc_contents != NULL)
7275 /* Locate the .debug_loc section. */
7276 sec = find_section (".debug_loc");
7280 debug_loc_size = sec->sh_size;
7282 debug_loc_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7283 _("debug_loc section data"));
7287 free_debug_loc (void)
7289 if (debug_loc_contents == NULL)
7292 free ((char *) debug_loc_contents);
7293 debug_loc_contents = NULL;
7297 static const char * debug_range_contents;
7298 static unsigned long debug_range_size;
7301 load_debug_range (FILE *file)
7303 Elf_Internal_Shdr *sec;
7305 /* If it is already loaded, do nothing. */
7306 if (debug_range_contents != NULL)
7309 /* Locate the .debug_str section. */
7310 sec = find_section (".debug_ranges");
7314 debug_range_size = sec->sh_size;
7316 debug_range_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7317 _("debug_range section data"));
7321 free_debug_range (void)
7323 if (debug_range_contents == NULL)
7326 free ((char *) debug_range_contents);
7327 debug_range_contents = NULL;
7328 debug_range_size = 0;
7331 /* Apply addends of RELA relocations. */
7334 debug_apply_rela_addends (FILE *file,
7335 Elf_Internal_Shdr *section,
7337 unsigned char *sec_data,
7338 unsigned char *start,
7341 Elf_Internal_Shdr *relsec;
7343 if (end - start < reloc_size)
7346 for (relsec = section_headers;
7347 relsec < section_headers + elf_header.e_shnum;
7350 unsigned long nrelas;
7351 Elf_Internal_Rela *rela, *rp;
7352 Elf_Internal_Shdr *symsec;
7353 Elf_Internal_Sym *symtab;
7354 Elf_Internal_Sym *sym;
7356 if (relsec->sh_type != SHT_RELA
7357 || SECTION_HEADER (relsec->sh_info) != section
7358 || relsec->sh_size == 0)
7361 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7365 symsec = SECTION_HEADER (relsec->sh_link);
7366 symtab = GET_ELF_SYMBOLS (file, symsec);
7368 for (rp = rela; rp < rela + nrelas; ++rp)
7372 if (rp->r_offset >= (bfd_vma) (start - sec_data)
7373 && rp->r_offset < (bfd_vma) (end - sec_data) - reloc_size)
7374 loc = sec_data + rp->r_offset;
7380 sym = symtab + ELF32_R_SYM (rp->r_info);
7382 if (ELF32_R_SYM (rp->r_info) != 0
7383 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION
7384 /* Relocations against object symbols can happen,
7385 eg when referencing a global array. For an
7386 example of this see the _clz.o binary in libgcc.a. */
7387 && ELF32_ST_TYPE (sym->st_info) != STT_OBJECT)
7389 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7390 get_symbol_type (ELF32_ST_TYPE (sym->st_info)),
7391 SECTION_NAME (section));
7397 /* In MIPS little-endian objects, r_info isn't really a
7398 64-bit little-endian value: it has a 32-bit little-endian
7399 symbol index followed by four individual byte fields.
7400 Reorder INFO accordingly. */
7401 if (elf_header.e_machine == EM_MIPS
7402 && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
7403 rp->r_info = (((rp->r_info & 0xffffffff) << 32)
7404 | ((rp->r_info >> 56) & 0xff)
7405 | ((rp->r_info >> 40) & 0xff00)
7406 | ((rp->r_info >> 24) & 0xff0000)
7407 | ((rp->r_info >> 8) & 0xff000000));
7409 sym = symtab + ELF64_R_SYM (rp->r_info);
7411 if (ELF64_R_SYM (rp->r_info) != 0
7412 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION
7413 && ELF64_ST_TYPE (sym->st_info) != STT_OBJECT)
7415 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7416 get_symbol_type (ELF64_ST_TYPE (sym->st_info)),
7417 SECTION_NAME (section));
7422 byte_put (loc, rp->r_addend, reloc_size);
7432 /* FIXME: There are better and more efficient ways to handle
7433 these structures. For now though, I just want something that
7434 is simple to implement. */
7435 typedef struct abbrev_attr
7437 unsigned long attribute;
7439 struct abbrev_attr *next;
7443 typedef struct abbrev_entry
7445 unsigned long entry;
7448 struct abbrev_attr *first_attr;
7449 struct abbrev_attr *last_attr;
7450 struct abbrev_entry *next;
7454 static abbrev_entry *first_abbrev = NULL;
7455 static abbrev_entry *last_abbrev = NULL;
7460 abbrev_entry *abbrev;
7462 for (abbrev = first_abbrev; abbrev;)
7464 abbrev_entry *next = abbrev->next;
7467 for (attr = abbrev->first_attr; attr;)
7469 abbrev_attr *next = attr->next;
7479 last_abbrev = first_abbrev = NULL;
7483 add_abbrev (unsigned long number, unsigned long tag, int children)
7485 abbrev_entry *entry;
7487 entry = malloc (sizeof (*entry));
7493 entry->entry = number;
7495 entry->children = children;
7496 entry->first_attr = NULL;
7497 entry->last_attr = NULL;
7500 if (first_abbrev == NULL)
7501 first_abbrev = entry;
7503 last_abbrev->next = entry;
7505 last_abbrev = entry;
7509 add_abbrev_attr (unsigned long attribute, unsigned long form)
7513 attr = malloc (sizeof (*attr));
7519 attr->attribute = attribute;
7523 if (last_abbrev->first_attr == NULL)
7524 last_abbrev->first_attr = attr;
7526 last_abbrev->last_attr->next = attr;
7528 last_abbrev->last_attr = attr;
7531 /* Processes the (partial) contents of a .debug_abbrev section.
7532 Returns NULL if the end of the section was encountered.
7533 Returns the address after the last byte read if the end of
7534 an abbreviation set was found. */
7536 static unsigned char *
7537 process_abbrev_section (unsigned char *start, unsigned char *end)
7539 if (first_abbrev != NULL)
7544 unsigned int bytes_read;
7545 unsigned long entry;
7547 unsigned long attribute;
7550 entry = read_leb128 (start, & bytes_read, 0);
7551 start += bytes_read;
7553 /* A single zero is supposed to end the section according
7554 to the standard. If there's more, then signal that to
7557 return start == end ? NULL : start;
7559 tag = read_leb128 (start, & bytes_read, 0);
7560 start += bytes_read;
7562 children = *start++;
7564 add_abbrev (entry, tag, children);
7570 attribute = read_leb128 (start, & bytes_read, 0);
7571 start += bytes_read;
7573 form = read_leb128 (start, & bytes_read, 0);
7574 start += bytes_read;
7577 add_abbrev_attr (attribute, form);
7579 while (attribute != 0);
7586 get_TAG_name (unsigned long tag)
7590 case DW_TAG_padding: return "DW_TAG_padding";
7591 case DW_TAG_array_type: return "DW_TAG_array_type";
7592 case DW_TAG_class_type: return "DW_TAG_class_type";
7593 case DW_TAG_entry_point: return "DW_TAG_entry_point";
7594 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
7595 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
7596 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
7597 case DW_TAG_label: return "DW_TAG_label";
7598 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
7599 case DW_TAG_member: return "DW_TAG_member";
7600 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
7601 case DW_TAG_reference_type: return "DW_TAG_reference_type";
7602 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
7603 case DW_TAG_string_type: return "DW_TAG_string_type";
7604 case DW_TAG_structure_type: return "DW_TAG_structure_type";
7605 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
7606 case DW_TAG_typedef: return "DW_TAG_typedef";
7607 case DW_TAG_union_type: return "DW_TAG_union_type";
7608 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
7609 case DW_TAG_variant: return "DW_TAG_variant";
7610 case DW_TAG_common_block: return "DW_TAG_common_block";
7611 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
7612 case DW_TAG_inheritance: return "DW_TAG_inheritance";
7613 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
7614 case DW_TAG_module: return "DW_TAG_module";
7615 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
7616 case DW_TAG_set_type: return "DW_TAG_set_type";
7617 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
7618 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
7619 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
7620 case DW_TAG_base_type: return "DW_TAG_base_type";
7621 case DW_TAG_catch_block: return "DW_TAG_catch_block";
7622 case DW_TAG_const_type: return "DW_TAG_const_type";
7623 case DW_TAG_constant: return "DW_TAG_constant";
7624 case DW_TAG_enumerator: return "DW_TAG_enumerator";
7625 case DW_TAG_file_type: return "DW_TAG_file_type";
7626 case DW_TAG_friend: return "DW_TAG_friend";
7627 case DW_TAG_namelist: return "DW_TAG_namelist";
7628 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
7629 case DW_TAG_packed_type: return "DW_TAG_packed_type";
7630 case DW_TAG_subprogram: return "DW_TAG_subprogram";
7631 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
7632 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
7633 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
7634 case DW_TAG_try_block: return "DW_TAG_try_block";
7635 case DW_TAG_variant_part: return "DW_TAG_variant_part";
7636 case DW_TAG_variable: return "DW_TAG_variable";
7637 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
7638 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
7639 case DW_TAG_format_label: return "DW_TAG_format_label";
7640 case DW_TAG_function_template: return "DW_TAG_function_template";
7641 case DW_TAG_class_template: return "DW_TAG_class_template";
7642 /* DWARF 2.1 values. */
7643 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
7644 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
7645 case DW_TAG_interface_type: return "DW_TAG_interface_type";
7646 case DW_TAG_namespace: return "DW_TAG_namespace";
7647 case DW_TAG_imported_module: return "DW_TAG_imported_module";
7648 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
7649 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
7650 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
7652 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
7653 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
7654 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
7657 static char buffer[100];
7659 snprintf (buffer, sizeof (buffer), _("Unknown TAG value: %lx"), tag);
7666 get_FORM_name (unsigned long form)
7670 case DW_FORM_addr: return "DW_FORM_addr";
7671 case DW_FORM_block2: return "DW_FORM_block2";
7672 case DW_FORM_block4: return "DW_FORM_block4";
7673 case DW_FORM_data2: return "DW_FORM_data2";
7674 case DW_FORM_data4: return "DW_FORM_data4";
7675 case DW_FORM_data8: return "DW_FORM_data8";
7676 case DW_FORM_string: return "DW_FORM_string";
7677 case DW_FORM_block: return "DW_FORM_block";
7678 case DW_FORM_block1: return "DW_FORM_block1";
7679 case DW_FORM_data1: return "DW_FORM_data1";
7680 case DW_FORM_flag: return "DW_FORM_flag";
7681 case DW_FORM_sdata: return "DW_FORM_sdata";
7682 case DW_FORM_strp: return "DW_FORM_strp";
7683 case DW_FORM_udata: return "DW_FORM_udata";
7684 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
7685 case DW_FORM_ref1: return "DW_FORM_ref1";
7686 case DW_FORM_ref2: return "DW_FORM_ref2";
7687 case DW_FORM_ref4: return "DW_FORM_ref4";
7688 case DW_FORM_ref8: return "DW_FORM_ref8";
7689 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
7690 case DW_FORM_indirect: return "DW_FORM_indirect";
7693 static char buffer[100];
7695 snprintf (buffer, sizeof (buffer), _("Unknown FORM value: %lx"), form);
7701 static unsigned char *
7702 display_block (unsigned char *data, unsigned long length)
7704 printf (_(" %lu byte block: "), length);
7707 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7713 decode_location_expression (unsigned char * data,
7714 unsigned int pointer_size,
7715 unsigned long length,
7716 unsigned long cu_offset)
7719 unsigned int bytes_read;
7720 unsigned long uvalue;
7721 unsigned char *end = data + length;
7722 int need_frame_base = 0;
7731 printf ("DW_OP_addr: %lx",
7732 (unsigned long) byte_get (data, pointer_size));
7733 data += pointer_size;
7736 printf ("DW_OP_deref");
7739 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7742 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
7745 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7749 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
7753 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7757 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
7761 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7762 (unsigned long) byte_get (data + 4, 4));
7766 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7767 (long) byte_get (data + 4, 4));
7771 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7775 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7779 printf ("DW_OP_dup");
7782 printf ("DW_OP_drop");
7785 printf ("DW_OP_over");
7788 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7791 printf ("DW_OP_swap");
7794 printf ("DW_OP_rot");
7797 printf ("DW_OP_xderef");
7800 printf ("DW_OP_abs");
7803 printf ("DW_OP_and");
7806 printf ("DW_OP_div");
7809 printf ("DW_OP_minus");
7812 printf ("DW_OP_mod");
7815 printf ("DW_OP_mul");
7818 printf ("DW_OP_neg");
7821 printf ("DW_OP_not");
7824 printf ("DW_OP_or");
7827 printf ("DW_OP_plus");
7829 case DW_OP_plus_uconst:
7830 printf ("DW_OP_plus_uconst: %lu",
7831 read_leb128 (data, &bytes_read, 0));
7835 printf ("DW_OP_shl");
7838 printf ("DW_OP_shr");
7841 printf ("DW_OP_shra");
7844 printf ("DW_OP_xor");
7847 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
7851 printf ("DW_OP_eq");
7854 printf ("DW_OP_ge");
7857 printf ("DW_OP_gt");
7860 printf ("DW_OP_le");
7863 printf ("DW_OP_lt");
7866 printf ("DW_OP_ne");
7869 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
7905 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7940 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7975 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7976 read_leb128 (data, &bytes_read, 1));
7981 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7985 need_frame_base = 1;
7986 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7990 uvalue = read_leb128 (data, &bytes_read, 0);
7992 printf ("DW_OP_bregx: %lu %ld", uvalue,
7993 read_leb128 (data, &bytes_read, 1));
7997 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
8000 case DW_OP_deref_size:
8001 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
8003 case DW_OP_xderef_size:
8004 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
8007 printf ("DW_OP_nop");
8010 /* DWARF 3 extensions. */
8011 case DW_OP_push_object_address:
8012 printf ("DW_OP_push_object_address");
8015 /* XXX: Strictly speaking for 64-bit DWARF3 files
8016 this ought to be an 8-byte wide computation. */
8017 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
8021 /* XXX: Strictly speaking for 64-bit DWARF3 files
8022 this ought to be an 8-byte wide computation. */
8023 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
8026 case DW_OP_call_ref:
8027 printf ("DW_OP_call_ref");
8030 /* GNU extensions. */
8031 case DW_OP_GNU_push_tls_address:
8032 printf ("DW_OP_GNU_push_tls_address");
8036 if (op >= DW_OP_lo_user
8037 && op <= DW_OP_hi_user)
8038 printf (_("(User defined location op)"));
8040 printf (_("(Unknown location op)"));
8041 /* No way to tell where the next op is, so just bail. */
8042 return need_frame_base;
8045 /* Separate the ops. */
8050 return need_frame_base;
8053 /* This structure records the information that
8054 we extract from the.debug_info section. */
8057 unsigned int pointer_size;
8058 unsigned long cu_offset;
8059 unsigned long base_address;
8060 /* This is an array of offsets to the location list table. */
8061 unsigned long *loc_offsets;
8062 int *have_frame_base;
8063 unsigned int num_loc_offsets;
8064 unsigned int max_loc_offsets;
8065 unsigned long *range_lists;
8066 unsigned int num_range_lists;
8067 unsigned int max_range_lists;
8071 static debug_info * debug_information = NULL;
8072 static unsigned int num_debug_info_entries = 0;
8073 static unsigned int last_pointer_size = 0;
8074 static int warned_about_missing_comp_units = FALSE;
8076 static unsigned char *
8077 read_and_display_attr_value (unsigned long attribute,
8079 unsigned char *data,
8080 unsigned long cu_offset,
8081 unsigned long pointer_size,
8082 unsigned long offset_size,
8084 debug_info *debug_info_p,
8087 unsigned long uvalue = 0;
8088 unsigned char *block_start = NULL;
8089 unsigned int bytes_read;
8096 case DW_FORM_ref_addr:
8097 if (dwarf_version == 2)
8099 uvalue = byte_get (data, pointer_size);
8100 data += pointer_size;
8102 else if (dwarf_version == 3)
8104 uvalue = byte_get (data, offset_size);
8105 data += offset_size;
8109 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8114 uvalue = byte_get (data, pointer_size);
8115 data += pointer_size;
8119 uvalue = byte_get (data, offset_size);
8120 data += offset_size;
8126 uvalue = byte_get (data++, 1);
8131 uvalue = byte_get (data, 2);
8137 uvalue = byte_get (data, 4);
8142 uvalue = read_leb128 (data, & bytes_read, 1);
8146 case DW_FORM_ref_udata:
8148 uvalue = read_leb128 (data, & bytes_read, 0);
8152 case DW_FORM_indirect:
8153 form = read_leb128 (data, & bytes_read, 0);
8156 printf (" %s", get_FORM_name (form));
8157 return read_and_display_attr_value (attribute, form, data,
8158 cu_offset, pointer_size,
8159 offset_size, dwarf_version,
8160 debug_info_p, do_loc);
8165 case DW_FORM_ref_addr:
8167 printf (" <#%lx>", uvalue);
8173 case DW_FORM_ref_udata:
8175 printf (" <%lx>", uvalue + cu_offset);
8181 printf (" %#lx", uvalue);
8190 printf (" %ld", uvalue);
8197 uvalue = byte_get (data, 4);
8198 printf (" %lx", uvalue);
8199 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
8201 if ((do_loc || do_debug_loc || do_debug_ranges)
8202 && num_debug_info_entries == 0)
8204 if (sizeof (uvalue) == 8)
8205 uvalue = byte_get (data, 8);
8207 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8212 case DW_FORM_string:
8214 printf (" %s", data);
8215 data += strlen ((char *) data) + 1;
8219 uvalue = read_leb128 (data, & bytes_read, 0);
8220 block_start = data + bytes_read;
8222 data = block_start + uvalue;
8224 data = display_block (block_start, uvalue);
8227 case DW_FORM_block1:
8228 uvalue = byte_get (data, 1);
8229 block_start = data + 1;
8231 data = block_start + uvalue;
8233 data = display_block (block_start, uvalue);
8236 case DW_FORM_block2:
8237 uvalue = byte_get (data, 2);
8238 block_start = data + 2;
8240 data = block_start + uvalue;
8242 data = display_block (block_start, uvalue);
8245 case DW_FORM_block4:
8246 uvalue = byte_get (data, 4);
8247 block_start = data + 4;
8249 data = block_start + uvalue;
8251 data = display_block (block_start, uvalue);
8256 printf (_(" (indirect string, offset: 0x%lx): %s"),
8257 uvalue, fetch_indirect_string (uvalue));
8260 case DW_FORM_indirect:
8261 /* Handled above. */
8265 warn (_("Unrecognized form: %d\n"), form);
8269 /* For some attributes we can display further information. */
8270 if ((do_loc || do_debug_loc || do_debug_ranges)
8271 && num_debug_info_entries == 0)
8275 case DW_AT_frame_base:
8276 have_frame_base = 1;
8277 case DW_AT_location:
8278 case DW_AT_data_member_location:
8279 case DW_AT_vtable_elem_location:
8280 case DW_AT_allocated:
8281 case DW_AT_associated:
8282 case DW_AT_data_location:
8284 case DW_AT_upper_bound:
8285 case DW_AT_lower_bound:
8286 if (form == DW_FORM_data4 || form == DW_FORM_data8)
8288 /* Process location list. */
8289 unsigned int max = debug_info_p->max_loc_offsets;
8290 unsigned int num = debug_info_p->num_loc_offsets;
8292 if (max == 0 || num >= max)
8295 debug_info_p->loc_offsets
8296 = xrealloc (debug_info_p->loc_offsets,
8297 max * sizeof (*debug_info_p->loc_offsets));
8298 debug_info_p->have_frame_base
8299 = xrealloc (debug_info_p->have_frame_base,
8300 max * sizeof (*debug_info_p->have_frame_base));
8301 debug_info_p->max_loc_offsets = max;
8303 debug_info_p->loc_offsets [num] = uvalue;
8304 debug_info_p->have_frame_base [num] = have_frame_base;
8305 debug_info_p->num_loc_offsets++;
8310 if (need_base_address)
8311 debug_info_p->base_address = uvalue;
8315 if (form == DW_FORM_data4 || form == DW_FORM_data8)
8317 /* Process range list. */
8318 unsigned int max = debug_info_p->max_range_lists;
8319 unsigned int num = debug_info_p->num_range_lists;
8321 if (max == 0 || num >= max)
8324 debug_info_p->range_lists
8325 = xrealloc (debug_info_p->range_lists,
8326 max * sizeof (*debug_info_p->range_lists));
8327 debug_info_p->max_range_lists = max;
8329 debug_info_p->range_lists [num] = uvalue;
8330 debug_info_p->num_range_lists++;
8349 case DW_INL_not_inlined:
8350 printf (_("(not inlined)"));
8352 case DW_INL_inlined:
8353 printf (_("(inlined)"));
8355 case DW_INL_declared_not_inlined:
8356 printf (_("(declared as inline but ignored)"));
8358 case DW_INL_declared_inlined:
8359 printf (_("(declared as inline and inlined)"));
8362 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
8367 case DW_AT_language:
8370 case DW_LANG_C: printf ("(non-ANSI C)"); break;
8371 case DW_LANG_C89: printf ("(ANSI C)"); break;
8372 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
8373 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
8374 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
8375 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
8376 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
8377 case DW_LANG_Ada83: printf ("(Ada)"); break;
8378 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
8379 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
8380 /* DWARF 2.1 values. */
8381 case DW_LANG_C99: printf ("(ANSI C99)"); break;
8382 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
8383 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
8384 /* MIPS extension. */
8385 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
8386 /* UPC extension. */
8387 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
8389 printf ("(Unknown: %lx)", uvalue);
8394 case DW_AT_encoding:
8397 case DW_ATE_void: printf ("(void)"); break;
8398 case DW_ATE_address: printf ("(machine address)"); break;
8399 case DW_ATE_boolean: printf ("(boolean)"); break;
8400 case DW_ATE_complex_float: printf ("(complex float)"); break;
8401 case DW_ATE_float: printf ("(float)"); break;
8402 case DW_ATE_signed: printf ("(signed)"); break;
8403 case DW_ATE_signed_char: printf ("(signed char)"); break;
8404 case DW_ATE_unsigned: printf ("(unsigned)"); break;
8405 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
8406 /* DWARF 2.1 value. */
8407 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
8409 if (uvalue >= DW_ATE_lo_user
8410 && uvalue <= DW_ATE_hi_user)
8411 printf ("(user defined type)");
8413 printf ("(unknown type)");
8418 case DW_AT_accessibility:
8421 case DW_ACCESS_public: printf ("(public)"); break;
8422 case DW_ACCESS_protected: printf ("(protected)"); break;
8423 case DW_ACCESS_private: printf ("(private)"); break;
8425 printf ("(unknown accessibility)");
8430 case DW_AT_visibility:
8433 case DW_VIS_local: printf ("(local)"); break;
8434 case DW_VIS_exported: printf ("(exported)"); break;
8435 case DW_VIS_qualified: printf ("(qualified)"); break;
8436 default: printf ("(unknown visibility)"); break;
8440 case DW_AT_virtuality:
8443 case DW_VIRTUALITY_none: printf ("(none)"); break;
8444 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8445 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8446 default: printf ("(unknown virtuality)"); break;
8450 case DW_AT_identifier_case:
8453 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8454 case DW_ID_up_case: printf ("(up_case)"); break;
8455 case DW_ID_down_case: printf ("(down_case)"); break;
8456 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8457 default: printf ("(unknown case)"); break;
8461 case DW_AT_calling_convention:
8464 case DW_CC_normal: printf ("(normal)"); break;
8465 case DW_CC_program: printf ("(program)"); break;
8466 case DW_CC_nocall: printf ("(nocall)"); break;
8468 if (uvalue >= DW_CC_lo_user
8469 && uvalue <= DW_CC_hi_user)
8470 printf ("(user defined)");
8472 printf ("(unknown convention)");
8476 case DW_AT_ordering:
8479 case -1: printf ("(undefined)"); break;
8480 case 0: printf ("(row major)"); break;
8481 case 1: printf ("(column major)"); break;
8485 case DW_AT_frame_base:
8486 have_frame_base = 1;
8487 case DW_AT_location:
8488 case DW_AT_data_member_location:
8489 case DW_AT_vtable_elem_location:
8490 case DW_AT_allocated:
8491 case DW_AT_associated:
8492 case DW_AT_data_location:
8494 case DW_AT_upper_bound:
8495 case DW_AT_lower_bound:
8498 int need_frame_base;
8501 need_frame_base = decode_location_expression (block_start,
8506 if (need_frame_base && !have_frame_base)
8507 printf (_(" [without DW_AT_frame_base]"));
8509 else if (form == DW_FORM_data4 || form == DW_FORM_data8)
8510 printf (_("(location list)"));
8522 get_AT_name (unsigned long attribute)
8526 case DW_AT_sibling: return "DW_AT_sibling";
8527 case DW_AT_location: return "DW_AT_location";
8528 case DW_AT_name: return "DW_AT_name";
8529 case DW_AT_ordering: return "DW_AT_ordering";
8530 case DW_AT_subscr_data: return "DW_AT_subscr_data";
8531 case DW_AT_byte_size: return "DW_AT_byte_size";
8532 case DW_AT_bit_offset: return "DW_AT_bit_offset";
8533 case DW_AT_bit_size: return "DW_AT_bit_size";
8534 case DW_AT_element_list: return "DW_AT_element_list";
8535 case DW_AT_stmt_list: return "DW_AT_stmt_list";
8536 case DW_AT_low_pc: return "DW_AT_low_pc";
8537 case DW_AT_high_pc: return "DW_AT_high_pc";
8538 case DW_AT_language: return "DW_AT_language";
8539 case DW_AT_member: return "DW_AT_member";
8540 case DW_AT_discr: return "DW_AT_discr";
8541 case DW_AT_discr_value: return "DW_AT_discr_value";
8542 case DW_AT_visibility: return "DW_AT_visibility";
8543 case DW_AT_import: return "DW_AT_import";
8544 case DW_AT_string_length: return "DW_AT_string_length";
8545 case DW_AT_common_reference: return "DW_AT_common_reference";
8546 case DW_AT_comp_dir: return "DW_AT_comp_dir";
8547 case DW_AT_const_value: return "DW_AT_const_value";
8548 case DW_AT_containing_type: return "DW_AT_containing_type";
8549 case DW_AT_default_value: return "DW_AT_default_value";
8550 case DW_AT_inline: return "DW_AT_inline";
8551 case DW_AT_is_optional: return "DW_AT_is_optional";
8552 case DW_AT_lower_bound: return "DW_AT_lower_bound";
8553 case DW_AT_producer: return "DW_AT_producer";
8554 case DW_AT_prototyped: return "DW_AT_prototyped";
8555 case DW_AT_return_addr: return "DW_AT_return_addr";
8556 case DW_AT_start_scope: return "DW_AT_start_scope";
8557 case DW_AT_stride_size: return "DW_AT_stride_size";
8558 case DW_AT_upper_bound: return "DW_AT_upper_bound";
8559 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
8560 case DW_AT_accessibility: return "DW_AT_accessibility";
8561 case DW_AT_address_class: return "DW_AT_address_class";
8562 case DW_AT_artificial: return "DW_AT_artificial";
8563 case DW_AT_base_types: return "DW_AT_base_types";
8564 case DW_AT_calling_convention: return "DW_AT_calling_convention";
8565 case DW_AT_count: return "DW_AT_count";
8566 case DW_AT_data_member_location: return "DW_AT_data_member_location";
8567 case DW_AT_decl_column: return "DW_AT_decl_column";
8568 case DW_AT_decl_file: return "DW_AT_decl_file";
8569 case DW_AT_decl_line: return "DW_AT_decl_line";
8570 case DW_AT_declaration: return "DW_AT_declaration";
8571 case DW_AT_discr_list: return "DW_AT_discr_list";
8572 case DW_AT_encoding: return "DW_AT_encoding";
8573 case DW_AT_external: return "DW_AT_external";
8574 case DW_AT_frame_base: return "DW_AT_frame_base";
8575 case DW_AT_friend: return "DW_AT_friend";
8576 case DW_AT_identifier_case: return "DW_AT_identifier_case";
8577 case DW_AT_macro_info: return "DW_AT_macro_info";
8578 case DW_AT_namelist_items: return "DW_AT_namelist_items";
8579 case DW_AT_priority: return "DW_AT_priority";
8580 case DW_AT_segment: return "DW_AT_segment";
8581 case DW_AT_specification: return "DW_AT_specification";
8582 case DW_AT_static_link: return "DW_AT_static_link";
8583 case DW_AT_type: return "DW_AT_type";
8584 case DW_AT_use_location: return "DW_AT_use_location";
8585 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
8586 case DW_AT_virtuality: return "DW_AT_virtuality";
8587 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
8588 /* DWARF 2.1 values. */
8589 case DW_AT_allocated: return "DW_AT_allocated";
8590 case DW_AT_associated: return "DW_AT_associated";
8591 case DW_AT_data_location: return "DW_AT_data_location";
8592 case DW_AT_stride: return "DW_AT_stride";
8593 case DW_AT_entry_pc: return "DW_AT_entry_pc";
8594 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
8595 case DW_AT_extension: return "DW_AT_extension";
8596 case DW_AT_ranges: return "DW_AT_ranges";
8597 case DW_AT_trampoline: return "DW_AT_trampoline";
8598 case DW_AT_call_column: return "DW_AT_call_column";
8599 case DW_AT_call_file: return "DW_AT_call_file";
8600 case DW_AT_call_line: return "DW_AT_call_line";
8601 /* SGI/MIPS extensions. */
8602 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
8603 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
8604 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
8605 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
8606 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
8607 case DW_AT_MIPS_software_pipeline_depth:
8608 return "DW_AT_MIPS_software_pipeline_depth";
8609 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
8610 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
8611 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
8612 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
8613 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
8614 /* GNU extensions. */
8615 case DW_AT_sf_names: return "DW_AT_sf_names";
8616 case DW_AT_src_info: return "DW_AT_src_info";
8617 case DW_AT_mac_info: return "DW_AT_mac_info";
8618 case DW_AT_src_coords: return "DW_AT_src_coords";
8619 case DW_AT_body_begin: return "DW_AT_body_begin";
8620 case DW_AT_body_end: return "DW_AT_body_end";
8621 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
8622 /* UPC extension. */
8623 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
8626 static char buffer[100];
8628 snprintf (buffer, sizeof (buffer), _("Unknown AT value: %lx"),
8635 static unsigned char *
8636 read_and_display_attr (unsigned long attribute,
8638 unsigned char *data,
8639 unsigned long cu_offset,
8640 unsigned long pointer_size,
8641 unsigned long offset_size,
8643 debug_info *debug_info_p,
8647 printf (" %-18s:", get_AT_name (attribute));
8648 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8649 pointer_size, offset_size,
8650 dwarf_version, debug_info_p,
8658 /* Process the contents of a .debug_info section. If do_loc is non-zero
8659 then we are scanning for location lists and we do not want to display
8660 anything to the user. */
8663 process_debug_info (Elf_Internal_Shdr *section, unsigned char *start,
8664 FILE *file, int do_loc)
8666 unsigned char *end = start + section->sh_size;
8667 unsigned char *section_begin;
8669 unsigned int num_units = 0;
8671 if ((do_loc || do_debug_loc || do_debug_ranges)
8672 && num_debug_info_entries == 0)
8674 unsigned long length;
8676 /* First scan the section to get the number of comp units. */
8677 for (section_begin = start, num_units = 0; section_begin < end;
8680 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8681 will be the length. For a 64-bit DWARF section, it'll be
8682 the escape code 0xffffffff followed by an 8 byte length. */
8683 length = byte_get (section_begin, 4);
8685 if (length == 0xffffffff)
8687 length = byte_get (section_begin + 4, 8);
8688 section_begin += length + 12;
8691 section_begin += length + 4;
8696 error (_("No comp units in .debug_info section ?"));
8700 /* Then allocate an array to hold the information. */
8701 debug_information = malloc (num_units *
8702 sizeof (* debug_information));
8703 if (debug_information == NULL)
8705 error (_("Not enough memory for a debug info array of %u entries"),
8713 printf (_("The section %s contains:\n\n"),
8714 SECTION_NAME (section));
8716 load_debug_str (file);
8717 load_debug_loc (file);
8718 load_debug_range (file);
8721 for (section_begin = start, unit = 0; start < end; unit++)
8723 DWARF2_Internal_CompUnit compunit;
8724 unsigned char *hdrptr;
8725 unsigned char *cu_abbrev_offset_ptr;
8726 unsigned char *tags;
8728 unsigned long cu_offset;
8730 int initial_length_size;
8734 compunit.cu_length = byte_get (hdrptr, 4);
8737 if (compunit.cu_length == 0xffffffff)
8739 compunit.cu_length = byte_get (hdrptr, 8);
8742 initial_length_size = 12;
8747 initial_length_size = 4;
8750 compunit.cu_version = byte_get (hdrptr, 2);
8753 cu_offset = start - section_begin;
8754 start += compunit.cu_length + initial_length_size;
8756 if (elf_header.e_type == ET_REL
8757 && !debug_apply_rela_addends (file, section, offset_size,
8758 section_begin, hdrptr, start))
8761 cu_abbrev_offset_ptr = hdrptr;
8762 compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
8763 hdrptr += offset_size;
8765 compunit.cu_pointer_size = byte_get (hdrptr, 1);
8767 if ((do_loc || do_debug_loc || do_debug_ranges)
8768 && num_debug_info_entries == 0)
8770 debug_information [unit].cu_offset = cu_offset;
8771 debug_information [unit].pointer_size
8772 = compunit.cu_pointer_size;
8773 debug_information [unit].base_address = 0;
8774 debug_information [unit].loc_offsets = NULL;
8775 debug_information [unit].have_frame_base = NULL;
8776 debug_information [unit].max_loc_offsets = 0;
8777 debug_information [unit].num_loc_offsets = 0;
8778 debug_information [unit].range_lists = NULL;
8779 debug_information [unit].max_range_lists= 0;
8780 debug_information [unit].num_range_lists = 0;
8787 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8788 printf (_(" Length: %ld\n"), compunit.cu_length);
8789 printf (_(" Version: %d\n"), compunit.cu_version);
8790 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8791 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8794 if (compunit.cu_version != 2 && compunit.cu_version != 3)
8796 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8802 /* Read in the abbrevs used by this compilation unit. */
8804 Elf_Internal_Shdr *sec;
8805 unsigned char *begin;
8807 /* Locate the .debug_abbrev section and process it. */
8808 sec = find_section (".debug_abbrev");
8811 warn (_("Unable to locate .debug_abbrev section!\n"));
8815 begin = get_data (NULL, file, sec->sh_offset, sec->sh_size,
8816 _("debug_abbrev section data"));
8820 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8821 begin + sec->sh_size);
8827 while (tags < start)
8829 unsigned int bytes_read;
8830 unsigned long abbrev_number;
8831 abbrev_entry *entry;
8834 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8837 /* A null DIE marks the end of a list of children. */
8838 if (abbrev_number == 0)
8844 /* Scan through the abbreviation list until we reach the
8846 for (entry = first_abbrev;
8847 entry && entry->entry != abbrev_number;
8848 entry = entry->next)
8853 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8859 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8861 (unsigned long) (tags - section_begin
8864 get_TAG_name (entry->tag));
8869 need_base_address = 0;
8871 case DW_TAG_compile_unit:
8872 need_base_address = 1;
8874 case DW_TAG_entry_point:
8875 case DW_TAG_inlined_subroutine:
8876 case DW_TAG_subprogram:
8877 need_base_address = 0;
8878 /* Assuming that there is no DW_AT_frame_base. */
8879 have_frame_base = 0;
8883 for (attr = entry->first_attr; attr; attr = attr->next)
8884 tags = read_and_display_attr (attr->attribute,
8887 compunit.cu_pointer_size,
8889 compunit.cu_version,
8890 &debug_information [unit],
8893 if (entry->children)
8898 /* Set num_debug_info_entries here so that it can be used to check if
8899 we need to proecess .debug_loc and .debug_ranges sections. */
8900 if ((do_loc || do_debug_loc || do_debug_ranges)
8901 && num_debug_info_entries == 0)
8902 num_debug_info_entries = num_units;
8906 free_debug_range ();
8916 /* Retrieve the pointer size associated with the given compilation unit.
8917 Optionally the offset of this unit into the .debug_info section is
8918 also retutned. If there is no .debug_info section then an error
8919 message is issued and 0 is returned. If the requested comp unit has
8920 not been defined in the .debug_info section then a warning message
8921 is issued and the last know pointer size is returned. This message
8922 is only issued once per section dumped per file dumped. */
8925 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit,
8926 const char * section_name,
8927 unsigned long * offset_return)
8929 unsigned long offset = 0;
8931 if (num_debug_info_entries == 0)
8932 error (_("%s section needs a populated .debug_info section\n"),
8935 else if (comp_unit >= num_debug_info_entries)
8937 if (!warned_about_missing_comp_units)
8939 warn (_("%s section has more comp units than .debug_info section\n"),
8941 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
8943 warned_about_missing_comp_units = TRUE;
8948 last_pointer_size = debug_information [comp_unit].pointer_size;
8949 offset = debug_information [comp_unit].cu_offset;
8952 if (offset_return != NULL)
8953 * offset_return = offset;
8955 return last_pointer_size;
8958 /* Locate and scan the .debug_info section in the file and record the pointer
8959 sizes and offsets for the compilation units in it. Usually an executable
8960 will have just one pointer size, but this is not guaranteed, and so we try
8961 not to make any assumptions. Returns zero upon failure, or the number of
8962 compilation units upon success. */
8965 get_debug_info (FILE * file)
8967 Elf_Internal_Shdr * section;
8968 unsigned char * start;
8971 /* Reset the last pointer size so that we can issue correct error
8972 messages if we are displaying the contents of more than one section. */
8973 last_pointer_size = 0;
8974 warned_about_missing_comp_units = FALSE;
8976 /* If we already have the information there is nothing else to do. */
8977 if (num_debug_info_entries > 0)
8978 return num_debug_info_entries;
8980 section = find_section (".debug_info");
8981 if (section == NULL)
8984 start = get_data (NULL, file, section->sh_offset, section->sh_size,
8985 _("extracting information from .debug_info section"));
8989 ret = process_debug_info (section, start, file, 1);
8992 return ret ? num_debug_info_entries : 0;
8996 display_debug_lines (Elf_Internal_Shdr *section,
8997 unsigned char *start, FILE *file)
8999 unsigned char *data = start;
9000 unsigned char *end = start + section->sh_size;
9001 unsigned int comp_unit = 0;
9003 printf (_("\nDump of debug contents of section %s:\n\n"),
9004 SECTION_NAME (section));
9006 get_debug_info (file);
9010 DWARF2_Internal_LineInfo info;
9011 unsigned char *standard_opcodes;
9012 unsigned char *end_of_sequence;
9013 unsigned char *hdrptr;
9014 unsigned int pointer_size;
9015 int initial_length_size;
9021 /* Check the length of the block. */
9022 info.li_length = byte_get (hdrptr, 4);
9025 if (info.li_length == 0xffffffff)
9027 /* This section is 64-bit DWARF 3. */
9028 info.li_length = byte_get (hdrptr, 8);
9031 initial_length_size = 12;
9036 initial_length_size = 4;
9039 if (info.li_length + initial_length_size > section->sh_size)
9042 (_("The line info appears to be corrupt - the section is too small\n"));
9046 /* Check its version number. */
9047 info.li_version = byte_get (hdrptr, 2);
9049 if (info.li_version != 2 && info.li_version != 3)
9051 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
9055 info.li_prologue_length = byte_get (hdrptr, offset_size);
9056 hdrptr += offset_size;
9057 info.li_min_insn_length = byte_get (hdrptr, 1);
9059 info.li_default_is_stmt = byte_get (hdrptr, 1);
9061 info.li_line_base = byte_get (hdrptr, 1);
9063 info.li_line_range = byte_get (hdrptr, 1);
9065 info.li_opcode_base = byte_get (hdrptr, 1);
9068 /* Sign extend the line base field. */
9069 info.li_line_base <<= 24;
9070 info.li_line_base >>= 24;
9072 /* Get the pointer size from the comp unit associated
9073 with this block of line number information. */
9074 pointer_size = get_pointer_size_and_offset_of_comp_unit
9075 (comp_unit, ".debug_lines", NULL);
9078 printf (_(" Length: %ld\n"), info.li_length);
9079 printf (_(" DWARF Version: %d\n"), info.li_version);
9080 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
9081 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
9082 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
9083 printf (_(" Line Base: %d\n"), info.li_line_base);
9084 printf (_(" Line Range: %d\n"), info.li_line_range);
9085 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
9086 printf (_(" (Pointer size: %u)\n"), pointer_size);
9088 end_of_sequence = data + info.li_length + initial_length_size;
9090 reset_state_machine (info.li_default_is_stmt);
9092 /* Display the contents of the Opcodes table. */
9093 standard_opcodes = hdrptr;
9095 printf (_("\n Opcodes:\n"));
9097 for (i = 1; i < info.li_opcode_base; i++)
9098 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
9100 /* Display the contents of the Directory table. */
9101 data = standard_opcodes + info.li_opcode_base - 1;
9104 printf (_("\n The Directory Table is empty.\n"));
9107 printf (_("\n The Directory Table:\n"));
9111 printf (_(" %s\n"), data);
9113 data += strlen ((char *) data) + 1;
9117 /* Skip the NUL at the end of the table. */
9120 /* Display the contents of the File Name table. */
9122 printf (_("\n The File Name Table is empty.\n"));
9125 printf (_("\n The File Name Table:\n"));
9126 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9130 unsigned char *name;
9131 unsigned int bytes_read;
9133 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
9136 data += strlen ((char *) data) + 1;
9138 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9140 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9142 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9144 printf (_("%s\n"), name);
9148 /* Skip the NUL at the end of the table. */
9151 /* Now display the statements. */
9152 printf (_("\n Line Number Statements:\n"));
9154 while (data < end_of_sequence)
9156 unsigned char op_code;
9158 unsigned int bytes_read;
9162 if (op_code >= info.li_opcode_base)
9164 op_code -= info.li_opcode_base;
9165 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
9166 state_machine_regs.address += adv;
9167 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9168 op_code, adv, state_machine_regs.address);
9169 adv = (op_code % info.li_line_range) + info.li_line_base;
9170 state_machine_regs.line += adv;
9171 printf (_(" and Line by %d to %d\n"),
9172 adv, state_machine_regs.line);
9174 else switch (op_code)
9176 case DW_LNS_extended_op:
9177 data += process_extended_line_op (data, info.li_default_is_stmt,
9182 printf (_(" Copy\n"));
9185 case DW_LNS_advance_pc:
9186 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
9188 state_machine_regs.address += adv;
9189 printf (_(" Advance PC by %d to %lx\n"), adv,
9190 state_machine_regs.address);
9193 case DW_LNS_advance_line:
9194 adv = read_leb128 (data, & bytes_read, 1);
9196 state_machine_regs.line += adv;
9197 printf (_(" Advance Line by %d to %d\n"), adv,
9198 state_machine_regs.line);
9201 case DW_LNS_set_file:
9202 adv = read_leb128 (data, & bytes_read, 0);
9204 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9206 state_machine_regs.file = adv;
9209 case DW_LNS_set_column:
9210 adv = read_leb128 (data, & bytes_read, 0);
9212 printf (_(" Set column to %d\n"), adv);
9213 state_machine_regs.column = adv;
9216 case DW_LNS_negate_stmt:
9217 adv = state_machine_regs.is_stmt;
9219 printf (_(" Set is_stmt to %d\n"), adv);
9220 state_machine_regs.is_stmt = adv;
9223 case DW_LNS_set_basic_block:
9224 printf (_(" Set basic block\n"));
9225 state_machine_regs.basic_block = 1;
9228 case DW_LNS_const_add_pc:
9229 adv = (((255 - info.li_opcode_base) / info.li_line_range)
9230 * info.li_min_insn_length);
9231 state_machine_regs.address += adv;
9232 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
9233 state_machine_regs.address);
9236 case DW_LNS_fixed_advance_pc:
9237 adv = byte_get (data, 2);
9239 state_machine_regs.address += adv;
9240 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9241 adv, state_machine_regs.address);
9244 case DW_LNS_set_prologue_end:
9245 printf (_(" Set prologue_end to true\n"));
9248 case DW_LNS_set_epilogue_begin:
9249 printf (_(" Set epilogue_begin to true\n"));
9252 case DW_LNS_set_isa:
9253 adv = read_leb128 (data, & bytes_read, 0);
9255 printf (_(" Set ISA to %d\n"), adv);
9259 printf (_(" Unknown opcode %d with operands: "), op_code);
9261 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
9263 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
9264 i == 1 ? "" : ", ");
9278 display_debug_pubnames (Elf_Internal_Shdr *section,
9279 unsigned char *start,
9280 FILE *file ATTRIBUTE_UNUSED)
9282 DWARF2_Internal_PubNames pubnames;
9285 end = start + section->sh_size;
9287 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9291 unsigned char *data;
9292 unsigned long offset;
9293 int offset_size, initial_length_size;
9297 pubnames.pn_length = byte_get (data, 4);
9299 if (pubnames.pn_length == 0xffffffff)
9301 pubnames.pn_length = byte_get (data, 8);
9304 initial_length_size = 12;
9309 initial_length_size = 4;
9312 pubnames.pn_version = byte_get (data, 2);
9314 pubnames.pn_offset = byte_get (data, offset_size);
9315 data += offset_size;
9316 pubnames.pn_size = byte_get (data, offset_size);
9317 data += offset_size;
9319 start += pubnames.pn_length + initial_length_size;
9321 if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
9323 static int warned = 0;
9327 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9334 printf (_(" Length: %ld\n"),
9335 pubnames.pn_length);
9336 printf (_(" Version: %d\n"),
9337 pubnames.pn_version);
9338 printf (_(" Offset into .debug_info section: %ld\n"),
9339 pubnames.pn_offset);
9340 printf (_(" Size of area in .debug_info section: %ld\n"),
9343 printf (_("\n Offset\tName\n"));
9347 offset = byte_get (data, offset_size);
9351 data += offset_size;
9352 printf (" %-6ld\t\t%s\n", offset, data);
9353 data += strlen ((char *) data) + 1;
9356 while (offset != 0);
9364 display_debug_macinfo (Elf_Internal_Shdr *section,
9365 unsigned char *start,
9366 FILE *file ATTRIBUTE_UNUSED)
9368 unsigned char *end = start + section->sh_size;
9369 unsigned char *curr = start;
9370 unsigned int bytes_read;
9371 enum dwarf_macinfo_record_type op;
9373 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9377 unsigned int lineno;
9385 case DW_MACINFO_start_file:
9387 unsigned int filenum;
9389 lineno = read_leb128 (curr, & bytes_read, 0);
9391 filenum = read_leb128 (curr, & bytes_read, 0);
9394 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9399 case DW_MACINFO_end_file:
9400 printf (_(" DW_MACINFO_end_file\n"));
9403 case DW_MACINFO_define:
9404 lineno = read_leb128 (curr, & bytes_read, 0);
9406 string = (char *) curr;
9407 curr += strlen (string) + 1;
9408 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9412 case DW_MACINFO_undef:
9413 lineno = read_leb128 (curr, & bytes_read, 0);
9415 string = (char *) curr;
9416 curr += strlen (string) + 1;
9417 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9421 case DW_MACINFO_vendor_ext:
9423 unsigned int constant;
9425 constant = read_leb128 (curr, & bytes_read, 0);
9427 string = (char *) curr;
9428 curr += strlen (string) + 1;
9429 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9441 display_debug_abbrev (Elf_Internal_Shdr *section,
9442 unsigned char *start,
9443 FILE *file ATTRIBUTE_UNUSED)
9445 abbrev_entry *entry;
9446 unsigned char *end = start + section->sh_size;
9448 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9452 start = process_abbrev_section (start, end);
9454 if (first_abbrev == NULL)
9457 printf (_(" Number TAG\n"));
9459 for (entry = first_abbrev; entry; entry = entry->next)
9463 printf (_(" %ld %s [%s]\n"),
9465 get_TAG_name (entry->tag),
9466 entry->children ? _("has children") : _("no children"));
9468 for (attr = entry->first_attr; attr; attr = attr->next)
9469 printf (_(" %-18s %s\n"),
9470 get_AT_name (attr->attribute),
9471 get_FORM_name (attr->form));
9484 display_debug_loc (Elf_Internal_Shdr *section,
9485 unsigned char *start, FILE *file)
9487 unsigned char *section_end;
9488 unsigned long bytes;
9489 unsigned char *section_begin = start;
9490 unsigned int num_loc_list = 0;
9491 unsigned long last_offset = 0;
9492 unsigned int first = 0;
9495 int seen_first_offset = 0;
9496 int use_debug_info = 1;
9497 unsigned char *next;
9499 bytes = section->sh_size;
9500 section_end = start + bytes;
9504 printf (_("\nThe .debug_loc section is empty.\n"));
9508 get_debug_info (file);
9510 /* Check the order of location list in .debug_info section. If
9511 offsets of location lists are in the ascending order, we can
9512 use `debug_information' directly. */
9513 for (i = 0; i < num_debug_info_entries; i++)
9517 num = debug_information [i].num_loc_offsets;
9518 num_loc_list += num;
9520 /* Check if we can use `debug_information' directly. */
9521 if (use_debug_info && num != 0)
9523 if (!seen_first_offset)
9525 /* This is the first location list. */
9526 last_offset = debug_information [i].loc_offsets [0];
9528 seen_first_offset = 1;
9534 for (; j < num; j++)
9537 debug_information [i].loc_offsets [j])
9542 last_offset = debug_information [i].loc_offsets [j];
9547 if (!use_debug_info)
9548 /* FIXME: Should we handle this case? */
9549 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9551 if (!seen_first_offset)
9552 error (_("No location lists in .debug_info section!\n"));
9554 if (debug_information [first].loc_offsets [0] != 0)
9555 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9556 debug_information [first].loc_offsets [0]);
9558 printf (_("Contents of the .debug_loc section:\n\n"));
9559 printf (_(" Offset Begin End Expression\n"));
9561 seen_first_offset = 0;
9562 for (i = first; i < num_debug_info_entries; i++)
9564 unsigned long begin;
9566 unsigned short length;
9567 unsigned long offset;
9568 unsigned int pointer_size;
9569 unsigned long cu_offset;
9570 unsigned long base_address;
9571 int need_frame_base;
9574 pointer_size = debug_information [i].pointer_size;
9575 cu_offset = debug_information [i].cu_offset;
9577 for (j = 0; j < debug_information [i].num_loc_offsets; j++)
9579 has_frame_base = debug_information [i].have_frame_base [j];
9580 offset = debug_information [i].loc_offsets [j];
9581 next = section_begin + offset;
9582 base_address = debug_information [i].base_address;
9584 if (!seen_first_offset)
9585 seen_first_offset = 1;
9589 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9590 start - section_begin, next - section_begin);
9591 else if (start > next)
9592 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9593 start - section_begin, next - section_begin);
9599 begin = byte_get (start, pointer_size);
9600 start += pointer_size;
9601 end = byte_get (start, pointer_size);
9602 start += pointer_size;
9604 if (begin == 0 && end == 0)
9606 printf (_(" %8.8lx <End of list>\n"), offset);
9610 /* Check base address specifiers. */
9611 if (begin == -1UL && end != -1UL)
9614 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
9615 offset, begin, end);
9619 length = byte_get (start, 2);
9622 printf (" %8.8lx %8.8lx %8.8lx (",
9623 offset, begin + base_address, end + base_address);
9624 need_frame_base = decode_location_expression (start,
9630 if (need_frame_base && !has_frame_base)
9631 printf (_(" [without DW_AT_frame_base]"));
9634 fputs (_(" (start == end)"), stdout);
9635 else if (begin > end)
9636 fputs (_(" (start > end)"), stdout);
9648 display_debug_str (Elf_Internal_Shdr *section,
9649 unsigned char *start,
9650 FILE *file ATTRIBUTE_UNUSED)
9652 unsigned long bytes;
9655 addr = section->sh_addr;
9656 bytes = section->sh_size;
9660 printf (_("\nThe .debug_str section is empty.\n"));
9664 printf (_("Contents of the .debug_str section:\n\n"));
9672 lbytes = (bytes > 16 ? 16 : bytes);
9674 printf (" 0x%8.8lx ", (unsigned long) addr);
9676 for (j = 0; j < 16; j++)
9679 printf ("%2.2x", start[j]);
9687 for (j = 0; j < lbytes; j++)
9690 if (k >= ' ' && k < 0x80)
9710 display_debug_info (Elf_Internal_Shdr * section,
9711 unsigned char * start, FILE * file)
9713 return process_debug_info (section, start, file, 0);
9718 display_debug_aranges (Elf_Internal_Shdr *section,
9719 unsigned char *start,
9720 FILE *file ATTRIBUTE_UNUSED)
9722 unsigned char *end = start + section->sh_size;
9724 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
9728 unsigned char *hdrptr;
9729 DWARF2_Internal_ARange arange;
9730 unsigned char *ranges;
9731 unsigned long length;
9732 unsigned long address;
9735 int initial_length_size;
9739 arange.ar_length = byte_get (hdrptr, 4);
9742 if (arange.ar_length == 0xffffffff)
9744 arange.ar_length = byte_get (hdrptr, 8);
9747 initial_length_size = 12;
9752 initial_length_size = 4;
9755 arange.ar_version = byte_get (hdrptr, 2);
9758 arange.ar_info_offset = byte_get (hdrptr, offset_size);
9759 hdrptr += offset_size;
9761 arange.ar_pointer_size = byte_get (hdrptr, 1);
9764 arange.ar_segment_size = byte_get (hdrptr, 1);
9767 if (arange.ar_version != 2 && arange.ar_version != 3)
9769 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
9773 printf (_(" Length: %ld\n"), arange.ar_length);
9774 printf (_(" Version: %d\n"), arange.ar_version);
9775 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
9776 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
9777 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
9779 printf (_("\n Address Length\n"));
9783 /* Must pad to an alignment boundary that is twice the pointer size. */
9784 excess = (hdrptr - start) % (2 * arange.ar_pointer_size);
9786 ranges += (2 * arange.ar_pointer_size) - excess;
9790 address = byte_get (ranges, arange.ar_pointer_size);
9792 ranges += arange.ar_pointer_size;
9794 length = byte_get (ranges, arange.ar_pointer_size);
9796 ranges += arange.ar_pointer_size;
9798 /* A pair of zeros marks the end of the list. */
9799 if (address == 0 && length == 0)
9802 printf (" %8.8lx %lu\n", address, length);
9805 start += arange.ar_length + initial_length_size;
9814 display_debug_ranges (Elf_Internal_Shdr *section,
9815 unsigned char *start,
9816 FILE *file ATTRIBUTE_UNUSED)
9818 unsigned char *section_end;
9819 unsigned long bytes;
9820 unsigned char *section_begin = start;
9821 unsigned int num_range_list = 0;
9822 unsigned long last_offset = 0;
9823 unsigned int first = 0;
9826 int seen_first_offset = 0;
9827 int use_debug_info = 1;
9828 unsigned char *next;
9830 bytes = section->sh_size;
9831 section_end = start + bytes;
9835 printf (_("\nThe .debug_ranges section is empty.\n"));
9839 get_debug_info (file);
9841 /* Check the order of range list in .debug_info section. If
9842 offsets of range lists are in the ascending order, we can
9843 use `debug_information' directly. */
9844 for (i = 0; i < num_debug_info_entries; i++)
9848 num = debug_information [i].num_range_lists;
9849 num_range_list += num;
9851 /* Check if we can use `debug_information' directly. */
9852 if (use_debug_info && num != 0)
9854 if (!seen_first_offset)
9856 /* This is the first range list. */
9857 last_offset = debug_information [i].range_lists [0];
9859 seen_first_offset = 1;
9865 for (; j < num; j++)
9868 debug_information [i].range_lists [j])
9873 last_offset = debug_information [i].range_lists [j];
9878 if (!use_debug_info)
9879 /* FIXME: Should we handle this case? */
9880 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
9882 if (!seen_first_offset)
9883 error (_("No range lists in .debug_info section!\n"));
9885 if (debug_information [first].range_lists [0] != 0)
9886 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
9887 debug_information [first].range_lists [0]);
9889 printf (_("Contents of the .debug_ranges section:\n\n"));
9890 printf (_(" Offset Begin End\n"));
9892 seen_first_offset = 0;
9893 for (i = first; i < num_debug_info_entries; i++)
9895 unsigned long begin;
9897 unsigned long offset;
9898 unsigned int pointer_size;
9899 unsigned long base_address;
9901 pointer_size = debug_information [i].pointer_size;
9903 for (j = 0; j < debug_information [i].num_range_lists; j++)
9905 offset = debug_information [i].range_lists [j];
9906 next = section_begin + offset;
9907 base_address = debug_information [i].base_address;
9909 if (!seen_first_offset)
9910 seen_first_offset = 1;
9914 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
9915 start - section_begin, next - section_begin);
9916 else if (start > next)
9917 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
9918 start - section_begin, next - section_begin);
9924 begin = byte_get (start, pointer_size);
9925 start += pointer_size;
9926 end = byte_get (start, pointer_size);
9927 start += pointer_size;
9929 if (begin == 0 && end == 0)
9931 printf (_(" %8.8lx <End of list>\n"), offset);
9935 /* Check base address specifiers. */
9936 if (begin == -1UL && end != -1UL)
9939 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
9940 offset, begin, end);
9944 printf (" %8.8lx %8.8lx %8.8lx",
9945 offset, begin + base_address, end + base_address);
9948 fputs (_(" (start == end)"), stdout);
9949 else if (begin > end)
9950 fputs (_(" (start > end)"), stdout);
9960 typedef struct Frame_Chunk
9962 struct Frame_Chunk *next;
9963 unsigned char *chunk_start;
9965 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
9966 short int *col_type;
9969 unsigned int code_factor;
9971 unsigned long pc_begin;
9972 unsigned long pc_range;
9976 unsigned char fde_encoding;
9977 unsigned char cfa_exp;
9981 /* A marker for a col_type that means this column was never referenced
9982 in the frame info. */
9983 #define DW_CFA_unreferenced (-1)
9986 frame_need_space (Frame_Chunk *fc, int reg)
9988 int prev = fc->ncols;
9990 if (reg < fc->ncols)
9993 fc->ncols = reg + 1;
9994 fc->col_type = xrealloc (fc->col_type, fc->ncols * sizeof (short int));
9995 fc->col_offset = xrealloc (fc->col_offset, fc->ncols * sizeof (int));
9997 while (prev < fc->ncols)
9999 fc->col_type[prev] = DW_CFA_unreferenced;
10000 fc->col_offset[prev] = 0;
10006 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
10011 if (*max_regs < fc->ncols)
10012 *max_regs = fc->ncols;
10014 if (*need_col_headers)
10016 *need_col_headers = 0;
10018 printf (" LOC CFA ");
10020 for (r = 0; r < *max_regs; r++)
10021 if (fc->col_type[r] != DW_CFA_unreferenced)
10026 printf ("r%-4d", r);
10032 printf ("%08lx ", fc->pc_begin);
10034 strcpy (tmp, "exp");
10036 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
10037 printf ("%-8s ", tmp);
10039 for (r = 0; r < fc->ncols; r++)
10041 if (fc->col_type[r] != DW_CFA_unreferenced)
10043 switch (fc->col_type[r])
10045 case DW_CFA_undefined:
10048 case DW_CFA_same_value:
10051 case DW_CFA_offset:
10052 sprintf (tmp, "c%+d", fc->col_offset[r]);
10054 case DW_CFA_register:
10055 sprintf (tmp, "r%d", fc->col_offset[r]);
10057 case DW_CFA_expression:
10058 strcpy (tmp, "exp");
10061 strcpy (tmp, "n/a");
10064 printf ("%-5s", tmp);
10071 size_of_encoded_value (int encoding)
10073 switch (encoding & 0x7)
10076 case 0: return eh_addr_size;
10084 get_encoded_value (unsigned char *data, int encoding)
10086 int size = size_of_encoded_value (encoding);
10087 if (encoding & DW_EH_PE_signed)
10088 return byte_get_signed (data, size);
10090 return byte_get (data, size);
10093 #define GET(N) byte_get (start, N); start += N
10094 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
10095 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10098 display_debug_frames (Elf_Internal_Shdr *section,
10099 unsigned char *start,
10100 FILE *file ATTRIBUTE_UNUSED)
10102 unsigned char *end = start + section->sh_size;
10103 unsigned char *section_start = start;
10104 Frame_Chunk *chunks = 0;
10105 Frame_Chunk *remembered_state = 0;
10107 int is_eh = streq (SECTION_NAME (section), ".eh_frame");
10108 unsigned int length_return;
10111 printf (_("The section %s contains:\n"), SECTION_NAME (section));
10113 while (start < end)
10115 unsigned char *saved_start;
10116 unsigned char *block_end;
10117 unsigned long length;
10118 unsigned long cie_id;
10121 int need_col_headers = 1;
10122 unsigned char *augmentation_data = NULL;
10123 unsigned long augmentation_data_len = 0;
10124 int encoded_ptr_size = eh_addr_size;
10126 int initial_length_size;
10128 saved_start = start;
10129 length = byte_get (start, 4); start += 4;
10133 printf ("\n%08lx ZERO terminator\n\n",
10134 (unsigned long)(saved_start - section_start));
10138 if (length == 0xffffffff)
10140 length = byte_get (start, 8);
10143 initial_length_size = 12;
10148 initial_length_size = 4;
10151 block_end = saved_start + length + initial_length_size;
10152 cie_id = byte_get (start, offset_size); start += offset_size;
10154 if (elf_header.e_type == ET_REL
10155 && !debug_apply_rela_addends (file, section, offset_size,
10156 section_start, start, block_end))
10159 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
10163 fc = xmalloc (sizeof (Frame_Chunk));
10164 memset (fc, 0, sizeof (Frame_Chunk));
10168 fc->chunk_start = saved_start;
10170 fc->col_type = xmalloc (sizeof (short int));
10171 fc->col_offset = xmalloc (sizeof (int));
10172 frame_need_space (fc, max_regs-1);
10174 version = *start++;
10176 fc->augmentation = (char *) start;
10177 start = (unsigned char *) strchr ((char *) start, '\0') + 1;
10179 if (fc->augmentation[0] == 'z')
10181 fc->code_factor = LEB ();
10182 fc->data_factor = SLEB ();
10191 augmentation_data_len = LEB ();
10192 augmentation_data = start;
10193 start += augmentation_data_len;
10195 else if (streq (fc->augmentation, "eh"))
10197 start += eh_addr_size;
10198 fc->code_factor = LEB ();
10199 fc->data_factor = SLEB ();
10211 fc->code_factor = LEB ();
10212 fc->data_factor = SLEB ();
10224 if (do_debug_frames_interp)
10225 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10226 (unsigned long)(saved_start - section_start), length, cie_id,
10227 fc->augmentation, fc->code_factor, fc->data_factor,
10231 printf ("\n%08lx %08lx %08lx CIE\n",
10232 (unsigned long)(saved_start - section_start), length, cie_id);
10233 printf (" Version: %d\n", version);
10234 printf (" Augmentation: \"%s\"\n", fc->augmentation);
10235 printf (" Code alignment factor: %u\n", fc->code_factor);
10236 printf (" Data alignment factor: %d\n", fc->data_factor);
10237 printf (" Return address column: %d\n", fc->ra);
10239 if (augmentation_data_len)
10242 printf (" Augmentation data: ");
10243 for (i = 0; i < augmentation_data_len; ++i)
10244 printf (" %02x", augmentation_data[i]);
10250 if (augmentation_data_len)
10252 unsigned char *p, *q;
10253 p = (unsigned char *) fc->augmentation + 1;
10254 q = augmentation_data;
10260 else if (*p == 'P')
10261 q += 1 + size_of_encoded_value (*q);
10262 else if (*p == 'R')
10263 fc->fde_encoding = *q++;
10269 if (fc->fde_encoding)
10270 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10273 frame_need_space (fc, fc->ra);
10277 unsigned char *look_for;
10278 static Frame_Chunk fde_fc;
10281 memset (fc, 0, sizeof (Frame_Chunk));
10283 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
10285 for (cie = chunks; cie ; cie = cie->next)
10286 if (cie->chunk_start == look_for)
10291 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10292 cie_id, saved_start);
10295 fc->col_type = xmalloc (sizeof (short int));
10296 fc->col_offset = xmalloc (sizeof (int));
10297 frame_need_space (fc, max_regs - 1);
10299 fc->augmentation = "";
10300 fc->fde_encoding = 0;
10304 fc->ncols = cie->ncols;
10305 fc->col_type = xmalloc (fc->ncols * sizeof (short int));
10306 fc->col_offset = xmalloc (fc->ncols * sizeof (int));
10307 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
10308 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
10309 fc->augmentation = cie->augmentation;
10310 fc->code_factor = cie->code_factor;
10311 fc->data_factor = cie->data_factor;
10312 fc->cfa_reg = cie->cfa_reg;
10313 fc->cfa_offset = cie->cfa_offset;
10315 frame_need_space (fc, max_regs-1);
10316 fc->fde_encoding = cie->fde_encoding;
10319 if (fc->fde_encoding)
10320 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10322 fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
10323 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10324 /* Don't adjust for ET_REL since there's invariably a pcrel
10325 reloc here, which we haven't applied. */
10326 && elf_header.e_type != ET_REL)
10327 fc->pc_begin += section->sh_addr + (start - section_start);
10328 start += encoded_ptr_size;
10329 fc->pc_range = byte_get (start, encoded_ptr_size);
10330 start += encoded_ptr_size;
10332 if (cie->augmentation[0] == 'z')
10334 augmentation_data_len = LEB ();
10335 augmentation_data = start;
10336 start += augmentation_data_len;
10339 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10340 (unsigned long)(saved_start - section_start), length, cie_id,
10341 (unsigned long)(cie->chunk_start - section_start),
10342 fc->pc_begin, fc->pc_begin + fc->pc_range);
10343 if (! do_debug_frames_interp && augmentation_data_len)
10347 printf (" Augmentation data: ");
10348 for (i = 0; i < augmentation_data_len; ++i)
10349 printf (" %02x", augmentation_data[i]);
10355 /* At this point, fc is the current chunk, cie (if any) is set, and
10356 we're about to interpret instructions for the chunk. */
10357 /* ??? At present we need to do this always, since this sizes the
10358 fc->col_type and fc->col_offset arrays, which we write into always.
10359 We should probably split the interpreted and non-interpreted bits
10360 into two different routines, since there's so much that doesn't
10361 really overlap between them. */
10362 if (1 || do_debug_frames_interp)
10364 /* Start by making a pass over the chunk, allocating storage
10365 and taking note of what registers are used. */
10366 unsigned char *tmp = start;
10368 while (start < block_end)
10371 unsigned long reg, tmp;
10378 /* Warning: if you add any more cases to this switch, be
10379 sure to add them to the corresponding switch below. */
10382 case DW_CFA_advance_loc:
10384 case DW_CFA_offset:
10386 frame_need_space (fc, opa);
10387 fc->col_type[opa] = DW_CFA_undefined;
10389 case DW_CFA_restore:
10390 frame_need_space (fc, opa);
10391 fc->col_type[opa] = DW_CFA_undefined;
10393 case DW_CFA_set_loc:
10394 start += encoded_ptr_size;
10396 case DW_CFA_advance_loc1:
10399 case DW_CFA_advance_loc2:
10402 case DW_CFA_advance_loc4:
10405 case DW_CFA_offset_extended:
10406 reg = LEB (); LEB ();
10407 frame_need_space (fc, reg);
10408 fc->col_type[reg] = DW_CFA_undefined;
10410 case DW_CFA_restore_extended:
10412 frame_need_space (fc, reg);
10413 fc->col_type[reg] = DW_CFA_undefined;
10415 case DW_CFA_undefined:
10417 frame_need_space (fc, reg);
10418 fc->col_type[reg] = DW_CFA_undefined;
10420 case DW_CFA_same_value:
10422 frame_need_space (fc, reg);
10423 fc->col_type[reg] = DW_CFA_undefined;
10425 case DW_CFA_register:
10426 reg = LEB (); LEB ();
10427 frame_need_space (fc, reg);
10428 fc->col_type[reg] = DW_CFA_undefined;
10430 case DW_CFA_def_cfa:
10433 case DW_CFA_def_cfa_register:
10436 case DW_CFA_def_cfa_offset:
10439 case DW_CFA_def_cfa_expression:
10443 case DW_CFA_expression:
10447 frame_need_space (fc, reg);
10448 fc->col_type[reg] = DW_CFA_undefined;
10450 case DW_CFA_offset_extended_sf:
10451 reg = LEB (); SLEB ();
10452 frame_need_space (fc, reg);
10453 fc->col_type[reg] = DW_CFA_undefined;
10455 case DW_CFA_def_cfa_sf:
10458 case DW_CFA_def_cfa_offset_sf:
10461 case DW_CFA_MIPS_advance_loc8:
10464 case DW_CFA_GNU_args_size:
10467 case DW_CFA_GNU_negative_offset_extended:
10468 reg = LEB (); LEB ();
10469 frame_need_space (fc, reg);
10470 fc->col_type[reg] = DW_CFA_undefined;
10479 /* Now we know what registers are used, make a second pass over
10480 the chunk, this time actually printing out the info. */
10482 while (start < block_end)
10485 unsigned long ul, reg, roffs;
10494 /* Warning: if you add any more cases to this switch, be
10495 sure to add them to the corresponding switch above. */
10498 case DW_CFA_advance_loc:
10499 if (do_debug_frames_interp)
10500 frame_display_row (fc, &need_col_headers, &max_regs);
10502 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10503 opa * fc->code_factor,
10504 fc->pc_begin + opa * fc->code_factor);
10505 fc->pc_begin += opa * fc->code_factor;
10508 case DW_CFA_offset:
10510 if (! do_debug_frames_interp)
10511 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10512 opa, roffs * fc->data_factor);
10513 fc->col_type[opa] = DW_CFA_offset;
10514 fc->col_offset[opa] = roffs * fc->data_factor;
10517 case DW_CFA_restore:
10518 if (! do_debug_frames_interp)
10519 printf (" DW_CFA_restore: r%d\n", opa);
10520 fc->col_type[opa] = cie->col_type[opa];
10521 fc->col_offset[opa] = cie->col_offset[opa];
10524 case DW_CFA_set_loc:
10525 vma = get_encoded_value (start, fc->fde_encoding);
10526 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10527 && elf_header.e_type != ET_REL)
10528 vma += section->sh_addr + (start - section_start);
10529 start += encoded_ptr_size;
10530 if (do_debug_frames_interp)
10531 frame_display_row (fc, &need_col_headers, &max_regs);
10533 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
10534 fc->pc_begin = vma;
10537 case DW_CFA_advance_loc1:
10538 ofs = byte_get (start, 1); start += 1;
10539 if (do_debug_frames_interp)
10540 frame_display_row (fc, &need_col_headers, &max_regs);
10542 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10543 ofs * fc->code_factor,
10544 fc->pc_begin + ofs * fc->code_factor);
10545 fc->pc_begin += ofs * fc->code_factor;
10548 case DW_CFA_advance_loc2:
10549 ofs = byte_get (start, 2); start += 2;
10550 if (do_debug_frames_interp)
10551 frame_display_row (fc, &need_col_headers, &max_regs);
10553 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10554 ofs * fc->code_factor,
10555 fc->pc_begin + ofs * fc->code_factor);
10556 fc->pc_begin += ofs * fc->code_factor;
10559 case DW_CFA_advance_loc4:
10560 ofs = byte_get (start, 4); start += 4;
10561 if (do_debug_frames_interp)
10562 frame_display_row (fc, &need_col_headers, &max_regs);
10564 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10565 ofs * fc->code_factor,
10566 fc->pc_begin + ofs * fc->code_factor);
10567 fc->pc_begin += ofs * fc->code_factor;
10570 case DW_CFA_offset_extended:
10573 if (! do_debug_frames_interp)
10574 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10575 reg, roffs * fc->data_factor);
10576 fc->col_type[reg] = DW_CFA_offset;
10577 fc->col_offset[reg] = roffs * fc->data_factor;
10580 case DW_CFA_restore_extended:
10582 if (! do_debug_frames_interp)
10583 printf (" DW_CFA_restore_extended: r%ld\n", reg);
10584 fc->col_type[reg] = cie->col_type[reg];
10585 fc->col_offset[reg] = cie->col_offset[reg];
10588 case DW_CFA_undefined:
10590 if (! do_debug_frames_interp)
10591 printf (" DW_CFA_undefined: r%ld\n", reg);
10592 fc->col_type[reg] = DW_CFA_undefined;
10593 fc->col_offset[reg] = 0;
10596 case DW_CFA_same_value:
10598 if (! do_debug_frames_interp)
10599 printf (" DW_CFA_same_value: r%ld\n", reg);
10600 fc->col_type[reg] = DW_CFA_same_value;
10601 fc->col_offset[reg] = 0;
10604 case DW_CFA_register:
10607 if (! do_debug_frames_interp)
10608 printf (" DW_CFA_register: r%ld in r%ld\n", reg, roffs);
10609 fc->col_type[reg] = DW_CFA_register;
10610 fc->col_offset[reg] = roffs;
10613 case DW_CFA_remember_state:
10614 if (! do_debug_frames_interp)
10615 printf (" DW_CFA_remember_state\n");
10616 rs = xmalloc (sizeof (Frame_Chunk));
10617 rs->ncols = fc->ncols;
10618 rs->col_type = xmalloc (rs->ncols * sizeof (short int));
10619 rs->col_offset = xmalloc (rs->ncols * sizeof (int));
10620 memcpy (rs->col_type, fc->col_type, rs->ncols);
10621 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
10622 rs->next = remembered_state;
10623 remembered_state = rs;
10626 case DW_CFA_restore_state:
10627 if (! do_debug_frames_interp)
10628 printf (" DW_CFA_restore_state\n");
10629 rs = remembered_state;
10632 remembered_state = rs->next;
10633 frame_need_space (fc, rs->ncols-1);
10634 memcpy (fc->col_type, rs->col_type, rs->ncols);
10635 memcpy (fc->col_offset, rs->col_offset,
10636 rs->ncols * sizeof (int));
10637 free (rs->col_type);
10638 free (rs->col_offset);
10641 else if (do_debug_frames_interp)
10642 printf ("Mismatched DW_CFA_restore_state\n");
10645 case DW_CFA_def_cfa:
10646 fc->cfa_reg = LEB ();
10647 fc->cfa_offset = LEB ();
10649 if (! do_debug_frames_interp)
10650 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10651 fc->cfa_reg, fc->cfa_offset);
10654 case DW_CFA_def_cfa_register:
10655 fc->cfa_reg = LEB ();
10657 if (! do_debug_frames_interp)
10658 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
10661 case DW_CFA_def_cfa_offset:
10662 fc->cfa_offset = LEB ();
10663 if (! do_debug_frames_interp)
10664 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
10668 if (! do_debug_frames_interp)
10669 printf (" DW_CFA_nop\n");
10672 case DW_CFA_def_cfa_expression:
10674 if (! do_debug_frames_interp)
10676 printf (" DW_CFA_def_cfa_expression (");
10677 decode_location_expression (start, eh_addr_size, ul, 0);
10684 case DW_CFA_expression:
10687 if (! do_debug_frames_interp)
10689 printf (" DW_CFA_expression: r%ld (", reg);
10690 decode_location_expression (start, eh_addr_size, ul, 0);
10693 fc->col_type[reg] = DW_CFA_expression;
10697 case DW_CFA_offset_extended_sf:
10700 frame_need_space (fc, reg);
10701 if (! do_debug_frames_interp)
10702 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10703 reg, l * fc->data_factor);
10704 fc->col_type[reg] = DW_CFA_offset;
10705 fc->col_offset[reg] = l * fc->data_factor;
10708 case DW_CFA_def_cfa_sf:
10709 fc->cfa_reg = LEB ();
10710 fc->cfa_offset = SLEB ();
10711 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
10713 if (! do_debug_frames_interp)
10714 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10715 fc->cfa_reg, fc->cfa_offset);
10718 case DW_CFA_def_cfa_offset_sf:
10719 fc->cfa_offset = SLEB ();
10720 fc->cfa_offset = fc->cfa_offset * fc->data_factor;
10721 if (! do_debug_frames_interp)
10722 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
10725 case DW_CFA_MIPS_advance_loc8:
10726 ofs = byte_get (start, 8); start += 8;
10727 if (do_debug_frames_interp)
10728 frame_display_row (fc, &need_col_headers, &max_regs);
10730 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10731 ofs * fc->code_factor,
10732 fc->pc_begin + ofs * fc->code_factor);
10733 fc->pc_begin += ofs * fc->code_factor;
10736 case DW_CFA_GNU_window_save:
10737 if (! do_debug_frames_interp)
10738 printf (" DW_CFA_GNU_window_save\n");
10741 case DW_CFA_GNU_args_size:
10743 if (! do_debug_frames_interp)
10744 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
10747 case DW_CFA_GNU_negative_offset_extended:
10750 frame_need_space (fc, reg);
10751 if (! do_debug_frames_interp)
10752 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10753 reg, l * fc->data_factor);
10754 fc->col_type[reg] = DW_CFA_offset;
10755 fc->col_offset[reg] = l * fc->data_factor;
10759 warn (_("unsupported or unknown DW_CFA_%d\n"), op);
10764 if (do_debug_frames_interp)
10765 frame_display_row (fc, &need_col_headers, &max_regs);
10780 display_debug_not_supported (Elf_Internal_Shdr *section,
10781 unsigned char *start ATTRIBUTE_UNUSED,
10782 FILE *file ATTRIBUTE_UNUSED)
10784 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10785 SECTION_NAME (section));
10790 /* A structure containing the name of a debug section
10791 and a pointer to a function that can decode it. */
10794 const char *const name;
10795 int (*display) (Elf_Internal_Shdr *, unsigned char *, FILE *);
10799 { ".debug_abbrev", display_debug_abbrev },
10800 { ".debug_aranges", display_debug_aranges },
10801 { ".debug_frame", display_debug_frames },
10802 { ".debug_info", display_debug_info },
10803 { ".debug_line", display_debug_lines },
10804 { ".debug_pubnames", display_debug_pubnames },
10805 { ".eh_frame", display_debug_frames },
10806 { ".debug_macinfo", display_debug_macinfo },
10807 { ".debug_str", display_debug_str },
10808 { ".debug_loc", display_debug_loc },
10809 { ".debug_pubtypes", display_debug_pubnames },
10810 { ".debug_ranges", display_debug_ranges },
10811 { ".debug_static_func", display_debug_not_supported },
10812 { ".debug_static_vars", display_debug_not_supported },
10813 { ".debug_types", display_debug_not_supported },
10814 { ".debug_weaknames", display_debug_not_supported }
10818 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
10820 char *name = SECTION_NAME (section);
10821 bfd_size_type length;
10825 length = section->sh_size;
10828 printf (_("\nSection '%s' has no debugging data.\n"), name);
10832 if (strneq (name, ".gnu.linkonce.wi.", 17))
10833 name = ".debug_info";
10835 /* See if we know how to display the contents of this section. */
10836 for (i = NUM_ELEM (debug_displays); i--;)
10837 if (streq (debug_displays[i].name, name))
10839 unsigned char *start;
10841 start = get_data (NULL, file, section->sh_offset, length,
10842 _("debug section data"));
10849 result &= debug_displays[i].display (section, start, file);
10852 /* If we loaded in the abbrev section
10853 at some point, we must release it here. */
10861 printf (_("Unrecognized debug section: %s\n"), name);
10869 process_section_contents (FILE *file)
10871 Elf_Internal_Shdr *section;
10877 for (i = 0, section = section_headers;
10878 i < elf_header.e_shnum && i < num_dump_sects;
10881 #ifdef SUPPORT_DISASSEMBLY
10882 if (dump_sects[i] & DISASS_DUMP)
10883 disassemble_section (section, file);
10885 if (dump_sects[i] & HEX_DUMP)
10886 dump_section (section, file);
10888 if (dump_sects[i] & DEBUG_DUMP)
10889 display_debug_section (section, file);
10892 /* Check to see if the user requested a
10893 dump of a section that does not exist. */
10894 while (i++ < num_dump_sects)
10896 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10900 process_mips_fpe_exception (int mask)
10905 if (mask & OEX_FPU_INEX)
10906 fputs ("INEX", stdout), first = 0;
10907 if (mask & OEX_FPU_UFLO)
10908 printf ("%sUFLO", first ? "" : "|"), first = 0;
10909 if (mask & OEX_FPU_OFLO)
10910 printf ("%sOFLO", first ? "" : "|"), first = 0;
10911 if (mask & OEX_FPU_DIV0)
10912 printf ("%sDIV0", first ? "" : "|"), first = 0;
10913 if (mask & OEX_FPU_INVAL)
10914 printf ("%sINVAL", first ? "" : "|");
10917 fputs ("0", stdout);
10921 process_mips_specific (FILE *file)
10923 Elf_Internal_Dyn *entry;
10924 size_t liblist_offset = 0;
10925 size_t liblistno = 0;
10926 size_t conflictsno = 0;
10927 size_t options_offset = 0;
10928 size_t conflicts_offset = 0;
10930 /* We have a lot of special sections. Thanks SGI! */
10931 if (dynamic_section == NULL)
10932 /* No information available. */
10935 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
10936 switch (entry->d_tag)
10938 case DT_MIPS_LIBLIST:
10940 = offset_from_vma (file, entry->d_un.d_val,
10941 liblistno * sizeof (Elf32_External_Lib));
10943 case DT_MIPS_LIBLISTNO:
10944 liblistno = entry->d_un.d_val;
10946 case DT_MIPS_OPTIONS:
10947 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
10949 case DT_MIPS_CONFLICT:
10951 = offset_from_vma (file, entry->d_un.d_val,
10952 conflictsno * sizeof (Elf32_External_Conflict));
10954 case DT_MIPS_CONFLICTNO:
10955 conflictsno = entry->d_un.d_val;
10961 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
10963 Elf32_External_Lib *elib;
10966 elib = get_data (NULL, file, liblist_offset,
10967 liblistno * sizeof (Elf32_External_Lib),
10971 printf ("\nSection '.liblist' contains %lu entries:\n",
10972 (unsigned long) liblistno);
10973 fputs (" Library Time Stamp Checksum Version Flags\n",
10976 for (cnt = 0; cnt < liblistno; ++cnt)
10983 liblist.l_name = BYTE_GET (elib[cnt].l_name);
10984 time = BYTE_GET (elib[cnt].l_time_stamp);
10985 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
10986 liblist.l_version = BYTE_GET (elib[cnt].l_version);
10987 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
10989 tmp = gmtime (&time);
10990 snprintf (timebuf, sizeof (timebuf),
10991 "%04u-%02u-%02uT%02u:%02u:%02u",
10992 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10993 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10995 printf ("%3lu: ", (unsigned long) cnt);
10996 if (VALID_DYNAMIC_NAME (liblist.l_name))
10997 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
10999 printf ("<corrupt: %9ld>", liblist.l_name);
11000 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
11001 liblist.l_version);
11003 if (liblist.l_flags == 0)
11007 static const struct
11014 { " EXACT_MATCH", LL_EXACT_MATCH },
11015 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
11016 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
11017 { " EXPORTS", LL_EXPORTS },
11018 { " DELAY_LOAD", LL_DELAY_LOAD },
11019 { " DELTA", LL_DELTA }
11021 int flags = liblist.l_flags;
11025 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
11027 if ((flags & l_flags_vals[fcnt].bit) != 0)
11029 fputs (l_flags_vals[fcnt].name, stdout);
11030 flags ^= l_flags_vals[fcnt].bit;
11033 printf (" %#x", (unsigned int) flags);
11043 if (options_offset != 0)
11045 Elf_External_Options *eopt;
11046 Elf_Internal_Shdr *sect = section_headers;
11047 Elf_Internal_Options *iopt;
11048 Elf_Internal_Options *option;
11052 /* Find the section header so that we get the size. */
11053 while (sect->sh_type != SHT_MIPS_OPTIONS)
11056 eopt = get_data (NULL, file, options_offset, sect->sh_size,
11060 iopt = malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt));
11063 error (_("Out of memory"));
11070 while (offset < sect->sh_size)
11072 Elf_External_Options *eoption;
11074 eoption = (Elf_External_Options *) ((char *) eopt + offset);
11076 option->kind = BYTE_GET (eoption->kind);
11077 option->size = BYTE_GET (eoption->size);
11078 option->section = BYTE_GET (eoption->section);
11079 option->info = BYTE_GET (eoption->info);
11081 offset += option->size;
11087 printf (_("\nSection '%s' contains %d entries:\n"),
11088 SECTION_NAME (sect), cnt);
11096 switch (option->kind)
11099 /* This shouldn't happen. */
11100 printf (" NULL %d %lx", option->section, option->info);
11103 printf (" REGINFO ");
11104 if (elf_header.e_machine == EM_MIPS)
11107 Elf32_External_RegInfo *ereg;
11108 Elf32_RegInfo reginfo;
11110 ereg = (Elf32_External_RegInfo *) (option + 1);
11111 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11112 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11113 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11114 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11115 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11116 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11118 printf ("GPR %08lx GP 0x%lx\n",
11119 reginfo.ri_gprmask,
11120 (unsigned long) reginfo.ri_gp_value);
11121 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11122 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11123 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11128 Elf64_External_RegInfo *ereg;
11129 Elf64_Internal_RegInfo reginfo;
11131 ereg = (Elf64_External_RegInfo *) (option + 1);
11132 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11133 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11134 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11135 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11136 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11137 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
11139 printf ("GPR %08lx GP 0x",
11140 reginfo.ri_gprmask);
11141 printf_vma (reginfo.ri_gp_value);
11144 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11145 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11146 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11150 case ODK_EXCEPTIONS:
11151 fputs (" EXCEPTIONS fpe_min(", stdout);
11152 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11153 fputs (") fpe_max(", stdout);
11154 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11155 fputs (")", stdout);
11157 if (option->info & OEX_PAGE0)
11158 fputs (" PAGE0", stdout);
11159 if (option->info & OEX_SMM)
11160 fputs (" SMM", stdout);
11161 if (option->info & OEX_FPDBUG)
11162 fputs (" FPDBUG", stdout);
11163 if (option->info & OEX_DISMISS)
11164 fputs (" DISMISS", stdout);
11167 fputs (" PAD ", stdout);
11168 if (option->info & OPAD_PREFIX)
11169 fputs (" PREFIX", stdout);
11170 if (option->info & OPAD_POSTFIX)
11171 fputs (" POSTFIX", stdout);
11172 if (option->info & OPAD_SYMBOL)
11173 fputs (" SYMBOL", stdout);
11176 fputs (" HWPATCH ", stdout);
11177 if (option->info & OHW_R4KEOP)
11178 fputs (" R4KEOP", stdout);
11179 if (option->info & OHW_R8KPFETCH)
11180 fputs (" R8KPFETCH", stdout);
11181 if (option->info & OHW_R5KEOP)
11182 fputs (" R5KEOP", stdout);
11183 if (option->info & OHW_R5KCVTL)
11184 fputs (" R5KCVTL", stdout);
11187 fputs (" FILL ", stdout);
11188 /* XXX Print content of info word? */
11191 fputs (" TAGS ", stdout);
11192 /* XXX Print content of info word? */
11195 fputs (" HWAND ", stdout);
11196 if (option->info & OHWA0_R4KEOP_CHECKED)
11197 fputs (" R4KEOP_CHECKED", stdout);
11198 if (option->info & OHWA0_R4KEOP_CLEAN)
11199 fputs (" R4KEOP_CLEAN", stdout);
11202 fputs (" HWOR ", stdout);
11203 if (option->info & OHWA0_R4KEOP_CHECKED)
11204 fputs (" R4KEOP_CHECKED", stdout);
11205 if (option->info & OHWA0_R4KEOP_CLEAN)
11206 fputs (" R4KEOP_CLEAN", stdout);
11209 printf (" GP_GROUP %#06lx self-contained %#06lx",
11210 option->info & OGP_GROUP,
11211 (option->info & OGP_SELF) >> 16);
11214 printf (" IDENT %#06lx self-contained %#06lx",
11215 option->info & OGP_GROUP,
11216 (option->info & OGP_SELF) >> 16);
11219 /* This shouldn't happen. */
11220 printf (" %3d ??? %d %lx",
11221 option->kind, option->section, option->info);
11225 len = sizeof (*eopt);
11226 while (len < option->size)
11227 if (((char *) option)[len] >= ' '
11228 && ((char *) option)[len] < 0x7f)
11229 printf ("%c", ((char *) option)[len++]);
11231 printf ("\\%03o", ((char *) option)[len++]);
11233 fputs ("\n", stdout);
11241 if (conflicts_offset != 0 && conflictsno != 0)
11243 Elf32_Conflict *iconf;
11246 if (dynamic_symbols == NULL)
11248 error (_("conflict list found without a dynamic symbol table"));
11252 iconf = malloc (conflictsno * sizeof (*iconf));
11255 error (_("Out of memory"));
11261 Elf32_External_Conflict *econf32;
11263 econf32 = get_data (NULL, file, conflicts_offset,
11264 conflictsno * sizeof (*econf32), _("conflict"));
11268 for (cnt = 0; cnt < conflictsno; ++cnt)
11269 iconf[cnt] = BYTE_GET (econf32[cnt]);
11275 Elf64_External_Conflict *econf64;
11277 econf64 = get_data (NULL, file, conflicts_offset,
11278 conflictsno * sizeof (*econf64), _("conflict"));
11282 for (cnt = 0; cnt < conflictsno; ++cnt)
11283 iconf[cnt] = BYTE_GET (econf64[cnt]);
11288 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11289 (unsigned long) conflictsno);
11290 puts (_(" Num: Index Value Name"));
11292 for (cnt = 0; cnt < conflictsno; ++cnt)
11294 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
11296 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11297 print_vma (psym->st_value, FULL_HEX);
11299 if (VALID_DYNAMIC_NAME (psym->st_name))
11300 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11302 printf ("<corrupt: %14ld>", psym->st_name);
11313 process_gnu_liblist (FILE *file)
11315 Elf_Internal_Shdr *section, *string_sec;
11316 Elf32_External_Lib *elib;
11324 for (i = 0, section = section_headers;
11325 i < elf_header.e_shnum;
11328 switch (section->sh_type)
11330 case SHT_GNU_LIBLIST:
11331 elib = get_data (NULL, file, section->sh_offset, section->sh_size,
11336 string_sec = SECTION_HEADER (section->sh_link);
11338 strtab = get_data (NULL, file, string_sec->sh_offset,
11339 string_sec->sh_size, _("liblist string table"));
11342 || section->sh_entsize != sizeof (Elf32_External_Lib))
11348 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11349 SECTION_NAME (section),
11350 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
11352 puts (" Library Time Stamp Checksum Version Flags");
11354 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11362 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11363 time = BYTE_GET (elib[cnt].l_time_stamp);
11364 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11365 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11366 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11368 tmp = gmtime (&time);
11369 snprintf (timebuf, sizeof (timebuf),
11370 "%04u-%02u-%02uT%02u:%02u:%02u",
11371 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11372 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11374 printf ("%3lu: ", (unsigned long) cnt);
11376 printf ("%-20s", strtab + liblist.l_name);
11378 printf ("%-20.20s", strtab + liblist.l_name);
11379 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11380 liblist.l_version, liblist.l_flags);
11390 static const char *
11391 get_note_type (unsigned e_type)
11393 static char buff[64];
11395 if (elf_header.e_type == ET_CORE)
11399 return _("NT_AUXV (auxiliary vector)");
11401 return _("NT_PRSTATUS (prstatus structure)");
11403 return _("NT_FPREGSET (floating point registers)");
11405 return _("NT_PRPSINFO (prpsinfo structure)");
11406 case NT_TASKSTRUCT:
11407 return _("NT_TASKSTRUCT (task structure)");
11409 return _("NT_PRXFPREG (user_xfpregs structure)");
11411 return _("NT_PSTATUS (pstatus structure)");
11413 return _("NT_FPREGS (floating point registers)");
11415 return _("NT_PSINFO (psinfo structure)");
11417 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11419 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11420 case NT_WIN32PSTATUS:
11421 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11429 return _("NT_VERSION (version)");
11431 return _("NT_ARCH (architecture)");
11436 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11440 static const char *
11441 get_netbsd_elfcore_note_type (unsigned e_type)
11443 static char buff[64];
11445 if (e_type == NT_NETBSDCORE_PROCINFO)
11447 /* NetBSD core "procinfo" structure. */
11448 return _("NetBSD procinfo structure");
11451 /* As of Jan 2002 there are no other machine-independent notes
11452 defined for NetBSD core files. If the note type is less
11453 than the start of the machine-dependent note types, we don't
11456 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11458 snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
11462 switch (elf_header.e_machine)
11464 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11465 and PT_GETFPREGS == mach+2. */
11470 case EM_SPARC32PLUS:
11474 case NT_NETBSDCORE_FIRSTMACH+0:
11475 return _("PT_GETREGS (reg structure)");
11476 case NT_NETBSDCORE_FIRSTMACH+2:
11477 return _("PT_GETFPREGS (fpreg structure)");
11483 /* On all other arch's, PT_GETREGS == mach+1 and
11484 PT_GETFPREGS == mach+3. */
11488 case NT_NETBSDCORE_FIRSTMACH+1:
11489 return _("PT_GETREGS (reg structure)");
11490 case NT_NETBSDCORE_FIRSTMACH+3:
11491 return _("PT_GETFPREGS (fpreg structure)");
11497 snprintf (buff, sizeof (buff), _("PT_FIRSTMACH+%d"),
11498 e_type - NT_NETBSDCORE_FIRSTMACH);
11502 /* Note that by the ELF standard, the name field is already null byte
11503 terminated, and namesz includes the terminating null byte.
11504 I.E. the value of namesz for the name "FSF" is 4.
11506 If the value of namesz is zero, there is no name present. */
11508 process_note (Elf_Internal_Note *pnote)
11512 if (pnote->namesz == 0)
11513 /* If there is no note name, then use the default set of
11514 note type strings. */
11515 nt = get_note_type (pnote->type);
11517 else if (strneq (pnote->namedata, "NetBSD-CORE", 11))
11518 /* NetBSD-specific core file notes. */
11519 nt = get_netbsd_elfcore_note_type (pnote->type);
11522 /* Don't recognize this note name; just use the default set of
11523 note type strings. */
11524 nt = get_note_type (pnote->type);
11526 printf (" %s\t\t0x%08lx\t%s\n",
11527 pnote->namesz ? pnote->namedata : "(NONE)",
11528 pnote->descsz, nt);
11534 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
11536 Elf_External_Note *pnotes;
11537 Elf_External_Note *external;
11543 pnotes = get_data (NULL, file, offset, length, _("notes"));
11549 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11550 (unsigned long) offset, (unsigned long) length);
11551 printf (_(" Owner\t\tData size\tDescription\n"));
11553 while (external < (Elf_External_Note *)((char *) pnotes + length))
11555 Elf_External_Note *next;
11556 Elf_Internal_Note inote;
11559 inote.type = BYTE_GET (external->type);
11560 inote.namesz = BYTE_GET (external->namesz);
11561 inote.namedata = external->name;
11562 inote.descsz = BYTE_GET (external->descsz);
11563 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
11564 inote.descpos = offset + (inote.descdata - (char *) pnotes);
11566 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
11568 if (((char *) next) > (((char *) pnotes) + length))
11570 warn (_("corrupt note found at offset %x into core notes\n"),
11571 ((char *) external) - ((char *) pnotes));
11572 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11573 inote.type, inote.namesz, inote.descsz);
11579 /* Verify that name is null terminated. It appears that at least
11580 one version of Linux (RedHat 6.0) generates corefiles that don't
11581 comply with the ELF spec by failing to include the null byte in
11583 if (inote.namedata[inote.namesz] != '\0')
11585 temp = malloc (inote.namesz + 1);
11589 error (_("Out of memory\n"));
11594 strncpy (temp, inote.namedata, inote.namesz);
11595 temp[inote.namesz] = 0;
11597 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11598 inote.namedata = temp;
11601 res &= process_note (& inote);
11616 process_corefile_note_segments (FILE *file)
11618 Elf_Internal_Phdr *segment;
11622 if (! get_program_headers (file))
11625 for (i = 0, segment = program_headers;
11626 i < elf_header.e_phnum;
11629 if (segment->p_type == PT_NOTE)
11630 res &= process_corefile_note_segment (file,
11631 (bfd_vma) segment->p_offset,
11632 (bfd_vma) segment->p_filesz);
11639 process_note_sections (FILE *file)
11641 Elf_Internal_Shdr *section;
11645 for (i = 0, section = section_headers;
11646 i < elf_header.e_shnum;
11648 if (section->sh_type == SHT_NOTE)
11649 res &= process_corefile_note_segment (file,
11650 (bfd_vma) section->sh_offset,
11651 (bfd_vma) section->sh_size);
11657 process_notes (FILE *file)
11659 /* If we have not been asked to display the notes then do nothing. */
11663 if (elf_header.e_type != ET_CORE)
11664 return process_note_sections (file);
11666 /* No program headers means no NOTE segment. */
11667 if (elf_header.e_phnum > 0)
11668 return process_corefile_note_segments (file);
11670 printf (_("No note segments present in the core file.\n"));
11675 process_arch_specific (FILE *file)
11680 switch (elf_header.e_machine)
11683 case EM_MIPS_RS3_LE:
11684 return process_mips_specific (file);
11693 get_file_header (FILE *file)
11695 /* Read in the identity array. */
11696 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
11699 /* Determine how to read the rest of the header. */
11700 switch (elf_header.e_ident[EI_DATA])
11702 default: /* fall through */
11703 case ELFDATANONE: /* fall through */
11705 byte_get = byte_get_little_endian;
11706 byte_put = byte_put_little_endian;
11709 byte_get = byte_get_big_endian;
11710 byte_put = byte_put_big_endian;
11714 /* For now we only support 32 bit and 64 bit ELF files. */
11715 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
11717 /* Read in the rest of the header. */
11720 Elf32_External_Ehdr ehdr32;
11722 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
11725 elf_header.e_type = BYTE_GET (ehdr32.e_type);
11726 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
11727 elf_header.e_version = BYTE_GET (ehdr32.e_version);
11728 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
11729 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
11730 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
11731 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
11732 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
11733 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
11734 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
11735 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
11736 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
11737 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
11741 Elf64_External_Ehdr ehdr64;
11743 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11744 we will not be able to cope with the 64bit data found in
11745 64 ELF files. Detect this now and abort before we start
11746 overwriting things. */
11747 if (sizeof (bfd_vma) < 8)
11749 error (_("This instance of readelf has been built without support for a\n\
11750 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11754 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
11757 elf_header.e_type = BYTE_GET (ehdr64.e_type);
11758 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
11759 elf_header.e_version = BYTE_GET (ehdr64.e_version);
11760 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
11761 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
11762 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
11763 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
11764 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
11765 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
11766 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
11767 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
11768 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
11769 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
11772 if (elf_header.e_shoff)
11774 /* There may be some extensions in the first section header. Don't
11775 bomb if we can't read it. */
11777 get_32bit_section_headers (file, 1);
11779 get_64bit_section_headers (file, 1);
11785 /* Process one ELF object file according to the command line options.
11786 This file may actually be stored in an archive. The file is
11787 positioned at the start of the ELF object. */
11790 process_object (char *file_name, FILE *file)
11794 if (! get_file_header (file))
11796 error (_("%s: Failed to read file header\n"), file_name);
11800 /* Initialise per file variables. */
11801 for (i = NUM_ELEM (version_info); i--;)
11802 version_info[i] = 0;
11804 for (i = NUM_ELEM (dynamic_info); i--;)
11805 dynamic_info[i] = 0;
11807 /* Process the file. */
11809 printf (_("\nFile: %s\n"), file_name);
11811 /* Initialise the dump_sects array from the cmdline_dump_sects array.
11812 Note we do this even if cmdline_dump_sects is empty because we
11813 must make sure that the dump_sets array is zeroed out before each
11814 object file is processed. */
11815 if (num_dump_sects > num_cmdline_dump_sects)
11816 memset (dump_sects, 0, num_dump_sects);
11818 if (num_cmdline_dump_sects > 0)
11820 if (num_dump_sects == 0)
11821 /* A sneaky way of allocating the dump_sects array. */
11822 request_dump (num_cmdline_dump_sects, 0);
11824 assert (num_dump_sects >= num_cmdline_dump_sects);
11825 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
11828 if (! process_file_header ())
11831 if (! process_section_headers (file))
11833 /* Without loaded section headers we cannot process lots of
11835 do_unwind = do_version = do_dump = do_arch = 0;
11837 if (! do_using_dynamic)
11838 do_syms = do_reloc = 0;
11841 if (! process_section_groups (file))
11843 /* Without loaded section groups we cannot process unwind. */
11847 if (process_program_headers (file))
11848 process_dynamic_section (file);
11850 process_relocs (file);
11852 process_unwind (file);
11854 process_symbol_table (file);
11856 process_syminfo (file);
11858 process_version_sections (file);
11860 process_section_contents (file);
11862 process_notes (file);
11864 process_gnu_liblist (file);
11866 process_arch_specific (file);
11868 if (program_headers)
11870 free (program_headers);
11871 program_headers = NULL;
11874 if (section_headers)
11876 free (section_headers);
11877 section_headers = NULL;
11882 free (string_table);
11883 string_table = NULL;
11884 string_table_length = 0;
11887 if (dynamic_strings)
11889 free (dynamic_strings);
11890 dynamic_strings = NULL;
11891 dynamic_strings_length = 0;
11894 if (dynamic_symbols)
11896 free (dynamic_symbols);
11897 dynamic_symbols = NULL;
11898 num_dynamic_syms = 0;
11901 if (dynamic_syminfo)
11903 free (dynamic_syminfo);
11904 dynamic_syminfo = NULL;
11907 if (section_headers_groups)
11909 free (section_headers_groups);
11910 section_headers_groups = NULL;
11913 if (section_groups)
11915 struct group_list *g, *next;
11917 for (i = 0; i < group_count; i++)
11919 for (g = section_groups [i].root; g != NULL; g = next)
11926 free (section_groups);
11927 section_groups = NULL;
11930 if (debug_information)
11932 for (i = 0; i < num_debug_info_entries; i++)
11934 if (!debug_information [i].max_loc_offsets)
11936 free (debug_information [i].loc_offsets);
11937 free (debug_information [i].have_frame_base);
11939 if (!debug_information [i].max_range_lists)
11940 free (debug_information [i].range_lists);
11942 free (debug_information);
11943 debug_information = NULL;
11944 num_debug_info_entries = 0;
11950 /* Process an ELF archive. The file is positioned just after the
11954 process_archive (char *file_name, FILE *file)
11956 struct ar_hdr arhdr;
11958 unsigned long size;
11959 char *longnames = NULL;
11960 unsigned long longnames_size = 0;
11961 size_t file_name_size;
11966 got = fread (&arhdr, 1, sizeof arhdr, file);
11967 if (got != sizeof arhdr)
11972 error (_("%s: failed to read archive header\n"), file_name);
11976 if (memcmp (arhdr.ar_name, "/ ", 16) == 0)
11978 /* This is the archive symbol table. Skip it.
11979 FIXME: We should have an option to dump it. */
11980 size = strtoul (arhdr.ar_size, NULL, 10);
11981 if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
11983 error (_("%s: failed to skip archive symbol table\n"), file_name);
11987 got = fread (&arhdr, 1, sizeof arhdr, file);
11988 if (got != sizeof arhdr)
11993 error (_("%s: failed to read archive header\n"), file_name);
11998 if (memcmp (arhdr.ar_name, "// ", 16) == 0)
12000 /* This is the archive string table holding long member
12003 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
12005 longnames = malloc (longnames_size);
12006 if (longnames == NULL)
12008 error (_("Out of memory\n"));
12012 if (fread (longnames, longnames_size, 1, file) != 1)
12015 error (_("%s: failed to read string table\n"), file_name);
12019 if ((longnames_size & 1) != 0)
12022 got = fread (&arhdr, 1, sizeof arhdr, file);
12023 if (got != sizeof arhdr)
12030 error (_("%s: failed to read archive header\n"), file_name);
12035 file_name_size = strlen (file_name);
12044 if (arhdr.ar_name[0] == '/')
12048 off = strtoul (arhdr.ar_name + 1, NULL, 10);
12049 if (off >= longnames_size)
12051 error (_("%s: invalid archive string table offset %lu\n"), off);
12056 name = longnames + off;
12057 nameend = memchr (name, '/', longnames_size - off);
12061 name = arhdr.ar_name;
12062 nameend = memchr (name, '/', 16);
12065 if (nameend == NULL)
12067 error (_("%s: bad archive file name\n"));
12072 namealc = malloc (file_name_size + (nameend - name) + 3);
12073 if (namealc == NULL)
12075 error (_("Out of memory\n"));
12080 memcpy (namealc, file_name, file_name_size);
12081 namealc[file_name_size] = '(';
12082 memcpy (namealc + file_name_size + 1, name, nameend - name);
12083 namealc[file_name_size + 1 + (nameend - name)] = ')';
12084 namealc[file_name_size + 2 + (nameend - name)] = '\0';
12086 archive_file_offset = ftell (file);
12087 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
12089 ret |= process_object (namealc, file);
12094 (archive_file_offset
12095 + archive_file_size
12096 + (archive_file_size & 1)),
12099 error (_("%s: failed to seek to next archive header\n"), file_name);
12104 got = fread (&arhdr, 1, sizeof arhdr, file);
12105 if (got != sizeof arhdr)
12110 error (_("%s: failed to read archive header\n"), file_name);
12116 if (longnames != 0)
12123 process_file (char *file_name)
12126 struct stat statbuf;
12127 char armag[SARMAG];
12130 if (stat (file_name, &statbuf) < 0)
12132 if (errno == ENOENT)
12133 error (_("'%s': No such file\n"), file_name);
12135 error (_("Could not locate '%s'. System error message: %s\n"),
12136 file_name, strerror (errno));
12140 if (! S_ISREG (statbuf.st_mode))
12142 error (_("'%s' is not an ordinary file\n"), file_name);
12146 file = fopen (file_name, "rb");
12149 error (_("Input file '%s' is not readable.\n"), file_name);
12153 if (fread (armag, SARMAG, 1, file) != 1)
12155 error (_("%s: Failed to read file header\n"), file_name);
12160 if (memcmp (armag, ARMAG, SARMAG) == 0)
12161 ret = process_archive (file_name, file);
12165 archive_file_size = archive_file_offset = 0;
12166 ret = process_object (file_name, file);
12174 #ifdef SUPPORT_DISASSEMBLY
12175 /* Needed by the i386 disassembler. For extra credit, someone could
12176 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12180 print_address (unsigned int addr, FILE *outfile)
12182 fprintf (outfile,"0x%8.8x", addr);
12185 /* Needed by the i386 disassembler. */
12187 db_task_printsym (unsigned int addr)
12189 print_address (addr, stderr);
12194 main (int argc, char **argv)
12198 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12199 setlocale (LC_MESSAGES, "");
12201 #if defined (HAVE_SETLOCALE)
12202 setlocale (LC_CTYPE, "");
12204 bindtextdomain (PACKAGE, LOCALEDIR);
12205 textdomain (PACKAGE);
12207 parse_args (argc, argv);
12209 if (num_dump_sects > 0)
12211 /* Make a copy of the dump_sects array. */
12212 cmdline_dump_sects = malloc (num_dump_sects);
12213 if (cmdline_dump_sects == NULL)
12214 error (_("Out of memory allocating dump request table."));
12217 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
12218 num_cmdline_dump_sects = num_dump_sects;
12222 if (optind < (argc - 1))
12226 while (optind < argc)
12227 err |= process_file (argv[optind++]);
12229 if (dump_sects != NULL)
12231 if (cmdline_dump_sects != NULL)
12232 free (cmdline_dump_sects);