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 long archive_file_offset;
121 unsigned long archive_file_size;
122 unsigned long dynamic_addr;
123 bfd_size_type dynamic_size;
124 unsigned int dynamic_nent;
125 char *dynamic_strings;
126 unsigned long dynamic_strings_length;
128 unsigned long string_table_length;
129 unsigned long num_dynamic_syms;
130 Elf_Internal_Sym *dynamic_symbols;
131 Elf_Internal_Syminfo *dynamic_syminfo;
132 unsigned long dynamic_syminfo_offset;
133 unsigned int dynamic_syminfo_nent;
134 char program_interpreter[64];
135 bfd_vma dynamic_info[DT_JMPREL + 1];
136 bfd_vma version_info[16];
137 Elf_Internal_Ehdr elf_header;
138 Elf_Internal_Shdr *section_headers;
139 Elf_Internal_Phdr *program_headers;
140 Elf_Internal_Dyn *dynamic_section;
141 Elf_Internal_Shdr *symtab_shndx_hdr;
147 int do_section_groups;
150 int do_using_dynamic;
158 int do_debug_abbrevs;
160 int do_debug_pubnames;
161 int do_debug_aranges;
164 int do_debug_frames_interp;
165 int do_debug_macinfo;
172 int need_base_address;
173 unsigned long saved_base_address;
177 struct group_list *next;
178 unsigned int section_index;
183 struct group_list *root;
184 unsigned int group_index;
187 struct group *section_groups;
188 size_t group_count = 0;
190 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 /* If we can support a 64 bit data type then BFD64 should be defined
252 and sizeof (bfd_vma) == 8. In this case when translating from an
253 external 8 byte field to an internal field, we can assume that the
254 internal field is also 8 bytes wide and so we can extract all the data.
255 If, however, BFD64 is not defined, then we must assume that the
256 internal data structure only has 4 byte wide fields that are the
257 equivalent of the 8 byte wide external counterparts, and so we must
258 truncate the data. */
260 #define BYTE_GET8(field) byte_get (field, -8)
262 #define BYTE_GET8(field) byte_get (field, 8)
265 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
267 #define GET_ELF_SYMBOLS(file, section) \
268 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
269 : get_64bit_elf_symbols (file, section))
271 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
272 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
273 already been called and verified that the string exists. */
274 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
276 /* This is just a bit of syntatic sugar. */
277 #define streq(a,b) (strcmp ((a), (b)) == 0)
278 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
281 error (const char *message, ...)
285 va_start (args, message);
286 fprintf (stderr, _("%s: Error: "), program_name);
287 vfprintf (stderr, message, args);
292 warn (const char *message, ...)
296 va_start (args, message);
297 fprintf (stderr, _("%s: Warning: "), program_name);
298 vfprintf (stderr, message, args);
303 get_data (void *var, FILE *file, long offset, size_t size, const char *reason)
310 if (fseek (file, archive_file_offset + offset, SEEK_SET))
312 error (_("Unable to seek to 0x%x for %s\n"),
313 archive_file_offset + offset, reason);
320 mvar = malloc (size);
324 error (_("Out of memory allocating 0x%x bytes for %s\n"),
330 if (fread (mvar, size, 1, file) != 1)
332 error (_("Unable to read in 0x%x bytes of %s\n"), size, reason);
342 byte_get_little_endian (unsigned char *field, int size)
350 return ((unsigned int) (field[0]))
351 | (((unsigned int) (field[1])) << 8);
355 /* We want to extract data from an 8 byte wide field and
356 place it into a 4 byte wide field. Since this is a little
357 endian source we can just use the 4 byte extraction code. */
361 return ((unsigned long) (field[0]))
362 | (((unsigned long) (field[1])) << 8)
363 | (((unsigned long) (field[2])) << 16)
364 | (((unsigned long) (field[3])) << 24);
369 /* This is a special case, generated by the BYTE_GET8 macro.
370 It means that we are loading an 8 byte value from a field
371 in an external structure into an 8 byte value in a field
372 in an internal structure. */
373 return ((bfd_vma) (field[0]))
374 | (((bfd_vma) (field[1])) << 8)
375 | (((bfd_vma) (field[2])) << 16)
376 | (((bfd_vma) (field[3])) << 24)
377 | (((bfd_vma) (field[4])) << 32)
378 | (((bfd_vma) (field[5])) << 40)
379 | (((bfd_vma) (field[6])) << 48)
380 | (((bfd_vma) (field[7])) << 56);
383 error (_("Unhandled data length: %d\n"), size);
389 byte_get_signed (unsigned char *field, int size)
391 bfd_vma x = byte_get (field, size);
396 return (x ^ 0x80) - 0x80;
398 return (x ^ 0x8000) - 0x8000;
400 return (x ^ 0x80000000) - 0x80000000;
410 byte_put_little_endian (unsigned char *field, bfd_vma value, int size)
415 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
416 field[6] = ((value >> 24) >> 24) & 0xff;
417 field[5] = ((value >> 24) >> 16) & 0xff;
418 field[4] = ((value >> 24) >> 8) & 0xff;
421 field[3] = (value >> 24) & 0xff;
422 field[2] = (value >> 16) & 0xff;
425 field[1] = (value >> 8) & 0xff;
428 field[0] = value & 0xff;
432 error (_("Unhandled data length: %d\n"), size);
437 /* Print a VMA value. */
439 print_vma (bfd_vma vma, print_mode mode)
451 printf ("%8.8lx", (unsigned long) vma);
457 printf ("%5ld", (long) vma);
465 printf ("%lx", (unsigned long) vma);
469 printf ("%ld", (unsigned long) vma);
473 printf ("%lu", (unsigned long) vma);
495 #if BFD_HOST_64BIT_LONG
498 if (_bfd_int64_high (vma))
499 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
501 printf ("%lx", _bfd_int64_low (vma));
506 #if BFD_HOST_64BIT_LONG
509 if (_bfd_int64_high (vma))
511 printf ("++%ld", _bfd_int64_low (vma));
513 printf ("%ld", _bfd_int64_low (vma));
518 #if BFD_HOST_64BIT_LONG
520 printf ("%5ld", vma);
522 printf ("%#lx", vma);
524 if (_bfd_int64_high (vma))
526 printf ("++%ld", _bfd_int64_low (vma));
527 else if (vma <= 99999)
528 printf ("%5ld", _bfd_int64_low (vma));
530 printf ("%#lx", _bfd_int64_low (vma));
535 #if BFD_HOST_64BIT_LONG
538 if (_bfd_int64_high (vma))
540 printf ("++%lu", _bfd_int64_low (vma));
542 printf ("%lu", _bfd_int64_low (vma));
550 /* Display a symbol on stdout. If do_wide is not true then
551 format the symbol to be at most WIDTH characters,
552 truncating as necessary. If WIDTH is negative then
553 format the string to be exactly - WIDTH characters,
554 truncating or padding as necessary. */
557 print_symbol (int width, const char *symbol)
560 printf ("%s", symbol);
562 printf ("%-*.*s", width, width, symbol);
564 printf ("%-.*s", width, symbol);
568 byte_get_big_endian (unsigned char *field, int size)
576 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
579 return ((unsigned long) (field[3]))
580 | (((unsigned long) (field[2])) << 8)
581 | (((unsigned long) (field[1])) << 16)
582 | (((unsigned long) (field[0])) << 24);
586 /* Although we are extracing data from an 8 byte wide field,
587 we are returning only 4 bytes of data. */
588 return ((unsigned long) (field[7]))
589 | (((unsigned long) (field[6])) << 8)
590 | (((unsigned long) (field[5])) << 16)
591 | (((unsigned long) (field[4])) << 24);
595 /* This is a special case, generated by the BYTE_GET8 macro.
596 It means that we are loading an 8 byte value from a field
597 in an external structure into an 8 byte value in a field
598 in an internal structure. */
599 return ((bfd_vma) (field[7]))
600 | (((bfd_vma) (field[6])) << 8)
601 | (((bfd_vma) (field[5])) << 16)
602 | (((bfd_vma) (field[4])) << 24)
603 | (((bfd_vma) (field[3])) << 32)
604 | (((bfd_vma) (field[2])) << 40)
605 | (((bfd_vma) (field[1])) << 48)
606 | (((bfd_vma) (field[0])) << 56);
610 error (_("Unhandled data length: %d\n"), size);
616 byte_put_big_endian (unsigned char *field, bfd_vma value, int size)
621 field[7] = value & 0xff;
622 field[6] = (value >> 8) & 0xff;
623 field[5] = (value >> 16) & 0xff;
624 field[4] = (value >> 24) & 0xff;
629 field[3] = value & 0xff;
630 field[2] = (value >> 8) & 0xff;
634 field[1] = value & 0xff;
638 field[0] = value & 0xff;
642 error (_("Unhandled data length: %d\n"), size);
647 /* Guess the relocation size commonly used by the specific machines. */
650 guess_is_rela (unsigned long e_machine)
654 /* Targets that use REL relocations. */
669 /* Targets that use RELA relocations. */
684 case EM_CYGNUS_MN10200:
686 case EM_CYGNUS_MN10300:
733 warn (_("Don't know about relocations on this machine architecture\n"));
739 slurp_rela_relocs (FILE *file,
740 unsigned long rel_offset,
741 unsigned long rel_size,
742 Elf_Internal_Rela **relasp,
743 unsigned long *nrelasp)
745 Elf_Internal_Rela *relas;
746 unsigned long nrelas;
751 Elf32_External_Rela *erelas;
753 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
757 nrelas = rel_size / sizeof (Elf32_External_Rela);
759 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
763 error (_("out of memory parsing relocs"));
767 for (i = 0; i < nrelas; i++)
769 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
770 relas[i].r_info = BYTE_GET (erelas[i].r_info);
771 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
778 Elf64_External_Rela *erelas;
780 erelas = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
784 nrelas = rel_size / sizeof (Elf64_External_Rela);
786 relas = malloc (nrelas * sizeof (Elf_Internal_Rela));
790 error (_("out of memory parsing relocs"));
794 for (i = 0; i < nrelas; i++)
796 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
797 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
798 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
809 slurp_rel_relocs (FILE *file,
810 unsigned long rel_offset,
811 unsigned long rel_size,
812 Elf_Internal_Rela **relsp,
813 unsigned long *nrelsp)
815 Elf_Internal_Rela *rels;
821 Elf32_External_Rel *erels;
823 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
827 nrels = rel_size / sizeof (Elf32_External_Rel);
829 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
833 error (_("out of memory parsing relocs"));
837 for (i = 0; i < nrels; i++)
839 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
840 rels[i].r_info = BYTE_GET (erels[i].r_info);
841 rels[i].r_addend = 0;
848 Elf64_External_Rel *erels;
850 erels = get_data (NULL, file, rel_offset, rel_size, _("relocs"));
854 nrels = rel_size / sizeof (Elf64_External_Rel);
856 rels = malloc (nrels * sizeof (Elf_Internal_Rela));
860 error (_("out of memory parsing relocs"));
864 for (i = 0; i < nrels; i++)
866 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
867 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
868 rels[i].r_addend = 0;
878 /* Display the contents of the relocation data found at the specified
882 dump_relocations (FILE *file,
883 unsigned long rel_offset,
884 unsigned long rel_size,
885 Elf_Internal_Sym *symtab,
888 unsigned long strtablen,
892 Elf_Internal_Rela *rels;
895 if (is_rela == UNKNOWN)
896 is_rela = guess_is_rela (elf_header.e_machine);
900 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
905 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
914 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
916 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
921 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
923 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
931 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
933 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
938 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
940 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
944 for (i = 0; i < rel_size; i++)
947 const char *rtype2 = NULL;
948 const char *rtype3 = NULL;
951 bfd_vma symtab_index;
956 offset = rels[i].r_offset;
957 info = rels[i].r_info;
961 type = ELF32_R_TYPE (info);
962 symtab_index = ELF32_R_SYM (info);
966 /* The #ifdef BFD64 below is to prevent a compile time warning.
967 We know that if we do not have a 64 bit data type that we
968 will never execute this code anyway. */
970 if (elf_header.e_machine == EM_MIPS)
972 /* In little-endian objects, r_info isn't really a 64-bit
973 little-endian value: it has a 32-bit little-endian
974 symbol index followed by four individual byte fields.
975 Reorder INFO accordingly. */
976 if (elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
977 info = (((info & 0xffffffff) << 32)
978 | ((info >> 56) & 0xff)
979 | ((info >> 40) & 0xff00)
980 | ((info >> 24) & 0xff0000)
981 | ((info >> 8) & 0xff000000));
982 type = ELF64_MIPS_R_TYPE (info);
983 type2 = ELF64_MIPS_R_TYPE2 (info);
984 type3 = ELF64_MIPS_R_TYPE3 (info);
986 else if (elf_header.e_machine == EM_SPARCV9)
987 type = ELF64_R_TYPE_ID (info);
989 type = ELF64_R_TYPE (info);
991 symtab_index = ELF64_R_SYM (info);
997 #ifdef _bfd_int64_low
998 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1000 printf ("%8.8lx %8.8lx ", offset, info);
1005 #ifdef _bfd_int64_low
1007 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1008 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1009 _bfd_int64_high (offset),
1010 _bfd_int64_low (offset),
1011 _bfd_int64_high (info),
1012 _bfd_int64_low (info));
1015 ? "%16.16lx %16.16lx "
1016 : "%12.12lx %12.12lx ",
1021 switch (elf_header.e_machine)
1028 case EM_CYGNUS_M32R:
1029 rtype = elf_m32r_reloc_type (type);
1034 rtype = elf_i386_reloc_type (type);
1039 rtype = elf_m68hc11_reloc_type (type);
1043 rtype = elf_m68k_reloc_type (type);
1047 rtype = elf_i960_reloc_type (type);
1052 rtype = elf_avr_reloc_type (type);
1055 case EM_OLD_SPARCV9:
1056 case EM_SPARC32PLUS:
1059 rtype = elf_sparc_reloc_type (type);
1063 case EM_CYGNUS_V850:
1064 rtype = v850_reloc_type (type);
1068 case EM_CYGNUS_D10V:
1069 rtype = elf_d10v_reloc_type (type);
1073 case EM_CYGNUS_D30V:
1074 rtype = elf_d30v_reloc_type (type);
1078 rtype = elf_dlx_reloc_type (type);
1082 rtype = elf_sh_reloc_type (type);
1086 case EM_CYGNUS_MN10300:
1087 rtype = elf_mn10300_reloc_type (type);
1091 case EM_CYGNUS_MN10200:
1092 rtype = elf_mn10200_reloc_type (type);
1096 case EM_CYGNUS_FR30:
1097 rtype = elf_fr30_reloc_type (type);
1101 rtype = elf_frv_reloc_type (type);
1105 rtype = elf_mcore_reloc_type (type);
1109 rtype = elf_mmix_reloc_type (type);
1114 rtype = elf_msp430_reloc_type (type);
1118 rtype = elf_ppc_reloc_type (type);
1122 rtype = elf_ppc64_reloc_type (type);
1126 case EM_MIPS_RS3_LE:
1127 rtype = elf_mips_reloc_type (type);
1130 rtype2 = elf_mips_reloc_type (type2);
1131 rtype3 = elf_mips_reloc_type (type3);
1136 rtype = elf_alpha_reloc_type (type);
1140 rtype = elf_arm_reloc_type (type);
1144 rtype = elf_arc_reloc_type (type);
1148 rtype = elf_hppa_reloc_type (type);
1154 rtype = elf_h8_reloc_type (type);
1159 rtype = elf_or32_reloc_type (type);
1164 rtype = elf_pj_reloc_type (type);
1167 rtype = elf_ia64_reloc_type (type);
1171 rtype = elf_cris_reloc_type (type);
1175 rtype = elf_i860_reloc_type (type);
1179 rtype = elf_x86_64_reloc_type (type);
1183 rtype = i370_reloc_type (type);
1188 rtype = elf_s390_reloc_type (type);
1192 rtype = elf_xstormy16_reloc_type (type);
1196 rtype = elf_crx_reloc_type (type);
1200 rtype = elf_vax_reloc_type (type);
1205 rtype = elf_ip2k_reloc_type (type);
1209 rtype = elf_iq2000_reloc_type (type);
1214 rtype = elf_xtensa_reloc_type (type);
1219 #ifdef _bfd_int64_low
1220 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1222 printf (_("unrecognized: %-7lx"), type);
1225 printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1229 if (symtab == NULL || symtab_index >= nsyms)
1230 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1233 Elf_Internal_Sym *psym;
1235 psym = symtab + symtab_index;
1238 print_vma (psym->st_value, LONG_HEX);
1239 printf (is_32bit_elf ? " " : " ");
1241 if (psym->st_name == 0)
1243 const char *sec_name = "<null>";
1246 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1248 bfd_vma sec_index = (bfd_vma) -1;
1250 if (psym->st_shndx < SHN_LORESERVE)
1251 sec_index = psym->st_shndx;
1252 else if (psym->st_shndx > SHN_HIRESERVE)
1253 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1256 if (sec_index != (bfd_vma) -1)
1257 sec_name = SECTION_NAME (section_headers + sec_index);
1258 else if (psym->st_shndx == SHN_ABS)
1260 else if (psym->st_shndx == SHN_COMMON)
1261 sec_name = "COMMON";
1262 else if (elf_header.e_machine == EM_IA_64
1263 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1264 && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1265 sec_name = "ANSI_COM";
1268 sprintf (name_buf, "<section 0x%x>",
1269 (unsigned int) psym->st_shndx);
1270 sec_name = name_buf;
1273 print_symbol (22, sec_name);
1275 else if (strtab == NULL)
1276 printf (_("<string table index: %3ld>"), psym->st_name);
1277 else if (psym->st_name > strtablen)
1278 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1280 print_symbol (22, strtab + psym->st_name);
1283 printf (" + %lx", (unsigned long) rels[i].r_addend);
1288 printf ("%*c", is_32bit_elf ?
1289 (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1290 print_vma (rels[i].r_addend, LONG_HEX);
1293 if (elf_header.e_machine == EM_SPARCV9
1294 && streq (rtype, "R_SPARC_OLO10"))
1295 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1299 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1301 printf (" Type2: ");
1304 #ifdef _bfd_int64_low
1305 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1307 printf (_("unrecognized: %-7lx"), type2);
1310 printf ("%-17.17s", rtype2);
1312 printf ("\n Type3: ");
1315 #ifdef _bfd_int64_low
1316 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1318 printf (_("unrecognized: %-7lx"), type3);
1321 printf ("%-17.17s", rtype3);
1333 get_mips_dynamic_type (unsigned long type)
1337 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1338 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1339 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1340 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1341 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1342 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1343 case DT_MIPS_MSYM: return "MIPS_MSYM";
1344 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1345 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1346 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1347 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1348 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1349 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1350 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1351 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1352 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1353 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1354 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1355 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1356 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1357 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1358 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1359 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1360 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1361 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1362 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1363 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1364 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1365 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1366 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1367 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1368 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1369 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1370 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1371 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1372 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1373 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1374 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1375 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1376 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1377 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1378 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1379 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1386 get_sparc64_dynamic_type (unsigned long type)
1390 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1397 get_ppc64_dynamic_type (unsigned long type)
1401 case DT_PPC64_GLINK: return "PPC64_GLINK";
1402 case DT_PPC64_OPD: return "PPC64_OPD";
1403 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1410 get_parisc_dynamic_type (unsigned long type)
1414 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1415 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1416 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1417 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1418 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1419 case DT_HP_PREINIT: return "HP_PREINIT";
1420 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1421 case DT_HP_NEEDED: return "HP_NEEDED";
1422 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1423 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1424 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1425 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1426 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1433 get_ia64_dynamic_type (unsigned long type)
1437 case DT_IA_64_PLT_RESERVE: return "IA_64_PLT_RESERVE";
1444 get_dynamic_type (unsigned long type)
1446 static char buff[32];
1450 case DT_NULL: return "NULL";
1451 case DT_NEEDED: return "NEEDED";
1452 case DT_PLTRELSZ: return "PLTRELSZ";
1453 case DT_PLTGOT: return "PLTGOT";
1454 case DT_HASH: return "HASH";
1455 case DT_STRTAB: return "STRTAB";
1456 case DT_SYMTAB: return "SYMTAB";
1457 case DT_RELA: return "RELA";
1458 case DT_RELASZ: return "RELASZ";
1459 case DT_RELAENT: return "RELAENT";
1460 case DT_STRSZ: return "STRSZ";
1461 case DT_SYMENT: return "SYMENT";
1462 case DT_INIT: return "INIT";
1463 case DT_FINI: return "FINI";
1464 case DT_SONAME: return "SONAME";
1465 case DT_RPATH: return "RPATH";
1466 case DT_SYMBOLIC: return "SYMBOLIC";
1467 case DT_REL: return "REL";
1468 case DT_RELSZ: return "RELSZ";
1469 case DT_RELENT: return "RELENT";
1470 case DT_PLTREL: return "PLTREL";
1471 case DT_DEBUG: return "DEBUG";
1472 case DT_TEXTREL: return "TEXTREL";
1473 case DT_JMPREL: return "JMPREL";
1474 case DT_BIND_NOW: return "BIND_NOW";
1475 case DT_INIT_ARRAY: return "INIT_ARRAY";
1476 case DT_FINI_ARRAY: return "FINI_ARRAY";
1477 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1478 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1479 case DT_RUNPATH: return "RUNPATH";
1480 case DT_FLAGS: return "FLAGS";
1482 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1483 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1485 case DT_CHECKSUM: return "CHECKSUM";
1486 case DT_PLTPADSZ: return "PLTPADSZ";
1487 case DT_MOVEENT: return "MOVEENT";
1488 case DT_MOVESZ: return "MOVESZ";
1489 case DT_FEATURE: return "FEATURE";
1490 case DT_POSFLAG_1: return "POSFLAG_1";
1491 case DT_SYMINSZ: return "SYMINSZ";
1492 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1494 case DT_ADDRRNGLO: return "ADDRRNGLO";
1495 case DT_CONFIG: return "CONFIG";
1496 case DT_DEPAUDIT: return "DEPAUDIT";
1497 case DT_AUDIT: return "AUDIT";
1498 case DT_PLTPAD: return "PLTPAD";
1499 case DT_MOVETAB: return "MOVETAB";
1500 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1502 case DT_VERSYM: return "VERSYM";
1504 case DT_RELACOUNT: return "RELACOUNT";
1505 case DT_RELCOUNT: return "RELCOUNT";
1506 case DT_FLAGS_1: return "FLAGS_1";
1507 case DT_VERDEF: return "VERDEF";
1508 case DT_VERDEFNUM: return "VERDEFNUM";
1509 case DT_VERNEED: return "VERNEED";
1510 case DT_VERNEEDNUM: return "VERNEEDNUM";
1512 case DT_AUXILIARY: return "AUXILIARY";
1513 case DT_USED: return "USED";
1514 case DT_FILTER: return "FILTER";
1516 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1517 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1518 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1519 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1520 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1523 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1527 switch (elf_header.e_machine)
1530 case EM_MIPS_RS3_LE:
1531 result = get_mips_dynamic_type (type);
1534 result = get_sparc64_dynamic_type (type);
1537 result = get_ppc64_dynamic_type (type);
1540 result = get_ia64_dynamic_type (type);
1550 sprintf (buff, _("Processor Specific: %lx"), type);
1552 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1556 switch (elf_header.e_machine)
1559 result = get_parisc_dynamic_type (type);
1569 sprintf (buff, _("Operating System specific: %lx"), type);
1572 sprintf (buff, _("<unknown>: %lx"), type);
1579 get_file_type (unsigned e_type)
1581 static char buff[32];
1585 case ET_NONE: return _("NONE (None)");
1586 case ET_REL: return _("REL (Relocatable file)");
1587 case ET_EXEC: return _("EXEC (Executable file)");
1588 case ET_DYN: return _("DYN (Shared object file)");
1589 case ET_CORE: return _("CORE (Core file)");
1592 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1593 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1594 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1595 sprintf (buff, _("OS Specific: (%x)"), e_type);
1597 sprintf (buff, _("<unknown>: %x"), e_type);
1603 get_machine_name (unsigned e_machine)
1605 static char buff[64]; /* XXX */
1609 case EM_NONE: return _("None");
1610 case EM_M32: return "WE32100";
1611 case EM_SPARC: return "Sparc";
1612 case EM_386: return "Intel 80386";
1613 case EM_68K: return "MC68000";
1614 case EM_88K: return "MC88000";
1615 case EM_486: return "Intel 80486";
1616 case EM_860: return "Intel 80860";
1617 case EM_MIPS: return "MIPS R3000";
1618 case EM_S370: return "IBM System/370";
1619 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1620 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1621 case EM_PARISC: return "HPPA";
1622 case EM_PPC_OLD: return "Power PC (old)";
1623 case EM_SPARC32PLUS: return "Sparc v8+" ;
1624 case EM_960: return "Intel 90860";
1625 case EM_PPC: return "PowerPC";
1626 case EM_PPC64: return "PowerPC64";
1627 case EM_V800: return "NEC V800";
1628 case EM_FR20: return "Fujitsu FR20";
1629 case EM_RH32: return "TRW RH32";
1630 case EM_MCORE: return "MCORE";
1631 case EM_ARM: return "ARM";
1632 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1633 case EM_SH: return "Renesas / SuperH SH";
1634 case EM_SPARCV9: return "Sparc v9";
1635 case EM_TRICORE: return "Siemens Tricore";
1636 case EM_ARC: return "ARC";
1637 case EM_H8_300: return "Renesas H8/300";
1638 case EM_H8_300H: return "Renesas H8/300H";
1639 case EM_H8S: return "Renesas H8S";
1640 case EM_H8_500: return "Renesas H8/500";
1641 case EM_IA_64: return "Intel IA-64";
1642 case EM_MIPS_X: return "Stanford MIPS-X";
1643 case EM_COLDFIRE: return "Motorola Coldfire";
1644 case EM_68HC12: return "Motorola M68HC12";
1645 case EM_ALPHA: return "Alpha";
1646 case EM_CYGNUS_D10V:
1647 case EM_D10V: return "d10v";
1648 case EM_CYGNUS_D30V:
1649 case EM_D30V: return "d30v";
1650 case EM_CYGNUS_M32R:
1651 case EM_M32R: return "Renesas M32R (formerly Mitsubishi M32r)";
1652 case EM_CYGNUS_V850:
1653 case EM_V850: return "NEC v850";
1654 case EM_CYGNUS_MN10300:
1655 case EM_MN10300: return "mn10300";
1656 case EM_CYGNUS_MN10200:
1657 case EM_MN10200: return "mn10200";
1658 case EM_CYGNUS_FR30:
1659 case EM_FR30: return "Fujitsu FR30";
1660 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1662 case EM_PJ: return "picoJava";
1663 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1664 case EM_PCP: return "Siemens PCP";
1665 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1666 case EM_NDR1: return "Denso NDR1 microprocesspr";
1667 case EM_STARCORE: return "Motorola Star*Core processor";
1668 case EM_ME16: return "Toyota ME16 processor";
1669 case EM_ST100: return "STMicroelectronics ST100 processor";
1670 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1671 case EM_FX66: return "Siemens FX66 microcontroller";
1672 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1673 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1674 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1675 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1676 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1677 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1678 case EM_SVX: return "Silicon Graphics SVx";
1679 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1680 case EM_VAX: return "Digital VAX";
1682 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1683 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1684 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1685 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1686 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1687 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1688 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1689 case EM_PRISM: return "Vitesse Prism";
1690 case EM_X86_64: return "Advanced Micro Devices X86-64";
1692 case EM_S390: return "IBM S/390";
1693 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1695 case EM_OR32: return "OpenRISC";
1696 case EM_CRX: return "National Semiconductor CRX microprocessor";
1697 case EM_DLX: return "OpenDLX";
1699 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1700 case EM_IQ2000: return "Vitesse IQ2000";
1702 case EM_XTENSA: return "Tensilica Xtensa Processor";
1704 sprintf (buff, _("<unknown>: %x"), e_machine);
1710 decode_ARM_machine_flags (unsigned e_flags, char buf[])
1715 eabi = EF_ARM_EABI_VERSION (e_flags);
1716 e_flags &= ~ EF_ARM_EABIMASK;
1718 /* Handle "generic" ARM flags. */
1719 if (e_flags & EF_ARM_RELEXEC)
1721 strcat (buf, ", relocatable executable");
1722 e_flags &= ~ EF_ARM_RELEXEC;
1725 if (e_flags & EF_ARM_HASENTRY)
1727 strcat (buf, ", has entry point");
1728 e_flags &= ~ EF_ARM_HASENTRY;
1731 /* Now handle EABI specific flags. */
1735 strcat (buf, ", <unrecognized EABI>");
1740 case EF_ARM_EABI_VER1:
1741 strcat (buf, ", Version1 EABI");
1746 /* Process flags one bit at a time. */
1747 flag = e_flags & - e_flags;
1752 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1753 strcat (buf, ", sorted symbol tables");
1763 case EF_ARM_EABI_VER2:
1764 strcat (buf, ", Version2 EABI");
1769 /* Process flags one bit at a time. */
1770 flag = e_flags & - e_flags;
1775 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1776 strcat (buf, ", sorted symbol tables");
1779 case EF_ARM_DYNSYMSUSESEGIDX:
1780 strcat (buf, ", dynamic symbols use segment index");
1783 case EF_ARM_MAPSYMSFIRST:
1784 strcat (buf, ", mapping symbols precede others");
1794 case EF_ARM_EABI_VER3:
1795 strcat (buf, ", Version3 EABI");
1798 case EF_ARM_EABI_VER4:
1799 strcat (buf, ", Version4 EABI");
1804 /* Process flags one bit at a time. */
1805 flag = e_flags & - e_flags;
1811 strcat (buf, ", BE8");
1815 strcat (buf, ", LE8");
1825 case EF_ARM_EABI_UNKNOWN:
1826 strcat (buf, ", GNU EABI");
1831 /* Process flags one bit at a time. */
1832 flag = e_flags & - e_flags;
1837 case EF_ARM_INTERWORK:
1838 strcat (buf, ", interworking enabled");
1841 case EF_ARM_APCS_26:
1842 strcat (buf, ", uses APCS/26");
1845 case EF_ARM_APCS_FLOAT:
1846 strcat (buf, ", uses APCS/float");
1850 strcat (buf, ", position independent");
1854 strcat (buf, ", 8 bit structure alignment");
1857 case EF_ARM_NEW_ABI:
1858 strcat (buf, ", uses new ABI");
1861 case EF_ARM_OLD_ABI:
1862 strcat (buf, ", uses old ABI");
1865 case EF_ARM_SOFT_FLOAT:
1866 strcat (buf, ", software FP");
1869 case EF_ARM_VFP_FLOAT:
1870 strcat (buf, ", VFP");
1873 case EF_ARM_MAVERICK_FLOAT:
1874 strcat (buf, ", Maverick FP");
1885 strcat (buf,", <unknown>");
1889 get_machine_flags (unsigned e_flags, unsigned e_machine)
1891 static char buf[1024];
1903 decode_ARM_machine_flags (e_flags, buf);
1907 switch (e_flags & EF_FRV_CPU_MASK)
1909 case EF_FRV_CPU_GENERIC:
1913 strcat (buf, ", fr???");
1916 case EF_FRV_CPU_FR300:
1917 strcat (buf, ", fr300");
1920 case EF_FRV_CPU_FR400:
1921 strcat (buf, ", fr400");
1923 case EF_FRV_CPU_FR405:
1924 strcat (buf, ", fr405");
1927 case EF_FRV_CPU_FR450:
1928 strcat (buf, ", fr450");
1931 case EF_FRV_CPU_FR500:
1932 strcat (buf, ", fr500");
1934 case EF_FRV_CPU_FR550:
1935 strcat (buf, ", fr550");
1938 case EF_FRV_CPU_SIMPLE:
1939 strcat (buf, ", simple");
1941 case EF_FRV_CPU_TOMCAT:
1942 strcat (buf, ", tomcat");
1948 if (e_flags & EF_CPU32)
1949 strcat (buf, ", cpu32");
1950 if (e_flags & EF_M68000)
1951 strcat (buf, ", m68000");
1955 if (e_flags & EF_PPC_EMB)
1956 strcat (buf, ", emb");
1958 if (e_flags & EF_PPC_RELOCATABLE)
1959 strcat (buf, ", relocatable");
1961 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1962 strcat (buf, ", relocatable-lib");
1966 case EM_CYGNUS_V850:
1967 switch (e_flags & EF_V850_ARCH)
1970 strcat (buf, ", v850e1");
1973 strcat (buf, ", v850e");
1976 strcat (buf, ", v850");
1979 strcat (buf, ", unknown v850 architecture variant");
1985 case EM_CYGNUS_M32R:
1986 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1987 strcat (buf, ", m32r");
1992 case EM_MIPS_RS3_LE:
1993 if (e_flags & EF_MIPS_NOREORDER)
1994 strcat (buf, ", noreorder");
1996 if (e_flags & EF_MIPS_PIC)
1997 strcat (buf, ", pic");
1999 if (e_flags & EF_MIPS_CPIC)
2000 strcat (buf, ", cpic");
2002 if (e_flags & EF_MIPS_UCODE)
2003 strcat (buf, ", ugen_reserved");
2005 if (e_flags & EF_MIPS_ABI2)
2006 strcat (buf, ", abi2");
2008 if (e_flags & EF_MIPS_OPTIONS_FIRST)
2009 strcat (buf, ", odk first");
2011 if (e_flags & EF_MIPS_32BITMODE)
2012 strcat (buf, ", 32bitmode");
2014 switch ((e_flags & EF_MIPS_MACH))
2016 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
2017 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
2018 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
2019 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
2020 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
2021 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
2022 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
2023 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
2024 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
2025 case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
2027 /* We simply ignore the field in this case to avoid confusion:
2028 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2031 default: strcat (buf, ", unknown CPU"); break;
2034 switch ((e_flags & EF_MIPS_ABI))
2036 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
2037 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
2038 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
2039 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
2041 /* We simply ignore the field in this case to avoid confusion:
2042 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2043 This means it is likely to be an o32 file, but not for
2046 default: strcat (buf, ", unknown ABI"); break;
2049 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
2050 strcat (buf, ", mdmx");
2052 if (e_flags & EF_MIPS_ARCH_ASE_M16)
2053 strcat (buf, ", mips16");
2055 switch ((e_flags & EF_MIPS_ARCH))
2057 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
2058 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
2059 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
2060 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
2061 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
2062 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
2063 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
2064 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
2065 case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
2066 default: strcat (buf, ", unknown ISA"); break;
2072 switch ((e_flags & EF_SH_MACH_MASK))
2074 case EF_SH1: strcat (buf, ", sh1"); break;
2075 case EF_SH2: strcat (buf, ", sh2"); break;
2076 case EF_SH3: strcat (buf, ", sh3"); break;
2077 case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
2078 case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
2079 case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
2080 case EF_SH3E: strcat (buf, ", sh3e"); break;
2081 case EF_SH4: strcat (buf, ", sh4"); break;
2082 case EF_SH5: strcat (buf, ", sh5"); break;
2083 case EF_SH2E: strcat (buf, ", sh2e"); break;
2084 case EF_SH4A: strcat (buf, ", sh4a"); break;
2085 case EF_SH2A: strcat (buf, ", sh2a"); break;
2086 case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
2087 case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
2088 case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
2089 default: strcat (buf, ", unknown ISA"); break;
2095 if (e_flags & EF_SPARC_32PLUS)
2096 strcat (buf, ", v8+");
2098 if (e_flags & EF_SPARC_SUN_US1)
2099 strcat (buf, ", ultrasparcI");
2101 if (e_flags & EF_SPARC_SUN_US3)
2102 strcat (buf, ", ultrasparcIII");
2104 if (e_flags & EF_SPARC_HAL_R1)
2105 strcat (buf, ", halr1");
2107 if (e_flags & EF_SPARC_LEDATA)
2108 strcat (buf, ", ledata");
2110 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2111 strcat (buf, ", tso");
2113 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2114 strcat (buf, ", pso");
2116 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2117 strcat (buf, ", rmo");
2121 switch (e_flags & EF_PARISC_ARCH)
2123 case EFA_PARISC_1_0:
2124 strcpy (buf, ", PA-RISC 1.0");
2126 case EFA_PARISC_1_1:
2127 strcpy (buf, ", PA-RISC 1.1");
2129 case EFA_PARISC_2_0:
2130 strcpy (buf, ", PA-RISC 2.0");
2135 if (e_flags & EF_PARISC_TRAPNIL)
2136 strcat (buf, ", trapnil");
2137 if (e_flags & EF_PARISC_EXT)
2138 strcat (buf, ", ext");
2139 if (e_flags & EF_PARISC_LSB)
2140 strcat (buf, ", lsb");
2141 if (e_flags & EF_PARISC_WIDE)
2142 strcat (buf, ", wide");
2143 if (e_flags & EF_PARISC_NO_KABP)
2144 strcat (buf, ", no kabp");
2145 if (e_flags & EF_PARISC_LAZYSWAP)
2146 strcat (buf, ", lazyswap");
2151 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2152 strcat (buf, ", new calling convention");
2154 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2155 strcat (buf, ", gnu calling convention");
2159 if ((e_flags & EF_IA_64_ABI64))
2160 strcat (buf, ", 64-bit");
2162 strcat (buf, ", 32-bit");
2163 if ((e_flags & EF_IA_64_REDUCEDFP))
2164 strcat (buf, ", reduced fp model");
2165 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2166 strcat (buf, ", no function descriptors, constant gp");
2167 else if ((e_flags & EF_IA_64_CONS_GP))
2168 strcat (buf, ", constant gp");
2169 if ((e_flags & EF_IA_64_ABSOLUTE))
2170 strcat (buf, ", absolute");
2174 if ((e_flags & EF_VAX_NONPIC))
2175 strcat (buf, ", non-PIC");
2176 if ((e_flags & EF_VAX_DFLOAT))
2177 strcat (buf, ", D-Float");
2178 if ((e_flags & EF_VAX_GFLOAT))
2179 strcat (buf, ", G-Float");
2188 get_osabi_name (unsigned int osabi)
2190 static char buff[32];
2194 case ELFOSABI_NONE: return "UNIX - System V";
2195 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2196 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2197 case ELFOSABI_LINUX: return "UNIX - Linux";
2198 case ELFOSABI_HURD: return "GNU/Hurd";
2199 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2200 case ELFOSABI_AIX: return "UNIX - AIX";
2201 case ELFOSABI_IRIX: return "UNIX - IRIX";
2202 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2203 case ELFOSABI_TRU64: return "UNIX - TRU64";
2204 case ELFOSABI_MODESTO: return "Novell - Modesto";
2205 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2206 case ELFOSABI_OPENVMS: return "VMS - OpenVMS";
2207 case ELFOSABI_NSK: return "HP - Non-Stop Kernel";
2208 case ELFOSABI_AROS: return "Amiga Research OS";
2209 case ELFOSABI_STANDALONE: return _("Standalone App");
2210 case ELFOSABI_ARM: return "ARM";
2212 sprintf (buff, _("<unknown: %x>"), osabi);
2218 get_mips_segment_type (unsigned long type)
2222 case PT_MIPS_REGINFO:
2224 case PT_MIPS_RTPROC:
2226 case PT_MIPS_OPTIONS:
2236 get_parisc_segment_type (unsigned long type)
2240 case PT_HP_TLS: return "HP_TLS";
2241 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2242 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2243 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2244 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2245 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2246 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2247 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2248 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2249 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2250 case PT_HP_PARALLEL: return "HP_PARALLEL";
2251 case PT_HP_FASTBIND: return "HP_FASTBIND";
2252 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2253 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2262 get_ia64_segment_type (unsigned long type)
2266 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2267 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2268 case PT_HP_TLS: return "HP_TLS";
2269 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2270 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2271 case PT_IA_64_HP_STACK: return "HP_STACK";
2280 get_segment_type (unsigned long p_type)
2282 static char buff[32];
2286 case PT_NULL: return "NULL";
2287 case PT_LOAD: return "LOAD";
2288 case PT_DYNAMIC: return "DYNAMIC";
2289 case PT_INTERP: return "INTERP";
2290 case PT_NOTE: return "NOTE";
2291 case PT_SHLIB: return "SHLIB";
2292 case PT_PHDR: return "PHDR";
2293 case PT_TLS: return "TLS";
2295 case PT_GNU_EH_FRAME:
2296 return "GNU_EH_FRAME";
2297 case PT_GNU_STACK: return "GNU_STACK";
2298 case PT_GNU_RELRO: return "GNU_RELRO";
2301 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2305 switch (elf_header.e_machine)
2308 case EM_MIPS_RS3_LE:
2309 result = get_mips_segment_type (p_type);
2312 result = get_parisc_segment_type (p_type);
2315 result = get_ia64_segment_type (p_type);
2325 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2327 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2331 switch (elf_header.e_machine)
2334 result = get_parisc_segment_type (p_type);
2337 result = get_ia64_segment_type (p_type);
2347 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2350 sprintf (buff, _("<unknown>: %lx"), p_type);
2357 get_mips_section_type_name (unsigned int sh_type)
2361 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2362 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2363 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2364 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2365 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2366 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2367 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2368 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2369 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2370 case SHT_MIPS_RELD: return "MIPS_RELD";
2371 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2372 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2373 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2374 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2375 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2376 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2377 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2378 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2379 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2380 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2381 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2382 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2383 case SHT_MIPS_LINE: return "MIPS_LINE";
2384 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2385 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2386 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2387 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2388 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2389 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2390 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2391 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2392 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2393 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2394 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2395 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2396 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2397 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2398 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2399 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2407 get_parisc_section_type_name (unsigned int sh_type)
2411 case SHT_PARISC_EXT: return "PARISC_EXT";
2412 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2413 case SHT_PARISC_DOC: return "PARISC_DOC";
2421 get_ia64_section_type_name (unsigned int sh_type)
2423 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2424 if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
2425 return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
2429 case SHT_IA_64_EXT: return "IA_64_EXT";
2430 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2431 case SHT_IA_64_PRIORITY_INIT: return "IA_64_PRIORITY_INIT";
2439 get_x86_64_section_type_name (unsigned int sh_type)
2443 case SHT_X86_64_UNWIND: return "X86_64_UNWIND";
2451 get_arm_section_type_name (unsigned int sh_type)
2464 get_section_type_name (unsigned int sh_type)
2466 static char buff[32];
2470 case SHT_NULL: return "NULL";
2471 case SHT_PROGBITS: return "PROGBITS";
2472 case SHT_SYMTAB: return "SYMTAB";
2473 case SHT_STRTAB: return "STRTAB";
2474 case SHT_RELA: return "RELA";
2475 case SHT_HASH: return "HASH";
2476 case SHT_DYNAMIC: return "DYNAMIC";
2477 case SHT_NOTE: return "NOTE";
2478 case SHT_NOBITS: return "NOBITS";
2479 case SHT_REL: return "REL";
2480 case SHT_SHLIB: return "SHLIB";
2481 case SHT_DYNSYM: return "DYNSYM";
2482 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2483 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2484 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2485 case SHT_GROUP: return "GROUP";
2486 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2487 case SHT_GNU_verdef: return "VERDEF";
2488 case SHT_GNU_verneed: return "VERNEED";
2489 case SHT_GNU_versym: return "VERSYM";
2490 case 0x6ffffff0: return "VERSYM";
2491 case 0x6ffffffc: return "VERDEF";
2492 case 0x7ffffffd: return "AUXILIARY";
2493 case 0x7fffffff: return "FILTER";
2494 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2497 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2501 switch (elf_header.e_machine)
2504 case EM_MIPS_RS3_LE:
2505 result = get_mips_section_type_name (sh_type);
2508 result = get_parisc_section_type_name (sh_type);
2511 result = get_ia64_section_type_name (sh_type);
2514 result = get_x86_64_section_type_name (sh_type);
2517 result = get_arm_section_type_name (sh_type);
2527 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2529 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2530 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2531 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2532 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2534 sprintf (buff, _("<unknown>: %x"), sh_type);
2540 #define OPTION_DEBUG_DUMP 512
2542 struct option options[] =
2544 {"all", no_argument, 0, 'a'},
2545 {"file-header", no_argument, 0, 'h'},
2546 {"program-headers", no_argument, 0, 'l'},
2547 {"headers", no_argument, 0, 'e'},
2548 {"histogram", no_argument, 0, 'I'},
2549 {"segments", no_argument, 0, 'l'},
2550 {"sections", no_argument, 0, 'S'},
2551 {"section-headers", no_argument, 0, 'S'},
2552 {"section-groups", no_argument, 0, 'g'},
2553 {"symbols", no_argument, 0, 's'},
2554 {"syms", no_argument, 0, 's'},
2555 {"relocs", no_argument, 0, 'r'},
2556 {"notes", no_argument, 0, 'n'},
2557 {"dynamic", no_argument, 0, 'd'},
2558 {"arch-specific", no_argument, 0, 'A'},
2559 {"version-info", no_argument, 0, 'V'},
2560 {"use-dynamic", no_argument, 0, 'D'},
2561 {"hex-dump", required_argument, 0, 'x'},
2562 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2563 {"unwind", no_argument, 0, 'u'},
2564 #ifdef SUPPORT_DISASSEMBLY
2565 {"instruction-dump", required_argument, 0, 'i'},
2568 {"version", no_argument, 0, 'v'},
2569 {"wide", no_argument, 0, 'W'},
2570 {"help", no_argument, 0, 'H'},
2571 {0, no_argument, 0, 0}
2577 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2578 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2579 fprintf (stdout, _(" Options are:\n\
2580 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2581 -h --file-header Display the ELF file header\n\
2582 -l --program-headers Display the program headers\n\
2583 --segments An alias for --program-headers\n\
2584 -S --section-headers Display the sections' header\n\
2585 --sections An alias for --section-headers\n\
2586 -g --section-groups Display the section groups\n\
2587 -e --headers Equivalent to: -h -l -S\n\
2588 -s --syms Display the symbol table\n\
2589 --symbols An alias for --syms\n\
2590 -n --notes Display the core notes (if present)\n\
2591 -r --relocs Display the relocations (if present)\n\
2592 -u --unwind Display the unwind info (if present)\n\
2593 -d --dynamic Display the dynamic section (if present)\n\
2594 -V --version-info Display the version sections (if present)\n\
2595 -A --arch-specific Display architecture specific information (if any).\n\
2596 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2597 -x --hex-dump=<number> Dump the contents of section <number>\n\
2598 -w[liaprmfFsoR] or\n\
2599 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2600 Display the contents of DWARF2 debug sections\n"));
2601 #ifdef SUPPORT_DISASSEMBLY
2602 fprintf (stdout, _("\
2603 -i --instruction-dump=<number>\n\
2604 Disassemble the contents of section <number>\n"));
2606 fprintf (stdout, _("\
2607 -I --histogram Display histogram of bucket list lengths\n\
2608 -W --wide Allow output width to exceed 80 characters\n\
2609 -H --help Display this information\n\
2610 -v --version Display the version number of readelf\n"));
2611 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2616 /* Record the fact that the user wants the contents of section number
2617 SECTION to be displayed using the method(s) encoded as flags bits
2618 in TYPE. Note, TYPE can be zero if we are creating the array for
2622 request_dump (unsigned int section, int type)
2624 if (section >= num_dump_sects)
2626 char *new_dump_sects;
2628 new_dump_sects = calloc (section + 1, 1);
2630 if (new_dump_sects == NULL)
2631 error (_("Out of memory allocating dump request table."));
2634 /* Copy current flag settings. */
2635 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2639 dump_sects = new_dump_sects;
2640 num_dump_sects = section + 1;
2645 dump_sects[section] |= type;
2651 parse_args (int argc, char **argv)
2658 while ((c = getopt_long
2659 (argc, argv, "ersuahnldSDAIgw::x:i:vVWH", options, NULL)) != EOF)
2680 do_section_groups++;
2688 do_section_groups++;
2730 section = strtoul (optarg, & cp, 0);
2731 if (! *cp && section >= 0)
2733 request_dump (section, HEX_DUMP);
2743 unsigned int index = 0;
2747 while (optarg[index])
2748 switch (optarg[index++])
2757 do_debug_abbrevs = 1;
2767 do_debug_pubnames = 1;
2771 do_debug_aranges = 1;
2775 do_debug_ranges = 1;
2779 do_debug_frames_interp = 1;
2781 do_debug_frames = 1;
2786 do_debug_macinfo = 1;
2800 warn (_("Unrecognized debug option '%s'\n"), optarg);
2805 case OPTION_DEBUG_DUMP:
2813 const char * option;
2816 debug_dump_long_opts;
2818 debug_dump_long_opts opts_table [] =
2820 /* Please keep this table alpha- sorted. */
2821 { "Ranges", & do_debug_ranges },
2822 { "abbrev", & do_debug_abbrevs },
2823 { "aranges", & do_debug_aranges },
2824 { "frames", & do_debug_frames },
2825 { "frames-interp", & do_debug_frames_interp },
2826 { "info", & do_debug_info },
2827 { "line", & do_debug_lines },
2828 { "loc", & do_debug_loc },
2829 { "macro", & do_debug_macinfo },
2830 { "pubnames", & do_debug_pubnames },
2831 /* This entry is for compatability
2832 with earlier versions of readelf. */
2833 { "ranges", & do_debug_aranges },
2834 { "str", & do_debug_str },
2845 debug_dump_long_opts * entry;
2847 for (entry = opts_table; entry->option; entry++)
2849 size_t len = strlen (entry->option);
2851 if (strneq (p, entry->option, len)
2852 && (p[len] == ',' || p[len] == '\0'))
2854 * entry->variable = 1;
2856 /* The --debug-dump=frames-interp option also
2857 enables the --debug-dump=frames option. */
2858 if (do_debug_frames_interp)
2859 do_debug_frames = 1;
2866 if (entry->option == NULL)
2868 warn (_("Unrecognized debug option '%s'\n"), p);
2869 p = strchr (p, ',');
2879 #ifdef SUPPORT_DISASSEMBLY
2882 section = strtoul (optarg, & cp, 0);
2883 if (! *cp && section >= 0)
2885 request_dump (section, DISASS_DUMP);
2891 print_version (program_name);
2901 /* xgettext:c-format */
2902 error (_("Invalid option '-%c'\n"), c);
2909 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2910 && !do_segments && !do_header && !do_dump && !do_version
2911 && !do_histogram && !do_debugging && !do_arch && !do_notes
2912 && !do_section_groups)
2916 warn (_("Nothing to do.\n"));
2922 get_elf_class (unsigned int elf_class)
2924 static char buff[32];
2928 case ELFCLASSNONE: return _("none");
2929 case ELFCLASS32: return "ELF32";
2930 case ELFCLASS64: return "ELF64";
2932 sprintf (buff, _("<unknown: %x>"), elf_class);
2938 get_data_encoding (unsigned int encoding)
2940 static char buff[32];
2944 case ELFDATANONE: return _("none");
2945 case ELFDATA2LSB: return _("2's complement, little endian");
2946 case ELFDATA2MSB: return _("2's complement, big endian");
2948 sprintf (buff, _("<unknown: %x>"), encoding);
2953 /* Decode the data held in 'elf_header'. */
2956 process_file_header (void)
2958 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2959 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2960 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2961 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2964 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2972 printf (_("ELF Header:\n"));
2973 printf (_(" Magic: "));
2974 for (i = 0; i < EI_NIDENT; i++)
2975 printf ("%2.2x ", elf_header.e_ident[i]);
2977 printf (_(" Class: %s\n"),
2978 get_elf_class (elf_header.e_ident[EI_CLASS]));
2979 printf (_(" Data: %s\n"),
2980 get_data_encoding (elf_header.e_ident[EI_DATA]));
2981 printf (_(" Version: %d %s\n"),
2982 elf_header.e_ident[EI_VERSION],
2983 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2985 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2988 printf (_(" OS/ABI: %s\n"),
2989 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2990 printf (_(" ABI Version: %d\n"),
2991 elf_header.e_ident[EI_ABIVERSION]);
2992 printf (_(" Type: %s\n"),
2993 get_file_type (elf_header.e_type));
2994 printf (_(" Machine: %s\n"),
2995 get_machine_name (elf_header.e_machine));
2996 printf (_(" Version: 0x%lx\n"),
2997 (unsigned long) elf_header.e_version);
2999 printf (_(" Entry point address: "));
3000 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3001 printf (_("\n Start of program headers: "));
3002 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3003 printf (_(" (bytes into file)\n Start of section headers: "));
3004 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
3005 printf (_(" (bytes into file)\n"));
3007 printf (_(" Flags: 0x%lx%s\n"),
3008 (unsigned long) elf_header.e_flags,
3009 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
3010 printf (_(" Size of this header: %ld (bytes)\n"),
3011 (long) elf_header.e_ehsize);
3012 printf (_(" Size of program headers: %ld (bytes)\n"),
3013 (long) elf_header.e_phentsize);
3014 printf (_(" Number of program headers: %ld\n"),
3015 (long) elf_header.e_phnum);
3016 printf (_(" Size of section headers: %ld (bytes)\n"),
3017 (long) elf_header.e_shentsize);
3018 printf (_(" Number of section headers: %ld"),
3019 (long) elf_header.e_shnum);
3020 if (section_headers != NULL && elf_header.e_shnum == 0)
3021 printf (" (%ld)", (long) section_headers[0].sh_size);
3022 putc ('\n', stdout);
3023 printf (_(" Section header string table index: %ld"),
3024 (long) elf_header.e_shstrndx);
3025 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
3026 printf (" (%ld)", (long) section_headers[0].sh_link);
3027 putc ('\n', stdout);
3030 if (section_headers != NULL)
3032 if (elf_header.e_shnum == 0)
3033 elf_header.e_shnum = section_headers[0].sh_size;
3034 if (elf_header.e_shstrndx == SHN_XINDEX)
3035 elf_header.e_shstrndx = section_headers[0].sh_link;
3036 free (section_headers);
3037 section_headers = NULL;
3045 get_32bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3047 Elf32_External_Phdr *phdrs;
3048 Elf32_External_Phdr *external;
3049 Elf_Internal_Phdr *internal;
3052 phdrs = get_data (NULL, file, elf_header.e_phoff,
3053 elf_header.e_phentsize * elf_header.e_phnum,
3054 _("program headers"));
3058 for (i = 0, internal = program_headers, external = phdrs;
3059 i < elf_header.e_phnum;
3060 i++, internal++, external++)
3062 internal->p_type = BYTE_GET (external->p_type);
3063 internal->p_offset = BYTE_GET (external->p_offset);
3064 internal->p_vaddr = BYTE_GET (external->p_vaddr);
3065 internal->p_paddr = BYTE_GET (external->p_paddr);
3066 internal->p_filesz = BYTE_GET (external->p_filesz);
3067 internal->p_memsz = BYTE_GET (external->p_memsz);
3068 internal->p_flags = BYTE_GET (external->p_flags);
3069 internal->p_align = BYTE_GET (external->p_align);
3078 get_64bit_program_headers (FILE *file, Elf_Internal_Phdr *program_headers)
3080 Elf64_External_Phdr *phdrs;
3081 Elf64_External_Phdr *external;
3082 Elf_Internal_Phdr *internal;
3085 phdrs = get_data (NULL, file, elf_header.e_phoff,
3086 elf_header.e_phentsize * elf_header.e_phnum,
3087 _("program headers"));
3091 for (i = 0, internal = program_headers, external = phdrs;
3092 i < elf_header.e_phnum;
3093 i++, internal++, external++)
3095 internal->p_type = BYTE_GET (external->p_type);
3096 internal->p_flags = BYTE_GET (external->p_flags);
3097 internal->p_offset = BYTE_GET8 (external->p_offset);
3098 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
3099 internal->p_paddr = BYTE_GET8 (external->p_paddr);
3100 internal->p_filesz = BYTE_GET8 (external->p_filesz);
3101 internal->p_memsz = BYTE_GET8 (external->p_memsz);
3102 internal->p_align = BYTE_GET8 (external->p_align);
3110 /* Returns 1 if the program headers were read into `program_headers'. */
3113 get_program_headers (FILE *file)
3115 Elf_Internal_Phdr *phdrs;
3117 /* Check cache of prior read. */
3118 if (program_headers != NULL)
3121 phdrs = malloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3125 error (_("Out of memory\n"));
3130 ? get_32bit_program_headers (file, phdrs)
3131 : get_64bit_program_headers (file, phdrs))
3133 program_headers = phdrs;
3141 /* Returns 1 if the program headers were loaded. */
3144 process_program_headers (FILE *file)
3146 Elf_Internal_Phdr *segment;
3149 if (elf_header.e_phnum == 0)
3152 printf (_("\nThere are no program headers in this file.\n"));
3156 if (do_segments && !do_header)
3158 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3159 printf (_("Entry point "));
3160 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3161 printf (_("\nThere are %d program headers, starting at offset "),
3162 elf_header.e_phnum);
3163 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3167 if (! get_program_headers (file))
3172 if (elf_header.e_phnum > 1)
3173 printf (_("\nProgram Headers:\n"));
3175 printf (_("\nProgram Headers:\n"));
3179 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3182 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3186 (_(" Type Offset VirtAddr PhysAddr\n"));
3188 (_(" FileSiz MemSiz Flags Align\n"));
3195 for (i = 0, segment = program_headers;
3196 i < elf_header.e_phnum;
3201 printf (" %-14.14s ", get_segment_type (segment->p_type));
3205 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3206 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3207 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3208 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3209 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3211 (segment->p_flags & PF_R ? 'R' : ' '),
3212 (segment->p_flags & PF_W ? 'W' : ' '),
3213 (segment->p_flags & PF_X ? 'E' : ' '));
3214 printf ("%#lx", (unsigned long) segment->p_align);
3218 if ((unsigned long) segment->p_offset == segment->p_offset)
3219 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3222 print_vma (segment->p_offset, FULL_HEX);
3226 print_vma (segment->p_vaddr, FULL_HEX);
3228 print_vma (segment->p_paddr, FULL_HEX);
3231 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3232 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3235 print_vma (segment->p_filesz, FULL_HEX);
3239 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3240 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3243 print_vma (segment->p_offset, FULL_HEX);
3247 (segment->p_flags & PF_R ? 'R' : ' '),
3248 (segment->p_flags & PF_W ? 'W' : ' '),
3249 (segment->p_flags & PF_X ? 'E' : ' '));
3251 if ((unsigned long) segment->p_align == segment->p_align)
3252 printf ("%#lx", (unsigned long) segment->p_align);
3255 print_vma (segment->p_align, PREFIX_HEX);
3260 print_vma (segment->p_offset, FULL_HEX);
3262 print_vma (segment->p_vaddr, FULL_HEX);
3264 print_vma (segment->p_paddr, FULL_HEX);
3266 print_vma (segment->p_filesz, FULL_HEX);
3268 print_vma (segment->p_memsz, FULL_HEX);
3270 (segment->p_flags & PF_R ? 'R' : ' '),
3271 (segment->p_flags & PF_W ? 'W' : ' '),
3272 (segment->p_flags & PF_X ? 'E' : ' '));
3273 print_vma (segment->p_align, HEX);
3277 switch (segment->p_type)
3281 error (_("more than one dynamic segment\n"));
3283 /* Try to locate the .dynamic section. If there is
3284 a section header table, we can easily locate it. */
3285 if (section_headers != NULL)
3287 Elf_Internal_Shdr *sec;
3290 for (j = 0, sec = section_headers;
3291 j < elf_header.e_shnum;
3293 if (streq (SECTION_NAME (sec), ".dynamic"))
3296 if (j == elf_header.e_shnum || sec->sh_size == 0)
3298 error (_("no .dynamic section in the dynamic segment"));
3302 dynamic_addr = sec->sh_offset;
3303 dynamic_size = sec->sh_size;
3305 if (dynamic_addr < segment->p_offset
3306 || dynamic_addr > segment->p_offset + segment->p_filesz)
3307 warn (_("the .dynamic section is not contained within the dynamic segment"));
3308 else if (dynamic_addr > segment->p_offset)
3309 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3313 /* Otherwise, we can only assume that the .dynamic
3314 section is the first section in the DYNAMIC segment. */
3315 dynamic_addr = segment->p_offset;
3316 dynamic_size = segment->p_filesz;
3321 if (fseek (file, archive_file_offset + (long) segment->p_offset,
3323 error (_("Unable to find program interpreter name\n"));
3326 program_interpreter[0] = 0;
3327 fscanf (file, "%63s", program_interpreter);
3330 printf (_("\n [Requesting program interpreter: %s]"),
3331 program_interpreter);
3337 putc ('\n', stdout);
3340 if (do_segments && section_headers != NULL)
3342 printf (_("\n Section to Segment mapping:\n"));
3343 printf (_(" Segment Sections...\n"));
3345 assert (string_table != NULL);
3347 for (i = 0; i < elf_header.e_phnum; i++)
3350 Elf_Internal_Shdr *section;
3352 segment = program_headers + i;
3353 section = section_headers;
3355 printf (" %2.2d ", i);
3357 for (j = 1; j < elf_header.e_shnum; j++, section++)
3359 if (section->sh_size > 0
3360 /* Compare allocated sections by VMA, unallocated
3361 sections by file offset. */
3362 && (section->sh_flags & SHF_ALLOC
3363 ? (section->sh_addr >= segment->p_vaddr
3364 && section->sh_addr + section->sh_size
3365 <= segment->p_vaddr + segment->p_memsz)
3366 : ((bfd_vma) section->sh_offset >= segment->p_offset
3367 && (section->sh_offset + section->sh_size
3368 <= segment->p_offset + segment->p_filesz)))
3369 /* .tbss is special. It doesn't contribute memory space
3370 to normal segments. */
3371 && (!((section->sh_flags & SHF_TLS) != 0
3372 && section->sh_type == SHT_NOBITS)
3373 || segment->p_type == PT_TLS))
3374 printf ("%s ", SECTION_NAME (section));
3385 /* Find the file offset corresponding to VMA by using the program headers. */
3388 offset_from_vma (FILE *file, bfd_vma vma, bfd_size_type size)
3390 Elf_Internal_Phdr *seg;
3392 if (! get_program_headers (file))
3394 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3398 for (seg = program_headers;
3399 seg < program_headers + elf_header.e_phnum;
3402 if (seg->p_type != PT_LOAD)
3405 if (vma >= (seg->p_vaddr & -seg->p_align)
3406 && vma + size <= seg->p_vaddr + seg->p_filesz)
3407 return vma - seg->p_vaddr + seg->p_offset;
3410 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3417 get_32bit_section_headers (FILE *file, unsigned int num)
3419 Elf32_External_Shdr *shdrs;
3420 Elf_Internal_Shdr *internal;
3423 shdrs = get_data (NULL, file, elf_header.e_shoff,
3424 elf_header.e_shentsize * num, _("section headers"));
3428 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3430 if (section_headers == NULL)
3432 error (_("Out of memory\n"));
3436 for (i = 0, internal = section_headers;
3440 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3441 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3442 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3443 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3444 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3445 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3446 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3447 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3448 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3449 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3458 get_64bit_section_headers (FILE *file, unsigned int num)
3460 Elf64_External_Shdr *shdrs;
3461 Elf_Internal_Shdr *internal;
3464 shdrs = get_data (NULL, file, elf_header.e_shoff,
3465 elf_header.e_shentsize * num, _("section headers"));
3469 section_headers = malloc (num * sizeof (Elf_Internal_Shdr));
3471 if (section_headers == NULL)
3473 error (_("Out of memory\n"));
3477 for (i = 0, internal = section_headers;
3481 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3482 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3483 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3484 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3485 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3486 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3487 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3488 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3489 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3490 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3498 static Elf_Internal_Sym *
3499 get_32bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3501 unsigned long number;
3502 Elf32_External_Sym *esyms;
3503 Elf_External_Sym_Shndx *shndx;
3504 Elf_Internal_Sym *isyms;
3505 Elf_Internal_Sym *psym;
3508 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3514 if (symtab_shndx_hdr != NULL
3515 && (symtab_shndx_hdr->sh_link
3516 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3518 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3519 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3527 number = section->sh_size / section->sh_entsize;
3528 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3532 error (_("Out of memory\n"));
3539 for (j = 0, psym = isyms;
3543 psym->st_name = BYTE_GET (esyms[j].st_name);
3544 psym->st_value = BYTE_GET (esyms[j].st_value);
3545 psym->st_size = BYTE_GET (esyms[j].st_size);
3546 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3547 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3549 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3550 psym->st_info = BYTE_GET (esyms[j].st_info);
3551 psym->st_other = BYTE_GET (esyms[j].st_other);
3561 static Elf_Internal_Sym *
3562 get_64bit_elf_symbols (FILE *file, Elf_Internal_Shdr *section)
3564 unsigned long number;
3565 Elf64_External_Sym *esyms;
3566 Elf_External_Sym_Shndx *shndx;
3567 Elf_Internal_Sym *isyms;
3568 Elf_Internal_Sym *psym;
3571 esyms = get_data (NULL, file, section->sh_offset, section->sh_size,
3577 if (symtab_shndx_hdr != NULL
3578 && (symtab_shndx_hdr->sh_link
3579 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3581 shndx = get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3582 symtab_shndx_hdr->sh_size, _("symtab shndx"));
3590 number = section->sh_size / section->sh_entsize;
3591 isyms = malloc (number * sizeof (Elf_Internal_Sym));
3595 error (_("Out of memory\n"));
3602 for (j = 0, psym = isyms;
3606 psym->st_name = BYTE_GET (esyms[j].st_name);
3607 psym->st_info = BYTE_GET (esyms[j].st_info);
3608 psym->st_other = BYTE_GET (esyms[j].st_other);
3609 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3610 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3612 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3613 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3614 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3625 get_elf_section_flags (bfd_vma sh_flags)
3627 static char buff[32];
3635 flag = sh_flags & - sh_flags;
3640 case SHF_WRITE: strcat (buff, "W"); break;
3641 case SHF_ALLOC: strcat (buff, "A"); break;
3642 case SHF_EXECINSTR: strcat (buff, "X"); break;
3643 case SHF_MERGE: strcat (buff, "M"); break;
3644 case SHF_STRINGS: strcat (buff, "S"); break;
3645 case SHF_INFO_LINK: strcat (buff, "I"); break;
3646 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3647 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3648 case SHF_GROUP: strcat (buff, "G"); break;
3649 case SHF_TLS: strcat (buff, "T"); break;
3652 if (flag & SHF_MASKOS)
3655 sh_flags &= ~ SHF_MASKOS;
3657 else if (flag & SHF_MASKPROC)
3660 sh_flags &= ~ SHF_MASKPROC;
3672 process_section_headers (FILE *file)
3674 Elf_Internal_Shdr *section;
3677 section_headers = NULL;
3679 if (elf_header.e_shnum == 0)
3682 printf (_("\nThere are no sections in this file.\n"));
3687 if (do_sections && !do_header)
3688 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3689 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3693 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3696 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3699 /* Read in the string table, so that we have names to display. */
3700 section = SECTION_HEADER (elf_header.e_shstrndx);
3702 if (section->sh_size != 0)
3704 string_table = get_data (NULL, file, section->sh_offset,
3705 section->sh_size, _("string table"));
3707 if (string_table == NULL)
3710 string_table_length = section->sh_size;
3713 /* Scan the sections for the dynamic symbol table
3714 and dynamic string table and debug sections. */
3715 dynamic_symbols = NULL;
3716 dynamic_strings = NULL;
3717 dynamic_syminfo = NULL;
3718 symtab_shndx_hdr = NULL;
3720 for (i = 0, section = section_headers;
3721 i < elf_header.e_shnum;
3724 char *name = SECTION_NAME (section);
3726 if (section->sh_type == SHT_DYNSYM)
3728 if (dynamic_symbols != NULL)
3730 error (_("File contains multiple dynamic symbol tables\n"));
3734 num_dynamic_syms = section->sh_size / section->sh_entsize;
3735 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3737 else if (section->sh_type == SHT_STRTAB
3738 && streq (name, ".dynstr"))
3740 if (dynamic_strings != NULL)
3742 error (_("File contains multiple dynamic string tables\n"));
3746 dynamic_strings = get_data (NULL, file, section->sh_offset,
3747 section->sh_size, _("dynamic strings"));
3748 dynamic_strings_length = section->sh_size;
3750 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3752 if (symtab_shndx_hdr != NULL)
3754 error (_("File contains multiple symtab shndx tables\n"));
3757 symtab_shndx_hdr = section;
3759 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3760 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3761 || do_debug_frames || do_debug_macinfo || do_debug_str
3762 || do_debug_loc || do_debug_ranges)
3763 && strneq (name, ".debug_", 7))
3768 || (do_debug_info && streq (name, "info"))
3769 || (do_debug_abbrevs && streq (name, "abbrev"))
3770 || (do_debug_lines && streq (name, "line"))
3771 || (do_debug_pubnames && streq (name, "pubnames"))
3772 || (do_debug_aranges && streq (name, "aranges"))
3773 || (do_debug_ranges && streq (name, "ranges"))
3774 || (do_debug_frames && streq (name, "frame"))
3775 || (do_debug_macinfo && streq (name, "macinfo"))
3776 || (do_debug_str && streq (name, "str"))
3777 || (do_debug_loc && streq (name, "loc"))
3779 request_dump (i, DEBUG_DUMP);
3781 /* linkonce section to be combined with .debug_info at link time. */
3782 else if ((do_debugging || do_debug_info)
3783 && strneq (name, ".gnu.linkonce.wi.", 17))
3784 request_dump (i, DEBUG_DUMP);
3785 else if (do_debug_frames && streq (name, ".eh_frame"))
3786 request_dump (i, DEBUG_DUMP);
3792 if (elf_header.e_shnum > 1)
3793 printf (_("\nSection Headers:\n"));
3795 printf (_("\nSection Header:\n"));
3799 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3802 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3805 printf (_(" [Nr] Name Type Address Offset\n"));
3806 printf (_(" Size EntSize Flags Link Info Align\n"));
3809 for (i = 0, section = section_headers;
3810 i < elf_header.e_shnum;
3813 printf (" [%2u] %-17.17s %-15.15s ",
3814 SECTION_HEADER_NUM (i),
3815 SECTION_NAME (section),
3816 get_section_type_name (section->sh_type));
3820 print_vma (section->sh_addr, LONG_HEX);
3822 printf ( " %6.6lx %6.6lx %2.2lx",
3823 (unsigned long) section->sh_offset,
3824 (unsigned long) section->sh_size,
3825 (unsigned long) section->sh_entsize);
3827 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3829 printf ("%2ld %3lu %2ld\n",
3830 (unsigned long) section->sh_link,
3831 (unsigned long) section->sh_info,
3832 (unsigned long) section->sh_addralign);
3836 print_vma (section->sh_addr, LONG_HEX);
3838 if ((long) section->sh_offset == section->sh_offset)
3839 printf (" %6.6lx", (unsigned long) section->sh_offset);
3843 print_vma (section->sh_offset, LONG_HEX);
3846 if ((unsigned long) section->sh_size == section->sh_size)
3847 printf (" %6.6lx", (unsigned long) section->sh_size);
3851 print_vma (section->sh_size, LONG_HEX);
3854 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3855 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3859 print_vma (section->sh_entsize, LONG_HEX);
3862 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3864 printf ("%2ld %3lu ",
3865 (unsigned long) section->sh_link,
3866 (unsigned long) section->sh_info);
3868 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3869 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3872 print_vma (section->sh_addralign, DEC);
3879 print_vma (section->sh_addr, LONG_HEX);
3880 if ((long) section->sh_offset == section->sh_offset)
3881 printf (" %8.8lx", (unsigned long) section->sh_offset);
3885 print_vma (section->sh_offset, LONG_HEX);
3888 print_vma (section->sh_size, LONG_HEX);
3890 print_vma (section->sh_entsize, LONG_HEX);
3892 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3894 printf (" %2ld %3lu %ld\n",
3895 (unsigned long) section->sh_link,
3896 (unsigned long) section->sh_info,
3897 (unsigned long) section->sh_addralign);
3901 printf (_("Key to Flags:\n\
3902 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3903 I (info), L (link order), G (group), x (unknown)\n\
3904 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3910 get_group_flags (unsigned int flags)
3912 static char buff[32];
3919 sprintf (buff, _("[<unknown>: 0x%x]"), flags);
3926 process_section_groups (FILE *file)
3928 Elf_Internal_Shdr *section;
3930 struct group *group;
3932 if (elf_header.e_shnum == 0)
3934 if (do_section_groups)
3935 printf (_("\nThere are no section groups in this file.\n"));
3940 if (section_headers == NULL)
3942 error (_("Section headers are not available!\n"));
3946 section_headers_groups = calloc (elf_header.e_shnum,
3947 sizeof (struct group *));
3949 if (section_headers_groups == NULL)
3951 error (_("Out of memory\n"));
3955 /* Scan the sections for the group section. */
3956 for (i = 0, section = section_headers;
3957 i < elf_header.e_shnum;
3959 if (section->sh_type == SHT_GROUP)
3962 section_groups = calloc (group_count, sizeof (struct group));
3964 if (section_groups == NULL)
3966 error (_("Out of memory\n"));
3970 for (i = 0, section = section_headers, group = section_groups;
3971 i < elf_header.e_shnum;
3974 if (section->sh_type == SHT_GROUP)
3976 char *name = SECTION_NAME (section);
3977 char *group_name, *strtab, *start, *indices;
3978 unsigned int entry, j, size;
3979 Elf_Internal_Sym *sym;
3980 Elf_Internal_Shdr *symtab_sec, *strtab_sec, *sec;
3981 Elf_Internal_Sym *symtab;
3983 /* Get the symbol table. */
3984 symtab_sec = SECTION_HEADER (section->sh_link);
3985 if (symtab_sec->sh_type != SHT_SYMTAB)
3987 error (_("Bad sh_link in group section `%s'\n"), name);
3990 symtab = GET_ELF_SYMBOLS (file, symtab_sec);
3992 sym = symtab + section->sh_info;
3994 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3996 bfd_vma sec_index = SECTION_HEADER_INDEX (sym->st_shndx);
3999 error (_("Bad sh_info in group section `%s'\n"), name);
4003 group_name = SECTION_NAME (section_headers + sec_index);
4008 /* Get the string table. */
4009 strtab_sec = SECTION_HEADER (symtab_sec->sh_link);
4010 strtab = get_data (NULL, file, strtab_sec->sh_offset,
4011 strtab_sec->sh_size,
4014 group_name = strtab + sym->st_name;
4017 start = get_data (NULL, file, section->sh_offset,
4018 section->sh_size, _("section data"));
4021 size = (section->sh_size / section->sh_entsize) - 1;
4022 entry = byte_get (indices, 4);
4025 if (do_section_groups)
4027 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
4028 get_group_flags (entry), name, group_name, size);
4030 printf (_(" [Index] Name\n"));
4033 group->group_index = i;
4035 for (j = 0; j < size; j++)
4037 struct group_list *g;
4039 entry = byte_get (indices, 4);
4042 if (section_headers_groups [SECTION_HEADER_INDEX (entry)]
4045 error (_("section [%5u] already in group section [%5u]\n"),
4046 entry, section_headers_groups [SECTION_HEADER_INDEX (entry)]->group_index);
4050 section_headers_groups [SECTION_HEADER_INDEX (entry)]
4053 if (do_section_groups)
4055 sec = SECTION_HEADER (entry);
4056 printf (" [%5u] %s\n",
4057 entry, SECTION_NAME (sec));
4060 g = xmalloc (sizeof (struct group_list));
4061 g->section_index = entry;
4062 g->next = group->root;
4086 } dynamic_relocations [] =
4088 { "REL", DT_REL, DT_RELSZ, FALSE },
4089 { "RELA", DT_RELA, DT_RELASZ, TRUE },
4090 { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
4093 /* Process the reloc section. */
4096 process_relocs (FILE *file)
4098 unsigned long rel_size;
4099 unsigned long rel_offset;
4105 if (do_using_dynamic)
4109 int has_dynamic_reloc;
4112 has_dynamic_reloc = 0;
4114 for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
4116 is_rela = dynamic_relocations [i].rela;
4117 name = dynamic_relocations [i].name;
4118 rel_size = dynamic_info [dynamic_relocations [i].size];
4119 rel_offset = dynamic_info [dynamic_relocations [i].reloc];
4121 has_dynamic_reloc |= rel_size;
4123 if (is_rela == UNKNOWN)
4125 if (dynamic_relocations [i].reloc == DT_JMPREL)
4126 switch (dynamic_info[DT_PLTREL])
4140 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4141 name, rel_offset, rel_size);
4143 dump_relocations (file,
4144 offset_from_vma (file, rel_offset, rel_size),
4146 dynamic_symbols, num_dynamic_syms,
4147 dynamic_strings, dynamic_strings_length, is_rela);
4151 if (! has_dynamic_reloc)
4152 printf (_("\nThere are no dynamic relocations in this file.\n"));
4156 Elf_Internal_Shdr *section;
4160 for (i = 0, section = section_headers;
4161 i < elf_header.e_shnum;
4164 if ( section->sh_type != SHT_RELA
4165 && section->sh_type != SHT_REL)
4168 rel_offset = section->sh_offset;
4169 rel_size = section->sh_size;
4173 Elf_Internal_Shdr *strsec;
4176 printf (_("\nRelocation section "));
4178 if (string_table == NULL)
4179 printf ("%d", section->sh_name);
4181 printf (_("'%s'"), SECTION_NAME (section));
4183 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4184 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
4186 is_rela = section->sh_type == SHT_RELA;
4188 if (section->sh_link)
4190 Elf_Internal_Shdr *symsec;
4191 Elf_Internal_Sym *symtab;
4192 unsigned long nsyms;
4193 unsigned long strtablen;
4194 char *strtab = NULL;
4196 symsec = SECTION_HEADER (section->sh_link);
4197 nsyms = symsec->sh_size / symsec->sh_entsize;
4198 symtab = GET_ELF_SYMBOLS (file, symsec);
4203 strsec = SECTION_HEADER (symsec->sh_link);
4205 strtab = get_data (NULL, file, strsec->sh_offset,
4206 strsec->sh_size, _("string table"));
4207 strtablen = strtab == NULL ? 0 : strsec->sh_size;
4209 dump_relocations (file, rel_offset, rel_size,
4210 symtab, nsyms, strtab, strtablen, is_rela);
4216 dump_relocations (file, rel_offset, rel_size,
4217 NULL, 0, NULL, 0, is_rela);
4224 printf (_("\nThere are no relocations in this file.\n"));
4230 /* Process the unwind section. */
4232 #include "unwind-ia64.h"
4234 /* An absolute address consists of a section and an offset. If the
4235 section is NULL, the offset itself is the address, otherwise, the
4236 address equals to LOAD_ADDRESS(section) + offset. */
4240 unsigned short section;
4244 struct ia64_unw_aux_info
4246 struct ia64_unw_table_entry
4248 struct absaddr start;
4250 struct absaddr info;
4252 *table; /* Unwind table. */
4253 unsigned long table_len; /* Length of unwind table. */
4254 unsigned char *info; /* Unwind info. */
4255 unsigned long info_size; /* Size of unwind info. */
4256 bfd_vma info_addr; /* starting address of unwind info. */
4257 bfd_vma seg_base; /* Starting address of segment. */
4258 Elf_Internal_Sym *symtab; /* The symbol table. */
4259 unsigned long nsyms; /* Number of symbols. */
4260 char *strtab; /* The string table. */
4261 unsigned long strtab_size; /* Size of string table. */
4265 find_symbol_for_address (Elf_Internal_Sym *symtab,
4266 unsigned long nsyms,
4268 unsigned long strtab_size,
4269 struct absaddr addr,
4270 const char **symname,
4273 bfd_vma dist = 0x100000;
4274 Elf_Internal_Sym *sym, *best = NULL;
4277 for (i = 0, sym = symtab; i < nsyms; ++i, ++sym)
4279 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
4280 && sym->st_name != 0
4281 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
4282 && addr.offset >= sym->st_value
4283 && addr.offset - sym->st_value < dist)
4286 dist = addr.offset - sym->st_value;
4293 *symname = (best->st_name >= strtab_size
4294 ? "<corrupt>" : strtab + best->st_name);
4299 *offset = addr.offset;
4303 dump_ia64_unwind (struct ia64_unw_aux_info *aux)
4306 struct ia64_unw_table_entry *tp;
4309 addr_size = is_32bit_elf ? 4 : 8;
4311 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4315 const unsigned char *dp;
4316 const unsigned char *head;
4317 const char *procname;
4319 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4320 aux->strtab_size, tp->start, &procname, &offset);
4322 fputs ("\n<", stdout);
4326 fputs (procname, stdout);
4329 printf ("+%lx", (unsigned long) offset);
4332 fputs (">: [", stdout);
4333 print_vma (tp->start.offset, PREFIX_HEX);
4334 fputc ('-', stdout);
4335 print_vma (tp->end.offset, PREFIX_HEX);
4336 printf ("], info at +0x%lx\n",
4337 (unsigned long) (tp->info.offset - aux->seg_base));
4339 head = aux->info + (tp->info.offset - aux->info_addr);
4340 stamp = BYTE_GET8 ((unsigned char *) head);
4342 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4343 (unsigned) UNW_VER (stamp),
4344 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4345 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4346 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4347 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
4349 if (UNW_VER (stamp) != 1)
4351 printf ("\tUnknown version.\n");
4356 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4357 dp = unw_decode (dp, in_body, & in_body);
4362 slurp_ia64_unwind_table (FILE *file,
4363 struct ia64_unw_aux_info *aux,
4364 Elf_Internal_Shdr *sec)
4366 unsigned long size, addr_size, nrelas, i;
4367 Elf_Internal_Phdr *seg;
4368 struct ia64_unw_table_entry *tep;
4369 Elf_Internal_Shdr *relsec;
4370 Elf_Internal_Rela *rela, *rp;
4371 unsigned char *table, *tp;
4372 Elf_Internal_Sym *sym;
4373 const char *relname;
4375 addr_size = is_32bit_elf ? 4 : 8;
4377 /* First, find the starting address of the segment that includes
4380 if (elf_header.e_phnum)
4382 if (! get_program_headers (file))
4385 for (seg = program_headers;
4386 seg < program_headers + elf_header.e_phnum;
4389 if (seg->p_type != PT_LOAD)
4392 if (sec->sh_addr >= seg->p_vaddr
4393 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4395 aux->seg_base = seg->p_vaddr;
4401 /* Second, build the unwind table from the contents of the unwind section: */
4402 size = sec->sh_size;
4403 table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
4407 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4408 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4410 tep->start.section = SHN_UNDEF;
4411 tep->end.section = SHN_UNDEF;
4412 tep->info.section = SHN_UNDEF;
4415 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4416 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4417 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4421 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4422 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4423 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4425 tep->start.offset += aux->seg_base;
4426 tep->end.offset += aux->seg_base;
4427 tep->info.offset += aux->seg_base;
4431 /* Third, apply any relocations to the unwind table: */
4433 for (relsec = section_headers;
4434 relsec < section_headers + elf_header.e_shnum;
4437 if (relsec->sh_type != SHT_RELA
4438 || SECTION_HEADER (relsec->sh_info) != sec)
4441 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4445 for (rp = rela; rp < rela + nrelas; ++rp)
4449 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4450 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4454 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4455 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4458 if (! strneq (relname, "R_IA64_SEGREL", 13))
4460 warn (_("Skipping unexpected relocation type %s\n"), relname);
4464 i = rp->r_offset / (3 * addr_size);
4466 switch (rp->r_offset/addr_size % 3)
4469 aux->table[i].start.section = sym->st_shndx;
4470 aux->table[i].start.offset += rp->r_addend + sym->st_value;
4473 aux->table[i].end.section = sym->st_shndx;
4474 aux->table[i].end.offset += rp->r_addend + sym->st_value;
4477 aux->table[i].info.section = sym->st_shndx;
4478 aux->table[i].info.offset += rp->r_addend + sym->st_value;
4488 aux->table_len = size / (3 * addr_size);
4493 ia64_process_unwind (FILE *file)
4495 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4496 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4497 struct ia64_unw_aux_info aux;
4499 memset (& aux, 0, sizeof (aux));
4501 addr_size = is_32bit_elf ? 4 : 8;
4503 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4505 if (sec->sh_type == SHT_SYMTAB)
4507 aux.nsyms = sec->sh_size / sec->sh_entsize;
4508 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4510 strsec = SECTION_HEADER (sec->sh_link);
4511 aux.strtab_size = strsec->sh_size;
4512 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4513 aux.strtab_size, _("string table"));
4515 else if (sec->sh_type == SHT_IA_64_UNWIND)
4520 printf (_("\nThere are no unwind sections in this file.\n"));
4522 while (unwcount-- > 0)
4527 for (i = unwstart, sec = section_headers + unwstart;
4528 i < elf_header.e_shnum; ++i, ++sec)
4529 if (sec->sh_type == SHT_IA_64_UNWIND)
4536 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4538 if ((unwsec->sh_flags & SHF_GROUP) != 0)
4540 /* We need to find which section group it is in. */
4541 struct group_list *g = section_headers_groups [i]->root;
4543 for (; g != NULL; g = g->next)
4545 sec = SECTION_HEADER (g->section_index);
4547 if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
4552 i = elf_header.e_shnum;
4554 else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
4556 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4557 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4558 suffix = SECTION_NAME (unwsec) + len;
4559 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4561 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
4562 && streq (SECTION_NAME (sec) + len2, suffix))
4567 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4568 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4569 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4570 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4572 if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
4573 suffix = SECTION_NAME (unwsec) + len;
4574 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4576 if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
4577 && streq (SECTION_NAME (sec) + len2, suffix))
4581 if (i == elf_header.e_shnum)
4583 printf (_("\nCould not find unwind info section for "));
4585 if (string_table == NULL)
4586 printf ("%d", unwsec->sh_name);
4588 printf (_("'%s'"), SECTION_NAME (unwsec));
4592 aux.info_size = sec->sh_size;
4593 aux.info_addr = sec->sh_addr;
4594 aux.info = get_data (NULL, file, sec->sh_offset, aux.info_size,
4597 printf (_("\nUnwind section "));
4599 if (string_table == NULL)
4600 printf ("%d", unwsec->sh_name);
4602 printf (_("'%s'"), SECTION_NAME (unwsec));
4604 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4605 (unsigned long) unwsec->sh_offset,
4606 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4608 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4610 if (aux.table_len > 0)
4611 dump_ia64_unwind (& aux);
4614 free ((char *) aux.table);
4616 free ((char *) aux.info);
4625 free ((char *) aux.strtab);
4630 struct hppa_unw_aux_info
4632 struct hppa_unw_table_entry
4634 struct absaddr start;
4636 unsigned int Cannot_unwind:1; /* 0 */
4637 unsigned int Millicode:1; /* 1 */
4638 unsigned int Millicode_save_sr0:1; /* 2 */
4639 unsigned int Region_description:2; /* 3..4 */
4640 unsigned int reserved1:1; /* 5 */
4641 unsigned int Entry_SR:1; /* 6 */
4642 unsigned int Entry_FR:4; /* number saved */ /* 7..10 */
4643 unsigned int Entry_GR:5; /* number saved */ /* 11..15 */
4644 unsigned int Args_stored:1; /* 16 */
4645 unsigned int Variable_Frame:1; /* 17 */
4646 unsigned int Separate_Package_Body:1; /* 18 */
4647 unsigned int Frame_Extension_Millicode:1; /* 19 */
4648 unsigned int Stack_Overflow_Check:1; /* 20 */
4649 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
4650 unsigned int Ada_Region:1; /* 22 */
4651 unsigned int cxx_info:1; /* 23 */
4652 unsigned int cxx_try_catch:1; /* 24 */
4653 unsigned int sched_entry_seq:1; /* 25 */
4654 unsigned int reserved2:1; /* 26 */
4655 unsigned int Save_SP:1; /* 27 */
4656 unsigned int Save_RP:1; /* 28 */
4657 unsigned int Save_MRP_in_frame:1; /* 29 */
4658 unsigned int extn_ptr_defined:1; /* 30 */
4659 unsigned int Cleanup_defined:1; /* 31 */
4661 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
4662 unsigned int HP_UX_interrupt_marker:1; /* 1 */
4663 unsigned int Large_frame:1; /* 2 */
4664 unsigned int Pseudo_SP_Set:1; /* 3 */
4665 unsigned int reserved4:1; /* 4 */
4666 unsigned int Total_frame_size:27; /* 5..31 */
4668 *table; /* Unwind table. */
4669 unsigned long table_len; /* Length of unwind table. */
4670 bfd_vma seg_base; /* Starting address of segment. */
4671 Elf_Internal_Sym *symtab; /* The symbol table. */
4672 unsigned long nsyms; /* Number of symbols. */
4673 char *strtab; /* The string table. */
4674 unsigned long strtab_size; /* Size of string table. */
4678 dump_hppa_unwind (struct hppa_unw_aux_info *aux)
4681 struct hppa_unw_table_entry *tp;
4683 addr_size = is_32bit_elf ? 4 : 8;
4684 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
4687 const char *procname;
4689 find_symbol_for_address (aux->symtab, aux->nsyms, aux->strtab,
4690 aux->strtab_size, tp->start, &procname,
4693 fputs ("\n<", stdout);
4697 fputs (procname, stdout);
4700 printf ("+%lx", (unsigned long) offset);
4703 fputs (">: [", stdout);
4704 print_vma (tp->start.offset, PREFIX_HEX);
4705 fputc ('-', stdout);
4706 print_vma (tp->end.offset, PREFIX_HEX);
4709 #define PF(_m) if (tp->_m) printf (#_m " ");
4710 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
4713 PF(Millicode_save_sr0);
4714 /* PV(Region_description); */
4720 PF(Separate_Package_Body);
4721 PF(Frame_Extension_Millicode);
4722 PF(Stack_Overflow_Check);
4723 PF(Two_Instruction_SP_Increment);
4727 PF(sched_entry_seq);
4730 PF(Save_MRP_in_frame);
4731 PF(extn_ptr_defined);
4732 PF(Cleanup_defined);
4733 PF(MPE_XL_interrupt_marker);
4734 PF(HP_UX_interrupt_marker);
4737 PV(Total_frame_size);
4746 slurp_hppa_unwind_table (FILE *file,
4747 struct hppa_unw_aux_info *aux,
4748 Elf_Internal_Shdr *sec)
4750 unsigned long size, unw_ent_size, addr_size, nrelas, i;
4751 Elf_Internal_Phdr *seg;
4752 struct hppa_unw_table_entry *tep;
4753 Elf_Internal_Shdr *relsec;
4754 Elf_Internal_Rela *rela, *rp;
4755 unsigned char *table, *tp;
4756 Elf_Internal_Sym *sym;
4757 const char *relname;
4759 addr_size = is_32bit_elf ? 4 : 8;
4761 /* First, find the starting address of the segment that includes
4764 if (elf_header.e_phnum)
4766 if (! get_program_headers (file))
4769 for (seg = program_headers;
4770 seg < program_headers + elf_header.e_phnum;
4773 if (seg->p_type != PT_LOAD)
4776 if (sec->sh_addr >= seg->p_vaddr
4777 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4779 aux->seg_base = seg->p_vaddr;
4785 /* Second, build the unwind table from the contents of the unwind
4787 size = sec->sh_size;
4788 table = get_data (NULL, file, sec->sh_offset, size, _("unwind table"));
4792 unw_ent_size = 2 * addr_size + 8;
4794 tep = aux->table = xmalloc (size / unw_ent_size * sizeof (aux->table[0]));
4796 for (tp = table; tp < table + size; tp += (2 * addr_size + 8), ++tep)
4798 unsigned int tmp1, tmp2;
4800 tep->start.section = SHN_UNDEF;
4801 tep->end.section = SHN_UNDEF;
4805 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4806 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4807 tmp1 = byte_get ((unsigned char *) tp + 8, 4);
4808 tmp2 = byte_get ((unsigned char *) tp + 12, 4);
4812 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4813 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4814 tmp1 = byte_get ((unsigned char *) tp + 16, 4);
4815 tmp2 = byte_get ((unsigned char *) tp + 20, 4);
4818 tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
4819 tep->Millicode = (tmp1 >> 30) & 0x1;
4820 tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
4821 tep->Region_description = (tmp1 >> 27) & 0x3;
4822 tep->reserved1 = (tmp1 >> 26) & 0x1;
4823 tep->Entry_SR = (tmp1 >> 25) & 0x1;
4824 tep->Entry_FR = (tmp1 >> 21) & 0xf;
4825 tep->Entry_GR = (tmp1 >> 16) & 0x1f;
4826 tep->Args_stored = (tmp1 >> 15) & 0x1;
4827 tep->Variable_Frame = (tmp1 >> 14) & 0x1;
4828 tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
4829 tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
4830 tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
4831 tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
4832 tep->Ada_Region = (tmp1 >> 9) & 0x1;
4833 tep->cxx_info = (tmp1 >> 8) & 0x1;
4834 tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
4835 tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
4836 tep->reserved2 = (tmp1 >> 5) & 0x1;
4837 tep->Save_SP = (tmp1 >> 4) & 0x1;
4838 tep->Save_RP = (tmp1 >> 3) & 0x1;
4839 tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
4840 tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
4841 tep->Cleanup_defined = tmp1 & 0x1;
4843 tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
4844 tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
4845 tep->Large_frame = (tmp2 >> 29) & 0x1;
4846 tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
4847 tep->reserved4 = (tmp2 >> 27) & 0x1;
4848 tep->Total_frame_size = tmp2 & 0x7ffffff;
4850 tep->start.offset += aux->seg_base;
4851 tep->end.offset += aux->seg_base;
4855 /* Third, apply any relocations to the unwind table. */
4857 for (relsec = section_headers;
4858 relsec < section_headers + elf_header.e_shnum;
4861 if (relsec->sh_type != SHT_RELA
4862 || SECTION_HEADER (relsec->sh_info) != sec)
4865 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4869 for (rp = rela; rp < rela + nrelas; ++rp)
4873 relname = elf_hppa_reloc_type (ELF32_R_TYPE (rp->r_info));
4874 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4878 relname = elf_hppa_reloc_type (ELF64_R_TYPE (rp->r_info));
4879 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4882 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
4883 if (strncmp (relname, "R_PARISC_SEGREL", 15) != 0)
4885 warn (_("Skipping unexpected relocation type %s\n"), relname);
4889 i = rp->r_offset / unw_ent_size;
4891 switch ((rp->r_offset % unw_ent_size) / addr_size)
4894 aux->table[i].start.section = sym->st_shndx;
4895 aux->table[i].start.offset += sym->st_value + rp->r_addend;
4898 aux->table[i].end.section = sym->st_shndx;
4899 aux->table[i].end.offset += sym->st_value + rp->r_addend;
4909 aux->table_len = size / unw_ent_size;
4915 hppa_process_unwind (FILE *file)
4917 struct hppa_unw_aux_info aux;
4918 Elf_Internal_Shdr *unwsec = NULL;
4919 Elf_Internal_Shdr *strsec;
4920 Elf_Internal_Shdr *sec;
4921 unsigned long addr_size;
4924 memset (& aux, 0, sizeof (aux));
4926 assert (string_table != NULL);
4927 addr_size = is_32bit_elf ? 4 : 8;
4929 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4931 if (sec->sh_type == SHT_SYMTAB)
4933 aux.nsyms = sec->sh_size / sec->sh_entsize;
4934 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4936 strsec = SECTION_HEADER (sec->sh_link);
4937 aux.strtab_size = strsec->sh_size;
4938 aux.strtab = get_data (NULL, file, strsec->sh_offset,
4939 aux.strtab_size, _("string table"));
4941 else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
4946 printf (_("\nThere are no unwind sections in this file.\n"));
4948 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4950 if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
4952 printf (_("\nUnwind section "));
4953 printf (_("'%s'"), SECTION_NAME (sec));
4955 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4956 (unsigned long) sec->sh_offset,
4957 (unsigned long) (sec->sh_size / (2 * addr_size + 8)));
4959 slurp_hppa_unwind_table (file, &aux, sec);
4960 if (aux.table_len > 0)
4961 dump_hppa_unwind (&aux);
4964 free ((char *) aux.table);
4972 free ((char *) aux.strtab);
4978 process_unwind (FILE *file)
4980 struct unwind_handler {
4982 int (*handler)(FILE *file);
4984 { EM_IA_64, ia64_process_unwind },
4985 { EM_PARISC, hppa_process_unwind },
4993 for (i = 0; handlers[i].handler != NULL; i++)
4994 if (elf_header.e_machine == handlers[i].machtype)
4995 return handlers[i].handler (file);
4997 printf (_("\nThere are no unwind sections in this file.\n"));
5002 dynamic_section_mips_val (Elf_Internal_Dyn *entry)
5004 switch (entry->d_tag)
5007 if (entry->d_un.d_val == 0)
5011 static const char * opts[] =
5013 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5014 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5015 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5016 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5021 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
5022 if (entry->d_un.d_val & (1 << cnt))
5024 printf ("%s%s", first ? "" : " ", opts[cnt]);
5031 case DT_MIPS_IVERSION:
5032 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5033 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5035 printf ("<corrupt: %ld>\n", (long) entry->d_un.d_ptr);
5038 case DT_MIPS_TIME_STAMP:
5043 time_t time = entry->d_un.d_val;
5044 tmp = gmtime (&time);
5045 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
5046 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5047 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5048 printf ("Time Stamp: %s\n", timebuf);
5052 case DT_MIPS_RLD_VERSION:
5053 case DT_MIPS_LOCAL_GOTNO:
5054 case DT_MIPS_CONFLICTNO:
5055 case DT_MIPS_LIBLISTNO:
5056 case DT_MIPS_SYMTABNO:
5057 case DT_MIPS_UNREFEXTNO:
5058 case DT_MIPS_HIPAGENO:
5059 case DT_MIPS_DELTA_CLASS_NO:
5060 case DT_MIPS_DELTA_INSTANCE_NO:
5061 case DT_MIPS_DELTA_RELOC_NO:
5062 case DT_MIPS_DELTA_SYM_NO:
5063 case DT_MIPS_DELTA_CLASSSYM_NO:
5064 case DT_MIPS_COMPACT_SIZE:
5065 printf ("%ld\n", (long) entry->d_un.d_ptr);
5069 printf ("%#lx\n", (long) entry->d_un.d_ptr);
5075 dynamic_section_parisc_val (Elf_Internal_Dyn *entry)
5077 switch (entry->d_tag)
5079 case DT_HP_DLD_FLAGS:
5088 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
5089 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
5090 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
5091 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
5092 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
5093 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
5094 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
5095 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
5096 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
5097 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
5098 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
5102 bfd_vma val = entry->d_un.d_val;
5104 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
5105 if (val & flags[cnt].bit)
5109 fputs (flags[cnt].str, stdout);
5111 val ^= flags[cnt].bit;
5114 if (val != 0 || first)
5118 print_vma (val, HEX);
5124 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5131 dynamic_section_ia64_val (Elf_Internal_Dyn *entry)
5133 switch (entry->d_tag)
5135 case DT_IA_64_PLT_RESERVE:
5136 /* First 3 slots reserved. */
5137 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5139 print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
5143 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
5150 get_32bit_dynamic_section (FILE *file)
5152 Elf32_External_Dyn *edyn, *ext;
5153 Elf_Internal_Dyn *entry;
5155 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
5156 _("dynamic section"));
5160 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5161 might not have the luxury of section headers. Look for the DT_NULL
5162 terminator to determine the number of entries. */
5163 for (ext = edyn, dynamic_nent = 0;
5164 (char *) ext < (char *) edyn + dynamic_size;
5168 if (BYTE_GET (ext->d_tag) == DT_NULL)
5172 dynamic_section = malloc (dynamic_nent * sizeof (*entry));
5173 if (dynamic_section == NULL)
5175 error (_("Out of memory\n"));
5180 for (ext = edyn, entry = dynamic_section;
5181 entry < dynamic_section + dynamic_nent;
5184 entry->d_tag = BYTE_GET (ext->d_tag);
5185 entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
5194 get_64bit_dynamic_section (FILE *file)
5196 Elf64_External_Dyn *edyn, *ext;
5197 Elf_Internal_Dyn *entry;
5199 edyn = get_data (NULL, file, dynamic_addr, dynamic_size,
5200 _("dynamic section"));
5204 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5205 might not have the luxury of section headers. Look for the DT_NULL
5206 terminator to determine the number of entries. */
5207 for (ext = edyn, dynamic_nent = 0;
5208 (char *) ext < (char *) edyn + dynamic_size;
5212 if (BYTE_GET8 (ext->d_tag) == DT_NULL)
5216 dynamic_section = malloc (dynamic_nent * sizeof (*entry));
5217 if (dynamic_section == NULL)
5219 error (_("Out of memory\n"));
5224 for (ext = edyn, entry = dynamic_section;
5225 entry < dynamic_section + dynamic_nent;
5228 entry->d_tag = BYTE_GET8 (ext->d_tag);
5229 entry->d_un.d_val = BYTE_GET8 (ext->d_un.d_val);
5238 get_dynamic_flags (bfd_vma flags)
5240 static char buff[128];
5248 flag = flags & - flags;
5256 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
5257 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
5258 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
5259 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
5260 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
5261 default: strcpy (p, "unknown"); break;
5264 p = strchr (p, '\0');
5269 /* Parse and display the contents of the dynamic section. */
5272 process_dynamic_section (FILE *file)
5274 Elf_Internal_Dyn *entry;
5276 if (dynamic_size == 0)
5279 printf (_("\nThere is no dynamic section in this file.\n"));
5286 if (! get_32bit_dynamic_section (file))
5289 else if (! get_64bit_dynamic_section (file))
5292 /* Find the appropriate symbol table. */
5293 if (dynamic_symbols == NULL)
5295 for (entry = dynamic_section;
5296 entry < dynamic_section + dynamic_nent;
5299 Elf_Internal_Shdr section;
5301 if (entry->d_tag != DT_SYMTAB)
5304 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
5306 /* Since we do not know how big the symbol table is,
5307 we default to reading in the entire file (!) and
5308 processing that. This is overkill, I know, but it
5310 section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
5312 if (archive_file_offset != 0)
5313 section.sh_size = archive_file_size - section.sh_offset;
5316 if (fseek (file, 0, SEEK_END))
5317 error (_("Unable to seek to end of file!"));
5319 section.sh_size = ftell (file) - section.sh_offset;
5323 section.sh_entsize = sizeof (Elf32_External_Sym);
5325 section.sh_entsize = sizeof (Elf64_External_Sym);
5327 num_dynamic_syms = section.sh_size / section.sh_entsize;
5328 if (num_dynamic_syms < 1)
5330 error (_("Unable to determine the number of symbols to load\n"));
5334 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
5338 /* Similarly find a string table. */
5339 if (dynamic_strings == NULL)
5341 for (entry = dynamic_section;
5342 entry < dynamic_section + dynamic_nent;
5345 unsigned long offset;
5348 if (entry->d_tag != DT_STRTAB)
5351 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
5353 /* Since we do not know how big the string table is,
5354 we default to reading in the entire file (!) and
5355 processing that. This is overkill, I know, but it
5358 offset = offset_from_vma (file, entry->d_un.d_val, 0);
5360 if (archive_file_offset != 0)
5361 str_tab_len = archive_file_size - offset;
5364 if (fseek (file, 0, SEEK_END))
5365 error (_("Unable to seek to end of file\n"));
5366 str_tab_len = ftell (file) - offset;
5369 if (str_tab_len < 1)
5372 (_("Unable to determine the length of the dynamic string table\n"));
5376 dynamic_strings = get_data (NULL, file, offset, str_tab_len,
5377 _("dynamic string table"));
5378 dynamic_strings_length = str_tab_len;
5383 /* And find the syminfo section if available. */
5384 if (dynamic_syminfo == NULL)
5386 unsigned long syminsz = 0;
5388 for (entry = dynamic_section;
5389 entry < dynamic_section + dynamic_nent;
5392 if (entry->d_tag == DT_SYMINENT)
5394 /* Note: these braces are necessary to avoid a syntax
5395 error from the SunOS4 C compiler. */
5396 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
5398 else if (entry->d_tag == DT_SYMINSZ)
5399 syminsz = entry->d_un.d_val;
5400 else if (entry->d_tag == DT_SYMINFO)
5401 dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
5405 if (dynamic_syminfo_offset != 0 && syminsz != 0)
5407 Elf_External_Syminfo *extsyminfo, *extsym;
5408 Elf_Internal_Syminfo *syminfo;
5410 /* There is a syminfo section. Read the data. */
5411 extsyminfo = get_data (NULL, file, dynamic_syminfo_offset, syminsz,
5412 _("symbol information"));
5416 dynamic_syminfo = malloc (syminsz);
5417 if (dynamic_syminfo == NULL)
5419 error (_("Out of memory\n"));
5423 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
5424 for (syminfo = dynamic_syminfo, extsym = extsyminfo;
5425 syminfo < dynamic_syminfo + dynamic_syminfo_nent;
5426 ++syminfo, ++extsym)
5428 syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
5429 syminfo->si_flags = BYTE_GET (extsym->si_flags);
5436 if (do_dynamic && dynamic_addr)
5437 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5438 dynamic_addr, dynamic_nent);
5440 printf (_(" Tag Type Name/Value\n"));
5442 for (entry = dynamic_section;
5443 entry < dynamic_section + dynamic_nent;
5451 print_vma (entry->d_tag, FULL_HEX);
5452 dtype = get_dynamic_type (entry->d_tag);
5453 printf (" (%s)%*s", dtype,
5454 ((is_32bit_elf ? 27 : 19)
5455 - (int) strlen (dtype)),
5459 switch (entry->d_tag)
5463 puts (get_dynamic_flags (entry->d_un.d_val));
5473 switch (entry->d_tag)
5476 printf (_("Auxiliary library"));
5480 printf (_("Filter library"));
5484 printf (_("Configuration file"));
5488 printf (_("Dependency audit library"));
5492 printf (_("Audit library"));
5496 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5497 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
5501 print_vma (entry->d_un.d_val, PREFIX_HEX);
5510 printf (_("Flags:"));
5512 if (entry->d_un.d_val == 0)
5513 printf (_(" None\n"));
5516 unsigned long int val = entry->d_un.d_val;
5518 if (val & DTF_1_PARINIT)
5520 printf (" PARINIT");
5521 val ^= DTF_1_PARINIT;
5523 if (val & DTF_1_CONFEXP)
5525 printf (" CONFEXP");
5526 val ^= DTF_1_CONFEXP;
5529 printf (" %lx", val);
5538 printf (_("Flags:"));
5540 if (entry->d_un.d_val == 0)
5541 printf (_(" None\n"));
5544 unsigned long int val = entry->d_un.d_val;
5546 if (val & DF_P1_LAZYLOAD)
5548 printf (" LAZYLOAD");
5549 val ^= DF_P1_LAZYLOAD;
5551 if (val & DF_P1_GROUPPERM)
5553 printf (" GROUPPERM");
5554 val ^= DF_P1_GROUPPERM;
5557 printf (" %lx", val);
5566 printf (_("Flags:"));
5567 if (entry->d_un.d_val == 0)
5568 printf (_(" None\n"));
5571 unsigned long int val = entry->d_un.d_val;
5578 if (val & DF_1_GLOBAL)
5583 if (val & DF_1_GROUP)
5588 if (val & DF_1_NODELETE)
5590 printf (" NODELETE");
5591 val ^= DF_1_NODELETE;
5593 if (val & DF_1_LOADFLTR)
5595 printf (" LOADFLTR");
5596 val ^= DF_1_LOADFLTR;
5598 if (val & DF_1_INITFIRST)
5600 printf (" INITFIRST");
5601 val ^= DF_1_INITFIRST;
5603 if (val & DF_1_NOOPEN)
5608 if (val & DF_1_ORIGIN)
5613 if (val & DF_1_DIRECT)
5618 if (val & DF_1_TRANS)
5623 if (val & DF_1_INTERPOSE)
5625 printf (" INTERPOSE");
5626 val ^= DF_1_INTERPOSE;
5628 if (val & DF_1_NODEFLIB)
5630 printf (" NODEFLIB");
5631 val ^= DF_1_NODEFLIB;
5633 if (val & DF_1_NODUMP)
5638 if (val & DF_1_CONLFAT)
5640 printf (" CONLFAT");
5641 val ^= DF_1_CONLFAT;
5644 printf (" %lx", val);
5651 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5653 puts (get_dynamic_type (entry->d_un.d_val));
5673 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5679 if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
5680 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
5686 switch (entry->d_tag)
5689 printf (_("Shared library: [%s]"), name);
5691 if (streq (name, program_interpreter))
5692 printf (_(" program interpreter"));
5696 printf (_("Library soname: [%s]"), name);
5700 printf (_("Library rpath: [%s]"), name);
5704 printf (_("Library runpath: [%s]"), name);
5708 print_vma (entry->d_un.d_val, PREFIX_HEX);
5713 print_vma (entry->d_un.d_val, PREFIX_HEX);
5726 dynamic_info[entry->d_tag] = entry->d_un.d_val;
5730 case DT_INIT_ARRAYSZ:
5731 case DT_FINI_ARRAYSZ:
5732 case DT_GNU_CONFLICTSZ:
5733 case DT_GNU_LIBLISTSZ:
5736 print_vma (entry->d_un.d_val, UNSIGNED);
5737 printf (" (bytes)\n");
5747 print_vma (entry->d_un.d_val, UNSIGNED);
5760 if (entry->d_tag == DT_USED
5761 && VALID_DYNAMIC_NAME (entry->d_un.d_val))
5763 char *name = GET_DYNAMIC_NAME (entry->d_un.d_val);
5767 printf (_("Not needed object: [%s]\n"), name);
5772 print_vma (entry->d_un.d_val, PREFIX_HEX);
5778 /* The value of this entry is ignored. */
5783 case DT_GNU_PRELINKED:
5787 time_t time = entry->d_un.d_val;
5789 tmp = gmtime (&time);
5790 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5791 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5792 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5798 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5799 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5804 switch (elf_header.e_machine)
5807 case EM_MIPS_RS3_LE:
5808 dynamic_section_mips_val (entry);
5811 dynamic_section_parisc_val (entry);
5814 dynamic_section_ia64_val (entry);
5817 print_vma (entry->d_un.d_val, PREFIX_HEX);
5829 get_ver_flags (unsigned int flags)
5831 static char buff[32];
5838 if (flags & VER_FLG_BASE)
5839 strcat (buff, "BASE ");
5841 if (flags & VER_FLG_WEAK)
5843 if (flags & VER_FLG_BASE)
5844 strcat (buff, "| ");
5846 strcat (buff, "WEAK ");
5849 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5850 strcat (buff, "| <unknown>");
5855 /* Display the contents of the version sections. */
5857 process_version_sections (FILE *file)
5859 Elf_Internal_Shdr *section;
5866 for (i = 0, section = section_headers;
5867 i < elf_header.e_shnum;
5870 switch (section->sh_type)
5872 case SHT_GNU_verdef:
5874 Elf_External_Verdef *edefs;
5881 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5882 SECTION_NAME (section), section->sh_info);
5884 printf (_(" Addr: 0x"));
5885 printf_vma (section->sh_addr);
5886 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5887 (unsigned long) section->sh_offset, section->sh_link,
5888 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5890 edefs = get_data (NULL, file, section->sh_offset, section->sh_size,
5891 _("version definition section"));
5895 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5898 Elf_External_Verdef *edef;
5899 Elf_Internal_Verdef ent;
5900 Elf_External_Verdaux *eaux;
5901 Elf_Internal_Verdaux aux;
5905 vstart = ((char *) edefs) + idx;
5907 edef = (Elf_External_Verdef *) vstart;
5909 ent.vd_version = BYTE_GET (edef->vd_version);
5910 ent.vd_flags = BYTE_GET (edef->vd_flags);
5911 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5912 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5913 ent.vd_hash = BYTE_GET (edef->vd_hash);
5914 ent.vd_aux = BYTE_GET (edef->vd_aux);
5915 ent.vd_next = BYTE_GET (edef->vd_next);
5917 printf (_(" %#06x: Rev: %d Flags: %s"),
5918 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5920 printf (_(" Index: %d Cnt: %d "),
5921 ent.vd_ndx, ent.vd_cnt);
5923 vstart += ent.vd_aux;
5925 eaux = (Elf_External_Verdaux *) vstart;
5927 aux.vda_name = BYTE_GET (eaux->vda_name);
5928 aux.vda_next = BYTE_GET (eaux->vda_next);
5930 if (VALID_DYNAMIC_NAME (aux.vda_name))
5931 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
5933 printf (_("Name index: %ld\n"), aux.vda_name);
5935 isum = idx + ent.vd_aux;
5937 for (j = 1; j < ent.vd_cnt; j++)
5939 isum += aux.vda_next;
5940 vstart += aux.vda_next;
5942 eaux = (Elf_External_Verdaux *) vstart;
5944 aux.vda_name = BYTE_GET (eaux->vda_name);
5945 aux.vda_next = BYTE_GET (eaux->vda_next);
5947 if (VALID_DYNAMIC_NAME (aux.vda_name))
5948 printf (_(" %#06x: Parent %d: %s\n"),
5949 isum, j, GET_DYNAMIC_NAME (aux.vda_name));
5951 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5952 isum, j, aux.vda_name);
5962 case SHT_GNU_verneed:
5964 Elf_External_Verneed *eneed;
5970 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5971 SECTION_NAME (section), section->sh_info);
5973 printf (_(" Addr: 0x"));
5974 printf_vma (section->sh_addr);
5975 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5976 (unsigned long) section->sh_offset, section->sh_link,
5977 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5979 eneed = get_data (NULL, file, section->sh_offset, section->sh_size,
5980 _("version need section"));
5984 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5986 Elf_External_Verneed *entry;
5987 Elf_Internal_Verneed ent;
5992 vstart = ((char *) eneed) + idx;
5994 entry = (Elf_External_Verneed *) vstart;
5996 ent.vn_version = BYTE_GET (entry->vn_version);
5997 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5998 ent.vn_file = BYTE_GET (entry->vn_file);
5999 ent.vn_aux = BYTE_GET (entry->vn_aux);
6000 ent.vn_next = BYTE_GET (entry->vn_next);
6002 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
6004 if (VALID_DYNAMIC_NAME (ent.vn_file))
6005 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
6007 printf (_(" File: %lx"), ent.vn_file);
6009 printf (_(" Cnt: %d\n"), ent.vn_cnt);
6011 vstart += ent.vn_aux;
6013 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
6015 Elf_External_Vernaux *eaux;
6016 Elf_Internal_Vernaux aux;
6018 eaux = (Elf_External_Vernaux *) vstart;
6020 aux.vna_hash = BYTE_GET (eaux->vna_hash);
6021 aux.vna_flags = BYTE_GET (eaux->vna_flags);
6022 aux.vna_other = BYTE_GET (eaux->vna_other);
6023 aux.vna_name = BYTE_GET (eaux->vna_name);
6024 aux.vna_next = BYTE_GET (eaux->vna_next);
6026 if (VALID_DYNAMIC_NAME (aux.vna_name))
6027 printf (_(" %#06x: Name: %s"),
6028 isum, GET_DYNAMIC_NAME (aux.vna_name));
6030 printf (_(" %#06x: Name index: %lx"),
6031 isum, aux.vna_name);
6033 printf (_(" Flags: %s Version: %d\n"),
6034 get_ver_flags (aux.vna_flags), aux.vna_other);
6036 isum += aux.vna_next;
6037 vstart += aux.vna_next;
6047 case SHT_GNU_versym:
6049 Elf_Internal_Shdr *link_section;
6052 unsigned char *edata;
6053 unsigned short *data;
6055 Elf_Internal_Sym *symbols;
6056 Elf_Internal_Shdr *string_sec;
6059 link_section = SECTION_HEADER (section->sh_link);
6060 total = section->sh_size / section->sh_entsize;
6064 symbols = GET_ELF_SYMBOLS (file, link_section);
6066 string_sec = SECTION_HEADER (link_section->sh_link);
6068 strtab = get_data (NULL, file, string_sec->sh_offset,
6069 string_sec->sh_size, _("version string table"));
6073 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6074 SECTION_NAME (section), total);
6076 printf (_(" Addr: "));
6077 printf_vma (section->sh_addr);
6078 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6079 (unsigned long) section->sh_offset, section->sh_link,
6080 SECTION_NAME (link_section));
6082 off = offset_from_vma (file,
6083 version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6084 total * sizeof (short));
6085 edata = get_data (NULL, file, off, total * sizeof (short),
6086 _("version symbol data"));
6093 data = malloc (total * sizeof (short));
6095 for (cnt = total; cnt --;)
6096 data[cnt] = byte_get (edata + cnt * sizeof (short),
6101 for (cnt = 0; cnt < total; cnt += 4)
6104 int check_def, check_need;
6107 printf (" %03x:", cnt);
6109 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
6110 switch (data[cnt + j])
6113 fputs (_(" 0 (*local*) "), stdout);
6117 fputs (_(" 1 (*global*) "), stdout);
6121 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
6122 data[cnt + j] & 0x8000 ? 'h' : ' ');
6126 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
6129 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
6136 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
6138 Elf_Internal_Verneed ivn;
6139 unsigned long offset;
6141 offset = offset_from_vma
6142 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6143 sizeof (Elf_External_Verneed));
6147 Elf_Internal_Vernaux ivna;
6148 Elf_External_Verneed evn;
6149 Elf_External_Vernaux evna;
6150 unsigned long a_off;
6152 get_data (&evn, file, offset, sizeof (evn),
6155 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6156 ivn.vn_next = BYTE_GET (evn.vn_next);
6158 a_off = offset + ivn.vn_aux;
6162 get_data (&evna, file, a_off, sizeof (evna),
6163 _("version need aux (2)"));
6165 ivna.vna_next = BYTE_GET (evna.vna_next);
6166 ivna.vna_other = BYTE_GET (evna.vna_other);
6168 a_off += ivna.vna_next;
6170 while (ivna.vna_other != data[cnt + j]
6171 && ivna.vna_next != 0);
6173 if (ivna.vna_other == data[cnt + j])
6175 ivna.vna_name = BYTE_GET (evna.vna_name);
6177 name = strtab + ivna.vna_name;
6178 nn += printf ("(%s%-*s",
6180 12 - (int) strlen (name),
6186 offset += ivn.vn_next;
6188 while (ivn.vn_next);
6191 if (check_def && data[cnt + j] != 0x8001
6192 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6194 Elf_Internal_Verdef ivd;
6195 Elf_External_Verdef evd;
6196 unsigned long offset;
6198 offset = offset_from_vma
6199 (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6204 get_data (&evd, file, offset, sizeof (evd),
6207 ivd.vd_next = BYTE_GET (evd.vd_next);
6208 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6210 offset += ivd.vd_next;
6212 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
6213 && ivd.vd_next != 0);
6215 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
6217 Elf_External_Verdaux evda;
6218 Elf_Internal_Verdaux ivda;
6220 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6222 get_data (&evda, file,
6223 offset - ivd.vd_next + ivd.vd_aux,
6224 sizeof (evda), _("version def aux"));
6226 ivda.vda_name = BYTE_GET (evda.vda_name);
6228 name = strtab + ivda.vda_name;
6229 nn += printf ("(%s%-*s",
6231 12 - (int) strlen (name),
6237 printf ("%*c", 18 - nn, ' ');
6255 printf (_("\nNo version information found in this file.\n"));
6261 get_symbol_binding (unsigned int binding)
6263 static char buff[32];
6267 case STB_LOCAL: return "LOCAL";
6268 case STB_GLOBAL: return "GLOBAL";
6269 case STB_WEAK: return "WEAK";
6271 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
6272 sprintf (buff, _("<processor specific>: %d"), binding);
6273 else if (binding >= STB_LOOS && binding <= STB_HIOS)
6274 sprintf (buff, _("<OS specific>: %d"), binding);
6276 sprintf (buff, _("<unknown>: %d"), binding);
6282 get_symbol_type (unsigned int type)
6284 static char buff[32];
6288 case STT_NOTYPE: return "NOTYPE";
6289 case STT_OBJECT: return "OBJECT";
6290 case STT_FUNC: return "FUNC";
6291 case STT_SECTION: return "SECTION";
6292 case STT_FILE: return "FILE";
6293 case STT_COMMON: return "COMMON";
6294 case STT_TLS: return "TLS";
6296 if (type >= STT_LOPROC && type <= STT_HIPROC)
6298 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
6299 return "THUMB_FUNC";
6301 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
6304 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
6305 return "PARISC_MILLI";
6307 sprintf (buff, _("<processor specific>: %d"), type);
6309 else if (type >= STT_LOOS && type <= STT_HIOS)
6311 if (elf_header.e_machine == EM_PARISC)
6313 if (type == STT_HP_OPAQUE)
6315 if (type == STT_HP_STUB)
6319 sprintf (buff, _("<OS specific>: %d"), type);
6322 sprintf (buff, _("<unknown>: %d"), type);
6328 get_symbol_visibility (unsigned int visibility)
6332 case STV_DEFAULT: return "DEFAULT";
6333 case STV_INTERNAL: return "INTERNAL";
6334 case STV_HIDDEN: return "HIDDEN";
6335 case STV_PROTECTED: return "PROTECTED";
6341 get_symbol_index_type (unsigned int type)
6343 static char buff[32];
6347 case SHN_UNDEF: return "UND";
6348 case SHN_ABS: return "ABS";
6349 case SHN_COMMON: return "COM";
6351 if (type == SHN_IA_64_ANSI_COMMON
6352 && elf_header.e_machine == EM_IA_64
6353 && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
6355 else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
6356 sprintf (buff, "PRC[0x%04x]", type);
6357 else if (type >= SHN_LOOS && type <= SHN_HIOS)
6358 sprintf (buff, "OS [0x%04x]", type);
6359 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
6360 sprintf (buff, "RSV[0x%04x]", type);
6362 sprintf (buff, "%3d", type);
6370 get_dynamic_data (FILE *file, unsigned int number)
6372 unsigned char *e_data;
6375 e_data = malloc (number * 4);
6379 error (_("Out of memory\n"));
6383 if (fread (e_data, 4, number, file) != number)
6385 error (_("Unable to read in dynamic data\n"));
6389 i_data = malloc (number * sizeof (*i_data));
6393 error (_("Out of memory\n"));
6399 i_data[number] = byte_get (e_data + number * 4, 4);
6406 /* Dump the symbol table. */
6408 process_symbol_table (FILE *file)
6410 Elf_Internal_Shdr *section;
6411 unsigned char nb[4];
6412 unsigned char nc[4];
6415 int *buckets = NULL;
6418 if (! do_syms && !do_histogram)
6421 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
6425 (archive_file_offset
6426 + offset_from_vma (file, dynamic_info[DT_HASH],
6427 sizeof nb + sizeof nc)),
6430 error (_("Unable to seek to start of dynamic information"));
6434 if (fread (nb, sizeof (nb), 1, file) != 1)
6436 error (_("Failed to read in number of buckets\n"));
6440 if (fread (nc, sizeof (nc), 1, file) != 1)
6442 error (_("Failed to read in number of chains\n"));
6446 nbuckets = byte_get (nb, 4);
6447 nchains = byte_get (nc, 4);
6449 buckets = get_dynamic_data (file, nbuckets);
6450 chains = get_dynamic_data (file, nchains);
6452 if (buckets == NULL || chains == NULL)
6457 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
6462 printf (_("\nSymbol table for image:\n"));
6464 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6466 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6468 for (hn = 0; hn < nbuckets; hn++)
6473 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
6475 Elf_Internal_Sym *psym;
6477 psym = dynamic_symbols + si;
6479 printf (" %3d %3d: ", si, hn);
6480 print_vma (psym->st_value, LONG_HEX);
6482 print_vma (psym->st_size, DEC_5);
6484 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6485 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6486 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6487 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
6488 if (VALID_DYNAMIC_NAME (psym->st_name))
6489 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
6491 printf (" <corrupt: %14ld>", psym->st_name);
6496 else if (do_syms && !do_using_dynamic)
6500 for (i = 0, section = section_headers;
6501 i < elf_header.e_shnum;
6506 Elf_Internal_Sym *symtab;
6507 Elf_Internal_Sym *psym;
6510 if ( section->sh_type != SHT_SYMTAB
6511 && section->sh_type != SHT_DYNSYM)
6514 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6515 SECTION_NAME (section),
6516 (unsigned long) (section->sh_size / section->sh_entsize));
6518 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6520 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6522 symtab = GET_ELF_SYMBOLS (file, section);
6526 if (section->sh_link == elf_header.e_shstrndx)
6527 strtab = string_table;
6530 Elf_Internal_Shdr *string_sec;
6532 string_sec = SECTION_HEADER (section->sh_link);
6534 strtab = get_data (NULL, file, string_sec->sh_offset,
6535 string_sec->sh_size, _("string table"));
6538 for (si = 0, psym = symtab;
6539 si < section->sh_size / section->sh_entsize;
6542 printf ("%6d: ", si);
6543 print_vma (psym->st_value, LONG_HEX);
6545 print_vma (psym->st_size, DEC_5);
6546 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
6547 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
6548 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
6549 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
6550 print_symbol (25, strtab + psym->st_name);
6552 if (section->sh_type == SHT_DYNSYM &&
6553 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
6555 unsigned char data[2];
6556 unsigned short vers_data;
6557 unsigned long offset;
6561 offset = offset_from_vma
6562 (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
6563 sizeof data + si * sizeof (vers_data));
6565 get_data (&data, file, offset + si * sizeof (vers_data),
6566 sizeof (data), _("version data"));
6568 vers_data = byte_get (data, 2);
6570 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
6573 check_def = (psym->st_shndx != SHN_UNDEF);
6575 if ((vers_data & 0x8000) || vers_data > 1)
6577 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
6578 && (is_nobits || ! check_def))
6580 Elf_External_Verneed evn;
6581 Elf_Internal_Verneed ivn;
6582 Elf_Internal_Vernaux ivna;
6584 /* We must test both. */
6585 offset = offset_from_vma
6586 (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
6591 unsigned long vna_off;
6593 get_data (&evn, file, offset, sizeof (evn),
6596 ivn.vn_aux = BYTE_GET (evn.vn_aux);
6597 ivn.vn_next = BYTE_GET (evn.vn_next);
6599 vna_off = offset + ivn.vn_aux;
6603 Elf_External_Vernaux evna;
6605 get_data (&evna, file, vna_off,
6607 _("version need aux (3)"));
6609 ivna.vna_other = BYTE_GET (evna.vna_other);
6610 ivna.vna_next = BYTE_GET (evna.vna_next);
6611 ivna.vna_name = BYTE_GET (evna.vna_name);
6613 vna_off += ivna.vna_next;
6615 while (ivna.vna_other != vers_data
6616 && ivna.vna_next != 0);
6618 if (ivna.vna_other == vers_data)
6621 offset += ivn.vn_next;
6623 while (ivn.vn_next != 0);
6625 if (ivna.vna_other == vers_data)
6628 strtab + ivna.vna_name, ivna.vna_other);
6631 else if (! is_nobits)
6632 error (_("bad dynamic symbol"));
6639 if (vers_data != 0x8001
6640 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
6642 Elf_Internal_Verdef ivd;
6643 Elf_Internal_Verdaux ivda;
6644 Elf_External_Verdaux evda;
6645 unsigned long offset;
6647 offset = offset_from_vma
6649 version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
6650 sizeof (Elf_External_Verdef));
6654 Elf_External_Verdef evd;
6656 get_data (&evd, file, offset, sizeof (evd),
6659 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
6660 ivd.vd_aux = BYTE_GET (evd.vd_aux);
6661 ivd.vd_next = BYTE_GET (evd.vd_next);
6663 offset += ivd.vd_next;
6665 while (ivd.vd_ndx != (vers_data & 0x7fff)
6666 && ivd.vd_next != 0);
6668 offset -= ivd.vd_next;
6669 offset += ivd.vd_aux;
6671 get_data (&evda, file, offset, sizeof (evda),
6672 _("version def aux"));
6674 ivda.vda_name = BYTE_GET (evda.vda_name);
6676 if (psym->st_name != ivda.vda_name)
6677 printf ((vers_data & 0x8000)
6679 strtab + ivda.vda_name);
6689 if (strtab != string_table)
6695 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6697 if (do_histogram && buckets != NULL)
6704 int nzero_counts = 0;
6707 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6709 printf (_(" Length Number %% of total Coverage\n"));
6711 lengths = calloc (nbuckets, sizeof (int));
6712 if (lengths == NULL)
6714 error (_("Out of memory"));
6717 for (hn = 0; hn < nbuckets; ++hn)
6722 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
6725 if (maxlength < ++lengths[hn])
6730 counts = calloc (maxlength + 1, sizeof (int));
6733 error (_("Out of memory"));
6737 for (hn = 0; hn < nbuckets; ++hn)
6738 ++counts[lengths[hn]];
6742 printf (" 0 %-10d (%5.1f%%)\n",
6743 counts[0], (counts[0] * 100.0) / nbuckets);
6744 for (si = 1; si <= maxlength; ++si)
6746 nzero_counts += counts[si] * si;
6747 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6748 si, counts[si], (counts[si] * 100.0) / nbuckets,
6749 (nzero_counts * 100.0) / nsyms);
6757 if (buckets != NULL)
6767 process_syminfo (FILE *file ATTRIBUTE_UNUSED)
6771 if (dynamic_syminfo == NULL
6773 /* No syminfo, this is ok. */
6776 /* There better should be a dynamic symbol section. */
6777 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6781 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6782 dynamic_syminfo_offset, dynamic_syminfo_nent);
6784 printf (_(" Num: Name BoundTo Flags\n"));
6785 for (i = 0; i < dynamic_syminfo_nent; ++i)
6787 unsigned short int flags = dynamic_syminfo[i].si_flags;
6789 printf ("%4d: ", i);
6790 if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
6791 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
6793 printf ("<corrupt: %19ld>", dynamic_symbols[i].st_name);
6796 switch (dynamic_syminfo[i].si_boundto)
6798 case SYMINFO_BT_SELF:
6799 fputs ("SELF ", stdout);
6801 case SYMINFO_BT_PARENT:
6802 fputs ("PARENT ", stdout);
6805 if (dynamic_syminfo[i].si_boundto > 0
6806 && dynamic_syminfo[i].si_boundto < dynamic_nent
6807 && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
6809 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
6813 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6817 if (flags & SYMINFO_FLG_DIRECT)
6819 if (flags & SYMINFO_FLG_PASSTHRU)
6820 printf (" PASSTHRU");
6821 if (flags & SYMINFO_FLG_COPY)
6823 if (flags & SYMINFO_FLG_LAZYLOAD)
6824 printf (" LAZYLOAD");
6832 #ifdef SUPPORT_DISASSEMBLY
6834 disassemble_section (Elf_Internal_Shdr *section, FILE *file)
6836 printf (_("\nAssembly dump of section %s\n"),
6837 SECTION_NAME (section));
6839 /* XXX -- to be done --- XXX */
6846 dump_section (Elf_Internal_Shdr *section, FILE *file)
6848 bfd_size_type bytes;
6850 unsigned char *data;
6851 unsigned char *start;
6853 bytes = section->sh_size;
6855 if (bytes == 0 || section->sh_type == SHT_NOBITS)
6857 printf (_("\nSection '%s' has no data to dump.\n"),
6858 SECTION_NAME (section));
6862 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6864 addr = section->sh_addr;
6866 start = get_data (NULL, file, section->sh_offset, bytes, _("section data"));
6878 lbytes = (bytes > 16 ? 16 : bytes);
6880 printf (" 0x%8.8lx ", (unsigned long) addr);
6882 switch (elf_header.e_ident[EI_DATA])
6886 for (j = 15; j >= 0; j --)
6889 printf ("%2.2x", data[j]);
6899 for (j = 0; j < 16; j++)
6902 printf ("%2.2x", data[j]);
6912 for (j = 0; j < lbytes; j++)
6915 if (k >= ' ' && k < 0x7f)
6934 static unsigned long int
6935 read_leb128 (unsigned char *data, int *length_return, int sign)
6937 unsigned long int result = 0;
6938 unsigned int num_read = 0;
6939 unsigned int shift = 0;
6947 result |= ((unsigned long int) (byte & 0x7f)) << shift;
6952 while (byte & 0x80);
6954 if (length_return != NULL)
6955 *length_return = num_read;
6957 if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))
6958 result |= -1L << shift;
6963 typedef struct State_Machine_Registers
6965 unsigned long address;
6968 unsigned int column;
6972 /* This variable hold the number of the last entry seen
6973 in the File Table. */
6974 unsigned int last_file_entry;
6977 static SMR state_machine_regs;
6980 reset_state_machine (int is_stmt)
6982 state_machine_regs.address = 0;
6983 state_machine_regs.file = 1;
6984 state_machine_regs.line = 1;
6985 state_machine_regs.column = 0;
6986 state_machine_regs.is_stmt = is_stmt;
6987 state_machine_regs.basic_block = 0;
6988 state_machine_regs.end_sequence = 0;
6989 state_machine_regs.last_file_entry = 0;
6992 /* Handled an extend line op. Returns true if this is the end
6996 process_extended_line_op (unsigned char *data, int is_stmt, int pointer_size)
6998 unsigned char op_code;
7001 unsigned char *name;
7004 len = read_leb128 (data, & bytes_read, 0);
7009 warn (_("badly formed extended line op encountered!\n"));
7016 printf (_(" Extended opcode %d: "), op_code);
7020 case DW_LNE_end_sequence:
7021 printf (_("End of Sequence\n\n"));
7022 reset_state_machine (is_stmt);
7025 case DW_LNE_set_address:
7026 adr = byte_get (data, pointer_size);
7027 printf (_("set Address to 0x%lx\n"), adr);
7028 state_machine_regs.address = adr;
7031 case DW_LNE_define_file:
7032 printf (_(" define new File Table entry\n"));
7033 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7035 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
7037 data += strlen ((char *) data) + 1;
7038 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7040 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7042 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
7043 printf (_("%s\n\n"), name);
7047 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
7054 /* Finds section NAME inside FILE and returns a
7055 pointer to it, or NULL upon failure. */
7057 static Elf_Internal_Shdr *
7058 find_section (const char * name)
7060 Elf_Internal_Shdr *sec;
7063 for (i = elf_header.e_shnum, sec = section_headers + i - 1;
7065 if (streq (SECTION_NAME (sec), name))
7068 if (i && sec && sec->sh_size != 0)
7074 static const char *debug_str_contents;
7075 static bfd_vma debug_str_size;
7078 load_debug_str (FILE *file)
7080 Elf_Internal_Shdr *sec;
7082 /* If it is already loaded, do nothing. */
7083 if (debug_str_contents != NULL)
7086 /* Locate the .debug_str section. */
7087 sec = find_section (".debug_str");
7091 debug_str_size = sec->sh_size;
7093 debug_str_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7094 _("debug_str section data"));
7098 free_debug_str (void)
7100 if (debug_str_contents == NULL)
7103 free ((char *) debug_str_contents);
7104 debug_str_contents = NULL;
7109 fetch_indirect_string (unsigned long offset)
7111 if (debug_str_contents == NULL)
7112 return _("<no .debug_str section>");
7114 if (offset > debug_str_size)
7115 return _("<offset is too big>");
7117 return debug_str_contents + offset;
7120 static const char *debug_loc_contents;
7121 static bfd_vma debug_loc_size;
7124 load_debug_loc (FILE *file)
7126 Elf_Internal_Shdr *sec;
7128 /* If it is already loaded, do nothing. */
7129 if (debug_loc_contents != NULL)
7132 /* Locate the .debug_loc section. */
7133 sec = find_section (".debug_loc");
7137 debug_loc_size = sec->sh_size;
7139 debug_loc_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7140 _("debug_loc section data"));
7144 free_debug_loc (void)
7146 if (debug_loc_contents == NULL)
7149 free ((char *) debug_loc_contents);
7150 debug_loc_contents = NULL;
7154 static const char * debug_range_contents;
7155 static unsigned long debug_range_size;
7158 load_debug_range (FILE *file)
7160 Elf_Internal_Shdr *sec;
7162 /* If it is already loaded, do nothing. */
7163 if (debug_range_contents != NULL)
7166 /* Locate the .debug_str section. */
7167 sec = find_section (".debug_ranges");
7171 debug_range_size = sec->sh_size;
7173 debug_range_contents = get_data (NULL, file, sec->sh_offset, sec->sh_size,
7174 _("debug_range section data"));
7178 free_debug_range (void)
7180 if (debug_range_contents == NULL)
7183 free ((char *) debug_range_contents);
7184 debug_range_contents = NULL;
7185 debug_range_size = 0;
7188 /* Apply addends of RELA relocations. */
7191 debug_apply_rela_addends (FILE *file,
7192 Elf_Internal_Shdr *section,
7194 unsigned char *sec_data,
7195 unsigned char *start,
7198 Elf_Internal_Shdr *relsec;
7200 if (end - start < reloc_size)
7203 for (relsec = section_headers;
7204 relsec < section_headers + elf_header.e_shnum;
7207 unsigned long nrelas;
7208 Elf_Internal_Rela *rela, *rp;
7209 Elf_Internal_Shdr *symsec;
7210 Elf_Internal_Sym *symtab;
7211 Elf_Internal_Sym *sym;
7213 if (relsec->sh_type != SHT_RELA
7214 || SECTION_HEADER (relsec->sh_info) != section
7215 || relsec->sh_size == 0)
7218 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7222 symsec = SECTION_HEADER (relsec->sh_link);
7223 symtab = GET_ELF_SYMBOLS (file, symsec);
7225 for (rp = rela; rp < rela + nrelas; ++rp)
7229 if (rp->r_offset >= (bfd_vma) (start - sec_data)
7230 && rp->r_offset < (bfd_vma) (end - sec_data) - reloc_size)
7231 loc = sec_data + rp->r_offset;
7237 sym = symtab + ELF32_R_SYM (rp->r_info);
7239 if (ELF32_R_SYM (rp->r_info) != 0
7240 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION
7241 /* Relocations against object symbols can happen,
7242 eg when referencing a global array. For an
7243 example of this see the _clz.o binary in libgcc.a. */
7244 && ELF32_ST_TYPE (sym->st_info) != STT_OBJECT)
7246 warn (_("%s: skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7247 get_symbol_type (ELF32_ST_TYPE (sym->st_info)),
7248 SECTION_NAME (section));
7254 sym = symtab + ELF64_R_SYM (rp->r_info);
7256 if (ELF64_R_SYM (rp->r_info) != 0
7257 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION
7258 && ELF64_ST_TYPE (sym->st_info) != STT_OBJECT)
7260 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7261 get_symbol_type (ELF64_ST_TYPE (sym->st_info)),
7262 SECTION_NAME (section));
7267 byte_put (loc, rp->r_addend, reloc_size);
7277 /* FIXME: There are better and more efficient ways to handle
7278 these structures. For now though, I just want something that
7279 is simple to implement. */
7280 typedef struct abbrev_attr
7282 unsigned long attribute;
7284 struct abbrev_attr *next;
7288 typedef struct abbrev_entry
7290 unsigned long entry;
7293 struct abbrev_attr *first_attr;
7294 struct abbrev_attr *last_attr;
7295 struct abbrev_entry *next;
7299 static abbrev_entry *first_abbrev = NULL;
7300 static abbrev_entry *last_abbrev = NULL;
7305 abbrev_entry *abbrev;
7307 for (abbrev = first_abbrev; abbrev;)
7309 abbrev_entry *next = abbrev->next;
7312 for (attr = abbrev->first_attr; attr;)
7314 abbrev_attr *next = attr->next;
7324 last_abbrev = first_abbrev = NULL;
7328 add_abbrev (unsigned long number, unsigned long tag, int children)
7330 abbrev_entry *entry;
7332 entry = malloc (sizeof (*entry));
7338 entry->entry = number;
7340 entry->children = children;
7341 entry->first_attr = NULL;
7342 entry->last_attr = NULL;
7345 if (first_abbrev == NULL)
7346 first_abbrev = entry;
7348 last_abbrev->next = entry;
7350 last_abbrev = entry;
7354 add_abbrev_attr (unsigned long attribute, unsigned long form)
7358 attr = malloc (sizeof (*attr));
7364 attr->attribute = attribute;
7368 if (last_abbrev->first_attr == NULL)
7369 last_abbrev->first_attr = attr;
7371 last_abbrev->last_attr->next = attr;
7373 last_abbrev->last_attr = attr;
7376 /* Processes the (partial) contents of a .debug_abbrev section.
7377 Returns NULL if the end of the section was encountered.
7378 Returns the address after the last byte read if the end of
7379 an abbreviation set was found. */
7381 static unsigned char *
7382 process_abbrev_section (unsigned char *start, unsigned char *end)
7384 if (first_abbrev != NULL)
7390 unsigned long entry;
7392 unsigned long attribute;
7395 entry = read_leb128 (start, & bytes_read, 0);
7396 start += bytes_read;
7398 /* A single zero is supposed to end the section according
7399 to the standard. If there's more, then signal that to
7402 return start == end ? NULL : start;
7404 tag = read_leb128 (start, & bytes_read, 0);
7405 start += bytes_read;
7407 children = *start++;
7409 add_abbrev (entry, tag, children);
7415 attribute = read_leb128 (start, & bytes_read, 0);
7416 start += bytes_read;
7418 form = read_leb128 (start, & bytes_read, 0);
7419 start += bytes_read;
7422 add_abbrev_attr (attribute, form);
7424 while (attribute != 0);
7431 get_TAG_name (unsigned long tag)
7435 case DW_TAG_padding: return "DW_TAG_padding";
7436 case DW_TAG_array_type: return "DW_TAG_array_type";
7437 case DW_TAG_class_type: return "DW_TAG_class_type";
7438 case DW_TAG_entry_point: return "DW_TAG_entry_point";
7439 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
7440 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
7441 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
7442 case DW_TAG_label: return "DW_TAG_label";
7443 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
7444 case DW_TAG_member: return "DW_TAG_member";
7445 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
7446 case DW_TAG_reference_type: return "DW_TAG_reference_type";
7447 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
7448 case DW_TAG_string_type: return "DW_TAG_string_type";
7449 case DW_TAG_structure_type: return "DW_TAG_structure_type";
7450 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
7451 case DW_TAG_typedef: return "DW_TAG_typedef";
7452 case DW_TAG_union_type: return "DW_TAG_union_type";
7453 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
7454 case DW_TAG_variant: return "DW_TAG_variant";
7455 case DW_TAG_common_block: return "DW_TAG_common_block";
7456 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
7457 case DW_TAG_inheritance: return "DW_TAG_inheritance";
7458 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
7459 case DW_TAG_module: return "DW_TAG_module";
7460 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
7461 case DW_TAG_set_type: return "DW_TAG_set_type";
7462 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
7463 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
7464 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
7465 case DW_TAG_base_type: return "DW_TAG_base_type";
7466 case DW_TAG_catch_block: return "DW_TAG_catch_block";
7467 case DW_TAG_const_type: return "DW_TAG_const_type";
7468 case DW_TAG_constant: return "DW_TAG_constant";
7469 case DW_TAG_enumerator: return "DW_TAG_enumerator";
7470 case DW_TAG_file_type: return "DW_TAG_file_type";
7471 case DW_TAG_friend: return "DW_TAG_friend";
7472 case DW_TAG_namelist: return "DW_TAG_namelist";
7473 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
7474 case DW_TAG_packed_type: return "DW_TAG_packed_type";
7475 case DW_TAG_subprogram: return "DW_TAG_subprogram";
7476 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
7477 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
7478 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
7479 case DW_TAG_try_block: return "DW_TAG_try_block";
7480 case DW_TAG_variant_part: return "DW_TAG_variant_part";
7481 case DW_TAG_variable: return "DW_TAG_variable";
7482 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
7483 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
7484 case DW_TAG_format_label: return "DW_TAG_format_label";
7485 case DW_TAG_function_template: return "DW_TAG_function_template";
7486 case DW_TAG_class_template: return "DW_TAG_class_template";
7487 /* DWARF 2.1 values. */
7488 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
7489 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
7490 case DW_TAG_interface_type: return "DW_TAG_interface_type";
7491 case DW_TAG_namespace: return "DW_TAG_namespace";
7492 case DW_TAG_imported_module: return "DW_TAG_imported_module";
7493 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
7494 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
7495 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
7497 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
7498 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
7499 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
7502 static char buffer[100];
7504 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
7511 get_FORM_name (unsigned long form)
7515 case DW_FORM_addr: return "DW_FORM_addr";
7516 case DW_FORM_block2: return "DW_FORM_block2";
7517 case DW_FORM_block4: return "DW_FORM_block4";
7518 case DW_FORM_data2: return "DW_FORM_data2";
7519 case DW_FORM_data4: return "DW_FORM_data4";
7520 case DW_FORM_data8: return "DW_FORM_data8";
7521 case DW_FORM_string: return "DW_FORM_string";
7522 case DW_FORM_block: return "DW_FORM_block";
7523 case DW_FORM_block1: return "DW_FORM_block1";
7524 case DW_FORM_data1: return "DW_FORM_data1";
7525 case DW_FORM_flag: return "DW_FORM_flag";
7526 case DW_FORM_sdata: return "DW_FORM_sdata";
7527 case DW_FORM_strp: return "DW_FORM_strp";
7528 case DW_FORM_udata: return "DW_FORM_udata";
7529 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
7530 case DW_FORM_ref1: return "DW_FORM_ref1";
7531 case DW_FORM_ref2: return "DW_FORM_ref2";
7532 case DW_FORM_ref4: return "DW_FORM_ref4";
7533 case DW_FORM_ref8: return "DW_FORM_ref8";
7534 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
7535 case DW_FORM_indirect: return "DW_FORM_indirect";
7538 static char buffer[100];
7540 sprintf (buffer, _("Unknown FORM value: %lx"), form);
7546 static unsigned char *
7547 display_block (unsigned char *data, unsigned long length)
7549 printf (_(" %lu byte block: "), length);
7552 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7558 decode_location_expression (unsigned char * data,
7559 unsigned int pointer_size,
7560 unsigned long length,
7561 unsigned long cu_offset)
7565 unsigned long uvalue;
7566 unsigned char *end = data + length;
7567 int need_frame_base = 0;
7576 printf ("DW_OP_addr: %lx",
7577 (unsigned long) byte_get (data, pointer_size));
7578 data += pointer_size;
7581 printf ("DW_OP_deref");
7584 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7587 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data++, 1));
7590 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7594 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data, 2));
7598 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7602 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data, 4));
7606 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7607 (unsigned long) byte_get (data + 4, 4));
7611 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7612 (long) byte_get (data + 4, 4));
7616 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7620 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7624 printf ("DW_OP_dup");
7627 printf ("DW_OP_drop");
7630 printf ("DW_OP_over");
7633 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7636 printf ("DW_OP_swap");
7639 printf ("DW_OP_rot");
7642 printf ("DW_OP_xderef");
7645 printf ("DW_OP_abs");
7648 printf ("DW_OP_and");
7651 printf ("DW_OP_div");
7654 printf ("DW_OP_minus");
7657 printf ("DW_OP_mod");
7660 printf ("DW_OP_mul");
7663 printf ("DW_OP_neg");
7666 printf ("DW_OP_not");
7669 printf ("DW_OP_or");
7672 printf ("DW_OP_plus");
7674 case DW_OP_plus_uconst:
7675 printf ("DW_OP_plus_uconst: %lu",
7676 read_leb128 (data, &bytes_read, 0));
7680 printf ("DW_OP_shl");
7683 printf ("DW_OP_shr");
7686 printf ("DW_OP_shra");
7689 printf ("DW_OP_xor");
7692 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data, 2));
7696 printf ("DW_OP_eq");
7699 printf ("DW_OP_ge");
7702 printf ("DW_OP_gt");
7705 printf ("DW_OP_le");
7708 printf ("DW_OP_lt");
7711 printf ("DW_OP_ne");
7714 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data, 2));
7750 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7785 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7820 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7821 read_leb128 (data, &bytes_read, 1));
7826 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7830 need_frame_base = 1;
7831 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7835 uvalue = read_leb128 (data, &bytes_read, 0);
7837 printf ("DW_OP_bregx: %lu %ld", uvalue,
7838 read_leb128 (data, &bytes_read, 1));
7842 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7845 case DW_OP_deref_size:
7846 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7848 case DW_OP_xderef_size:
7849 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7852 printf ("DW_OP_nop");
7855 /* DWARF 3 extensions. */
7856 case DW_OP_push_object_address:
7857 printf ("DW_OP_push_object_address");
7860 /* XXX: Strictly speaking for 64-bit DWARF3 files
7861 this ought to be an 8-byte wide computation. */
7862 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2) + cu_offset);
7866 /* XXX: Strictly speaking for 64-bit DWARF3 files
7867 this ought to be an 8-byte wide computation. */
7868 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4) + cu_offset);
7871 case DW_OP_call_ref:
7872 printf ("DW_OP_call_ref");
7875 /* GNU extensions. */
7876 case DW_OP_GNU_push_tls_address:
7877 printf ("DW_OP_GNU_push_tls_address");
7881 if (op >= DW_OP_lo_user
7882 && op <= DW_OP_hi_user)
7883 printf (_("(User defined location op)"));
7885 printf (_("(Unknown location op)"));
7886 /* No way to tell where the next op is, so just bail. */
7887 return need_frame_base;
7890 /* Separate the ops. */
7895 return need_frame_base;
7898 /* Decode a DW_AT_ranges attribute for 64bit DWARF3 . */
7901 decode_64bit_range (unsigned long offset, bfd_vma base_address)
7903 const char * start = debug_range_contents + offset;
7904 const char * end = debug_range_contents + debug_range_size;
7911 a = byte_get ((unsigned char *) start, 8);
7912 b = byte_get ((unsigned char *) start + 8, 8);
7914 if (a == 0xffffffff)
7918 else if (a == 0 && b == 0)
7921 printf (_(" [corrupt: start > end]"));
7925 print_vma (base_address + a, PREFIX_HEX);
7927 print_vma (base_address + b, PREFIX_HEX);
7933 while (start < end);
7936 /* Decode a DW_AT_ranges attribute. */
7939 decode_range (unsigned long offset, bfd_vma base_address)
7944 if (offset >= (debug_range_size - 8))
7946 printf (_("[corrupt: offset is outside the .debug_ranges section]"));
7950 /* Since all entries in the .debug_ranges section are pairs of either
7951 4-byte integers (32-bit DWARF3) or 8-byte integers (64-bit DWARF3)
7952 the offset should always be a multiple of 8 bytes. */
7955 printf (_("[corrupt: offset is not a multiple of 8]"));
7959 start = debug_range_contents + offset;
7962 /* Be paranoid - check to see if the previous
7963 two words were and end-of-range marker. */
7964 && (byte_get ((unsigned char *) start - 4, 4) != 0
7965 || byte_get ((unsigned char *) start - 8, 4) != 0))
7967 printf (_("[corrupt: offset is not at the start of a range]"));
7971 end = debug_range_contents + debug_range_size;
7979 a = byte_get ((unsigned char *) start, 4);
7980 b = byte_get ((unsigned char *) start + 4, 4);
7982 if (a == 0xffffffff)
7984 if (b == 0xffffffff)
7986 decode_64bit_range (offset, base_address);
7992 else if (a == 0 && b == 0)
7995 printf (_("[corrupt: start > end]"));
7998 if (start > debug_range_contents + offset)
8001 printf (_("0x%lx - 0x%lx"),
8002 (unsigned long) base_address + a,
8003 (unsigned long) base_address + b);
8008 while (start < end);
8012 /* This structure records the information that
8013 we extract from the.debug_info section. */
8016 unsigned int pointer_size;
8017 unsigned long cu_offset;
8018 unsigned long base_address;
8019 /* This is an array of offsets to the location list table. */
8020 unsigned long *loc_offsets;
8021 int *have_frame_base;
8022 unsigned int num_loc_offsets;
8023 unsigned int max_loc_offsets;
8027 static debug_info * debug_information = NULL;
8028 static unsigned int num_debug_info_entries = 0;
8029 static unsigned int last_pointer_size = 0;
8030 static int warned_about_missing_comp_units = FALSE;
8032 static unsigned char *
8033 read_and_display_attr_value (unsigned long attribute,
8035 unsigned char *data,
8036 unsigned long cu_offset,
8037 unsigned long pointer_size,
8038 unsigned long offset_size,
8040 debug_info *debug_info_p,
8043 unsigned long uvalue = 0;
8044 unsigned char *block_start = NULL;
8052 case DW_FORM_ref_addr:
8053 if (dwarf_version == 2)
8055 uvalue = byte_get (data, pointer_size);
8056 data += pointer_size;
8058 else if (dwarf_version == 3)
8060 uvalue = byte_get (data, offset_size);
8061 data += offset_size;
8065 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8070 uvalue = byte_get (data, pointer_size);
8071 data += pointer_size;
8075 uvalue = byte_get (data, offset_size);
8076 data += offset_size;
8082 uvalue = byte_get (data++, 1);
8087 uvalue = byte_get (data, 2);
8093 uvalue = byte_get (data, 4);
8098 uvalue = read_leb128 (data, & bytes_read, 1);
8102 case DW_FORM_ref_udata:
8104 uvalue = read_leb128 (data, & bytes_read, 0);
8108 case DW_FORM_indirect:
8109 form = read_leb128 (data, & bytes_read, 0);
8112 printf (" %s", get_FORM_name (form));
8113 return read_and_display_attr_value (attribute, form, data,
8114 cu_offset, pointer_size,
8115 offset_size, dwarf_version,
8116 debug_info_p, do_loc);
8121 case DW_FORM_ref_addr:
8123 printf (" <#%lx>", uvalue);
8129 case DW_FORM_ref_udata:
8131 printf (" <%lx>", uvalue + cu_offset);
8137 printf (" %#lx", uvalue);
8146 printf (" %ld", uvalue);
8153 uvalue = byte_get (data, 4);
8154 printf (" %lx", uvalue);
8155 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
8157 if ((do_loc || do_debug_loc)
8158 && num_debug_info_entries == 0)
8160 if (sizeof (uvalue) == 8)
8161 uvalue = byte_get (data, 8);
8163 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8168 case DW_FORM_string:
8170 printf (" %s", data);
8171 data += strlen ((char *) data) + 1;
8175 uvalue = read_leb128 (data, & bytes_read, 0);
8176 block_start = data + bytes_read;
8178 data = block_start + uvalue;
8180 data = display_block (block_start, uvalue);
8183 case DW_FORM_block1:
8184 uvalue = byte_get (data, 1);
8185 block_start = data + 1;
8187 data = block_start + uvalue;
8189 data = display_block (block_start, uvalue);
8192 case DW_FORM_block2:
8193 uvalue = byte_get (data, 2);
8194 block_start = data + 2;
8196 data = block_start + uvalue;
8198 data = display_block (block_start, uvalue);
8201 case DW_FORM_block4:
8202 uvalue = byte_get (data, 4);
8203 block_start = data + 4;
8205 data = block_start + uvalue;
8207 data = display_block (block_start, uvalue);
8212 printf (_(" (indirect string, offset: 0x%lx): %s"),
8213 uvalue, fetch_indirect_string (uvalue));
8216 case DW_FORM_indirect:
8217 /* Handled above. */
8221 warn (_("Unrecognized form: %d\n"), form);
8225 /* For some attributes we can display further information. */
8226 if ((do_loc || do_debug_loc)
8227 && num_debug_info_entries == 0)
8231 case DW_AT_frame_base:
8232 have_frame_base = 1;
8233 case DW_AT_location:
8234 case DW_AT_data_member_location:
8235 case DW_AT_vtable_elem_location:
8236 case DW_AT_allocated:
8237 case DW_AT_associated:
8238 case DW_AT_data_location:
8240 case DW_AT_upper_bound:
8241 case DW_AT_lower_bound:
8242 if (form == DW_FORM_data4 || form == DW_FORM_data8)
8244 /* Process location list. */
8245 unsigned int max = debug_info_p->max_loc_offsets;
8246 unsigned int num = debug_info_p->num_loc_offsets;
8248 if (max == 0 || num >= max)
8251 debug_info_p->loc_offsets
8252 = xrealloc (debug_info_p->loc_offsets,
8253 max * sizeof (*debug_info_p->loc_offsets));
8254 debug_info_p->have_frame_base
8255 = xrealloc (debug_info_p->have_frame_base,
8256 max * sizeof (*debug_info_p->have_frame_base));
8257 debug_info_p->max_loc_offsets = max;
8259 debug_info_p->loc_offsets [num] = uvalue;
8260 debug_info_p->have_frame_base [num] = have_frame_base;
8261 debug_info_p->num_loc_offsets++;
8266 if (need_base_address)
8267 debug_info_p->base_address = uvalue;
8285 case DW_INL_not_inlined:
8286 printf (_("(not inlined)"));
8288 case DW_INL_inlined:
8289 printf (_("(inlined)"));
8291 case DW_INL_declared_not_inlined:
8292 printf (_("(declared as inline but ignored)"));
8294 case DW_INL_declared_inlined:
8295 printf (_("(declared as inline and inlined)"));
8298 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
8303 case DW_AT_language:
8306 case DW_LANG_C: printf ("(non-ANSI C)"); break;
8307 case DW_LANG_C89: printf ("(ANSI C)"); break;
8308 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
8309 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
8310 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
8311 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
8312 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
8313 case DW_LANG_Ada83: printf ("(Ada)"); break;
8314 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
8315 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
8316 /* DWARF 2.1 values. */
8317 case DW_LANG_C99: printf ("(ANSI C99)"); break;
8318 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
8319 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
8320 /* MIPS extension. */
8321 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
8322 /* UPC extension. */
8323 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
8325 printf ("(Unknown: %lx)", uvalue);
8330 case DW_AT_encoding:
8333 case DW_ATE_void: printf ("(void)"); break;
8334 case DW_ATE_address: printf ("(machine address)"); break;
8335 case DW_ATE_boolean: printf ("(boolean)"); break;
8336 case DW_ATE_complex_float: printf ("(complex float)"); break;
8337 case DW_ATE_float: printf ("(float)"); break;
8338 case DW_ATE_signed: printf ("(signed)"); break;
8339 case DW_ATE_signed_char: printf ("(signed char)"); break;
8340 case DW_ATE_unsigned: printf ("(unsigned)"); break;
8341 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
8342 /* DWARF 2.1 value. */
8343 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
8345 if (uvalue >= DW_ATE_lo_user
8346 && uvalue <= DW_ATE_hi_user)
8347 printf ("(user defined type)");
8349 printf ("(unknown type)");
8354 case DW_AT_accessibility:
8357 case DW_ACCESS_public: printf ("(public)"); break;
8358 case DW_ACCESS_protected: printf ("(protected)"); break;
8359 case DW_ACCESS_private: printf ("(private)"); break;
8361 printf ("(unknown accessibility)");
8366 case DW_AT_visibility:
8369 case DW_VIS_local: printf ("(local)"); break;
8370 case DW_VIS_exported: printf ("(exported)"); break;
8371 case DW_VIS_qualified: printf ("(qualified)"); break;
8372 default: printf ("(unknown visibility)"); break;
8376 case DW_AT_virtuality:
8379 case DW_VIRTUALITY_none: printf ("(none)"); break;
8380 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8381 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8382 default: printf ("(unknown virtuality)"); break;
8386 case DW_AT_identifier_case:
8389 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8390 case DW_ID_up_case: printf ("(up_case)"); break;
8391 case DW_ID_down_case: printf ("(down_case)"); break;
8392 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8393 default: printf ("(unknown case)"); break;
8397 case DW_AT_calling_convention:
8400 case DW_CC_normal: printf ("(normal)"); break;
8401 case DW_CC_program: printf ("(program)"); break;
8402 case DW_CC_nocall: printf ("(nocall)"); break;
8404 if (uvalue >= DW_CC_lo_user
8405 && uvalue <= DW_CC_hi_user)
8406 printf ("(user defined)");
8408 printf ("(unknown convention)");
8412 case DW_AT_ordering:
8415 case -1: printf ("(undefined)"); break;
8416 case 0: printf ("(row major)"); break;
8417 case 1: printf ("(column major)"); break;
8421 case DW_AT_frame_base:
8422 have_frame_base = 1;
8423 case DW_AT_location:
8424 case DW_AT_data_member_location:
8425 case DW_AT_vtable_elem_location:
8426 case DW_AT_allocated:
8427 case DW_AT_associated:
8428 case DW_AT_data_location:
8430 case DW_AT_upper_bound:
8431 case DW_AT_lower_bound:
8434 int need_frame_base;
8437 need_frame_base = decode_location_expression (block_start,
8442 if (need_frame_base && !have_frame_base)
8443 printf (_(" [without DW_AT_frame_base]"));
8445 else if (form == DW_FORM_data4 || form == DW_FORM_data8)
8446 printf (_("(location list)"));
8451 if (need_base_address)
8452 saved_base_address = uvalue;
8456 decode_range (uvalue, saved_base_address);
8467 get_AT_name (unsigned long attribute)
8471 case DW_AT_sibling: return "DW_AT_sibling";
8472 case DW_AT_location: return "DW_AT_location";
8473 case DW_AT_name: return "DW_AT_name";
8474 case DW_AT_ordering: return "DW_AT_ordering";
8475 case DW_AT_subscr_data: return "DW_AT_subscr_data";
8476 case DW_AT_byte_size: return "DW_AT_byte_size";
8477 case DW_AT_bit_offset: return "DW_AT_bit_offset";
8478 case DW_AT_bit_size: return "DW_AT_bit_size";
8479 case DW_AT_element_list: return "DW_AT_element_list";
8480 case DW_AT_stmt_list: return "DW_AT_stmt_list";
8481 case DW_AT_low_pc: return "DW_AT_low_pc";
8482 case DW_AT_high_pc: return "DW_AT_high_pc";
8483 case DW_AT_language: return "DW_AT_language";
8484 case DW_AT_member: return "DW_AT_member";
8485 case DW_AT_discr: return "DW_AT_discr";
8486 case DW_AT_discr_value: return "DW_AT_discr_value";
8487 case DW_AT_visibility: return "DW_AT_visibility";
8488 case DW_AT_import: return "DW_AT_import";
8489 case DW_AT_string_length: return "DW_AT_string_length";
8490 case DW_AT_common_reference: return "DW_AT_common_reference";
8491 case DW_AT_comp_dir: return "DW_AT_comp_dir";
8492 case DW_AT_const_value: return "DW_AT_const_value";
8493 case DW_AT_containing_type: return "DW_AT_containing_type";
8494 case DW_AT_default_value: return "DW_AT_default_value";
8495 case DW_AT_inline: return "DW_AT_inline";
8496 case DW_AT_is_optional: return "DW_AT_is_optional";
8497 case DW_AT_lower_bound: return "DW_AT_lower_bound";
8498 case DW_AT_producer: return "DW_AT_producer";
8499 case DW_AT_prototyped: return "DW_AT_prototyped";
8500 case DW_AT_return_addr: return "DW_AT_return_addr";
8501 case DW_AT_start_scope: return "DW_AT_start_scope";
8502 case DW_AT_stride_size: return "DW_AT_stride_size";
8503 case DW_AT_upper_bound: return "DW_AT_upper_bound";
8504 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
8505 case DW_AT_accessibility: return "DW_AT_accessibility";
8506 case DW_AT_address_class: return "DW_AT_address_class";
8507 case DW_AT_artificial: return "DW_AT_artificial";
8508 case DW_AT_base_types: return "DW_AT_base_types";
8509 case DW_AT_calling_convention: return "DW_AT_calling_convention";
8510 case DW_AT_count: return "DW_AT_count";
8511 case DW_AT_data_member_location: return "DW_AT_data_member_location";
8512 case DW_AT_decl_column: return "DW_AT_decl_column";
8513 case DW_AT_decl_file: return "DW_AT_decl_file";
8514 case DW_AT_decl_line: return "DW_AT_decl_line";
8515 case DW_AT_declaration: return "DW_AT_declaration";
8516 case DW_AT_discr_list: return "DW_AT_discr_list";
8517 case DW_AT_encoding: return "DW_AT_encoding";
8518 case DW_AT_external: return "DW_AT_external";
8519 case DW_AT_frame_base: return "DW_AT_frame_base";
8520 case DW_AT_friend: return "DW_AT_friend";
8521 case DW_AT_identifier_case: return "DW_AT_identifier_case";
8522 case DW_AT_macro_info: return "DW_AT_macro_info";
8523 case DW_AT_namelist_items: return "DW_AT_namelist_items";
8524 case DW_AT_priority: return "DW_AT_priority";
8525 case DW_AT_segment: return "DW_AT_segment";
8526 case DW_AT_specification: return "DW_AT_specification";
8527 case DW_AT_static_link: return "DW_AT_static_link";
8528 case DW_AT_type: return "DW_AT_type";
8529 case DW_AT_use_location: return "DW_AT_use_location";
8530 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
8531 case DW_AT_virtuality: return "DW_AT_virtuality";
8532 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
8533 /* DWARF 2.1 values. */
8534 case DW_AT_allocated: return "DW_AT_allocated";
8535 case DW_AT_associated: return "DW_AT_associated";
8536 case DW_AT_data_location: return "DW_AT_data_location";
8537 case DW_AT_stride: return "DW_AT_stride";
8538 case DW_AT_entry_pc: return "DW_AT_entry_pc";
8539 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
8540 case DW_AT_extension: return "DW_AT_extension";
8541 case DW_AT_ranges: return "DW_AT_ranges";
8542 case DW_AT_trampoline: return "DW_AT_trampoline";
8543 case DW_AT_call_column: return "DW_AT_call_column";
8544 case DW_AT_call_file: return "DW_AT_call_file";
8545 case DW_AT_call_line: return "DW_AT_call_line";
8546 /* SGI/MIPS extensions. */
8547 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
8548 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
8549 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
8550 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
8551 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
8552 case DW_AT_MIPS_software_pipeline_depth:
8553 return "DW_AT_MIPS_software_pipeline_depth";
8554 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
8555 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
8556 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
8557 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
8558 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
8559 /* GNU extensions. */
8560 case DW_AT_sf_names: return "DW_AT_sf_names";
8561 case DW_AT_src_info: return "DW_AT_src_info";
8562 case DW_AT_mac_info: return "DW_AT_mac_info";
8563 case DW_AT_src_coords: return "DW_AT_src_coords";
8564 case DW_AT_body_begin: return "DW_AT_body_begin";
8565 case DW_AT_body_end: return "DW_AT_body_end";
8566 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
8567 /* UPC extension. */
8568 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
8571 static char buffer[100];
8573 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
8579 static unsigned char *
8580 read_and_display_attr (unsigned long attribute,
8582 unsigned char *data,
8583 unsigned long cu_offset,
8584 unsigned long pointer_size,
8585 unsigned long offset_size,
8587 debug_info *debug_info_p,
8591 printf (" %-18s:", get_AT_name (attribute));
8592 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8593 pointer_size, offset_size,
8594 dwarf_version, debug_info_p,
8602 /* Process the contents of a .debug_info section. If do_loc is non-zero
8603 then we are scanning for location lists and we do not want to display
8604 anything to the user. */
8607 process_debug_info (Elf_Internal_Shdr *section, unsigned char *start,
8608 FILE *file, int do_loc)
8610 unsigned char *end = start + section->sh_size;
8611 unsigned char *section_begin;
8613 unsigned int num_units = 0;
8615 if ((do_loc || do_debug_loc)
8616 && num_debug_info_entries == 0)
8618 unsigned long length;
8620 /* First scan the section to get the number of comp units. */
8621 for (section_begin = start, num_units = 0; section_begin < end;
8624 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8625 will be the length. For a 64-bit DWARF section, it'll be
8626 the escape code 0xffffffff followed by an 8 byte length. */
8627 length = byte_get (section_begin, 4);
8629 if (length == 0xffffffff)
8631 length = byte_get (section_begin + 4, 8);
8632 section_begin += length + 12;
8635 section_begin += length + 4;
8640 error (_("No comp units in .debug_info section ?"));
8644 /* Then allocate an array to hold the information. */
8645 debug_information = malloc (num_units *
8646 sizeof (* debug_information));
8647 if (debug_information == NULL)
8649 error (_("Not enough memory for a debug info array of %u entries"),
8657 printf (_("The section %s contains:\n\n"),
8658 SECTION_NAME (section));
8660 load_debug_str (file);
8661 load_debug_loc (file);
8662 load_debug_range (file);
8665 for (section_begin = start, unit = 0; start < end; unit++)
8667 DWARF2_Internal_CompUnit compunit;
8668 unsigned char *hdrptr;
8669 unsigned char *cu_abbrev_offset_ptr;
8670 unsigned char *tags;
8672 unsigned long cu_offset;
8674 int initial_length_size;
8678 compunit.cu_length = byte_get (hdrptr, 4);
8681 if (compunit.cu_length == 0xffffffff)
8683 compunit.cu_length = byte_get (hdrptr, 8);
8686 initial_length_size = 12;
8691 initial_length_size = 4;
8694 compunit.cu_version = byte_get (hdrptr, 2);
8697 cu_offset = start - section_begin;
8698 start += compunit.cu_length + initial_length_size;
8700 if (elf_header.e_type == ET_REL
8701 && !debug_apply_rela_addends (file, section, offset_size,
8702 section_begin, hdrptr, start))
8705 cu_abbrev_offset_ptr = hdrptr;
8706 compunit.cu_abbrev_offset = byte_get (hdrptr, offset_size);
8707 hdrptr += offset_size;
8709 compunit.cu_pointer_size = byte_get (hdrptr, 1);
8711 if ((do_loc || do_debug_loc)
8712 && num_debug_info_entries == 0)
8714 debug_information [unit].cu_offset = cu_offset;
8715 debug_information [unit].pointer_size
8716 = compunit.cu_pointer_size;
8717 debug_information [unit].base_address = 0;
8718 debug_information [unit].loc_offsets = NULL;
8719 debug_information [unit].have_frame_base = NULL;
8720 debug_information [unit].max_loc_offsets = 0;
8721 debug_information [unit].num_loc_offsets = 0;
8728 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8729 printf (_(" Length: %ld\n"), compunit.cu_length);
8730 printf (_(" Version: %d\n"), compunit.cu_version);
8731 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8732 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8735 if (compunit.cu_version != 2 && compunit.cu_version != 3)
8737 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8743 /* Read in the abbrevs used by this compilation unit. */
8745 Elf_Internal_Shdr *sec;
8746 unsigned char *begin;
8748 /* Locate the .debug_abbrev section and process it. */
8749 sec = find_section (".debug_abbrev");
8752 warn (_("Unable to locate .debug_abbrev section!\n"));
8756 begin = get_data (NULL, file, sec->sh_offset, sec->sh_size,
8757 _("debug_abbrev section data"));
8761 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8762 begin + sec->sh_size);
8768 while (tags < start)
8771 unsigned long abbrev_number;
8772 abbrev_entry *entry;
8775 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8778 /* A null DIE marks the end of a list of children. */
8779 if (abbrev_number == 0)
8785 /* Scan through the abbreviation list until we reach the
8787 for (entry = first_abbrev;
8788 entry && entry->entry != abbrev_number;
8789 entry = entry->next)
8794 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8800 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8802 (unsigned long) (tags - section_begin
8805 get_TAG_name (entry->tag));
8810 need_base_address = 0;
8812 case DW_TAG_compile_unit:
8813 need_base_address = 1;
8814 saved_base_address = 0;
8816 case DW_TAG_entry_point:
8817 case DW_TAG_inlined_subroutine:
8818 case DW_TAG_subprogram:
8819 need_base_address = 0;
8820 /* Assuming that there is no DW_AT_frame_base. */
8821 have_frame_base = 0;
8825 for (attr = entry->first_attr; attr; attr = attr->next)
8826 tags = read_and_display_attr (attr->attribute,
8829 compunit.cu_pointer_size,
8831 compunit.cu_version,
8832 &debug_information [unit],
8835 if (entry->children)
8840 /* Set num_debug_info_entries here so that it can be used
8841 to check if we need to proecess .debug_loc section. */
8842 if ((do_loc || do_debug_loc)
8843 && num_debug_info_entries == 0)
8844 num_debug_info_entries = num_units;
8848 free_debug_range ();
8858 /* Retrieve the pointer size associated with the given compilation unit.
8859 Optionally the offset of this unit into the .debug_info section is
8860 also retutned. If there is no .debug_info section then an error
8861 message is issued and 0 is returned. If the requested comp unit has
8862 not been defined in the .debug_info section then a warning message
8863 is issued and the last know pointer size is returned. This message
8864 is only issued once per section dumped per file dumped. */
8867 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit,
8868 const char * section_name,
8869 unsigned long * offset_return)
8871 unsigned long offset = 0;
8873 if (num_debug_info_entries == 0)
8874 error (_("%s section needs a populated .debug_info section\n"),
8877 else if (comp_unit >= num_debug_info_entries)
8879 if (!warned_about_missing_comp_units)
8881 warn (_("%s section has more comp units than .debug_info section\n"),
8883 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
8885 warned_about_missing_comp_units = TRUE;
8890 last_pointer_size = debug_information [comp_unit].pointer_size;
8891 offset = debug_information [comp_unit].cu_offset;
8894 if (offset_return != NULL)
8895 * offset_return = offset;
8897 return last_pointer_size;
8900 /* Locate and scan the .debug_info section in the file and record the pointer
8901 sizes and offsets for the compilation units in it. Usually an executable
8902 will have just one pointer size, but this is not guaranteed, and so we try
8903 not to make any assumptions. Returns zero upon failure, or the number of
8904 compilation units upon success. */
8907 get_debug_info (FILE * file)
8909 Elf_Internal_Shdr * section;
8910 unsigned char * start;
8913 /* Reset the last pointer size so that we can issue correct error
8914 messages if we are displaying the contents of more than one section. */
8915 last_pointer_size = 0;
8916 warned_about_missing_comp_units = FALSE;
8918 /* If we already have the information there is nothing else to do. */
8919 if (num_debug_info_entries > 0)
8920 return num_debug_info_entries;
8922 section = find_section (".debug_info");
8923 if (section == NULL)
8926 start = get_data (NULL, file, section->sh_offset, section->sh_size,
8927 _("extracting information from .debug_info section"));
8931 ret = process_debug_info (section, start, file, 1);
8934 return ret ? num_debug_info_entries : 0;
8938 display_debug_lines (Elf_Internal_Shdr *section,
8939 unsigned char *start, FILE *file)
8941 unsigned char *data = start;
8942 unsigned char *end = start + section->sh_size;
8943 unsigned int comp_unit = 0;
8945 printf (_("\nDump of debug contents of section %s:\n\n"),
8946 SECTION_NAME (section));
8948 get_debug_info (file);
8952 DWARF2_Internal_LineInfo info;
8953 unsigned char *standard_opcodes;
8954 unsigned char *end_of_sequence;
8955 unsigned char *hdrptr;
8956 unsigned int pointer_size;
8957 int initial_length_size;
8963 /* Check the length of the block. */
8964 info.li_length = byte_get (hdrptr, 4);
8967 if (info.li_length == 0xffffffff)
8969 /* This section is 64-bit DWARF 3. */
8970 info.li_length = byte_get (hdrptr, 8);
8973 initial_length_size = 12;
8978 initial_length_size = 4;
8981 if (info.li_length + initial_length_size > section->sh_size)
8984 (_("The line info appears to be corrupt - the section is too small\n"));
8988 /* Check its version number. */
8989 info.li_version = byte_get (hdrptr, 2);
8991 if (info.li_version != 2 && info.li_version != 3)
8993 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
8997 info.li_prologue_length = byte_get (hdrptr, offset_size);
8998 hdrptr += offset_size;
8999 info.li_min_insn_length = byte_get (hdrptr, 1);
9001 info.li_default_is_stmt = byte_get (hdrptr, 1);
9003 info.li_line_base = byte_get (hdrptr, 1);
9005 info.li_line_range = byte_get (hdrptr, 1);
9007 info.li_opcode_base = byte_get (hdrptr, 1);
9010 /* Sign extend the line base field. */
9011 info.li_line_base <<= 24;
9012 info.li_line_base >>= 24;
9014 /* Get the pointer size from the comp unit associated
9015 with this block of line number information. */
9016 pointer_size = get_pointer_size_and_offset_of_comp_unit
9017 (comp_unit, ".debug_lines", NULL);
9020 printf (_(" Length: %ld\n"), info.li_length);
9021 printf (_(" DWARF Version: %d\n"), info.li_version);
9022 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
9023 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
9024 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
9025 printf (_(" Line Base: %d\n"), info.li_line_base);
9026 printf (_(" Line Range: %d\n"), info.li_line_range);
9027 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
9028 printf (_(" (Pointer size: %u)\n"), pointer_size);
9030 end_of_sequence = data + info.li_length + initial_length_size;
9032 reset_state_machine (info.li_default_is_stmt);
9034 /* Display the contents of the Opcodes table. */
9035 standard_opcodes = hdrptr;
9037 printf (_("\n Opcodes:\n"));
9039 for (i = 1; i < info.li_opcode_base; i++)
9040 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
9042 /* Display the contents of the Directory table. */
9043 data = standard_opcodes + info.li_opcode_base - 1;
9046 printf (_("\n The Directory Table is empty.\n"));
9049 printf (_("\n The Directory Table:\n"));
9053 printf (_(" %s\n"), data);
9055 data += strlen ((char *) data) + 1;
9059 /* Skip the NUL at the end of the table. */
9062 /* Display the contents of the File Name table. */
9064 printf (_("\n The File Name Table is empty.\n"));
9067 printf (_("\n The File Name Table:\n"));
9068 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9072 unsigned char *name;
9075 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
9078 data += strlen ((char *) data) + 1;
9080 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9082 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9084 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
9086 printf (_("%s\n"), name);
9090 /* Skip the NUL at the end of the table. */
9093 /* Now display the statements. */
9094 printf (_("\n Line Number Statements:\n"));
9096 while (data < end_of_sequence)
9098 unsigned char op_code;
9104 if (op_code >= info.li_opcode_base)
9106 op_code -= info.li_opcode_base;
9107 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
9108 state_machine_regs.address += adv;
9109 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9110 op_code, adv, state_machine_regs.address);
9111 adv = (op_code % info.li_line_range) + info.li_line_base;
9112 state_machine_regs.line += adv;
9113 printf (_(" and Line by %d to %d\n"),
9114 adv, state_machine_regs.line);
9116 else switch (op_code)
9118 case DW_LNS_extended_op:
9119 data += process_extended_line_op (data, info.li_default_is_stmt,
9124 printf (_(" Copy\n"));
9127 case DW_LNS_advance_pc:
9128 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
9130 state_machine_regs.address += adv;
9131 printf (_(" Advance PC by %d to %lx\n"), adv,
9132 state_machine_regs.address);
9135 case DW_LNS_advance_line:
9136 adv = read_leb128 (data, & bytes_read, 1);
9138 state_machine_regs.line += adv;
9139 printf (_(" Advance Line by %d to %d\n"), adv,
9140 state_machine_regs.line);
9143 case DW_LNS_set_file:
9144 adv = read_leb128 (data, & bytes_read, 0);
9146 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9148 state_machine_regs.file = adv;
9151 case DW_LNS_set_column:
9152 adv = read_leb128 (data, & bytes_read, 0);
9154 printf (_(" Set column to %d\n"), adv);
9155 state_machine_regs.column = adv;
9158 case DW_LNS_negate_stmt:
9159 adv = state_machine_regs.is_stmt;
9161 printf (_(" Set is_stmt to %d\n"), adv);
9162 state_machine_regs.is_stmt = adv;
9165 case DW_LNS_set_basic_block:
9166 printf (_(" Set basic block\n"));
9167 state_machine_regs.basic_block = 1;
9170 case DW_LNS_const_add_pc:
9171 adv = (((255 - info.li_opcode_base) / info.li_line_range)
9172 * info.li_min_insn_length);
9173 state_machine_regs.address += adv;
9174 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
9175 state_machine_regs.address);
9178 case DW_LNS_fixed_advance_pc:
9179 adv = byte_get (data, 2);
9181 state_machine_regs.address += adv;
9182 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9183 adv, state_machine_regs.address);
9186 case DW_LNS_set_prologue_end:
9187 printf (_(" Set prologue_end to true\n"));
9190 case DW_LNS_set_epilogue_begin:
9191 printf (_(" Set epilogue_begin to true\n"));
9194 case DW_LNS_set_isa:
9195 adv = read_leb128 (data, & bytes_read, 0);
9197 printf (_(" Set ISA to %d\n"), adv);
9201 printf (_(" Unknown opcode %d with operands: "), op_code);
9203 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
9205 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
9206 i == 1 ? "" : ", ");
9220 display_debug_pubnames (Elf_Internal_Shdr *section,
9221 unsigned char *start,
9222 FILE *file ATTRIBUTE_UNUSED)
9224 DWARF2_Internal_PubNames pubnames;
9227 end = start + section->sh_size;
9229 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9233 unsigned char *data;
9234 unsigned long offset;
9235 int offset_size, initial_length_size;
9239 pubnames.pn_length = byte_get (data, 4);
9241 if (pubnames.pn_length == 0xffffffff)
9243 pubnames.pn_length = byte_get (data, 8);
9246 initial_length_size = 12;
9251 initial_length_size = 4;
9254 pubnames.pn_version = byte_get (data, 2);
9256 pubnames.pn_offset = byte_get (data, offset_size);
9257 data += offset_size;
9258 pubnames.pn_size = byte_get (data, offset_size);
9259 data += offset_size;
9261 start += pubnames.pn_length + initial_length_size;
9263 if (pubnames.pn_version != 2 && pubnames.pn_version != 3)
9265 static int warned = 0;
9269 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9276 printf (_(" Length: %ld\n"),
9277 pubnames.pn_length);
9278 printf (_(" Version: %d\n"),
9279 pubnames.pn_version);
9280 printf (_(" Offset into .debug_info section: %ld\n"),
9281 pubnames.pn_offset);
9282 printf (_(" Size of area in .debug_info section: %ld\n"),
9285 printf (_("\n Offset\tName\n"));
9289 offset = byte_get (data, offset_size);
9293 data += offset_size;
9294 printf (" %-6ld\t\t%s\n", offset, data);
9295 data += strlen ((char *) data) + 1;
9298 while (offset != 0);
9306 display_debug_macinfo (Elf_Internal_Shdr *section,
9307 unsigned char *start,
9308 FILE *file ATTRIBUTE_UNUSED)
9310 unsigned char *end = start + section->sh_size;
9311 unsigned char *curr = start;
9312 unsigned int bytes_read;
9313 enum dwarf_macinfo_record_type op;
9315 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9319 unsigned int lineno;
9327 case DW_MACINFO_start_file:
9329 unsigned int filenum;
9331 lineno = read_leb128 (curr, & bytes_read, 0);
9333 filenum = read_leb128 (curr, & bytes_read, 0);
9336 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9341 case DW_MACINFO_end_file:
9342 printf (_(" DW_MACINFO_end_file\n"));
9345 case DW_MACINFO_define:
9346 lineno = read_leb128 (curr, & bytes_read, 0);
9349 curr += strlen (string) + 1;
9350 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9354 case DW_MACINFO_undef:
9355 lineno = read_leb128 (curr, & bytes_read, 0);
9358 curr += strlen (string) + 1;
9359 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9363 case DW_MACINFO_vendor_ext:
9365 unsigned int constant;
9367 constant = read_leb128 (curr, & bytes_read, 0);
9370 curr += strlen (string) + 1;
9371 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9383 display_debug_abbrev (Elf_Internal_Shdr *section,
9384 unsigned char *start,
9385 FILE *file ATTRIBUTE_UNUSED)
9387 abbrev_entry *entry;
9388 unsigned char *end = start + section->sh_size;
9390 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
9394 start = process_abbrev_section (start, end);
9396 if (first_abbrev == NULL)
9399 printf (_(" Number TAG\n"));
9401 for (entry = first_abbrev; entry; entry = entry->next)
9405 printf (_(" %ld %s [%s]\n"),
9407 get_TAG_name (entry->tag),
9408 entry->children ? _("has children") : _("no children"));
9410 for (attr = entry->first_attr; attr; attr = attr->next)
9411 printf (_(" %-18s %s\n"),
9412 get_AT_name (attr->attribute),
9413 get_FORM_name (attr->form));
9426 display_debug_loc (Elf_Internal_Shdr *section,
9427 unsigned char *start, FILE *file)
9429 unsigned char *section_end;
9430 unsigned long bytes;
9431 unsigned char *section_begin = start;
9432 unsigned int num_loc_list = 0;
9433 unsigned long last_offset = 0;
9434 unsigned int first = 0;
9437 int seen_first_offset = 0;
9438 int use_debug_info = 1;
9439 unsigned char *next;
9441 bytes = section->sh_size;
9442 section_end = start + bytes;
9446 printf (_("\nThe .debug_loc section is empty.\n"));
9450 get_debug_info (file);
9452 /* Check the order of location list in .debug_info section. If
9453 offsets of location lists are in the ascending order, we can
9454 use `debug_information' directly. */
9455 for (i = 0; i < num_debug_info_entries; i++)
9459 num = debug_information [i].num_loc_offsets;
9460 num_loc_list += num;
9462 /* Check if we can use `debug_information' directly. */
9463 if (use_debug_info && num != 0)
9465 if (!seen_first_offset)
9467 /* This is the first location list. */
9468 last_offset = debug_information [i].loc_offsets [0];
9470 seen_first_offset = 1;
9476 for (; j < num; j++)
9479 debug_information [i].loc_offsets [j])
9484 last_offset = debug_information [i].loc_offsets [j];
9489 if (!use_debug_info)
9490 /* FIXME: Should we handle this case? */
9491 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9493 if (!seen_first_offset)
9494 error (_("No location lists in .debug_info section!\n"));
9496 if (debug_information [first].loc_offsets [0] != 0)
9497 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9498 debug_information [first].loc_offsets [0]);
9500 printf (_("Contents of the .debug_loc section:\n\n"));
9501 printf (_(" Offset Begin End Expression\n"));
9503 seen_first_offset = 0;
9504 for (i = first; i < num_debug_info_entries; i++)
9506 unsigned long begin;
9508 unsigned short length;
9509 unsigned long offset;
9510 unsigned int pointer_size;
9511 unsigned long cu_offset;
9512 unsigned long base_address;
9513 int need_frame_base;
9516 pointer_size = debug_information [i].pointer_size;
9517 cu_offset = debug_information [i].cu_offset;
9519 for (j = 0; j < debug_information [i].num_loc_offsets; j++)
9521 has_frame_base = debug_information [i].have_frame_base [j];
9522 offset = debug_information [i].loc_offsets [j];
9523 next = section_begin + offset;
9524 base_address = debug_information [i].base_address;
9526 if (!seen_first_offset)
9527 seen_first_offset = 1;
9531 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9532 start - section_begin, next - section_begin);
9533 else if (start > next)
9534 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9535 start - section_begin, next - section_begin);
9541 begin = byte_get (start, pointer_size);
9542 start += pointer_size;
9543 end = byte_get (start, pointer_size);
9544 start += pointer_size;
9546 if (begin == 0 && end == 0)
9549 /* Check base address specifiers. */
9550 if (begin == -1UL && end != -1UL)
9553 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
9554 offset, begin, end);
9558 length = byte_get (start, 2);
9561 printf (" %8.8lx %8.8lx %8.8lx (",
9562 offset, begin + base_address, end + base_address);
9563 need_frame_base = decode_location_expression (start,
9569 if (need_frame_base && !has_frame_base)
9570 printf (_(" [without DW_AT_frame_base]"));
9573 fputs (_(" (start == end)"), stdout);
9574 else if (begin > end)
9575 fputs (_(" (start > end)"), stdout);
9582 fputs (_(" <End of list>\n"), stdout);
9589 display_debug_str (Elf_Internal_Shdr *section,
9590 unsigned char *start,
9591 FILE *file ATTRIBUTE_UNUSED)
9593 unsigned long bytes;
9596 addr = section->sh_addr;
9597 bytes = section->sh_size;
9601 printf (_("\nThe .debug_str section is empty.\n"));
9605 printf (_("Contents of the .debug_str section:\n\n"));
9613 lbytes = (bytes > 16 ? 16 : bytes);
9615 printf (" 0x%8.8lx ", (unsigned long) addr);
9617 for (j = 0; j < 16; j++)
9620 printf ("%2.2x", start[j]);
9628 for (j = 0; j < lbytes; j++)
9631 if (k >= ' ' && k < 0x80)
9651 display_debug_info (Elf_Internal_Shdr * section,
9652 unsigned char * start, FILE * file)
9654 return process_debug_info (section, start, file, 0);
9659 display_debug_aranges (Elf_Internal_Shdr *section,
9660 unsigned char *start,
9661 FILE *file ATTRIBUTE_UNUSED)
9663 unsigned char *end = start + section->sh_size;
9665 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
9669 unsigned char *hdrptr;
9670 DWARF2_Internal_ARange arange;
9671 unsigned char *ranges;
9672 unsigned long length;
9673 unsigned long address;
9676 int initial_length_size;
9680 arange.ar_length = byte_get (hdrptr, 4);
9683 if (arange.ar_length == 0xffffffff)
9685 arange.ar_length = byte_get (hdrptr, 8);
9688 initial_length_size = 12;
9693 initial_length_size = 4;
9696 arange.ar_version = byte_get (hdrptr, 2);
9699 arange.ar_info_offset = byte_get (hdrptr, offset_size);
9700 hdrptr += offset_size;
9702 arange.ar_pointer_size = byte_get (hdrptr, 1);
9705 arange.ar_segment_size = byte_get (hdrptr, 1);
9708 if (arange.ar_version != 2 && arange.ar_version != 3)
9710 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
9714 printf (_(" Length: %ld\n"), arange.ar_length);
9715 printf (_(" Version: %d\n"), arange.ar_version);
9716 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
9717 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
9718 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
9720 printf (_("\n Address Length\n"));
9724 /* Must pad to an alignment boundary that is twice the pointer size. */
9725 excess = (hdrptr - start) % (2 * arange.ar_pointer_size);
9727 ranges += (2 * arange.ar_pointer_size) - excess;
9731 address = byte_get (ranges, arange.ar_pointer_size);
9733 ranges += arange.ar_pointer_size;
9735 length = byte_get (ranges, arange.ar_pointer_size);
9737 ranges += arange.ar_pointer_size;
9739 /* A pair of zeros marks the end of the list. */
9740 if (address == 0 && length == 0)
9743 printf (" %8.8lx %lu\n", address, length);
9746 start += arange.ar_length + initial_length_size;
9755 display_64bit_debug_ranges (unsigned char * start, unsigned char * end)
9757 bfd_vma base_address = 0;
9763 a = byte_get (start, 8);
9764 b = byte_get (start + 8, 8);
9766 if (a == 0xffffffffffffffffLL)
9768 printf (_(" set base address to "));
9769 print_vma (b, PREFIX_HEX);
9772 else if (a == 0 && b == 0)
9773 printf ( _("end of range"));
9775 printf (_(" <corrupt range entry, start is greater than end>"));
9776 else if (base_address == 0)
9778 printf ("range from base address + ");
9779 print_vma (a, PREFIX_HEX);
9780 printf (" to base address + ");
9781 print_vma (b, PREFIX_HEX);
9785 printf ("range from ");
9786 print_vma (base_address + a, PREFIX_HEX);
9788 print_vma (base_address + b, PREFIX_HEX);
9799 display_debug_ranges (Elf_Internal_Shdr *section,
9800 unsigned char *start,
9801 FILE *file ATTRIBUTE_UNUSED)
9803 unsigned long base_address = 0;
9804 unsigned char *end = start + section->sh_size;
9806 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
9813 a = byte_get (start, 4);
9814 b = byte_get (start + 4, 4);
9816 if (a == 0xffffffff)
9818 /* Attempt to handle 64-bit DWARF3 format. This assumes
9819 that in a 32-bit DWARF3 file the base address will
9820 never be 0xffffffff, and that the .debug_ranges section
9821 will never contain a mixture of 32-bit and 64-bit entries. */
9822 if (b == 0xffffffff)
9823 return display_64bit_debug_ranges (start, end);
9825 printf (_(" set base address to 0x%lx\n"), b);
9828 else if (a == 0 && b == 0)
9829 printf (_(" end of range\n"));
9831 printf (_(" <corrupt range entry, start is greater than end>\n"));
9832 else if (base_address == 0)
9833 printf (_(" range from base address + 0x%lx to base address + 0x%lx\n"), a, b);
9835 printf (_(" range from 0x%lx to 0x%lx\n"), base_address + a, base_address + b);
9843 typedef struct Frame_Chunk
9845 struct Frame_Chunk *next;
9846 unsigned char *chunk_start;
9848 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
9849 short int *col_type;
9852 unsigned int code_factor;
9854 unsigned long pc_begin;
9855 unsigned long pc_range;
9859 unsigned char fde_encoding;
9860 unsigned char cfa_exp;
9864 /* A marker for a col_type that means this column was never referenced
9865 in the frame info. */
9866 #define DW_CFA_unreferenced (-1)
9869 frame_need_space (Frame_Chunk *fc, int reg)
9871 int prev = fc->ncols;
9873 if (reg < fc->ncols)
9876 fc->ncols = reg + 1;
9877 fc->col_type = xrealloc (fc->col_type, fc->ncols * sizeof (short int));
9878 fc->col_offset = xrealloc (fc->col_offset, fc->ncols * sizeof (int));
9880 while (prev < fc->ncols)
9882 fc->col_type[prev] = DW_CFA_unreferenced;
9883 fc->col_offset[prev] = 0;
9889 frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
9894 if (*max_regs < fc->ncols)
9895 *max_regs = fc->ncols;
9897 if (*need_col_headers)
9899 *need_col_headers = 0;
9901 printf (" LOC CFA ");
9903 for (r = 0; r < *max_regs; r++)
9904 if (fc->col_type[r] != DW_CFA_unreferenced)
9909 printf ("r%-4d", r);
9915 printf ("%08lx ", fc->pc_begin);
9917 strcpy (tmp, "exp");
9919 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
9920 printf ("%-8s ", tmp);
9922 for (r = 0; r < fc->ncols; r++)
9924 if (fc->col_type[r] != DW_CFA_unreferenced)
9926 switch (fc->col_type[r])
9928 case DW_CFA_undefined:
9931 case DW_CFA_same_value:
9935 sprintf (tmp, "c%+d", fc->col_offset[r]);
9937 case DW_CFA_register:
9938 sprintf (tmp, "r%d", fc->col_offset[r]);
9940 case DW_CFA_expression:
9941 strcpy (tmp, "exp");
9944 strcpy (tmp, "n/a");
9947 printf ("%-5s", tmp);
9954 size_of_encoded_value (int encoding)
9956 switch (encoding & 0x7)
9959 case 0: return is_32bit_elf ? 4 : 8;
9967 get_encoded_value (unsigned char *data, int encoding)
9969 int size = size_of_encoded_value (encoding);
9970 if (encoding & DW_EH_PE_signed)
9971 return byte_get_signed (data, size);
9973 return byte_get (data, size);
9976 #define GET(N) byte_get (start, N); start += N
9977 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
9978 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
9981 display_debug_frames (Elf_Internal_Shdr *section,
9982 unsigned char *start,
9983 FILE *file ATTRIBUTE_UNUSED)
9985 unsigned char *end = start + section->sh_size;
9986 unsigned char *section_start = start;
9987 Frame_Chunk *chunks = 0;
9988 Frame_Chunk *remembered_state = 0;
9990 int is_eh = streq (SECTION_NAME (section), ".eh_frame");
9993 int addr_size = is_32bit_elf ? 4 : 8;
9995 printf (_("The section %s contains:\n"), SECTION_NAME (section));
9999 unsigned char *saved_start;
10000 unsigned char *block_end;
10001 unsigned long length;
10002 unsigned long cie_id;
10005 int need_col_headers = 1;
10006 unsigned char *augmentation_data = NULL;
10007 unsigned long augmentation_data_len = 0;
10008 int encoded_ptr_size = addr_size;
10010 int initial_length_size;
10012 saved_start = start;
10013 length = byte_get (start, 4); start += 4;
10017 printf ("\n%08lx ZERO terminator\n\n",
10018 (unsigned long)(saved_start - section_start));
10022 if (length == 0xffffffff)
10024 length = byte_get (start, 8);
10027 initial_length_size = 12;
10032 initial_length_size = 4;
10035 block_end = saved_start + length + initial_length_size;
10036 cie_id = byte_get (start, offset_size); start += offset_size;
10038 if (elf_header.e_type == ET_REL
10039 && !debug_apply_rela_addends (file, section, offset_size,
10040 section_start, start, block_end))
10043 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
10047 fc = xmalloc (sizeof (Frame_Chunk));
10048 memset (fc, 0, sizeof (Frame_Chunk));
10052 fc->chunk_start = saved_start;
10054 fc->col_type = xmalloc (sizeof (short int));
10055 fc->col_offset = xmalloc (sizeof (int));
10056 frame_need_space (fc, max_regs-1);
10058 version = *start++;
10060 fc->augmentation = start;
10061 start = strchr (start, '\0') + 1;
10063 if (fc->augmentation[0] == 'z')
10065 fc->code_factor = LEB ();
10066 fc->data_factor = SLEB ();
10075 augmentation_data_len = LEB ();
10076 augmentation_data = start;
10077 start += augmentation_data_len;
10079 else if (streq (fc->augmentation, "eh"))
10081 start += addr_size;
10082 fc->code_factor = LEB ();
10083 fc->data_factor = SLEB ();
10095 fc->code_factor = LEB ();
10096 fc->data_factor = SLEB ();
10108 if (do_debug_frames_interp)
10109 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10110 (unsigned long)(saved_start - section_start), length, cie_id,
10111 fc->augmentation, fc->code_factor, fc->data_factor,
10115 printf ("\n%08lx %08lx %08lx CIE\n",
10116 (unsigned long)(saved_start - section_start), length, cie_id);
10117 printf (" Version: %d\n", version);
10118 printf (" Augmentation: \"%s\"\n", fc->augmentation);
10119 printf (" Code alignment factor: %u\n", fc->code_factor);
10120 printf (" Data alignment factor: %d\n", fc->data_factor);
10121 printf (" Return address column: %d\n", fc->ra);
10123 if (augmentation_data_len)
10126 printf (" Augmentation data: ");
10127 for (i = 0; i < augmentation_data_len; ++i)
10128 printf (" %02x", augmentation_data[i]);
10134 if (augmentation_data_len)
10136 unsigned char *p, *q;
10137 p = fc->augmentation + 1;
10138 q = augmentation_data;
10144 else if (*p == 'P')
10145 q += 1 + size_of_encoded_value (*q);
10146 else if (*p == 'R')
10147 fc->fde_encoding = *q++;
10153 if (fc->fde_encoding)
10154 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10157 frame_need_space (fc, fc->ra);
10161 unsigned char *look_for;
10162 static Frame_Chunk fde_fc;
10165 memset (fc, 0, sizeof (Frame_Chunk));
10167 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
10169 for (cie = chunks; cie ; cie = cie->next)
10170 if (cie->chunk_start == look_for)
10175 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10176 cie_id, saved_start);
10179 fc->col_type = xmalloc (sizeof (short int));
10180 fc->col_offset = xmalloc (sizeof (int));
10181 frame_need_space (fc, max_regs - 1);
10183 fc->augmentation = "";
10184 fc->fde_encoding = 0;
10188 fc->ncols = cie->ncols;
10189 fc->col_type = xmalloc (fc->ncols * sizeof (short int));
10190 fc->col_offset = xmalloc (fc->ncols * sizeof (int));
10191 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
10192 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
10193 fc->augmentation = cie->augmentation;
10194 fc->code_factor = cie->code_factor;
10195 fc->data_factor = cie->data_factor;
10196 fc->cfa_reg = cie->cfa_reg;
10197 fc->cfa_offset = cie->cfa_offset;
10199 frame_need_space (fc, max_regs-1);
10200 fc->fde_encoding = cie->fde_encoding;
10203 if (fc->fde_encoding)
10204 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
10206 fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
10207 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10208 /* Don't adjust for ET_REL since there's invariably a pcrel
10209 reloc here, which we haven't applied. */
10210 && elf_header.e_type != ET_REL)
10211 fc->pc_begin += section->sh_addr + (start - section_start);
10212 start += encoded_ptr_size;
10213 fc->pc_range = byte_get (start, encoded_ptr_size);
10214 start += encoded_ptr_size;
10216 if (cie->augmentation[0] == 'z')
10218 augmentation_data_len = LEB ();
10219 augmentation_data = start;
10220 start += augmentation_data_len;
10223 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10224 (unsigned long)(saved_start - section_start), length, cie_id,
10225 (unsigned long)(cie->chunk_start - section_start),
10226 fc->pc_begin, fc->pc_begin + fc->pc_range);
10227 if (! do_debug_frames_interp && augmentation_data_len)
10231 printf (" Augmentation data: ");
10232 for (i = 0; i < augmentation_data_len; ++i)
10233 printf (" %02x", augmentation_data[i]);
10239 /* At this point, fc is the current chunk, cie (if any) is set, and
10240 we're about to interpret instructions for the chunk. */
10241 /* ??? At present we need to do this always, since this sizes the
10242 fc->col_type and fc->col_offset arrays, which we write into always.
10243 We should probably split the interpreted and non-interpreted bits
10244 into two different routines, since there's so much that doesn't
10245 really overlap between them. */
10246 if (1 || do_debug_frames_interp)
10248 /* Start by making a pass over the chunk, allocating storage
10249 and taking note of what registers are used. */
10250 unsigned char *tmp = start;
10252 while (start < block_end)
10255 unsigned long reg, tmp;
10262 /* Warning: if you add any more cases to this switch, be
10263 sure to add them to the corresponding switch below. */
10266 case DW_CFA_advance_loc:
10268 case DW_CFA_offset:
10270 frame_need_space (fc, opa);
10271 fc->col_type[opa] = DW_CFA_undefined;
10273 case DW_CFA_restore:
10274 frame_need_space (fc, opa);
10275 fc->col_type[opa] = DW_CFA_undefined;
10277 case DW_CFA_set_loc:
10278 start += encoded_ptr_size;
10280 case DW_CFA_advance_loc1:
10283 case DW_CFA_advance_loc2:
10286 case DW_CFA_advance_loc4:
10289 case DW_CFA_offset_extended:
10290 reg = LEB (); LEB ();
10291 frame_need_space (fc, reg);
10292 fc->col_type[reg] = DW_CFA_undefined;
10294 case DW_CFA_restore_extended:
10296 frame_need_space (fc, reg);
10297 fc->col_type[reg] = DW_CFA_undefined;
10299 case DW_CFA_undefined:
10301 frame_need_space (fc, reg);
10302 fc->col_type[reg] = DW_CFA_undefined;
10304 case DW_CFA_same_value:
10306 frame_need_space (fc, reg);
10307 fc->col_type[reg] = DW_CFA_undefined;
10309 case DW_CFA_register:
10310 reg = LEB (); LEB ();
10311 frame_need_space (fc, reg);
10312 fc->col_type[reg] = DW_CFA_undefined;
10314 case DW_CFA_def_cfa:
10317 case DW_CFA_def_cfa_register:
10320 case DW_CFA_def_cfa_offset:
10323 case DW_CFA_def_cfa_expression:
10327 case DW_CFA_expression:
10331 frame_need_space (fc, reg);
10332 fc->col_type[reg] = DW_CFA_undefined;
10334 case DW_CFA_offset_extended_sf:
10335 reg = LEB (); SLEB ();
10336 frame_need_space (fc, reg);
10337 fc->col_type[reg] = DW_CFA_undefined;
10339 case DW_CFA_def_cfa_sf:
10342 case DW_CFA_def_cfa_offset_sf:
10345 case DW_CFA_MIPS_advance_loc8:
10348 case DW_CFA_GNU_args_size:
10351 case DW_CFA_GNU_negative_offset_extended:
10352 reg = LEB (); LEB ();
10353 frame_need_space (fc, reg);
10354 fc->col_type[reg] = DW_CFA_undefined;
10363 /* Now we know what registers are used, make a second pass over
10364 the chunk, this time actually printing out the info. */
10366 while (start < block_end)
10369 unsigned long ul, reg, roffs;
10378 /* Warning: if you add any more cases to this switch, be
10379 sure to add them to the corresponding switch above. */
10382 case DW_CFA_advance_loc:
10383 if (do_debug_frames_interp)
10384 frame_display_row (fc, &need_col_headers, &max_regs);
10386 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10387 opa * fc->code_factor,
10388 fc->pc_begin + opa * fc->code_factor);
10389 fc->pc_begin += opa * fc->code_factor;
10392 case DW_CFA_offset:
10394 if (! do_debug_frames_interp)
10395 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10396 opa, roffs * fc->data_factor);
10397 fc->col_type[opa] = DW_CFA_offset;
10398 fc->col_offset[opa] = roffs * fc->data_factor;
10401 case DW_CFA_restore:
10402 if (! do_debug_frames_interp)
10403 printf (" DW_CFA_restore: r%d\n", opa);
10404 fc->col_type[opa] = cie->col_type[opa];
10405 fc->col_offset[opa] = cie->col_offset[opa];
10408 case DW_CFA_set_loc:
10409 vma = get_encoded_value (start, fc->fde_encoding);
10410 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel
10411 && elf_header.e_type != ET_REL)
10412 vma += section->sh_addr + (start - section_start);
10413 start += encoded_ptr_size;
10414 if (do_debug_frames_interp)
10415 frame_display_row (fc, &need_col_headers, &max_regs);
10417 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
10418 fc->pc_begin = vma;
10421 case DW_CFA_advance_loc1:
10422 ofs = byte_get (start, 1); start += 1;
10423 if (do_debug_frames_interp)
10424 frame_display_row (fc, &need_col_headers, &max_regs);
10426 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10427 ofs * fc->code_factor,
10428 fc->pc_begin + ofs * fc->code_factor);
10429 fc->pc_begin += ofs * fc->code_factor;
10432 case DW_CFA_advance_loc2:
10433 ofs = byte_get (start, 2); start += 2;
10434 if (do_debug_frames_interp)
10435 frame_display_row (fc, &need_col_headers, &max_regs);
10437 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10438 ofs * fc->code_factor,
10439 fc->pc_begin + ofs * fc->code_factor);
10440 fc->pc_begin += ofs * fc->code_factor;
10443 case DW_CFA_advance_loc4:
10444 ofs = byte_get (start, 4); start += 4;
10445 if (do_debug_frames_interp)
10446 frame_display_row (fc, &need_col_headers, &max_regs);
10448 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10449 ofs * fc->code_factor,
10450 fc->pc_begin + ofs * fc->code_factor);
10451 fc->pc_begin += ofs * fc->code_factor;
10454 case DW_CFA_offset_extended:
10457 if (! do_debug_frames_interp)
10458 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10459 reg, roffs * fc->data_factor);
10460 fc->col_type[reg] = DW_CFA_offset;
10461 fc->col_offset[reg] = roffs * fc->data_factor;
10464 case DW_CFA_restore_extended:
10466 if (! do_debug_frames_interp)
10467 printf (" DW_CFA_restore_extended: r%ld\n", reg);
10468 fc->col_type[reg] = cie->col_type[reg];
10469 fc->col_offset[reg] = cie->col_offset[reg];
10472 case DW_CFA_undefined:
10474 if (! do_debug_frames_interp)
10475 printf (" DW_CFA_undefined: r%ld\n", reg);
10476 fc->col_type[reg] = DW_CFA_undefined;
10477 fc->col_offset[reg] = 0;
10480 case DW_CFA_same_value:
10482 if (! do_debug_frames_interp)
10483 printf (" DW_CFA_same_value: r%ld\n", reg);
10484 fc->col_type[reg] = DW_CFA_same_value;
10485 fc->col_offset[reg] = 0;
10488 case DW_CFA_register:
10491 if (! do_debug_frames_interp)
10492 printf (" DW_CFA_register: r%ld in r%ld\n", reg, roffs);
10493 fc->col_type[reg] = DW_CFA_register;
10494 fc->col_offset[reg] = roffs;
10497 case DW_CFA_remember_state:
10498 if (! do_debug_frames_interp)
10499 printf (" DW_CFA_remember_state\n");
10500 rs = xmalloc (sizeof (Frame_Chunk));
10501 rs->ncols = fc->ncols;
10502 rs->col_type = xmalloc (rs->ncols * sizeof (short int));
10503 rs->col_offset = xmalloc (rs->ncols * sizeof (int));
10504 memcpy (rs->col_type, fc->col_type, rs->ncols);
10505 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
10506 rs->next = remembered_state;
10507 remembered_state = rs;
10510 case DW_CFA_restore_state:
10511 if (! do_debug_frames_interp)
10512 printf (" DW_CFA_restore_state\n");
10513 rs = remembered_state;
10516 remembered_state = rs->next;
10517 frame_need_space (fc, rs->ncols-1);
10518 memcpy (fc->col_type, rs->col_type, rs->ncols);
10519 memcpy (fc->col_offset, rs->col_offset,
10520 rs->ncols * sizeof (int));
10521 free (rs->col_type);
10522 free (rs->col_offset);
10525 else if (do_debug_frames_interp)
10526 printf ("Mismatched DW_CFA_restore_state\n");
10529 case DW_CFA_def_cfa:
10530 fc->cfa_reg = LEB ();
10531 fc->cfa_offset = LEB ();
10533 if (! do_debug_frames_interp)
10534 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10535 fc->cfa_reg, fc->cfa_offset);
10538 case DW_CFA_def_cfa_register:
10539 fc->cfa_reg = LEB ();
10541 if (! do_debug_frames_interp)
10542 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
10545 case DW_CFA_def_cfa_offset:
10546 fc->cfa_offset = LEB ();
10547 if (! do_debug_frames_interp)
10548 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
10552 if (! do_debug_frames_interp)
10553 printf (" DW_CFA_nop\n");
10556 case DW_CFA_def_cfa_expression:
10558 if (! do_debug_frames_interp)
10560 printf (" DW_CFA_def_cfa_expression (");
10561 decode_location_expression (start, addr_size, ul, 0);
10568 case DW_CFA_expression:
10571 if (! do_debug_frames_interp)
10573 printf (" DW_CFA_expression: r%ld (", reg);
10574 decode_location_expression (start, addr_size, ul, 0);
10577 fc->col_type[reg] = DW_CFA_expression;
10581 case DW_CFA_offset_extended_sf:
10584 frame_need_space (fc, reg);
10585 if (! do_debug_frames_interp)
10586 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10587 reg, l * fc->data_factor);
10588 fc->col_type[reg] = DW_CFA_offset;
10589 fc->col_offset[reg] = l * fc->data_factor;
10592 case DW_CFA_def_cfa_sf:
10593 fc->cfa_reg = LEB ();
10594 fc->cfa_offset = SLEB ();
10596 if (! do_debug_frames_interp)
10597 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10598 fc->cfa_reg, fc->cfa_offset);
10601 case DW_CFA_def_cfa_offset_sf:
10602 fc->cfa_offset = SLEB ();
10603 if (! do_debug_frames_interp)
10604 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
10607 case DW_CFA_MIPS_advance_loc8:
10608 ofs = byte_get (start, 8); start += 8;
10609 if (do_debug_frames_interp)
10610 frame_display_row (fc, &need_col_headers, &max_regs);
10612 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10613 ofs * fc->code_factor,
10614 fc->pc_begin + ofs * fc->code_factor);
10615 fc->pc_begin += ofs * fc->code_factor;
10618 case DW_CFA_GNU_window_save:
10619 if (! do_debug_frames_interp)
10620 printf (" DW_CFA_GNU_window_save\n");
10623 case DW_CFA_GNU_args_size:
10625 if (! do_debug_frames_interp)
10626 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
10629 case DW_CFA_GNU_negative_offset_extended:
10632 frame_need_space (fc, reg);
10633 if (! do_debug_frames_interp)
10634 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10635 reg, l * fc->data_factor);
10636 fc->col_type[reg] = DW_CFA_offset;
10637 fc->col_offset[reg] = l * fc->data_factor;
10641 warn (_("unsupported or unknown DW_CFA_%d\n"), op);
10646 if (do_debug_frames_interp)
10647 frame_display_row (fc, &need_col_headers, &max_regs);
10662 display_debug_not_supported (Elf_Internal_Shdr *section,
10663 unsigned char *start ATTRIBUTE_UNUSED,
10664 FILE *file ATTRIBUTE_UNUSED)
10666 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10667 SECTION_NAME (section));
10672 /* A structure containing the name of a debug section
10673 and a pointer to a function that can decode it. */
10676 const char *const name;
10677 int (*display) (Elf_Internal_Shdr *, unsigned char *, FILE *);
10681 { ".debug_abbrev", display_debug_abbrev },
10682 { ".debug_aranges", display_debug_aranges },
10683 { ".debug_frame", display_debug_frames },
10684 { ".debug_info", display_debug_info },
10685 { ".debug_line", display_debug_lines },
10686 { ".debug_pubnames", display_debug_pubnames },
10687 { ".eh_frame", display_debug_frames },
10688 { ".debug_macinfo", display_debug_macinfo },
10689 { ".debug_str", display_debug_str },
10690 { ".debug_loc", display_debug_loc },
10691 { ".debug_pubtypes", display_debug_pubnames },
10692 { ".debug_ranges", display_debug_ranges },
10693 { ".debug_static_func", display_debug_not_supported },
10694 { ".debug_static_vars", display_debug_not_supported },
10695 { ".debug_types", display_debug_not_supported },
10696 { ".debug_weaknames", display_debug_not_supported }
10700 display_debug_section (Elf_Internal_Shdr *section, FILE *file)
10702 char *name = SECTION_NAME (section);
10703 bfd_size_type length;
10707 length = section->sh_size;
10710 printf (_("\nSection '%s' has no debugging data.\n"), name);
10714 if (strneq (name, ".gnu.linkonce.wi.", 17))
10715 name = ".debug_info";
10717 /* See if we know how to display the contents of this section. */
10718 for (i = NUM_ELEM (debug_displays); i--;)
10719 if (streq (debug_displays[i].name, name))
10721 unsigned char *start;
10723 start = get_data (NULL, file, section->sh_offset, length,
10724 _("debug section data"));
10731 result &= debug_displays[i].display (section, start, file);
10734 /* If we loaded in the abbrev section
10735 at some point, we must release it here. */
10743 printf (_("Unrecognized debug section: %s\n"), name);
10751 process_section_contents (FILE *file)
10753 Elf_Internal_Shdr *section;
10759 for (i = 0, section = section_headers;
10760 i < elf_header.e_shnum && i < num_dump_sects;
10763 #ifdef SUPPORT_DISASSEMBLY
10764 if (dump_sects[i] & DISASS_DUMP)
10765 disassemble_section (section, file);
10767 if (dump_sects[i] & HEX_DUMP)
10768 dump_section (section, file);
10770 if (dump_sects[i] & DEBUG_DUMP)
10771 display_debug_section (section, file);
10774 /* Check to see if the user requested a
10775 dump of a section that does not exist. */
10776 while (i++ < num_dump_sects)
10778 warn (_("Section %d was not dumped because it does not exist!\n"), i);
10782 process_mips_fpe_exception (int mask)
10787 if (mask & OEX_FPU_INEX)
10788 fputs ("INEX", stdout), first = 0;
10789 if (mask & OEX_FPU_UFLO)
10790 printf ("%sUFLO", first ? "" : "|"), first = 0;
10791 if (mask & OEX_FPU_OFLO)
10792 printf ("%sOFLO", first ? "" : "|"), first = 0;
10793 if (mask & OEX_FPU_DIV0)
10794 printf ("%sDIV0", first ? "" : "|"), first = 0;
10795 if (mask & OEX_FPU_INVAL)
10796 printf ("%sINVAL", first ? "" : "|");
10799 fputs ("0", stdout);
10803 process_mips_specific (FILE *file)
10805 Elf_Internal_Dyn *entry;
10806 size_t liblist_offset = 0;
10807 size_t liblistno = 0;
10808 size_t conflictsno = 0;
10809 size_t options_offset = 0;
10810 size_t conflicts_offset = 0;
10812 /* We have a lot of special sections. Thanks SGI! */
10813 if (dynamic_section == NULL)
10814 /* No information available. */
10817 for (entry = dynamic_section; entry->d_tag != DT_NULL; ++entry)
10818 switch (entry->d_tag)
10820 case DT_MIPS_LIBLIST:
10822 = offset_from_vma (file, entry->d_un.d_val,
10823 liblistno * sizeof (Elf32_External_Lib));
10825 case DT_MIPS_LIBLISTNO:
10826 liblistno = entry->d_un.d_val;
10828 case DT_MIPS_OPTIONS:
10829 options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
10831 case DT_MIPS_CONFLICT:
10833 = offset_from_vma (file, entry->d_un.d_val,
10834 conflictsno * sizeof (Elf32_External_Conflict));
10836 case DT_MIPS_CONFLICTNO:
10837 conflictsno = entry->d_un.d_val;
10843 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
10845 Elf32_External_Lib *elib;
10848 elib = get_data (NULL, file, liblist_offset,
10849 liblistno * sizeof (Elf32_External_Lib),
10853 printf ("\nSection '.liblist' contains %lu entries:\n",
10854 (unsigned long) liblistno);
10855 fputs (" Library Time Stamp Checksum Version Flags\n",
10858 for (cnt = 0; cnt < liblistno; ++cnt)
10865 liblist.l_name = BYTE_GET (elib[cnt].l_name);
10866 time = BYTE_GET (elib[cnt].l_time_stamp);
10867 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
10868 liblist.l_version = BYTE_GET (elib[cnt].l_version);
10869 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
10871 tmp = gmtime (&time);
10872 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
10873 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10874 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10876 printf ("%3lu: ", (unsigned long) cnt);
10877 if (VALID_DYNAMIC_NAME (liblist.l_name))
10878 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
10880 printf ("<corrupt: %9ld>", liblist.l_name);
10881 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
10882 liblist.l_version);
10884 if (liblist.l_flags == 0)
10888 static const struct
10895 { " EXACT_MATCH", LL_EXACT_MATCH },
10896 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
10897 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
10898 { " EXPORTS", LL_EXPORTS },
10899 { " DELAY_LOAD", LL_DELAY_LOAD },
10900 { " DELTA", LL_DELTA }
10902 int flags = liblist.l_flags;
10906 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
10908 if ((flags & l_flags_vals[fcnt].bit) != 0)
10910 fputs (l_flags_vals[fcnt].name, stdout);
10911 flags ^= l_flags_vals[fcnt].bit;
10914 printf (" %#x", (unsigned int) flags);
10924 if (options_offset != 0)
10926 Elf_External_Options *eopt;
10927 Elf_Internal_Shdr *sect = section_headers;
10928 Elf_Internal_Options *iopt;
10929 Elf_Internal_Options *option;
10933 /* Find the section header so that we get the size. */
10934 while (sect->sh_type != SHT_MIPS_OPTIONS)
10937 eopt = get_data (NULL, file, options_offset, sect->sh_size,
10941 iopt = malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt));
10944 error (_("Out of memory"));
10951 while (offset < sect->sh_size)
10953 Elf_External_Options *eoption;
10955 eoption = (Elf_External_Options *) ((char *) eopt + offset);
10957 option->kind = BYTE_GET (eoption->kind);
10958 option->size = BYTE_GET (eoption->size);
10959 option->section = BYTE_GET (eoption->section);
10960 option->info = BYTE_GET (eoption->info);
10962 offset += option->size;
10968 printf (_("\nSection '%s' contains %d entries:\n"),
10969 SECTION_NAME (sect), cnt);
10977 switch (option->kind)
10980 /* This shouldn't happen. */
10981 printf (" NULL %d %lx", option->section, option->info);
10984 printf (" REGINFO ");
10985 if (elf_header.e_machine == EM_MIPS)
10988 Elf32_External_RegInfo *ereg;
10989 Elf32_RegInfo reginfo;
10991 ereg = (Elf32_External_RegInfo *) (option + 1);
10992 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
10993 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
10994 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
10995 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
10996 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
10997 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
10999 printf ("GPR %08lx GP 0x%lx\n",
11000 reginfo.ri_gprmask,
11001 (unsigned long) reginfo.ri_gp_value);
11002 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11003 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11004 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11009 Elf64_External_RegInfo *ereg;
11010 Elf64_Internal_RegInfo reginfo;
11012 ereg = (Elf64_External_RegInfo *) (option + 1);
11013 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
11014 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
11015 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
11016 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
11017 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
11018 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
11020 printf ("GPR %08lx GP 0x",
11021 reginfo.ri_gprmask);
11022 printf_vma (reginfo.ri_gp_value);
11025 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11026 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
11027 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
11031 case ODK_EXCEPTIONS:
11032 fputs (" EXCEPTIONS fpe_min(", stdout);
11033 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
11034 fputs (") fpe_max(", stdout);
11035 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
11036 fputs (")", stdout);
11038 if (option->info & OEX_PAGE0)
11039 fputs (" PAGE0", stdout);
11040 if (option->info & OEX_SMM)
11041 fputs (" SMM", stdout);
11042 if (option->info & OEX_FPDBUG)
11043 fputs (" FPDBUG", stdout);
11044 if (option->info & OEX_DISMISS)
11045 fputs (" DISMISS", stdout);
11048 fputs (" PAD ", stdout);
11049 if (option->info & OPAD_PREFIX)
11050 fputs (" PREFIX", stdout);
11051 if (option->info & OPAD_POSTFIX)
11052 fputs (" POSTFIX", stdout);
11053 if (option->info & OPAD_SYMBOL)
11054 fputs (" SYMBOL", stdout);
11057 fputs (" HWPATCH ", stdout);
11058 if (option->info & OHW_R4KEOP)
11059 fputs (" R4KEOP", stdout);
11060 if (option->info & OHW_R8KPFETCH)
11061 fputs (" R8KPFETCH", stdout);
11062 if (option->info & OHW_R5KEOP)
11063 fputs (" R5KEOP", stdout);
11064 if (option->info & OHW_R5KCVTL)
11065 fputs (" R5KCVTL", stdout);
11068 fputs (" FILL ", stdout);
11069 /* XXX Print content of info word? */
11072 fputs (" TAGS ", stdout);
11073 /* XXX Print content of info word? */
11076 fputs (" HWAND ", stdout);
11077 if (option->info & OHWA0_R4KEOP_CHECKED)
11078 fputs (" R4KEOP_CHECKED", stdout);
11079 if (option->info & OHWA0_R4KEOP_CLEAN)
11080 fputs (" R4KEOP_CLEAN", stdout);
11083 fputs (" HWOR ", stdout);
11084 if (option->info & OHWA0_R4KEOP_CHECKED)
11085 fputs (" R4KEOP_CHECKED", stdout);
11086 if (option->info & OHWA0_R4KEOP_CLEAN)
11087 fputs (" R4KEOP_CLEAN", stdout);
11090 printf (" GP_GROUP %#06lx self-contained %#06lx",
11091 option->info & OGP_GROUP,
11092 (option->info & OGP_SELF) >> 16);
11095 printf (" IDENT %#06lx self-contained %#06lx",
11096 option->info & OGP_GROUP,
11097 (option->info & OGP_SELF) >> 16);
11100 /* This shouldn't happen. */
11101 printf (" %3d ??? %d %lx",
11102 option->kind, option->section, option->info);
11106 len = sizeof (*eopt);
11107 while (len < option->size)
11108 if (((char *) option)[len] >= ' '
11109 && ((char *) option)[len] < 0x7f)
11110 printf ("%c", ((char *) option)[len++]);
11112 printf ("\\%03o", ((char *) option)[len++]);
11114 fputs ("\n", stdout);
11122 if (conflicts_offset != 0 && conflictsno != 0)
11124 Elf32_Conflict *iconf;
11127 if (dynamic_symbols == NULL)
11129 error (_("conflict list found without a dynamic symbol table"));
11133 iconf = malloc (conflictsno * sizeof (*iconf));
11136 error (_("Out of memory"));
11142 Elf32_External_Conflict *econf32;
11144 econf32 = get_data (NULL, file, conflicts_offset,
11145 conflictsno * sizeof (*econf32), _("conflict"));
11149 for (cnt = 0; cnt < conflictsno; ++cnt)
11150 iconf[cnt] = BYTE_GET (econf32[cnt]);
11156 Elf64_External_Conflict *econf64;
11158 econf64 = get_data (NULL, file, conflicts_offset,
11159 conflictsno * sizeof (*econf64), _("conflict"));
11163 for (cnt = 0; cnt < conflictsno; ++cnt)
11164 iconf[cnt] = BYTE_GET (econf64[cnt]);
11169 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11170 (unsigned long) conflictsno);
11171 puts (_(" Num: Index Value Name"));
11173 for (cnt = 0; cnt < conflictsno; ++cnt)
11175 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
11177 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
11178 print_vma (psym->st_value, FULL_HEX);
11180 if (VALID_DYNAMIC_NAME (psym->st_name))
11181 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11183 printf ("<corrupt: %14ld>", psym->st_name);
11194 process_gnu_liblist (FILE *file)
11196 Elf_Internal_Shdr *section, *string_sec;
11197 Elf32_External_Lib *elib;
11205 for (i = 0, section = section_headers;
11206 i < elf_header.e_shnum;
11209 switch (section->sh_type)
11211 case SHT_GNU_LIBLIST:
11212 elib = get_data (NULL, file, section->sh_offset, section->sh_size,
11217 string_sec = SECTION_HEADER (section->sh_link);
11219 strtab = get_data (NULL, file, string_sec->sh_offset,
11220 string_sec->sh_size, _("liblist string table"));
11223 || section->sh_entsize != sizeof (Elf32_External_Lib))
11229 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11230 SECTION_NAME (section),
11231 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
11233 puts (" Library Time Stamp Checksum Version Flags");
11235 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
11243 liblist.l_name = BYTE_GET (elib[cnt].l_name);
11244 time = BYTE_GET (elib[cnt].l_time_stamp);
11245 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
11246 liblist.l_version = BYTE_GET (elib[cnt].l_version);
11247 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
11249 tmp = gmtime (&time);
11250 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
11251 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11252 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11254 printf ("%3lu: ", (unsigned long) cnt);
11256 printf ("%-20s", strtab + liblist.l_name);
11258 printf ("%-20.20s", strtab + liblist.l_name);
11259 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
11260 liblist.l_version, liblist.l_flags);
11270 static const char *
11271 get_note_type (unsigned e_type)
11273 static char buff[64];
11275 if (elf_header.e_type == ET_CORE)
11279 return _("NT_AUXV (auxiliary vector)");
11281 return _("NT_PRSTATUS (prstatus structure)");
11283 return _("NT_FPREGSET (floating point registers)");
11285 return _("NT_PRPSINFO (prpsinfo structure)");
11286 case NT_TASKSTRUCT:
11287 return _("NT_TASKSTRUCT (task structure)");
11289 return _("NT_PRXFPREG (user_xfpregs structure)");
11291 return _("NT_PSTATUS (pstatus structure)");
11293 return _("NT_FPREGS (floating point registers)");
11295 return _("NT_PSINFO (psinfo structure)");
11297 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11299 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11300 case NT_WIN32PSTATUS:
11301 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11309 return _("NT_VERSION (version)");
11311 return _("NT_ARCH (architecture)");
11316 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
11320 static const char *
11321 get_netbsd_elfcore_note_type (unsigned e_type)
11323 static char buff[64];
11325 if (e_type == NT_NETBSDCORE_PROCINFO)
11327 /* NetBSD core "procinfo" structure. */
11328 return _("NetBSD procinfo structure");
11331 /* As of Jan 2002 there are no other machine-independent notes
11332 defined for NetBSD core files. If the note type is less
11333 than the start of the machine-dependent note types, we don't
11336 if (e_type < NT_NETBSDCORE_FIRSTMACH)
11338 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
11342 switch (elf_header.e_machine)
11344 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11345 and PT_GETFPREGS == mach+2. */
11350 case EM_SPARC32PLUS:
11354 case NT_NETBSDCORE_FIRSTMACH+0:
11355 return _("PT_GETREGS (reg structure)");
11356 case NT_NETBSDCORE_FIRSTMACH+2:
11357 return _("PT_GETFPREGS (fpreg structure)");
11363 /* On all other arch's, PT_GETREGS == mach+1 and
11364 PT_GETFPREGS == mach+3. */
11368 case NT_NETBSDCORE_FIRSTMACH+1:
11369 return _("PT_GETREGS (reg structure)");
11370 case NT_NETBSDCORE_FIRSTMACH+3:
11371 return _("PT_GETFPREGS (fpreg structure)");
11377 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
11381 /* Note that by the ELF standard, the name field is already null byte
11382 terminated, and namesz includes the terminating null byte.
11383 I.E. the value of namesz for the name "FSF" is 4.
11385 If the value of namesz is zero, there is no name present. */
11387 process_note (Elf_Internal_Note *pnote)
11391 if (pnote->namesz == 0)
11392 /* If there is no note name, then use the default set of
11393 note type strings. */
11394 nt = get_note_type (pnote->type);
11396 else if (strneq (pnote->namedata, "NetBSD-CORE", 11))
11397 /* NetBSD-specific core file notes. */
11398 nt = get_netbsd_elfcore_note_type (pnote->type);
11401 /* Don't recognize this note name; just use the default set of
11402 note type strings. */
11403 nt = get_note_type (pnote->type);
11405 printf (" %s\t\t0x%08lx\t%s\n",
11406 pnote->namesz ? pnote->namedata : "(NONE)",
11407 pnote->descsz, nt);
11413 process_corefile_note_segment (FILE *file, bfd_vma offset, bfd_vma length)
11415 Elf_External_Note *pnotes;
11416 Elf_External_Note *external;
11422 pnotes = get_data (NULL, file, offset, length, _("notes"));
11428 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11429 (unsigned long) offset, (unsigned long) length);
11430 printf (_(" Owner\t\tData size\tDescription\n"));
11432 while (external < (Elf_External_Note *)((char *) pnotes + length))
11434 Elf_External_Note *next;
11435 Elf_Internal_Note inote;
11438 inote.type = BYTE_GET (external->type);
11439 inote.namesz = BYTE_GET (external->namesz);
11440 inote.namedata = external->name;
11441 inote.descsz = BYTE_GET (external->descsz);
11442 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
11443 inote.descpos = offset + (inote.descdata - (char *) pnotes);
11445 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
11447 if (((char *) next) > (((char *) pnotes) + length))
11449 warn (_("corrupt note found at offset %x into core notes\n"),
11450 ((char *) external) - ((char *) pnotes));
11451 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11452 inote.type, inote.namesz, inote.descsz);
11458 /* Verify that name is null terminated. It appears that at least
11459 one version of Linux (RedHat 6.0) generates corefiles that don't
11460 comply with the ELF spec by failing to include the null byte in
11462 if (inote.namedata[inote.namesz] != '\0')
11464 temp = malloc (inote.namesz + 1);
11468 error (_("Out of memory\n"));
11473 strncpy (temp, inote.namedata, inote.namesz);
11474 temp[inote.namesz] = 0;
11476 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11477 inote.namedata = temp;
11480 res &= process_note (& inote);
11495 process_corefile_note_segments (FILE *file)
11497 Elf_Internal_Phdr *segment;
11501 if (! get_program_headers (file))
11504 for (i = 0, segment = program_headers;
11505 i < elf_header.e_phnum;
11508 if (segment->p_type == PT_NOTE)
11509 res &= process_corefile_note_segment (file,
11510 (bfd_vma) segment->p_offset,
11511 (bfd_vma) segment->p_filesz);
11518 process_note_sections (FILE *file)
11520 Elf_Internal_Shdr *section;
11524 for (i = 0, section = section_headers;
11525 i < elf_header.e_shnum;
11527 if (section->sh_type == SHT_NOTE)
11528 res &= process_corefile_note_segment (file,
11529 (bfd_vma) section->sh_offset,
11530 (bfd_vma) section->sh_size);
11536 process_notes (FILE *file)
11538 /* If we have not been asked to display the notes then do nothing. */
11542 if (elf_header.e_type != ET_CORE)
11543 return process_note_sections (file);
11545 /* No program headers means no NOTE segment. */
11546 if (elf_header.e_phnum > 0)
11547 return process_corefile_note_segments (file);
11549 printf (_("No note segments present in the core file.\n"));
11554 process_arch_specific (FILE *file)
11559 switch (elf_header.e_machine)
11562 case EM_MIPS_RS3_LE:
11563 return process_mips_specific (file);
11572 get_file_header (FILE *file)
11574 /* Read in the identity array. */
11575 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
11578 /* Determine how to read the rest of the header. */
11579 switch (elf_header.e_ident[EI_DATA])
11581 default: /* fall through */
11582 case ELFDATANONE: /* fall through */
11584 byte_get = byte_get_little_endian;
11585 byte_put = byte_put_little_endian;
11588 byte_get = byte_get_big_endian;
11589 byte_put = byte_put_big_endian;
11593 /* For now we only support 32 bit and 64 bit ELF files. */
11594 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
11596 /* Read in the rest of the header. */
11599 Elf32_External_Ehdr ehdr32;
11601 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
11604 elf_header.e_type = BYTE_GET (ehdr32.e_type);
11605 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
11606 elf_header.e_version = BYTE_GET (ehdr32.e_version);
11607 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
11608 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
11609 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
11610 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
11611 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
11612 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
11613 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
11614 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
11615 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
11616 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
11620 Elf64_External_Ehdr ehdr64;
11622 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11623 we will not be able to cope with the 64bit data found in
11624 64 ELF files. Detect this now and abort before we start
11625 overwriting things. */
11626 if (sizeof (bfd_vma) < 8)
11628 error (_("This instance of readelf has been built without support for a\n\
11629 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11633 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
11636 elf_header.e_type = BYTE_GET (ehdr64.e_type);
11637 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
11638 elf_header.e_version = BYTE_GET (ehdr64.e_version);
11639 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
11640 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
11641 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
11642 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
11643 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
11644 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
11645 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
11646 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
11647 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
11648 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
11651 if (elf_header.e_shoff)
11653 /* There may be some extensions in the first section header. Don't
11654 bomb if we can't read it. */
11656 get_32bit_section_headers (file, 1);
11658 get_64bit_section_headers (file, 1);
11664 /* Process one ELF object file according to the command line options.
11665 This file may actually be stored in an archive. The file is
11666 positioned at the start of the ELF object. */
11669 process_object (char *file_name, FILE *file)
11673 if (! get_file_header (file))
11675 error (_("%s: Failed to read file header\n"), file_name);
11679 /* Initialise per file variables. */
11680 for (i = NUM_ELEM (version_info); i--;)
11681 version_info[i] = 0;
11683 for (i = NUM_ELEM (dynamic_info); i--;)
11684 dynamic_info[i] = 0;
11686 /* Process the file. */
11688 printf (_("\nFile: %s\n"), file_name);
11690 /* Initialise the dump_sects array from the cmdline_dump_sects array.
11691 Note we do this even if cmdline_dump_sects is empty because we
11692 must make sure that the dump_sets array is zeroed out before each
11693 object file is processed. */
11694 if (num_dump_sects > num_cmdline_dump_sects)
11695 memset (dump_sects, 0, num_dump_sects);
11697 if (num_cmdline_dump_sects > 0)
11699 if (num_dump_sects == 0)
11700 /* A sneaky way of allocating the dump_sects array. */
11701 request_dump (num_cmdline_dump_sects, 0);
11703 assert (num_dump_sects >= num_cmdline_dump_sects);
11704 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
11707 if (! process_file_header ())
11710 if (! process_section_headers (file)
11711 || ! process_section_groups (file))
11713 /* Without loaded section headers and section groups we
11714 cannot process lots of things. */
11715 do_unwind = do_version = do_dump = do_arch = 0;
11717 if (! do_using_dynamic)
11718 do_syms = do_reloc = 0;
11721 if (process_program_headers (file))
11722 process_dynamic_section (file);
11724 process_relocs (file);
11726 process_unwind (file);
11728 process_symbol_table (file);
11730 process_syminfo (file);
11732 process_version_sections (file);
11734 process_section_contents (file);
11736 process_notes (file);
11738 process_gnu_liblist (file);
11740 process_arch_specific (file);
11742 if (program_headers)
11744 free (program_headers);
11745 program_headers = NULL;
11748 if (section_headers)
11750 free (section_headers);
11751 section_headers = NULL;
11756 free (string_table);
11757 string_table = NULL;
11758 string_table_length = 0;
11761 if (dynamic_strings)
11763 free (dynamic_strings);
11764 dynamic_strings = NULL;
11765 dynamic_strings_length = 0;
11768 if (dynamic_symbols)
11770 free (dynamic_symbols);
11771 dynamic_symbols = NULL;
11772 num_dynamic_syms = 0;
11775 if (dynamic_syminfo)
11777 free (dynamic_syminfo);
11778 dynamic_syminfo = NULL;
11781 if (section_headers_groups)
11783 free (section_headers_groups);
11784 section_headers_groups = NULL;
11787 if (section_groups)
11789 struct group_list *g, *next;
11791 for (i = 0; i < group_count; i++)
11793 for (g = section_groups [i].root; g != NULL; g = next)
11800 free (section_groups);
11801 section_groups = NULL;
11804 if (debug_information)
11806 for (i = 0; i < num_debug_info_entries; i++)
11807 if (!debug_information [i].max_loc_offsets)
11809 free (debug_information [i].loc_offsets);
11810 free (debug_information [i].have_frame_base);
11812 free (debug_information);
11813 debug_information = NULL;
11814 num_debug_info_entries = 0;
11820 /* Process an ELF archive. The file is positioned just after the
11824 process_archive (char *file_name, FILE *file)
11826 struct ar_hdr arhdr;
11828 unsigned long size;
11829 char *longnames = NULL;
11830 unsigned long longnames_size = 0;
11831 size_t file_name_size;
11836 got = fread (&arhdr, 1, sizeof arhdr, file);
11837 if (got != sizeof arhdr)
11842 error (_("%s: failed to read archive header\n"), file_name);
11846 if (memcmp (arhdr.ar_name, "/ ", 16) == 0)
11848 /* This is the archive symbol table. Skip it.
11849 FIXME: We should have an option to dump it. */
11850 size = strtoul (arhdr.ar_size, NULL, 10);
11851 if (fseek (file, size + (size & 1), SEEK_CUR) != 0)
11853 error (_("%s: failed to skip archive symbol table\n"), file_name);
11857 got = fread (&arhdr, 1, sizeof arhdr, file);
11858 if (got != sizeof arhdr)
11863 error (_("%s: failed to read archive header\n"), file_name);
11868 if (memcmp (arhdr.ar_name, "// ", 16) == 0)
11870 /* This is the archive string table holding long member
11873 longnames_size = strtoul (arhdr.ar_size, NULL, 10);
11875 longnames = malloc (longnames_size);
11876 if (longnames == NULL)
11878 error (_("Out of memory\n"));
11882 if (fread (longnames, longnames_size, 1, file) != 1)
11885 error (_("%s: failed to read string table\n"), file_name);
11889 if ((longnames_size & 1) != 0)
11892 got = fread (&arhdr, 1, sizeof arhdr, file);
11893 if (got != sizeof arhdr)
11900 error (_("%s: failed to read archive header\n"), file_name);
11905 file_name_size = strlen (file_name);
11914 if (arhdr.ar_name[0] == '/')
11918 off = strtoul (arhdr.ar_name + 1, NULL, 10);
11919 if (off >= longnames_size)
11921 error (_("%s: invalid archive string table offset %lu\n"), off);
11926 name = longnames + off;
11927 nameend = memchr (name, '/', longnames_size - off);
11931 name = arhdr.ar_name;
11932 nameend = memchr (name, '/', 16);
11935 if (nameend == NULL)
11937 error (_("%s: bad archive file name\n"));
11942 namealc = malloc (file_name_size + (nameend - name) + 3);
11943 if (namealc == NULL)
11945 error (_("Out of memory\n"));
11950 memcpy (namealc, file_name, file_name_size);
11951 namealc[file_name_size] = '(';
11952 memcpy (namealc + file_name_size + 1, name, nameend - name);
11953 namealc[file_name_size + 1 + (nameend - name)] = ')';
11954 namealc[file_name_size + 2 + (nameend - name)] = '\0';
11956 archive_file_offset = ftell (file);
11957 archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
11959 ret |= process_object (namealc, file);
11964 (archive_file_offset
11965 + archive_file_size
11966 + (archive_file_size & 1)),
11969 error (_("%s: failed to seek to next archive header\n"), file_name);
11974 got = fread (&arhdr, 1, sizeof arhdr, file);
11975 if (got != sizeof arhdr)
11980 error (_("%s: failed to read archive header\n"), file_name);
11986 if (longnames != 0)
11993 process_file (char *file_name)
11996 struct stat statbuf;
11997 char armag[SARMAG];
12000 if (stat (file_name, &statbuf) < 0)
12002 if (errno == ENOENT)
12003 error (_("'%s': No such file\n"), file_name);
12005 error (_("Could not locate '%s'. System error message: %s\n"),
12006 file_name, strerror (errno));
12010 if (! S_ISREG (statbuf.st_mode))
12012 error (_("'%s' is not an ordinary file\n"), file_name);
12016 file = fopen (file_name, "rb");
12019 error (_("Input file '%s' is not readable.\n"), file_name);
12023 if (fread (armag, SARMAG, 1, file) != 1)
12025 error (_("%s: Failed to read file header\n"), file_name);
12030 if (memcmp (armag, ARMAG, SARMAG) == 0)
12031 ret = process_archive (file_name, file);
12035 archive_file_size = archive_file_offset = 0;
12036 ret = process_object (file_name, file);
12044 #ifdef SUPPORT_DISASSEMBLY
12045 /* Needed by the i386 disassembler. For extra credit, someone could
12046 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12050 print_address (unsigned int addr, FILE *outfile)
12052 fprintf (outfile,"0x%8.8x", addr);
12055 /* Needed by the i386 disassembler. */
12057 db_task_printsym (unsigned int addr)
12059 print_address (addr, stderr);
12064 main (int argc, char **argv)
12068 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12069 setlocale (LC_MESSAGES, "");
12071 #if defined (HAVE_SETLOCALE)
12072 setlocale (LC_CTYPE, "");
12074 bindtextdomain (PACKAGE, LOCALEDIR);
12075 textdomain (PACKAGE);
12077 parse_args (argc, argv);
12079 if (num_dump_sects > 0)
12081 /* Make a copy of the dump_sects array. */
12082 cmdline_dump_sects = malloc (num_dump_sects);
12083 if (cmdline_dump_sects == NULL)
12084 error (_("Out of memory allocating dump request table."));
12087 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
12088 num_cmdline_dump_sects = num_dump_sects;
12092 if (optind < (argc - 1))
12096 while (optind < argc)
12097 err |= process_file (argv[optind++]);
12099 if (dump_sects != NULL)
12101 if (cmdline_dump_sects != NULL)
12102 free (cmdline_dump_sects);