1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
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
;
163 int do_debug_frames_interp
;
164 int do_debug_macinfo
;
173 struct group_list
*next
;
174 unsigned int section_index
;
179 struct group_list
*root
;
180 unsigned int group_index
;
183 struct group
*section_groups
;
184 size_t group_count
= 0;
186 struct group
**section_headers_groups
;
188 /* A dynamic array of flags indicating which sections require dumping. */
189 char *dump_sects
= NULL
;
190 unsigned int num_dump_sects
= 0;
192 #define HEX_DUMP (1 << 0)
193 #define DISASS_DUMP (1 << 1)
194 #define DEBUG_DUMP (1 << 2)
196 /* How to rpint a vma value. */
197 typedef enum print_mode
209 static bfd_vma (*byte_get
) (unsigned char *, int);
210 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
214 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
215 ((X)->sh_name >= string_table_length \
216 ? "<corrupt>" : string_table + (X)->sh_name))
218 /* Given st_shndx I, map to section_headers index. */
219 #define SECTION_HEADER_INDEX(I) \
220 ((I) < SHN_LORESERVE \
222 : ((I) <= SHN_HIRESERVE \
224 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
226 /* Reverse of the above. */
227 #define SECTION_HEADER_NUM(N) \
228 ((N) < SHN_LORESERVE \
230 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
232 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
234 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
236 #define BYTE_GET(field) byte_get (field, sizeof (field))
238 /* If we can support a 64 bit data type then BFD64 should be defined
239 and sizeof (bfd_vma) == 8. In this case when translating from an
240 external 8 byte field to an internal field, we can assume that the
241 internal field is also 8 bytes wide and so we can extract all the data.
242 If, however, BFD64 is not defined, then we must assume that the
243 internal data structure only has 4 byte wide fields that are the
244 equivalent of the 8 byte wide external counterparts, and so we must
245 truncate the data. */
247 #define BYTE_GET8(field) byte_get (field, -8)
249 #define BYTE_GET8(field) byte_get (field, 8)
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_ELF_SYMBOLS(file, section) \
255 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
256 : get_64bit_elf_symbols (file, section))
258 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
259 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
260 already been called and verified that the string exists. */
261 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
264 error (const char *message
, ...)
268 va_start (args
, message
);
269 fprintf (stderr
, _("%s: Error: "), program_name
);
270 vfprintf (stderr
, message
, args
);
275 warn (const char *message
, ...)
279 va_start (args
, message
);
280 fprintf (stderr
, _("%s: Warning: "), program_name
);
281 vfprintf (stderr
, message
, args
);
286 get_data (void *var
, FILE *file
, long offset
, size_t size
, const char *reason
)
293 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
295 error (_("Unable to seek to 0x%x for %s\n"),
296 archive_file_offset
+ offset
, reason
);
303 mvar
= malloc (size
);
307 error (_("Out of memory allocating 0x%x bytes for %s\n"),
313 if (fread (mvar
, size
, 1, file
) != 1)
315 error (_("Unable to read in 0x%x bytes of %s\n"), size
, reason
);
325 byte_get_little_endian (unsigned char *field
, int size
)
333 return ((unsigned int) (field
[0]))
334 | (((unsigned int) (field
[1])) << 8);
338 /* We want to extract data from an 8 byte wide field and
339 place it into a 4 byte wide field. Since this is a little
340 endian source we can just use the 4 byte extraction code. */
344 return ((unsigned long) (field
[0]))
345 | (((unsigned long) (field
[1])) << 8)
346 | (((unsigned long) (field
[2])) << 16)
347 | (((unsigned long) (field
[3])) << 24);
352 /* This is a special case, generated by the BYTE_GET8 macro.
353 It means that we are loading an 8 byte value from a field
354 in an external structure into an 8 byte value in a field
355 in an internal structure. */
356 return ((bfd_vma
) (field
[0]))
357 | (((bfd_vma
) (field
[1])) << 8)
358 | (((bfd_vma
) (field
[2])) << 16)
359 | (((bfd_vma
) (field
[3])) << 24)
360 | (((bfd_vma
) (field
[4])) << 32)
361 | (((bfd_vma
) (field
[5])) << 40)
362 | (((bfd_vma
) (field
[6])) << 48)
363 | (((bfd_vma
) (field
[7])) << 56);
366 error (_("Unhandled data length: %d\n"), size
);
372 byte_get_signed (unsigned char *field
, int size
)
374 bfd_vma x
= byte_get (field
, size
);
379 return (x
^ 0x80) - 0x80;
381 return (x
^ 0x8000) - 0x8000;
383 return (x
^ 0x80000000) - 0x80000000;
393 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
398 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
399 field
[6] = ((value
>> 24) >> 24) & 0xff;
400 field
[5] = ((value
>> 24) >> 16) & 0xff;
401 field
[4] = ((value
>> 24) >> 8) & 0xff;
404 field
[3] = (value
>> 24) & 0xff;
405 field
[2] = (value
>> 16) & 0xff;
408 field
[1] = (value
>> 8) & 0xff;
411 field
[0] = value
& 0xff;
415 error (_("Unhandled data length: %d\n"), size
);
420 /* Print a VMA value. */
422 print_vma (bfd_vma vma
, print_mode mode
)
434 printf ("%8.8lx", (unsigned long) vma
);
440 printf ("%5ld", (long) vma
);
448 printf ("%lx", (unsigned long) vma
);
452 printf ("%ld", (unsigned long) vma
);
456 printf ("%lu", (unsigned long) vma
);
478 #if BFD_HOST_64BIT_LONG
481 if (_bfd_int64_high (vma
))
482 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
484 printf ("%lx", _bfd_int64_low (vma
));
489 #if BFD_HOST_64BIT_LONG
492 if (_bfd_int64_high (vma
))
494 printf ("++%ld", _bfd_int64_low (vma
));
496 printf ("%ld", _bfd_int64_low (vma
));
501 #if BFD_HOST_64BIT_LONG
503 printf ("%5ld", vma
);
505 printf ("%#lx", vma
);
507 if (_bfd_int64_high (vma
))
509 printf ("++%ld", _bfd_int64_low (vma
));
510 else if (vma
<= 99999)
511 printf ("%5ld", _bfd_int64_low (vma
));
513 printf ("%#lx", _bfd_int64_low (vma
));
518 #if BFD_HOST_64BIT_LONG
521 if (_bfd_int64_high (vma
))
523 printf ("++%lu", _bfd_int64_low (vma
));
525 printf ("%lu", _bfd_int64_low (vma
));
533 /* Display a symbol on stdout. If do_wide is not true then
534 format the symbol to be at most WIDTH characters,
535 truncating as necessary. If WIDTH is negative then
536 format the string to be exactly - WIDTH characters,
537 truncating or padding as necessary. */
540 print_symbol (int width
, const char *symbol
)
543 printf ("%s", symbol
);
545 printf ("%-*.*s", width
, width
, symbol
);
547 printf ("%-.*s", width
, symbol
);
551 byte_get_big_endian (unsigned char *field
, int size
)
559 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
562 return ((unsigned long) (field
[3]))
563 | (((unsigned long) (field
[2])) << 8)
564 | (((unsigned long) (field
[1])) << 16)
565 | (((unsigned long) (field
[0])) << 24);
569 /* Although we are extracing data from an 8 byte wide field, we
570 are returning only 4 bytes of data. */
571 return ((unsigned long) (field
[7]))
572 | (((unsigned long) (field
[6])) << 8)
573 | (((unsigned long) (field
[5])) << 16)
574 | (((unsigned long) (field
[4])) << 24);
578 /* This is a special case, generated by the BYTE_GET8 macro.
579 It means that we are loading an 8 byte value from a field
580 in an external structure into an 8 byte value in a field
581 in an internal structure. */
582 return ((bfd_vma
) (field
[7]))
583 | (((bfd_vma
) (field
[6])) << 8)
584 | (((bfd_vma
) (field
[5])) << 16)
585 | (((bfd_vma
) (field
[4])) << 24)
586 | (((bfd_vma
) (field
[3])) << 32)
587 | (((bfd_vma
) (field
[2])) << 40)
588 | (((bfd_vma
) (field
[1])) << 48)
589 | (((bfd_vma
) (field
[0])) << 56);
593 error (_("Unhandled data length: %d\n"), size
);
599 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
604 field
[7] = value
& 0xff;
605 field
[6] = (value
>> 8) & 0xff;
606 field
[5] = (value
>> 16) & 0xff;
607 field
[4] = (value
>> 24) & 0xff;
612 field
[3] = value
& 0xff;
613 field
[2] = (value
>> 8) & 0xff;
617 field
[1] = value
& 0xff;
621 field
[0] = value
& 0xff;
625 error (_("Unhandled data length: %d\n"), size
);
630 /* Guess the relocation size commonly used by the specific machines. */
633 guess_is_rela (unsigned long e_machine
)
637 /* Targets that use REL relocations. */
652 /* Targets that use RELA relocations. */
667 case EM_CYGNUS_MN10200
:
669 case EM_CYGNUS_MN10300
:
716 warn (_("Don't know about relocations on this machine architecture\n"));
722 slurp_rela_relocs (FILE *file
,
723 unsigned long rel_offset
,
724 unsigned long rel_size
,
725 Elf_Internal_Rela
**relasp
,
726 unsigned long *nrelasp
)
728 Elf_Internal_Rela
*relas
;
729 unsigned long nrelas
;
734 Elf32_External_Rela
*erelas
;
736 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
740 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
742 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
746 error(_("out of memory parsing relocs"));
750 for (i
= 0; i
< nrelas
; i
++)
752 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
753 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
754 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
761 Elf64_External_Rela
*erelas
;
763 erelas
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
767 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
769 relas
= malloc (nrelas
* sizeof (Elf_Internal_Rela
));
773 error(_("out of memory parsing relocs"));
777 for (i
= 0; i
< nrelas
; i
++)
779 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
780 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
781 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
792 slurp_rel_relocs (FILE *file
,
793 unsigned long rel_offset
,
794 unsigned long rel_size
,
795 Elf_Internal_Rela
**relsp
,
796 unsigned long *nrelsp
)
798 Elf_Internal_Rela
*rels
;
804 Elf32_External_Rel
*erels
;
806 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
810 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
812 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
816 error(_("out of memory parsing relocs"));
820 for (i
= 0; i
< nrels
; i
++)
822 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
823 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
824 rels
[i
].r_addend
= 0;
831 Elf64_External_Rel
*erels
;
833 erels
= get_data (NULL
, file
, rel_offset
, rel_size
, _("relocs"));
837 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
839 rels
= malloc (nrels
* sizeof (Elf_Internal_Rela
));
843 error(_("out of memory parsing relocs"));
847 for (i
= 0; i
< nrels
; i
++)
849 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
850 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
851 rels
[i
].r_addend
= 0;
861 /* Display the contents of the relocation data found at the specified
865 dump_relocations (FILE *file
,
866 unsigned long rel_offset
,
867 unsigned long rel_size
,
868 Elf_Internal_Sym
*symtab
,
871 unsigned long strtablen
,
875 Elf_Internal_Rela
*rels
;
878 if (is_rela
== UNKNOWN
)
879 is_rela
= guess_is_rela (elf_header
.e_machine
);
883 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
888 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
897 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
899 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
904 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
906 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
914 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
916 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
921 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
923 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
927 for (i
= 0; i
< rel_size
; i
++)
930 const char *rtype2
= NULL
;
931 const char *rtype3
= NULL
;
934 bfd_vma symtab_index
;
939 offset
= rels
[i
].r_offset
;
940 info
= rels
[i
].r_info
;
944 type
= ELF32_R_TYPE (info
);
945 symtab_index
= ELF32_R_SYM (info
);
949 /* The #ifdef BFD64 below is to prevent a compile time warning.
950 We know that if we do not have a 64 bit data type that we
951 will never execute this code anyway. */
953 if (elf_header
.e_machine
== EM_MIPS
)
955 /* In little-endian objects, r_info isn't really a 64-bit
956 little-endian value: it has a 32-bit little-endian
957 symbol index followed by four individual byte fields.
958 Reorder INFO accordingly. */
959 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
960 info
= (((info
& 0xffffffff) << 32)
961 | ((info
>> 56) & 0xff)
962 | ((info
>> 40) & 0xff00)
963 | ((info
>> 24) & 0xff0000)
964 | ((info
>> 8) & 0xff000000));
965 type
= ELF64_MIPS_R_TYPE (info
);
966 type2
= ELF64_MIPS_R_TYPE2 (info
);
967 type3
= ELF64_MIPS_R_TYPE3 (info
);
969 else if (elf_header
.e_machine
== EM_SPARCV9
)
970 type
= ELF64_R_TYPE_ID (info
);
972 type
= ELF64_R_TYPE (info
);
974 symtab_index
= ELF64_R_SYM (info
);
980 #ifdef _bfd_int64_low
981 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
983 printf ("%8.8lx %8.8lx ", offset
, info
);
988 #ifdef _bfd_int64_low
990 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
991 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
992 _bfd_int64_high (offset
),
993 _bfd_int64_low (offset
),
994 _bfd_int64_high (info
),
995 _bfd_int64_low (info
));
998 ? "%16.16lx %16.16lx "
999 : "%12.12lx %12.12lx ",
1004 switch (elf_header
.e_machine
)
1011 case EM_CYGNUS_M32R
:
1012 rtype
= elf_m32r_reloc_type (type
);
1017 rtype
= elf_i386_reloc_type (type
);
1022 rtype
= elf_m68hc11_reloc_type (type
);
1026 rtype
= elf_m68k_reloc_type (type
);
1030 rtype
= elf_i960_reloc_type (type
);
1035 rtype
= elf_avr_reloc_type (type
);
1038 case EM_OLD_SPARCV9
:
1039 case EM_SPARC32PLUS
:
1042 rtype
= elf_sparc_reloc_type (type
);
1046 case EM_CYGNUS_V850
:
1047 rtype
= v850_reloc_type (type
);
1051 case EM_CYGNUS_D10V
:
1052 rtype
= elf_d10v_reloc_type (type
);
1056 case EM_CYGNUS_D30V
:
1057 rtype
= elf_d30v_reloc_type (type
);
1061 rtype
= elf_dlx_reloc_type (type
);
1065 rtype
= elf_sh_reloc_type (type
);
1069 case EM_CYGNUS_MN10300
:
1070 rtype
= elf_mn10300_reloc_type (type
);
1074 case EM_CYGNUS_MN10200
:
1075 rtype
= elf_mn10200_reloc_type (type
);
1079 case EM_CYGNUS_FR30
:
1080 rtype
= elf_fr30_reloc_type (type
);
1084 rtype
= elf_frv_reloc_type (type
);
1088 rtype
= elf_mcore_reloc_type (type
);
1092 rtype
= elf_mmix_reloc_type (type
);
1097 rtype
= elf_msp430_reloc_type (type
);
1101 rtype
= elf_ppc_reloc_type (type
);
1105 rtype
= elf_ppc64_reloc_type (type
);
1109 case EM_MIPS_RS3_LE
:
1110 rtype
= elf_mips_reloc_type (type
);
1113 rtype2
= elf_mips_reloc_type (type2
);
1114 rtype3
= elf_mips_reloc_type (type3
);
1119 rtype
= elf_alpha_reloc_type (type
);
1123 rtype
= elf_arm_reloc_type (type
);
1127 rtype
= elf_arc_reloc_type (type
);
1131 rtype
= elf_hppa_reloc_type (type
);
1137 rtype
= elf_h8_reloc_type (type
);
1142 rtype
= elf_or32_reloc_type (type
);
1147 rtype
= elf_pj_reloc_type (type
);
1150 rtype
= elf_ia64_reloc_type (type
);
1154 rtype
= elf_cris_reloc_type (type
);
1158 rtype
= elf_i860_reloc_type (type
);
1162 rtype
= elf_x86_64_reloc_type (type
);
1166 rtype
= i370_reloc_type (type
);
1171 rtype
= elf_s390_reloc_type (type
);
1175 rtype
= elf_xstormy16_reloc_type (type
);
1179 rtype
= elf_crx_reloc_type (type
);
1183 rtype
= elf_vax_reloc_type (type
);
1188 rtype
= elf_ip2k_reloc_type (type
);
1192 rtype
= elf_iq2000_reloc_type (type
);
1197 rtype
= elf_xtensa_reloc_type (type
);
1202 #ifdef _bfd_int64_low
1203 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1205 printf (_("unrecognized: %-7lx"), type
);
1208 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1212 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1213 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1216 Elf_Internal_Sym
*psym
;
1218 psym
= symtab
+ symtab_index
;
1221 print_vma (psym
->st_value
, LONG_HEX
);
1222 printf (is_32bit_elf
? " " : " ");
1224 if (psym
->st_name
== 0)
1226 const char *sec_name
= "<null>";
1229 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1231 bfd_vma sec_index
= (bfd_vma
) -1;
1233 if (psym
->st_shndx
< SHN_LORESERVE
)
1234 sec_index
= psym
->st_shndx
;
1235 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1236 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1239 if (sec_index
!= (bfd_vma
) -1)
1240 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1241 else if (psym
->st_shndx
== SHN_ABS
)
1243 else if (psym
->st_shndx
== SHN_COMMON
)
1244 sec_name
= "COMMON";
1245 else if (elf_header
.e_machine
== EM_IA_64
1246 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1247 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1248 sec_name
= "ANSI_COM";
1251 sprintf (name_buf
, "<section 0x%x>",
1252 (unsigned int) psym
->st_shndx
);
1253 sec_name
= name_buf
;
1256 print_symbol (22, sec_name
);
1258 else if (strtab
== NULL
)
1259 printf (_("<string table index: %3ld>"), psym
->st_name
);
1260 else if (psym
->st_name
> strtablen
)
1261 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1263 print_symbol (22, strtab
+ psym
->st_name
);
1266 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1271 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1272 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1275 if (elf_header
.e_machine
== EM_SPARCV9
1276 && !strcmp (rtype
, "R_SPARC_OLO10"))
1277 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1281 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1283 printf (" Type2: ");
1286 #ifdef _bfd_int64_low
1287 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1289 printf (_("unrecognized: %-7lx"), type2
);
1292 printf ("%-17.17s", rtype2
);
1294 printf("\n Type3: ");
1297 #ifdef _bfd_int64_low
1298 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1300 printf (_("unrecognized: %-7lx"), type3
);
1303 printf ("%-17.17s", rtype3
);
1315 get_mips_dynamic_type (unsigned long type
)
1319 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1320 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1321 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1322 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1323 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1324 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1325 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1326 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1327 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1328 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1329 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1330 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1331 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1332 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1333 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1334 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1335 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1336 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1337 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1338 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1339 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1340 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1341 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1342 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1343 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1344 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1345 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1346 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1347 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1348 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1349 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1350 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1351 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1352 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1353 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1354 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1355 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1356 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1357 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1358 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1359 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1360 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1361 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1368 get_sparc64_dynamic_type (unsigned long type
)
1372 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1379 get_ppc64_dynamic_type (unsigned long type
)
1383 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1384 case DT_PPC64_OPD
: return "PPC64_OPD";
1385 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1392 get_parisc_dynamic_type (unsigned long type
)
1396 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1397 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1398 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1399 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1400 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1401 case DT_HP_PREINIT
: return "HP_PREINIT";
1402 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1403 case DT_HP_NEEDED
: return "HP_NEEDED";
1404 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1405 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1406 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1407 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1408 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1415 get_ia64_dynamic_type (unsigned long type
)
1419 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1426 get_dynamic_type (unsigned long type
)
1428 static char buff
[32];
1432 case DT_NULL
: return "NULL";
1433 case DT_NEEDED
: return "NEEDED";
1434 case DT_PLTRELSZ
: return "PLTRELSZ";
1435 case DT_PLTGOT
: return "PLTGOT";
1436 case DT_HASH
: return "HASH";
1437 case DT_STRTAB
: return "STRTAB";
1438 case DT_SYMTAB
: return "SYMTAB";
1439 case DT_RELA
: return "RELA";
1440 case DT_RELASZ
: return "RELASZ";
1441 case DT_RELAENT
: return "RELAENT";
1442 case DT_STRSZ
: return "STRSZ";
1443 case DT_SYMENT
: return "SYMENT";
1444 case DT_INIT
: return "INIT";
1445 case DT_FINI
: return "FINI";
1446 case DT_SONAME
: return "SONAME";
1447 case DT_RPATH
: return "RPATH";
1448 case DT_SYMBOLIC
: return "SYMBOLIC";
1449 case DT_REL
: return "REL";
1450 case DT_RELSZ
: return "RELSZ";
1451 case DT_RELENT
: return "RELENT";
1452 case DT_PLTREL
: return "PLTREL";
1453 case DT_DEBUG
: return "DEBUG";
1454 case DT_TEXTREL
: return "TEXTREL";
1455 case DT_JMPREL
: return "JMPREL";
1456 case DT_BIND_NOW
: return "BIND_NOW";
1457 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1458 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1459 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1460 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1461 case DT_RUNPATH
: return "RUNPATH";
1462 case DT_FLAGS
: return "FLAGS";
1464 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1465 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1467 case DT_CHECKSUM
: return "CHECKSUM";
1468 case DT_PLTPADSZ
: return "PLTPADSZ";
1469 case DT_MOVEENT
: return "MOVEENT";
1470 case DT_MOVESZ
: return "MOVESZ";
1471 case DT_FEATURE
: return "FEATURE";
1472 case DT_POSFLAG_1
: return "POSFLAG_1";
1473 case DT_SYMINSZ
: return "SYMINSZ";
1474 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1476 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1477 case DT_CONFIG
: return "CONFIG";
1478 case DT_DEPAUDIT
: return "DEPAUDIT";
1479 case DT_AUDIT
: return "AUDIT";
1480 case DT_PLTPAD
: return "PLTPAD";
1481 case DT_MOVETAB
: return "MOVETAB";
1482 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1484 case DT_VERSYM
: return "VERSYM";
1486 case DT_RELACOUNT
: return "RELACOUNT";
1487 case DT_RELCOUNT
: return "RELCOUNT";
1488 case DT_FLAGS_1
: return "FLAGS_1";
1489 case DT_VERDEF
: return "VERDEF";
1490 case DT_VERDEFNUM
: return "VERDEFNUM";
1491 case DT_VERNEED
: return "VERNEED";
1492 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1494 case DT_AUXILIARY
: return "AUXILIARY";
1495 case DT_USED
: return "USED";
1496 case DT_FILTER
: return "FILTER";
1498 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1499 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1500 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1501 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1502 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1505 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1509 switch (elf_header
.e_machine
)
1512 case EM_MIPS_RS3_LE
:
1513 result
= get_mips_dynamic_type (type
);
1516 result
= get_sparc64_dynamic_type (type
);
1519 result
= get_ppc64_dynamic_type (type
);
1522 result
= get_ia64_dynamic_type (type
);
1532 sprintf (buff
, _("Processor Specific: %lx"), type
);
1534 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1538 switch (elf_header
.e_machine
)
1541 result
= get_parisc_dynamic_type (type
);
1551 sprintf (buff
, _("Operating System specific: %lx"), type
);
1554 sprintf (buff
, _("<unknown>: %lx"), type
);
1561 get_file_type (unsigned e_type
)
1563 static char buff
[32];
1567 case ET_NONE
: return _("NONE (None)");
1568 case ET_REL
: return _("REL (Relocatable file)");
1569 case ET_EXEC
: return _("EXEC (Executable file)");
1570 case ET_DYN
: return _("DYN (Shared object file)");
1571 case ET_CORE
: return _("CORE (Core file)");
1574 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1575 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1576 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1577 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1579 sprintf (buff
, _("<unknown>: %x"), e_type
);
1585 get_machine_name (unsigned e_machine
)
1587 static char buff
[64]; /* XXX */
1591 case EM_NONE
: return _("None");
1592 case EM_M32
: return "WE32100";
1593 case EM_SPARC
: return "Sparc";
1594 case EM_386
: return "Intel 80386";
1595 case EM_68K
: return "MC68000";
1596 case EM_88K
: return "MC88000";
1597 case EM_486
: return "Intel 80486";
1598 case EM_860
: return "Intel 80860";
1599 case EM_MIPS
: return "MIPS R3000";
1600 case EM_S370
: return "IBM System/370";
1601 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1602 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1603 case EM_PARISC
: return "HPPA";
1604 case EM_PPC_OLD
: return "Power PC (old)";
1605 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1606 case EM_960
: return "Intel 90860";
1607 case EM_PPC
: return "PowerPC";
1608 case EM_PPC64
: return "PowerPC64";
1609 case EM_V800
: return "NEC V800";
1610 case EM_FR20
: return "Fujitsu FR20";
1611 case EM_RH32
: return "TRW RH32";
1612 case EM_MCORE
: return "MCORE";
1613 case EM_ARM
: return "ARM";
1614 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1615 case EM_SH
: return "Renesas / SuperH SH";
1616 case EM_SPARCV9
: return "Sparc v9";
1617 case EM_TRICORE
: return "Siemens Tricore";
1618 case EM_ARC
: return "ARC";
1619 case EM_H8_300
: return "Renesas H8/300";
1620 case EM_H8_300H
: return "Renesas H8/300H";
1621 case EM_H8S
: return "Renesas H8S";
1622 case EM_H8_500
: return "Renesas H8/500";
1623 case EM_IA_64
: return "Intel IA-64";
1624 case EM_MIPS_X
: return "Stanford MIPS-X";
1625 case EM_COLDFIRE
: return "Motorola Coldfire";
1626 case EM_68HC12
: return "Motorola M68HC12";
1627 case EM_ALPHA
: return "Alpha";
1628 case EM_CYGNUS_D10V
:
1629 case EM_D10V
: return "d10v";
1630 case EM_CYGNUS_D30V
:
1631 case EM_D30V
: return "d30v";
1632 case EM_CYGNUS_M32R
:
1633 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1634 case EM_CYGNUS_V850
:
1635 case EM_V850
: return "NEC v850";
1636 case EM_CYGNUS_MN10300
:
1637 case EM_MN10300
: return "mn10300";
1638 case EM_CYGNUS_MN10200
:
1639 case EM_MN10200
: return "mn10200";
1640 case EM_CYGNUS_FR30
:
1641 case EM_FR30
: return "Fujitsu FR30";
1642 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1644 case EM_PJ
: return "picoJava";
1645 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1646 case EM_PCP
: return "Siemens PCP";
1647 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1648 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1649 case EM_STARCORE
: return "Motorola Star*Core processor";
1650 case EM_ME16
: return "Toyota ME16 processor";
1651 case EM_ST100
: return "STMicroelectronics ST100 processor";
1652 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1653 case EM_FX66
: return "Siemens FX66 microcontroller";
1654 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1655 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1656 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1657 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1658 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1659 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1660 case EM_SVX
: return "Silicon Graphics SVx";
1661 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1662 case EM_VAX
: return "Digital VAX";
1664 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1665 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1666 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1667 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1668 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1669 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1670 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1671 case EM_PRISM
: return "Vitesse Prism";
1672 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1674 case EM_S390
: return "IBM S/390";
1675 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1677 case EM_OR32
: return "OpenRISC";
1678 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1679 case EM_DLX
: return "OpenDLX";
1681 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1682 case EM_IQ2000
: return "Vitesse IQ2000";
1684 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1686 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1692 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1697 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1698 e_flags
&= ~ EF_ARM_EABIMASK
;
1700 /* Handle "generic" ARM flags. */
1701 if (e_flags
& EF_ARM_RELEXEC
)
1703 strcat (buf
, ", relocatable executable");
1704 e_flags
&= ~ EF_ARM_RELEXEC
;
1707 if (e_flags
& EF_ARM_HASENTRY
)
1709 strcat (buf
, ", has entry point");
1710 e_flags
&= ~ EF_ARM_HASENTRY
;
1713 /* Now handle EABI specific flags. */
1717 strcat (buf
, ", <unrecognized EABI>");
1722 case EF_ARM_EABI_VER1
:
1723 strcat (buf
, ", Version1 EABI");
1728 /* Process flags one bit at a time. */
1729 flag
= e_flags
& - e_flags
;
1734 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1735 strcat (buf
, ", sorted symbol tables");
1745 case EF_ARM_EABI_VER2
:
1746 strcat (buf
, ", Version2 EABI");
1751 /* Process flags one bit at a time. */
1752 flag
= e_flags
& - e_flags
;
1757 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1758 strcat (buf
, ", sorted symbol tables");
1761 case EF_ARM_DYNSYMSUSESEGIDX
:
1762 strcat (buf
, ", dynamic symbols use segment index");
1765 case EF_ARM_MAPSYMSFIRST
:
1766 strcat (buf
, ", mapping symbols precede others");
1776 case EF_ARM_EABI_VER3
:
1777 strcat (buf
, ", Version3 EABI");
1780 case EF_ARM_EABI_VER4
:
1781 strcat (buf
, ", Version4 EABI");
1786 /* Process flags one bit at a time. */
1787 flag
= e_flags
& - e_flags
;
1793 strcat (buf
, ", BE8");
1797 strcat (buf
, ", LE8");
1807 case EF_ARM_EABI_UNKNOWN
:
1808 strcat (buf
, ", GNU EABI");
1813 /* Process flags one bit at a time. */
1814 flag
= e_flags
& - e_flags
;
1819 case EF_ARM_INTERWORK
:
1820 strcat (buf
, ", interworking enabled");
1823 case EF_ARM_APCS_26
:
1824 strcat (buf
, ", uses APCS/26");
1827 case EF_ARM_APCS_FLOAT
:
1828 strcat (buf
, ", uses APCS/float");
1832 strcat (buf
, ", position independent");
1836 strcat (buf
, ", 8 bit structure alignment");
1839 case EF_ARM_NEW_ABI
:
1840 strcat (buf
, ", uses new ABI");
1843 case EF_ARM_OLD_ABI
:
1844 strcat (buf
, ", uses old ABI");
1847 case EF_ARM_SOFT_FLOAT
:
1848 strcat (buf
, ", software FP");
1851 case EF_ARM_VFP_FLOAT
:
1852 strcat (buf
, ", VFP");
1855 case EF_ARM_MAVERICK_FLOAT
:
1856 strcat (buf
, ", Maverick FP");
1867 strcat (buf
,", <unknown>");
1871 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1873 static char buf
[1024];
1885 decode_ARM_machine_flags (e_flags
, buf
);
1889 switch (e_flags
& EF_FRV_CPU_MASK
)
1891 case EF_FRV_CPU_GENERIC
:
1895 strcat (buf
, ", fr???");
1898 case EF_FRV_CPU_FR300
:
1899 strcat (buf
, ", fr300");
1902 case EF_FRV_CPU_FR400
:
1903 strcat (buf
, ", fr400");
1905 case EF_FRV_CPU_FR405
:
1906 strcat (buf
, ", fr405");
1909 case EF_FRV_CPU_FR450
:
1910 strcat (buf
, ", fr450");
1913 case EF_FRV_CPU_FR500
:
1914 strcat (buf
, ", fr500");
1916 case EF_FRV_CPU_FR550
:
1917 strcat (buf
, ", fr550");
1920 case EF_FRV_CPU_SIMPLE
:
1921 strcat (buf
, ", simple");
1923 case EF_FRV_CPU_TOMCAT
:
1924 strcat (buf
, ", tomcat");
1930 if (e_flags
& EF_CPU32
)
1931 strcat (buf
, ", cpu32");
1932 if (e_flags
& EF_M68000
)
1933 strcat (buf
, ", m68000");
1937 if (e_flags
& EF_PPC_EMB
)
1938 strcat (buf
, ", emb");
1940 if (e_flags
& EF_PPC_RELOCATABLE
)
1941 strcat (buf
, ", relocatable");
1943 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1944 strcat (buf
, ", relocatable-lib");
1948 case EM_CYGNUS_V850
:
1949 switch (e_flags
& EF_V850_ARCH
)
1952 strcat (buf
, ", v850e1");
1955 strcat (buf
, ", v850e");
1958 strcat (buf
, ", v850");
1961 strcat (buf
, ", unknown v850 architecture variant");
1967 case EM_CYGNUS_M32R
:
1968 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1969 strcat (buf
, ", m32r");
1974 case EM_MIPS_RS3_LE
:
1975 if (e_flags
& EF_MIPS_NOREORDER
)
1976 strcat (buf
, ", noreorder");
1978 if (e_flags
& EF_MIPS_PIC
)
1979 strcat (buf
, ", pic");
1981 if (e_flags
& EF_MIPS_CPIC
)
1982 strcat (buf
, ", cpic");
1984 if (e_flags
& EF_MIPS_UCODE
)
1985 strcat (buf
, ", ugen_reserved");
1987 if (e_flags
& EF_MIPS_ABI2
)
1988 strcat (buf
, ", abi2");
1990 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1991 strcat (buf
, ", odk first");
1993 if (e_flags
& EF_MIPS_32BITMODE
)
1994 strcat (buf
, ", 32bitmode");
1996 switch ((e_flags
& EF_MIPS_MACH
))
1998 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1999 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2000 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2001 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2002 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2003 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2004 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2005 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2006 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2008 /* We simply ignore the field in this case to avoid confusion:
2009 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2012 default: strcat (buf
, ", unknown CPU"); break;
2015 switch ((e_flags
& EF_MIPS_ABI
))
2017 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2018 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2019 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2020 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2022 /* We simply ignore the field in this case to avoid confusion:
2023 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2024 This means it is likely to be an o32 file, but not for
2027 default: strcat (buf
, ", unknown ABI"); break;
2030 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2031 strcat (buf
, ", mdmx");
2033 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2034 strcat (buf
, ", mips16");
2036 switch ((e_flags
& EF_MIPS_ARCH
))
2038 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2039 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2040 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2041 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2042 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2043 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2044 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2045 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2046 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2047 default: strcat (buf
, ", unknown ISA"); break;
2053 switch ((e_flags
& EF_SH_MACH_MASK
))
2055 case EF_SH1
: strcat (buf
, ", sh1"); break;
2056 case EF_SH2
: strcat (buf
, ", sh2"); break;
2057 case EF_SH3
: strcat (buf
, ", sh3"); break;
2058 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2059 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2060 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2061 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2062 case EF_SH4
: strcat (buf
, ", sh4"); break;
2063 case EF_SH5
: strcat (buf
, ", sh5"); break;
2064 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2065 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2066 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2067 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2068 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2069 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2070 default: strcat (buf
, ", unknown ISA"); break;
2076 if (e_flags
& EF_SPARC_32PLUS
)
2077 strcat (buf
, ", v8+");
2079 if (e_flags
& EF_SPARC_SUN_US1
)
2080 strcat (buf
, ", ultrasparcI");
2082 if (e_flags
& EF_SPARC_SUN_US3
)
2083 strcat (buf
, ", ultrasparcIII");
2085 if (e_flags
& EF_SPARC_HAL_R1
)
2086 strcat (buf
, ", halr1");
2088 if (e_flags
& EF_SPARC_LEDATA
)
2089 strcat (buf
, ", ledata");
2091 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2092 strcat (buf
, ", tso");
2094 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2095 strcat (buf
, ", pso");
2097 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2098 strcat (buf
, ", rmo");
2102 switch (e_flags
& EF_PARISC_ARCH
)
2104 case EFA_PARISC_1_0
:
2105 strcpy (buf
, ", PA-RISC 1.0");
2107 case EFA_PARISC_1_1
:
2108 strcpy (buf
, ", PA-RISC 1.1");
2110 case EFA_PARISC_2_0
:
2111 strcpy (buf
, ", PA-RISC 2.0");
2116 if (e_flags
& EF_PARISC_TRAPNIL
)
2117 strcat (buf
, ", trapnil");
2118 if (e_flags
& EF_PARISC_EXT
)
2119 strcat (buf
, ", ext");
2120 if (e_flags
& EF_PARISC_LSB
)
2121 strcat (buf
, ", lsb");
2122 if (e_flags
& EF_PARISC_WIDE
)
2123 strcat (buf
, ", wide");
2124 if (e_flags
& EF_PARISC_NO_KABP
)
2125 strcat (buf
, ", no kabp");
2126 if (e_flags
& EF_PARISC_LAZYSWAP
)
2127 strcat (buf
, ", lazyswap");
2132 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2133 strcat (buf
, ", new calling convention");
2135 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2136 strcat (buf
, ", gnu calling convention");
2140 if ((e_flags
& EF_IA_64_ABI64
))
2141 strcat (buf
, ", 64-bit");
2143 strcat (buf
, ", 32-bit");
2144 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2145 strcat (buf
, ", reduced fp model");
2146 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2147 strcat (buf
, ", no function descriptors, constant gp");
2148 else if ((e_flags
& EF_IA_64_CONS_GP
))
2149 strcat (buf
, ", constant gp");
2150 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2151 strcat (buf
, ", absolute");
2155 if ((e_flags
& EF_VAX_NONPIC
))
2156 strcat (buf
, ", non-PIC");
2157 if ((e_flags
& EF_VAX_DFLOAT
))
2158 strcat (buf
, ", D-Float");
2159 if ((e_flags
& EF_VAX_GFLOAT
))
2160 strcat (buf
, ", G-Float");
2169 get_osabi_name (unsigned int osabi
)
2171 static char buff
[32];
2175 case ELFOSABI_NONE
: return "UNIX - System V";
2176 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2177 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2178 case ELFOSABI_LINUX
: return "UNIX - Linux";
2179 case ELFOSABI_HURD
: return "GNU/Hurd";
2180 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2181 case ELFOSABI_AIX
: return "UNIX - AIX";
2182 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2183 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2184 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2185 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2186 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2187 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2188 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2189 case ELFOSABI_AROS
: return "Amiga Research OS";
2190 case ELFOSABI_STANDALONE
: return _("Standalone App");
2191 case ELFOSABI_ARM
: return "ARM";
2193 sprintf (buff
, _("<unknown: %x>"), osabi
);
2199 get_mips_segment_type (unsigned long type
)
2203 case PT_MIPS_REGINFO
:
2205 case PT_MIPS_RTPROC
:
2207 case PT_MIPS_OPTIONS
:
2217 get_parisc_segment_type (unsigned long type
)
2221 case PT_HP_TLS
: return "HP_TLS";
2222 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2223 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2224 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2225 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2226 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2227 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2228 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2229 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2230 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2231 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2232 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2233 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2234 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2243 get_ia64_segment_type (unsigned long type
)
2247 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2248 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2249 case PT_HP_TLS
: return "HP_TLS";
2250 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2251 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2252 case PT_IA_64_HP_STACK
: return "HP_STACK";
2261 get_segment_type (unsigned long p_type
)
2263 static char buff
[32];
2267 case PT_NULL
: return "NULL";
2268 case PT_LOAD
: return "LOAD";
2269 case PT_DYNAMIC
: return "DYNAMIC";
2270 case PT_INTERP
: return "INTERP";
2271 case PT_NOTE
: return "NOTE";
2272 case PT_SHLIB
: return "SHLIB";
2273 case PT_PHDR
: return "PHDR";
2274 case PT_TLS
: return "TLS";
2276 case PT_GNU_EH_FRAME
:
2277 return "GNU_EH_FRAME";
2278 case PT_GNU_STACK
: return "GNU_STACK";
2279 case PT_GNU_RELRO
: return "GNU_RELRO";
2282 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2286 switch (elf_header
.e_machine
)
2289 case EM_MIPS_RS3_LE
:
2290 result
= get_mips_segment_type (p_type
);
2293 result
= get_parisc_segment_type (p_type
);
2296 result
= get_ia64_segment_type (p_type
);
2306 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2308 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2312 switch (elf_header
.e_machine
)
2315 result
= get_parisc_segment_type (p_type
);
2318 result
= get_ia64_segment_type (p_type
);
2328 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2331 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2338 get_mips_section_type_name (unsigned int sh_type
)
2342 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2343 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2344 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2345 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2346 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2347 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2348 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2349 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2350 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2351 case SHT_MIPS_RELD
: return "MIPS_RELD";
2352 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2353 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2354 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2355 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2356 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2357 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2358 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2359 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2360 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2361 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2362 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2363 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2364 case SHT_MIPS_LINE
: return "MIPS_LINE";
2365 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2366 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2367 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2368 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2369 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2370 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2371 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2372 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2373 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2374 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2375 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2376 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2377 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2378 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2379 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2380 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2388 get_parisc_section_type_name (unsigned int sh_type
)
2392 case SHT_PARISC_EXT
: return "PARISC_EXT";
2393 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2394 case SHT_PARISC_DOC
: return "PARISC_DOC";
2402 get_ia64_section_type_name (unsigned int sh_type
)
2404 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2405 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2406 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2410 case SHT_IA_64_EXT
: return "IA_64_EXT";
2411 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2412 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2420 get_x86_64_section_type_name (unsigned int sh_type
)
2424 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2432 get_arm_section_type_name (unsigned int sh_type
)
2445 get_section_type_name (unsigned int sh_type
)
2447 static char buff
[32];
2451 case SHT_NULL
: return "NULL";
2452 case SHT_PROGBITS
: return "PROGBITS";
2453 case SHT_SYMTAB
: return "SYMTAB";
2454 case SHT_STRTAB
: return "STRTAB";
2455 case SHT_RELA
: return "RELA";
2456 case SHT_HASH
: return "HASH";
2457 case SHT_DYNAMIC
: return "DYNAMIC";
2458 case SHT_NOTE
: return "NOTE";
2459 case SHT_NOBITS
: return "NOBITS";
2460 case SHT_REL
: return "REL";
2461 case SHT_SHLIB
: return "SHLIB";
2462 case SHT_DYNSYM
: return "DYNSYM";
2463 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2464 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2465 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2466 case SHT_GROUP
: return "GROUP";
2467 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2468 case SHT_GNU_verdef
: return "VERDEF";
2469 case SHT_GNU_verneed
: return "VERNEED";
2470 case SHT_GNU_versym
: return "VERSYM";
2471 case 0x6ffffff0: return "VERSYM";
2472 case 0x6ffffffc: return "VERDEF";
2473 case 0x7ffffffd: return "AUXILIARY";
2474 case 0x7fffffff: return "FILTER";
2475 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2478 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2482 switch (elf_header
.e_machine
)
2485 case EM_MIPS_RS3_LE
:
2486 result
= get_mips_section_type_name (sh_type
);
2489 result
= get_parisc_section_type_name (sh_type
);
2492 result
= get_ia64_section_type_name (sh_type
);
2495 result
= get_x86_64_section_type_name (sh_type
);
2498 result
= get_arm_section_type_name (sh_type
);
2508 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2510 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2511 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2512 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2513 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2515 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2521 #define OPTION_DEBUG_DUMP 512
2523 struct option options
[] =
2525 {"all", no_argument
, 0, 'a'},
2526 {"file-header", no_argument
, 0, 'h'},
2527 {"program-headers", no_argument
, 0, 'l'},
2528 {"headers", no_argument
, 0, 'e'},
2529 {"histogram", no_argument
, 0, 'I'},
2530 {"segments", no_argument
, 0, 'l'},
2531 {"sections", no_argument
, 0, 'S'},
2532 {"section-headers", no_argument
, 0, 'S'},
2533 {"section-groups", no_argument
, 0, 'g'},
2534 {"symbols", no_argument
, 0, 's'},
2535 {"syms", no_argument
, 0, 's'},
2536 {"relocs", no_argument
, 0, 'r'},
2537 {"notes", no_argument
, 0, 'n'},
2538 {"dynamic", no_argument
, 0, 'd'},
2539 {"arch-specific", no_argument
, 0, 'A'},
2540 {"version-info", no_argument
, 0, 'V'},
2541 {"use-dynamic", no_argument
, 0, 'D'},
2542 {"hex-dump", required_argument
, 0, 'x'},
2543 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2544 {"unwind", no_argument
, 0, 'u'},
2545 #ifdef SUPPORT_DISASSEMBLY
2546 {"instruction-dump", required_argument
, 0, 'i'},
2549 {"version", no_argument
, 0, 'v'},
2550 {"wide", no_argument
, 0, 'W'},
2551 {"help", no_argument
, 0, 'H'},
2552 {0, no_argument
, 0, 0}
2558 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2559 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2560 fprintf (stdout
, _(" Options are:\n\
2561 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2562 -h --file-header Display the ELF file header\n\
2563 -l --program-headers Display the program headers\n\
2564 --segments An alias for --program-headers\n\
2565 -S --section-headers Display the sections' header\n\
2566 --sections An alias for --section-headers\n\
2567 -g --section-groups Display the section groups\n\
2568 -e --headers Equivalent to: -h -l -S\n\
2569 -s --syms Display the symbol table\n\
2570 --symbols An alias for --syms\n\
2571 -n --notes Display the core notes (if present)\n\
2572 -r --relocs Display the relocations (if present)\n\
2573 -u --unwind Display the unwind info (if present)\n\
2574 -d --dynamic Display the dynamic section (if present)\n\
2575 -V --version-info Display the version sections (if present)\n\
2576 -A --arch-specific Display architecture specific information (if any).\n\
2577 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2578 -x --hex-dump=<number> Dump the contents of section <number>\n\
2579 -w[liaprmfFso] or\n\
2580 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2581 Display the contents of DWARF2 debug sections\n"));
2582 #ifdef SUPPORT_DISASSEMBLY
2583 fprintf (stdout
, _("\
2584 -i --instruction-dump=<number>\n\
2585 Disassemble the contents of section <number>\n"));
2587 fprintf (stdout
, _("\
2588 -I --histogram Display histogram of bucket list lengths\n\
2589 -W --wide Allow output width to exceed 80 characters\n\
2590 -H --help Display this information\n\
2591 -v --version Display the version number of readelf\n"));
2592 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2598 request_dump (unsigned int section
, int type
)
2600 if (section
>= num_dump_sects
)
2602 char *new_dump_sects
;
2604 new_dump_sects
= calloc (section
+ 1, 1);
2606 if (new_dump_sects
== NULL
)
2607 error (_("Out of memory allocating dump request table."));
2610 /* Copy current flag settings. */
2611 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2615 dump_sects
= new_dump_sects
;
2616 num_dump_sects
= section
+ 1;
2621 dump_sects
[section
] |= type
;
2627 parse_args (int argc
, char **argv
)
2634 while ((c
= getopt_long
2635 (argc
, argv
, "ersuahnldSDAIgw::x:i:vVWH", options
, NULL
)) != EOF
)
2656 do_section_groups
++;
2664 do_section_groups
++;
2706 section
= strtoul (optarg
, & cp
, 0);
2707 if (! *cp
&& section
>= 0)
2709 request_dump (section
, HEX_DUMP
);
2719 unsigned int index
= 0;
2723 while (optarg
[index
])
2724 switch (optarg
[index
++])
2733 do_debug_abbrevs
= 1;
2743 do_debug_pubnames
= 1;
2748 do_debug_aranges
= 1;
2752 do_debug_frames_interp
= 1;
2754 do_debug_frames
= 1;
2759 do_debug_macinfo
= 1;
2773 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2778 case OPTION_DEBUG_DUMP
:
2784 static const char *debug_dump_opt
[]
2785 = { "line", "info", "abbrev", "pubnames", "ranges",
2786 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2795 for (index
= 0; debug_dump_opt
[index
]; index
++)
2797 size_t len
= strlen (debug_dump_opt
[index
]);
2799 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2800 && (p
[len
] == ',' || p
[len
] == '\0'))
2809 do_debug_abbrevs
= 1;
2820 do_debug_pubnames
= 1;
2824 do_debug_aranges
= 1;
2829 do_debug_frames_interp
= 1;
2830 do_debug_frames
= 1;
2834 do_debug_macinfo
= 1;
2847 if (debug_dump_opt
[index
] == NULL
)
2849 warn (_("Unrecognized debug option '%s'\n"), p
);
2850 p
= strchr (p
, ',');
2860 #ifdef SUPPORT_DISASSEMBLY
2863 section
= strtoul (optarg
, & cp
, 0);
2864 if (! *cp
&& section
>= 0)
2866 request_dump (section
, DISASS_DUMP
);
2872 print_version (program_name
);
2882 /* xgettext:c-format */
2883 error (_("Invalid option '-%c'\n"), c
);
2890 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2891 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2892 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
2893 && !do_section_groups
)
2897 warn (_("Nothing to do.\n"));
2903 get_elf_class (unsigned int elf_class
)
2905 static char buff
[32];
2909 case ELFCLASSNONE
: return _("none");
2910 case ELFCLASS32
: return "ELF32";
2911 case ELFCLASS64
: return "ELF64";
2913 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2919 get_data_encoding (unsigned int encoding
)
2921 static char buff
[32];
2925 case ELFDATANONE
: return _("none");
2926 case ELFDATA2LSB
: return _("2's complement, little endian");
2927 case ELFDATA2MSB
: return _("2's complement, big endian");
2929 sprintf (buff
, _("<unknown: %x>"), encoding
);
2934 /* Decode the data held in 'elf_header'. */
2937 process_file_header (void)
2939 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2940 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2941 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2942 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2945 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2953 printf (_("ELF Header:\n"));
2954 printf (_(" Magic: "));
2955 for (i
= 0; i
< EI_NIDENT
; i
++)
2956 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2958 printf (_(" Class: %s\n"),
2959 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2960 printf (_(" Data: %s\n"),
2961 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2962 printf (_(" Version: %d %s\n"),
2963 elf_header
.e_ident
[EI_VERSION
],
2964 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2966 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2969 printf (_(" OS/ABI: %s\n"),
2970 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2971 printf (_(" ABI Version: %d\n"),
2972 elf_header
.e_ident
[EI_ABIVERSION
]);
2973 printf (_(" Type: %s\n"),
2974 get_file_type (elf_header
.e_type
));
2975 printf (_(" Machine: %s\n"),
2976 get_machine_name (elf_header
.e_machine
));
2977 printf (_(" Version: 0x%lx\n"),
2978 (unsigned long) elf_header
.e_version
);
2980 printf (_(" Entry point address: "));
2981 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2982 printf (_("\n Start of program headers: "));
2983 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2984 printf (_(" (bytes into file)\n Start of section headers: "));
2985 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2986 printf (_(" (bytes into file)\n"));
2988 printf (_(" Flags: 0x%lx%s\n"),
2989 (unsigned long) elf_header
.e_flags
,
2990 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2991 printf (_(" Size of this header: %ld (bytes)\n"),
2992 (long) elf_header
.e_ehsize
);
2993 printf (_(" Size of program headers: %ld (bytes)\n"),
2994 (long) elf_header
.e_phentsize
);
2995 printf (_(" Number of program headers: %ld\n"),
2996 (long) elf_header
.e_phnum
);
2997 printf (_(" Size of section headers: %ld (bytes)\n"),
2998 (long) elf_header
.e_shentsize
);
2999 printf (_(" Number of section headers: %ld"),
3000 (long) elf_header
.e_shnum
);
3001 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3002 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3003 putc ('\n', stdout
);
3004 printf (_(" Section header string table index: %ld"),
3005 (long) elf_header
.e_shstrndx
);
3006 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3007 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3008 putc ('\n', stdout
);
3011 if (section_headers
!= NULL
)
3013 if (elf_header
.e_shnum
== 0)
3014 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3015 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3016 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3017 free (section_headers
);
3018 section_headers
= NULL
;
3026 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3028 Elf32_External_Phdr
*phdrs
;
3029 Elf32_External_Phdr
*external
;
3030 Elf_Internal_Phdr
*internal
;
3033 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3034 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3035 _("program headers"));
3039 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3040 i
< elf_header
.e_phnum
;
3041 i
++, internal
++, external
++)
3043 internal
->p_type
= BYTE_GET (external
->p_type
);
3044 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3045 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3046 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3047 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3048 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3049 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3050 internal
->p_align
= BYTE_GET (external
->p_align
);
3059 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3061 Elf64_External_Phdr
*phdrs
;
3062 Elf64_External_Phdr
*external
;
3063 Elf_Internal_Phdr
*internal
;
3066 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3067 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3068 _("program headers"));
3072 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3073 i
< elf_header
.e_phnum
;
3074 i
++, internal
++, external
++)
3076 internal
->p_type
= BYTE_GET (external
->p_type
);
3077 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3078 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
3079 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
3080 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
3081 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
3082 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
3083 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3091 /* Returns 1 if the program headers were read into `program_headers'. */
3094 get_program_headers (FILE *file
)
3096 Elf_Internal_Phdr
*phdrs
;
3098 /* Check cache of prior read. */
3099 if (program_headers
!= NULL
)
3102 phdrs
= malloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3106 error (_("Out of memory\n"));
3111 ? get_32bit_program_headers (file
, phdrs
)
3112 : get_64bit_program_headers (file
, phdrs
))
3114 program_headers
= phdrs
;
3122 /* Returns 1 if the program headers were loaded. */
3125 process_program_headers (FILE *file
)
3127 Elf_Internal_Phdr
*segment
;
3130 if (elf_header
.e_phnum
== 0)
3133 printf (_("\nThere are no program headers in this file.\n"));
3137 if (do_segments
&& !do_header
)
3139 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3140 printf (_("Entry point "));
3141 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3142 printf (_("\nThere are %d program headers, starting at offset "),
3143 elf_header
.e_phnum
);
3144 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3148 if (! get_program_headers (file
))
3153 if (elf_header
.e_phnum
> 1)
3154 printf (_("\nProgram Headers:\n"));
3156 printf (_("\nProgram Headers:\n"));
3160 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3163 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3167 (_(" Type Offset VirtAddr PhysAddr\n"));
3169 (_(" FileSiz MemSiz Flags Align\n"));
3176 for (i
= 0, segment
= program_headers
;
3177 i
< elf_header
.e_phnum
;
3182 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3186 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3187 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3188 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3189 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3190 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3192 (segment
->p_flags
& PF_R
? 'R' : ' '),
3193 (segment
->p_flags
& PF_W
? 'W' : ' '),
3194 (segment
->p_flags
& PF_X
? 'E' : ' '));
3195 printf ("%#lx", (unsigned long) segment
->p_align
);
3199 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3200 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3203 print_vma (segment
->p_offset
, FULL_HEX
);
3207 print_vma (segment
->p_vaddr
, FULL_HEX
);
3209 print_vma (segment
->p_paddr
, FULL_HEX
);
3212 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3213 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3216 print_vma (segment
->p_filesz
, FULL_HEX
);
3220 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3221 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3224 print_vma (segment
->p_offset
, FULL_HEX
);
3228 (segment
->p_flags
& PF_R
? 'R' : ' '),
3229 (segment
->p_flags
& PF_W
? 'W' : ' '),
3230 (segment
->p_flags
& PF_X
? 'E' : ' '));
3232 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3233 printf ("%#lx", (unsigned long) segment
->p_align
);
3236 print_vma (segment
->p_align
, PREFIX_HEX
);
3241 print_vma (segment
->p_offset
, FULL_HEX
);
3243 print_vma (segment
->p_vaddr
, FULL_HEX
);
3245 print_vma (segment
->p_paddr
, FULL_HEX
);
3247 print_vma (segment
->p_filesz
, FULL_HEX
);
3249 print_vma (segment
->p_memsz
, FULL_HEX
);
3251 (segment
->p_flags
& PF_R
? 'R' : ' '),
3252 (segment
->p_flags
& PF_W
? 'W' : ' '),
3253 (segment
->p_flags
& PF_X
? 'E' : ' '));
3254 print_vma (segment
->p_align
, HEX
);
3258 switch (segment
->p_type
)
3262 error (_("more than one dynamic segment\n"));
3264 /* Try to locate the .dynamic section. If there is
3265 a section header table, we can easily locate it. */
3266 if (section_headers
!= NULL
)
3268 Elf_Internal_Shdr
*sec
;
3271 for (j
= 0, sec
= section_headers
;
3272 j
< elf_header
.e_shnum
;
3274 if (strcmp (SECTION_NAME (sec
), ".dynamic") == 0)
3277 if (j
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
3279 error (_("no .dynamic section in the dynamic segment"));
3283 dynamic_addr
= sec
->sh_offset
;
3284 dynamic_size
= sec
->sh_size
;
3286 if (dynamic_addr
< segment
->p_offset
3287 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3288 warn (_("the .dynamic section is not contained within the dynamic segment"));
3289 else if (dynamic_addr
> segment
->p_offset
)
3290 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3294 /* Otherwise, we can only assume that the .dynamic
3295 section is the first section in the DYNAMIC segment. */
3296 dynamic_addr
= segment
->p_offset
;
3297 dynamic_size
= segment
->p_filesz
;
3302 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3304 error (_("Unable to find program interpreter name\n"));
3307 program_interpreter
[0] = 0;
3308 fscanf (file
, "%63s", program_interpreter
);
3311 printf (_("\n [Requesting program interpreter: %s]"),
3312 program_interpreter
);
3318 putc ('\n', stdout
);
3321 if (do_segments
&& section_headers
!= NULL
)
3323 printf (_("\n Section to Segment mapping:\n"));
3324 printf (_(" Segment Sections...\n"));
3326 assert (string_table
!= NULL
);
3328 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3331 Elf_Internal_Shdr
*section
;
3333 segment
= program_headers
+ i
;
3334 section
= section_headers
;
3336 printf (" %2.2d ", i
);
3338 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3340 if (section
->sh_size
> 0
3341 /* Compare allocated sections by VMA, unallocated
3342 sections by file offset. */
3343 && (section
->sh_flags
& SHF_ALLOC
3344 ? (section
->sh_addr
>= segment
->p_vaddr
3345 && section
->sh_addr
+ section
->sh_size
3346 <= segment
->p_vaddr
+ segment
->p_memsz
)
3347 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3348 && (section
->sh_offset
+ section
->sh_size
3349 <= segment
->p_offset
+ segment
->p_filesz
)))
3350 /* .tbss is special. It doesn't contribute memory space
3351 to normal segments. */
3352 && (!((section
->sh_flags
& SHF_TLS
) != 0
3353 && section
->sh_type
== SHT_NOBITS
)
3354 || segment
->p_type
== PT_TLS
))
3355 printf ("%s ", SECTION_NAME (section
));
3366 /* Find the file offset corresponding to VMA by using the program headers. */
3369 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3371 Elf_Internal_Phdr
*seg
;
3373 if (! get_program_headers (file
))
3375 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3379 for (seg
= program_headers
;
3380 seg
< program_headers
+ elf_header
.e_phnum
;
3383 if (seg
->p_type
!= PT_LOAD
)
3386 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3387 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3388 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3391 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3398 get_32bit_section_headers (FILE *file
, unsigned int num
)
3400 Elf32_External_Shdr
*shdrs
;
3401 Elf_Internal_Shdr
*internal
;
3404 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3405 elf_header
.e_shentsize
* num
, _("section headers"));
3409 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3411 if (section_headers
== NULL
)
3413 error (_("Out of memory\n"));
3417 for (i
= 0, internal
= section_headers
;
3421 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3422 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3423 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3424 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3425 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3426 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3427 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3428 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3429 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3430 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3439 get_64bit_section_headers (FILE *file
, unsigned int num
)
3441 Elf64_External_Shdr
*shdrs
;
3442 Elf_Internal_Shdr
*internal
;
3445 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3446 elf_header
.e_shentsize
* num
, _("section headers"));
3450 section_headers
= malloc (num
* sizeof (Elf_Internal_Shdr
));
3452 if (section_headers
== NULL
)
3454 error (_("Out of memory\n"));
3458 for (i
= 0, internal
= section_headers
;
3462 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3463 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3464 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3465 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3466 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3467 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3468 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3469 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3470 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3471 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3479 static Elf_Internal_Sym
*
3480 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3482 unsigned long number
;
3483 Elf32_External_Sym
*esyms
;
3484 Elf_External_Sym_Shndx
*shndx
;
3485 Elf_Internal_Sym
*isyms
;
3486 Elf_Internal_Sym
*psym
;
3489 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3495 if (symtab_shndx_hdr
!= NULL
3496 && (symtab_shndx_hdr
->sh_link
3497 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3499 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3500 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3508 number
= section
->sh_size
/ section
->sh_entsize
;
3509 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3513 error (_("Out of memory\n"));
3520 for (j
= 0, psym
= isyms
;
3524 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3525 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3526 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3527 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3528 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3530 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3531 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3532 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3542 static Elf_Internal_Sym
*
3543 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3545 unsigned long number
;
3546 Elf64_External_Sym
*esyms
;
3547 Elf_External_Sym_Shndx
*shndx
;
3548 Elf_Internal_Sym
*isyms
;
3549 Elf_Internal_Sym
*psym
;
3552 esyms
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
3558 if (symtab_shndx_hdr
!= NULL
3559 && (symtab_shndx_hdr
->sh_link
3560 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3562 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3563 symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3571 number
= section
->sh_size
/ section
->sh_entsize
;
3572 isyms
= malloc (number
* sizeof (Elf_Internal_Sym
));
3576 error (_("Out of memory\n"));
3583 for (j
= 0, psym
= isyms
;
3587 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3588 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3589 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3590 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3591 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3593 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3594 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3595 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3606 get_elf_section_flags (bfd_vma sh_flags
)
3608 static char buff
[32];
3616 flag
= sh_flags
& - sh_flags
;
3621 case SHF_WRITE
: strcat (buff
, "W"); break;
3622 case SHF_ALLOC
: strcat (buff
, "A"); break;
3623 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3624 case SHF_MERGE
: strcat (buff
, "M"); break;
3625 case SHF_STRINGS
: strcat (buff
, "S"); break;
3626 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3627 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3628 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3629 case SHF_GROUP
: strcat (buff
, "G"); break;
3630 case SHF_TLS
: strcat (buff
, "T"); break;
3633 if (flag
& SHF_MASKOS
)
3636 sh_flags
&= ~ SHF_MASKOS
;
3638 else if (flag
& SHF_MASKPROC
)
3641 sh_flags
&= ~ SHF_MASKPROC
;
3653 process_section_headers (FILE *file
)
3655 Elf_Internal_Shdr
*section
;
3658 section_headers
= NULL
;
3660 if (elf_header
.e_shnum
== 0)
3663 printf (_("\nThere are no sections in this file.\n"));
3668 if (do_sections
&& !do_header
)
3669 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3670 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3674 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3677 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3680 /* Read in the string table, so that we have names to display. */
3681 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3683 if (section
->sh_size
!= 0)
3685 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3686 section
->sh_size
, _("string table"));
3688 if (string_table
== NULL
)
3691 string_table_length
= section
->sh_size
;
3694 /* Scan the sections for the dynamic symbol table
3695 and dynamic string table and debug sections. */
3696 dynamic_symbols
= NULL
;
3697 dynamic_strings
= NULL
;
3698 dynamic_syminfo
= NULL
;
3699 symtab_shndx_hdr
= NULL
;
3701 for (i
= 0, section
= section_headers
;
3702 i
< elf_header
.e_shnum
;
3705 char *name
= SECTION_NAME (section
);
3707 if (section
->sh_type
== SHT_DYNSYM
)
3709 if (dynamic_symbols
!= NULL
)
3711 error (_("File contains multiple dynamic symbol tables\n"));
3715 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3716 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3718 else if (section
->sh_type
== SHT_STRTAB
3719 && strcmp (name
, ".dynstr") == 0)
3721 if (dynamic_strings
!= NULL
)
3723 error (_("File contains multiple dynamic string tables\n"));
3727 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3728 section
->sh_size
, _("dynamic strings"));
3729 dynamic_strings_length
= section
->sh_size
;
3731 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3733 if (symtab_shndx_hdr
!= NULL
)
3735 error (_("File contains multiple symtab shndx tables\n"));
3738 symtab_shndx_hdr
= section
;
3740 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3741 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3742 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3744 && strncmp (name
, ".debug_", 7) == 0)
3749 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3750 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3751 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3752 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3753 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3754 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3755 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3756 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3757 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3759 request_dump (i
, DEBUG_DUMP
);
3761 /* linkonce section to be combined with .debug_info at link time. */
3762 else if ((do_debugging
|| do_debug_info
)
3763 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3764 request_dump (i
, DEBUG_DUMP
);
3765 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3766 request_dump (i
, DEBUG_DUMP
);
3772 if (elf_header
.e_shnum
> 1)
3773 printf (_("\nSection Headers:\n"));
3775 printf (_("\nSection Header:\n"));
3779 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3782 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3785 printf (_(" [Nr] Name Type Address Offset\n"));
3786 printf (_(" Size EntSize Flags Link Info Align\n"));
3789 for (i
= 0, section
= section_headers
;
3790 i
< elf_header
.e_shnum
;
3793 printf (" [%2u] %-17.17s %-15.15s ",
3794 SECTION_HEADER_NUM (i
),
3795 SECTION_NAME (section
),
3796 get_section_type_name (section
->sh_type
));
3800 print_vma (section
->sh_addr
, LONG_HEX
);
3802 printf ( " %6.6lx %6.6lx %2.2lx",
3803 (unsigned long) section
->sh_offset
,
3804 (unsigned long) section
->sh_size
,
3805 (unsigned long) section
->sh_entsize
);
3807 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3809 printf ("%2ld %3lu %2ld\n",
3810 (unsigned long) section
->sh_link
,
3811 (unsigned long) section
->sh_info
,
3812 (unsigned long) section
->sh_addralign
);
3816 print_vma (section
->sh_addr
, LONG_HEX
);
3818 if ((long) section
->sh_offset
== section
->sh_offset
)
3819 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3823 print_vma (section
->sh_offset
, LONG_HEX
);
3826 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3827 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3831 print_vma (section
->sh_size
, LONG_HEX
);
3834 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3835 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3839 print_vma (section
->sh_entsize
, LONG_HEX
);
3842 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3844 printf ("%2ld %3lu ",
3845 (unsigned long) section
->sh_link
,
3846 (unsigned long) section
->sh_info
);
3848 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3849 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3852 print_vma (section
->sh_addralign
, DEC
);
3859 print_vma (section
->sh_addr
, LONG_HEX
);
3860 if ((long) section
->sh_offset
== section
->sh_offset
)
3861 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3865 print_vma (section
->sh_offset
, LONG_HEX
);
3868 print_vma (section
->sh_size
, LONG_HEX
);
3870 print_vma (section
->sh_entsize
, LONG_HEX
);
3872 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3874 printf (" %2ld %3lu %ld\n",
3875 (unsigned long) section
->sh_link
,
3876 (unsigned long) section
->sh_info
,
3877 (unsigned long) section
->sh_addralign
);
3881 printf (_("Key to Flags:\n\
3882 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3883 I (info), L (link order), G (group), x (unknown)\n\
3884 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3890 get_group_flags (unsigned int flags
)
3892 static char buff
[32];
3899 sprintf (buff
, _("[<unknown>: 0x%x]"), flags
);
3906 process_section_groups (FILE *file
)
3908 Elf_Internal_Shdr
*section
;
3910 struct group
*group
;
3912 if (elf_header
.e_shnum
== 0)
3914 if (do_section_groups
)
3915 printf (_("\nThere are no section groups in this file.\n"));
3920 if (section_headers
== NULL
)
3922 error (_("Section headers are not available!\n"));
3926 section_headers_groups
= calloc (elf_header
.e_shnum
,
3927 sizeof (struct group
*));
3929 if (section_headers_groups
== NULL
)
3931 error (_("Out of memory\n"));
3935 /* Scan the sections for the group section. */
3936 for (i
= 0, section
= section_headers
;
3937 i
< elf_header
.e_shnum
;
3939 if (section
->sh_type
== SHT_GROUP
)
3942 section_groups
= calloc (group_count
, sizeof (struct group
));
3944 if (section_groups
== NULL
)
3946 error (_("Out of memory\n"));
3950 for (i
= 0, section
= section_headers
, group
= section_groups
;
3951 i
< elf_header
.e_shnum
;
3954 if (section
->sh_type
== SHT_GROUP
)
3956 char *name
= SECTION_NAME (section
);
3957 char *group_name
, *strtab
, *start
, *indices
;
3958 unsigned int entry
, j
, size
;
3959 Elf_Internal_Sym
*sym
;
3960 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
, *sec
;
3961 Elf_Internal_Sym
*symtab
;
3963 /* Get the symbol table. */
3964 symtab_sec
= SECTION_HEADER (section
->sh_link
);
3965 if (symtab_sec
->sh_type
!= SHT_SYMTAB
)
3967 error (_("Bad sh_link in group section `%s'\n"), name
);
3970 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
3972 sym
= symtab
+ section
->sh_info
;
3974 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3976 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
3979 error (_("Bad sh_info in group section `%s'\n"), name
);
3983 group_name
= SECTION_NAME (section_headers
+ sec_index
);
3988 /* Get the string table. */
3989 strtab_sec
= SECTION_HEADER (symtab_sec
->sh_link
);
3990 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
3991 strtab_sec
->sh_size
,
3994 group_name
= strtab
+ sym
->st_name
;
3997 start
= get_data (NULL
, file
, section
->sh_offset
,
3998 section
->sh_size
, _("section data"));
4001 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4002 entry
= byte_get (indices
, 4);
4005 if (do_section_groups
)
4007 printf ("\n%s group section `%s' [%s] contains %u sections:\n",
4008 get_group_flags (entry
), name
, group_name
, size
);
4010 printf (_(" [Index] Name\n"));
4013 group
->group_index
= i
;
4015 for (j
= 0; j
< size
; j
++)
4017 struct group_list
*g
;
4019 entry
= byte_get (indices
, 4);
4022 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4025 error (_("section [%5u] already in group section [%5u]\n"),
4026 entry
, section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4030 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4033 if (do_section_groups
)
4035 sec
= SECTION_HEADER (entry
);
4036 printf (" [%5u] %s\n",
4037 entry
, SECTION_NAME (sec
));
4040 g
= xmalloc (sizeof (struct group_list
));
4041 g
->section_index
= entry
;
4042 g
->next
= group
->root
;
4066 } dynamic_relocations
[] =
4068 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4069 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4070 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4073 /* Process the reloc section. */
4075 process_relocs (FILE *file
)
4077 unsigned long rel_size
;
4078 unsigned long rel_offset
;
4084 if (do_using_dynamic
)
4088 int has_dynamic_reloc
;
4091 has_dynamic_reloc
= 0;
4093 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4095 is_rela
= dynamic_relocations
[i
].rela
;
4096 name
= dynamic_relocations
[i
].name
;
4097 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4098 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4100 has_dynamic_reloc
|= rel_size
;
4102 if (is_rela
== UNKNOWN
)
4104 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4105 switch (dynamic_info
[DT_PLTREL
])
4119 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4120 name
, rel_offset
, rel_size
);
4122 dump_relocations (file
,
4123 offset_from_vma (file
, rel_offset
, rel_size
),
4125 dynamic_symbols
, num_dynamic_syms
,
4126 dynamic_strings
, dynamic_strings_length
, is_rela
);
4130 if (! has_dynamic_reloc
)
4131 printf (_("\nThere are no dynamic relocations in this file.\n"));
4135 Elf_Internal_Shdr
*section
;
4139 for (i
= 0, section
= section_headers
;
4140 i
< elf_header
.e_shnum
;
4143 if ( section
->sh_type
!= SHT_RELA
4144 && section
->sh_type
!= SHT_REL
)
4147 rel_offset
= section
->sh_offset
;
4148 rel_size
= section
->sh_size
;
4152 Elf_Internal_Shdr
*strsec
;
4155 printf (_("\nRelocation section "));
4157 if (string_table
== NULL
)
4158 printf ("%d", section
->sh_name
);
4160 printf (_("'%s'"), SECTION_NAME (section
));
4162 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4163 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4165 is_rela
= section
->sh_type
== SHT_RELA
;
4167 if (section
->sh_link
)
4169 Elf_Internal_Shdr
*symsec
;
4170 Elf_Internal_Sym
*symtab
;
4171 unsigned long nsyms
;
4172 unsigned long strtablen
;
4173 char *strtab
= NULL
;
4175 symsec
= SECTION_HEADER (section
->sh_link
);
4176 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4177 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4182 strsec
= SECTION_HEADER (symsec
->sh_link
);
4184 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4185 strsec
->sh_size
, _("string table"));
4186 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4188 dump_relocations (file
, rel_offset
, rel_size
,
4189 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4195 dump_relocations (file
, rel_offset
, rel_size
,
4196 NULL
, 0, NULL
, 0, is_rela
);
4203 printf (_("\nThere are no relocations in this file.\n"));
4209 /* Process the unwind section. */
4211 #include "unwind-ia64.h"
4213 /* An absolute address consists of a section and an offset. If the
4214 section is NULL, the offset itself is the address, otherwise, the
4215 address equals to LOAD_ADDRESS(section) + offset. */
4219 unsigned short section
;
4223 struct ia64_unw_aux_info
4225 struct ia64_unw_table_entry
4227 struct absaddr start
;
4229 struct absaddr info
;
4231 *table
; /* Unwind table. */
4232 unsigned long table_len
; /* Length of unwind table. */
4233 unsigned char *info
; /* Unwind info. */
4234 unsigned long info_size
; /* Size of unwind info. */
4235 bfd_vma info_addr
; /* starting address of unwind info. */
4236 bfd_vma seg_base
; /* Starting address of segment. */
4237 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4238 unsigned long nsyms
; /* Number of symbols. */
4239 char *strtab
; /* The string table. */
4240 unsigned long strtab_size
; /* Size of string table. */
4244 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4245 unsigned long nsyms
,
4247 unsigned long strtab_size
,
4248 struct absaddr addr
,
4249 const char **symname
,
4252 bfd_vma dist
= 0x100000;
4253 Elf_Internal_Sym
*sym
, *best
= NULL
;
4256 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4258 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4259 && sym
->st_name
!= 0
4260 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4261 && addr
.offset
>= sym
->st_value
4262 && addr
.offset
- sym
->st_value
< dist
)
4265 dist
= addr
.offset
- sym
->st_value
;
4272 *symname
= (best
->st_name
>= strtab_size
4273 ? "<corrupt>" : strtab
+ best
->st_name
);
4278 *offset
= addr
.offset
;
4282 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4285 struct ia64_unw_table_entry
*tp
;
4288 addr_size
= is_32bit_elf
? 4 : 8;
4290 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4294 const unsigned char *dp
;
4295 const unsigned char *head
;
4296 const char *procname
;
4298 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4299 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4301 fputs ("\n<", stdout
);
4305 fputs (procname
, stdout
);
4308 printf ("+%lx", (unsigned long) offset
);
4311 fputs (">: [", stdout
);
4312 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4313 fputc ('-', stdout
);
4314 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4315 printf ("], info at +0x%lx\n",
4316 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4318 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4319 stamp
= BYTE_GET8 ((unsigned char *) head
);
4321 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4322 (unsigned) UNW_VER (stamp
),
4323 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4324 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4325 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4326 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4328 if (UNW_VER (stamp
) != 1)
4330 printf ("\tUnknown version.\n");
4335 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4336 dp
= unw_decode (dp
, in_body
, & in_body
);
4341 slurp_ia64_unwind_table (FILE *file
,
4342 struct ia64_unw_aux_info
*aux
,
4343 Elf_Internal_Shdr
*sec
)
4345 unsigned long size
, addr_size
, nrelas
, i
;
4346 Elf_Internal_Phdr
*seg
;
4347 struct ia64_unw_table_entry
*tep
;
4348 Elf_Internal_Shdr
*relsec
;
4349 Elf_Internal_Rela
*rela
, *rp
;
4350 unsigned char *table
, *tp
;
4351 Elf_Internal_Sym
*sym
;
4352 const char *relname
;
4354 addr_size
= is_32bit_elf
? 4 : 8;
4356 /* First, find the starting address of the segment that includes
4359 if (elf_header
.e_phnum
)
4361 if (! get_program_headers (file
))
4364 for (seg
= program_headers
;
4365 seg
< program_headers
+ elf_header
.e_phnum
;
4368 if (seg
->p_type
!= PT_LOAD
)
4371 if (sec
->sh_addr
>= seg
->p_vaddr
4372 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4374 aux
->seg_base
= seg
->p_vaddr
;
4380 /* Second, build the unwind table from the contents of the unwind section: */
4381 size
= sec
->sh_size
;
4382 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4386 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4387 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4389 tep
->start
.section
= SHN_UNDEF
;
4390 tep
->end
.section
= SHN_UNDEF
;
4391 tep
->info
.section
= SHN_UNDEF
;
4394 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4395 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4396 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4400 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4401 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4402 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4404 tep
->start
.offset
+= aux
->seg_base
;
4405 tep
->end
.offset
+= aux
->seg_base
;
4406 tep
->info
.offset
+= aux
->seg_base
;
4410 /* Third, apply any relocations to the unwind table: */
4412 for (relsec
= section_headers
;
4413 relsec
< section_headers
+ elf_header
.e_shnum
;
4416 if (relsec
->sh_type
!= SHT_RELA
4417 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4420 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4424 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4428 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4429 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4433 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4434 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4437 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4439 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4443 i
= rp
->r_offset
/ (3 * addr_size
);
4445 switch (rp
->r_offset
/addr_size
% 3)
4448 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4449 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4452 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4453 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4456 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4457 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4467 aux
->table_len
= size
/ (3 * addr_size
);
4472 ia64_process_unwind (FILE *file
)
4474 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4475 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4476 struct ia64_unw_aux_info aux
;
4478 memset (& aux
, 0, sizeof (aux
));
4480 addr_size
= is_32bit_elf
? 4 : 8;
4482 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4484 if (sec
->sh_type
== SHT_SYMTAB
)
4486 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4487 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4489 strsec
= SECTION_HEADER (sec
->sh_link
);
4490 aux
.strtab_size
= strsec
->sh_size
;
4491 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4492 aux
.strtab_size
, _("string table"));
4494 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4499 printf (_("\nThere are no unwind sections in this file.\n"));
4501 while (unwcount
-- > 0)
4506 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4507 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4508 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4515 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4517 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4519 /* We need to find which section group it is in. */
4520 struct group_list
*g
= section_headers_groups
[i
]->root
;
4522 for (; g
!= NULL
; g
= g
->next
)
4524 sec
= SECTION_HEADER (g
->section_index
);
4525 if (strcmp (SECTION_NAME (sec
),
4526 ELF_STRING_ia64_unwind_info
) == 0)
4531 i
= elf_header
.e_shnum
;
4533 else if (strncmp (SECTION_NAME (unwsec
),
4534 ELF_STRING_ia64_unwind_once
, len
) == 0)
4536 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4537 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4538 suffix
= SECTION_NAME (unwsec
) + len
;
4539 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4541 if (strncmp (SECTION_NAME (sec
),
4542 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4543 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4548 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4549 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4550 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4551 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4553 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4555 suffix
= SECTION_NAME (unwsec
) + len
;
4556 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4558 if (strncmp (SECTION_NAME (sec
),
4559 ELF_STRING_ia64_unwind_info
, len2
) == 0
4560 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4564 if (i
== elf_header
.e_shnum
)
4566 printf (_("\nCould not find unwind info section for "));
4568 if (string_table
== NULL
)
4569 printf ("%d", unwsec
->sh_name
);
4571 printf (_("'%s'"), SECTION_NAME (unwsec
));
4575 aux
.info_size
= sec
->sh_size
;
4576 aux
.info_addr
= sec
->sh_addr
;
4577 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, aux
.info_size
,
4580 printf (_("\nUnwind section "));
4582 if (string_table
== NULL
)
4583 printf ("%d", unwsec
->sh_name
);
4585 printf (_("'%s'"), SECTION_NAME (unwsec
));
4587 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4588 (unsigned long) unwsec
->sh_offset
,
4589 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4591 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4593 if (aux
.table_len
> 0)
4594 dump_ia64_unwind (& aux
);
4597 free ((char *) aux
.table
);
4599 free ((char *) aux
.info
);
4608 free ((char *) aux
.strtab
);
4613 struct hppa_unw_aux_info
4615 struct hppa_unw_table_entry
4617 struct absaddr start
;
4619 unsigned int Cannot_unwind
:1; /* 0 */
4620 unsigned int Millicode
:1; /* 1 */
4621 unsigned int Millicode_save_sr0
:1; /* 2 */
4622 unsigned int Region_description
:2; /* 3..4 */
4623 unsigned int reserved1
:1; /* 5 */
4624 unsigned int Entry_SR
:1; /* 6 */
4625 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
4626 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
4627 unsigned int Args_stored
:1; /* 16 */
4628 unsigned int Variable_Frame
:1; /* 17 */
4629 unsigned int Separate_Package_Body
:1; /* 18 */
4630 unsigned int Frame_Extension_Millicode
:1; /* 19 */
4631 unsigned int Stack_Overflow_Check
:1; /* 20 */
4632 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
4633 unsigned int Ada_Region
:1; /* 22 */
4634 unsigned int cxx_info
:1; /* 23 */
4635 unsigned int cxx_try_catch
:1; /* 24 */
4636 unsigned int sched_entry_seq
:1; /* 25 */
4637 unsigned int reserved2
:1; /* 26 */
4638 unsigned int Save_SP
:1; /* 27 */
4639 unsigned int Save_RP
:1; /* 28 */
4640 unsigned int Save_MRP_in_frame
:1; /* 29 */
4641 unsigned int extn_ptr_defined
:1; /* 30 */
4642 unsigned int Cleanup_defined
:1; /* 31 */
4644 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
4645 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
4646 unsigned int Large_frame
:1; /* 2 */
4647 unsigned int Pseudo_SP_Set
:1; /* 3 */
4648 unsigned int reserved4
:1; /* 4 */
4649 unsigned int Total_frame_size
:27; /* 5..31 */
4651 *table
; /* Unwind table. */
4652 unsigned long table_len
; /* Length of unwind table. */
4653 bfd_vma seg_base
; /* Starting address of segment. */
4654 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4655 unsigned long nsyms
; /* Number of symbols. */
4656 char *strtab
; /* The string table. */
4657 unsigned long strtab_size
; /* Size of string table. */
4661 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
4664 struct hppa_unw_table_entry
*tp
;
4666 addr_size
= is_32bit_elf
? 4 : 8;
4667 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4670 const char *procname
;
4672 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4673 aux
->strtab_size
, tp
->start
, &procname
,
4676 fputs ("\n<", stdout
);
4680 fputs (procname
, stdout
);
4683 printf ("+%lx", (unsigned long) offset
);
4686 fputs (">: [", stdout
);
4687 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4688 fputc ('-', stdout
);
4689 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4692 #define PF(_m) if (tp->_m) printf(#_m " ");
4693 #define PV(_m) if (tp->_m) printf(#_m "=%d ", tp->_m);
4696 PF(Millicode_save_sr0
);
4697 /* PV(Region_description); */
4703 PF(Separate_Package_Body
);
4704 PF(Frame_Extension_Millicode
);
4705 PF(Stack_Overflow_Check
);
4706 PF(Two_Instruction_SP_Increment
);
4710 PF(sched_entry_seq
);
4713 PF(Save_MRP_in_frame
);
4714 PF(extn_ptr_defined
);
4715 PF(Cleanup_defined
);
4716 PF(MPE_XL_interrupt_marker
);
4717 PF(HP_UX_interrupt_marker
);
4720 PV(Total_frame_size
);
4729 slurp_hppa_unwind_table (FILE *file
,
4730 struct hppa_unw_aux_info
*aux
,
4731 Elf_Internal_Shdr
*sec
)
4733 unsigned long size
, unw_ent_size
, addr_size
, nrelas
, i
;
4734 Elf_Internal_Phdr
*seg
;
4735 struct hppa_unw_table_entry
*tep
;
4736 Elf_Internal_Shdr
*relsec
;
4737 Elf_Internal_Rela
*rela
, *rp
;
4738 unsigned char *table
, *tp
;
4739 Elf_Internal_Sym
*sym
;
4740 const char *relname
;
4742 addr_size
= is_32bit_elf
? 4 : 8;
4744 /* First, find the starting address of the segment that includes
4747 if (elf_header
.e_phnum
)
4749 if (! get_program_headers (file
))
4752 for (seg
= program_headers
;
4753 seg
< program_headers
+ elf_header
.e_phnum
;
4756 if (seg
->p_type
!= PT_LOAD
)
4759 if (sec
->sh_addr
>= seg
->p_vaddr
4760 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4762 aux
->seg_base
= seg
->p_vaddr
;
4768 /* Second, build the unwind table from the contents of the unwind
4770 size
= sec
->sh_size
;
4771 table
= get_data (NULL
, file
, sec
->sh_offset
, size
, _("unwind table"));
4775 unw_ent_size
= 2 * addr_size
+ 8;
4777 tep
= aux
->table
= xmalloc (size
/ unw_ent_size
* sizeof (aux
->table
[0]));
4779 for (tp
= table
; tp
< table
+ size
; tp
+= (2 * addr_size
+ 8), ++tep
)
4781 unsigned int tmp1
, tmp2
;
4783 tep
->start
.section
= SHN_UNDEF
;
4784 tep
->end
.section
= SHN_UNDEF
;
4788 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4789 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4790 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
4791 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
4795 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4796 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4797 tmp1
= byte_get ((unsigned char *) tp
+ 16, 4);
4798 tmp2
= byte_get ((unsigned char *) tp
+ 20, 4);
4801 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
4802 tep
->Millicode
= (tmp1
>> 30) & 0x1;
4803 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
4804 tep
->Region_description
= (tmp1
>> 27) & 0x3;
4805 tep
->reserved1
= (tmp1
>> 26) & 0x1;
4806 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
4807 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
4808 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
4809 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
4810 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
4811 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
4812 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
4813 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
4814 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
4815 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
4816 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
4817 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
4818 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
4819 tep
->reserved2
= (tmp1
>> 5) & 0x1;
4820 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
4821 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
4822 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
4823 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
4824 tep
->Cleanup_defined
= tmp1
& 0x1;
4826 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
4827 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
4828 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
4829 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
4830 tep
->reserved4
= (tmp2
>> 27) & 0x1;
4831 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
4833 tep
->start
.offset
+= aux
->seg_base
;
4834 tep
->end
.offset
+= aux
->seg_base
;
4838 /* Third, apply any relocations to the unwind table. */
4840 for (relsec
= section_headers
;
4841 relsec
< section_headers
+ elf_header
.e_shnum
;
4844 if (relsec
->sh_type
!= SHT_RELA
4845 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4848 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4852 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4856 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4857 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4861 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4862 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4865 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
4866 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
4868 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4872 i
= rp
->r_offset
/ unw_ent_size
;
4874 switch ((rp
->r_offset
% unw_ent_size
) / addr_size
)
4877 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4878 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
4881 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4882 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
4892 aux
->table_len
= size
/ unw_ent_size
;
4898 hppa_process_unwind (FILE *file
)
4900 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4901 unsigned long i
, addr_size
;
4902 struct hppa_unw_aux_info aux
;
4904 memset (& aux
, 0, sizeof (aux
));
4906 assert (string_table
!= NULL
);
4907 addr_size
= is_32bit_elf
? 4 : 8;
4909 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4911 if (sec
->sh_type
== SHT_SYMTAB
)
4913 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4914 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4916 strsec
= SECTION_HEADER (sec
->sh_link
);
4917 aux
.strtab_size
= strsec
->sh_size
;
4918 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4919 aux
.strtab_size
, _("string table"));
4921 else if (strcmp (SECTION_NAME(sec
), ".PARISC.unwind") == 0)
4926 printf (_("\nThere are no unwind sections in this file.\n"));
4928 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4930 if (strcmp (SECTION_NAME(sec
), ".PARISC.unwind") == 0)
4933 printf (_("\nUnwind section "));
4934 printf (_("'%s'"), SECTION_NAME (sec
));
4936 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4937 (unsigned long) sec
->sh_offset
,
4938 (unsigned long) (sec
->sh_size
/ (2 * addr_size
+ 8)));
4940 slurp_hppa_unwind_table (file
, &aux
, sec
);
4941 if (aux
.table_len
> 0)
4942 dump_hppa_unwind (&aux
);
4945 free ((char *) aux
.table
);
4953 free ((char *) aux
.strtab
);
4959 process_unwind (FILE *file
)
4961 struct unwind_handler
{
4963 int (*handler
)(FILE *file
);
4965 { EM_IA_64
, ia64_process_unwind
},
4966 { EM_PARISC
, hppa_process_unwind
},
4974 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
4975 if (elf_header
.e_machine
== handlers
[i
].machtype
)
4976 return handlers
[i
].handler(file
);
4978 printf (_("\nThere are no unwind sections in this file.\n"));
4983 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
4985 switch (entry
->d_tag
)
4988 if (entry
->d_un
.d_val
== 0)
4992 static const char * opts
[] =
4994 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4995 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4996 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4997 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5002 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5003 if (entry
->d_un
.d_val
& (1 << cnt
))
5005 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5012 case DT_MIPS_IVERSION
:
5013 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5014 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5016 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5019 case DT_MIPS_TIME_STAMP
:
5024 time_t time
= entry
->d_un
.d_val
;
5025 tmp
= gmtime (&time
);
5026 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
5027 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5028 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5029 printf ("Time Stamp: %s\n", timebuf
);
5033 case DT_MIPS_RLD_VERSION
:
5034 case DT_MIPS_LOCAL_GOTNO
:
5035 case DT_MIPS_CONFLICTNO
:
5036 case DT_MIPS_LIBLISTNO
:
5037 case DT_MIPS_SYMTABNO
:
5038 case DT_MIPS_UNREFEXTNO
:
5039 case DT_MIPS_HIPAGENO
:
5040 case DT_MIPS_DELTA_CLASS_NO
:
5041 case DT_MIPS_DELTA_INSTANCE_NO
:
5042 case DT_MIPS_DELTA_RELOC_NO
:
5043 case DT_MIPS_DELTA_SYM_NO
:
5044 case DT_MIPS_DELTA_CLASSSYM_NO
:
5045 case DT_MIPS_COMPACT_SIZE
:
5046 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5050 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5056 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5058 switch (entry
->d_tag
)
5060 case DT_HP_DLD_FLAGS
:
5069 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5070 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5071 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5072 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5073 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5074 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5075 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5076 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5077 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5078 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5079 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
5083 bfd_vma val
= entry
->d_un
.d_val
;
5085 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5086 if (val
& flags
[cnt
].bit
)
5090 fputs (flags
[cnt
].str
, stdout
);
5092 val
^= flags
[cnt
].bit
;
5095 if (val
!= 0 || first
)
5099 print_vma (val
, HEX
);
5105 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5112 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5114 switch (entry
->d_tag
)
5116 case DT_IA_64_PLT_RESERVE
:
5117 /* First 3 slots reserved. */
5118 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5120 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5124 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5131 get_32bit_dynamic_section (FILE *file
)
5133 Elf32_External_Dyn
*edyn
, *ext
;
5134 Elf_Internal_Dyn
*entry
;
5136 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
5137 _("dynamic section"));
5141 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5142 might not have the luxury of section headers. Look for the DT_NULL
5143 terminator to determine the number of entries. */
5144 for (ext
= edyn
, dynamic_nent
= 0;
5145 (char *) ext
< (char *) edyn
+ dynamic_size
;
5149 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5153 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
5154 if (dynamic_section
== NULL
)
5156 error (_("Out of memory\n"));
5161 for (ext
= edyn
, entry
= dynamic_section
;
5162 entry
< dynamic_section
+ dynamic_nent
;
5165 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5166 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5175 get_64bit_dynamic_section (FILE *file
)
5177 Elf64_External_Dyn
*edyn
, *ext
;
5178 Elf_Internal_Dyn
*entry
;
5180 edyn
= get_data (NULL
, file
, dynamic_addr
, dynamic_size
,
5181 _("dynamic section"));
5185 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5186 might not have the luxury of section headers. Look for the DT_NULL
5187 terminator to determine the number of entries. */
5188 for (ext
= edyn
, dynamic_nent
= 0;
5189 (char *) ext
< (char *) edyn
+ dynamic_size
;
5193 if (BYTE_GET8 (ext
->d_tag
) == DT_NULL
)
5197 dynamic_section
= malloc (dynamic_nent
* sizeof (*entry
));
5198 if (dynamic_section
== NULL
)
5200 error (_("Out of memory\n"));
5205 for (ext
= edyn
, entry
= dynamic_section
;
5206 entry
< dynamic_section
+ dynamic_nent
;
5209 entry
->d_tag
= BYTE_GET8 (ext
->d_tag
);
5210 entry
->d_un
.d_val
= BYTE_GET8 (ext
->d_un
.d_val
);
5219 get_dynamic_flags (bfd_vma flags
)
5221 static char buff
[128];
5229 flag
= flags
& - flags
;
5237 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
5238 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
5239 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
5240 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
5241 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
5242 default: strcpy (p
, "unknown"); break;
5245 p
= strchr (p
, '\0');
5250 /* Parse and display the contents of the dynamic section. */
5253 process_dynamic_section (FILE *file
)
5255 Elf_Internal_Dyn
*entry
;
5257 if (dynamic_size
== 0)
5260 printf (_("\nThere is no dynamic section in this file.\n"));
5267 if (! get_32bit_dynamic_section (file
))
5270 else if (! get_64bit_dynamic_section (file
))
5273 /* Find the appropriate symbol table. */
5274 if (dynamic_symbols
== NULL
)
5276 for (entry
= dynamic_section
;
5277 entry
< dynamic_section
+ dynamic_nent
;
5280 Elf_Internal_Shdr section
;
5282 if (entry
->d_tag
!= DT_SYMTAB
)
5285 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5287 /* Since we do not know how big the symbol table is,
5288 we default to reading in the entire file (!) and
5289 processing that. This is overkill, I know, but it
5291 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5293 if (archive_file_offset
!= 0)
5294 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5297 if (fseek (file
, 0, SEEK_END
))
5298 error (_("Unable to seek to end of file!"));
5300 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5304 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5306 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5308 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5309 if (num_dynamic_syms
< 1)
5311 error (_("Unable to determine the number of symbols to load\n"));
5315 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5319 /* Similarly find a string table. */
5320 if (dynamic_strings
== NULL
)
5322 for (entry
= dynamic_section
;
5323 entry
< dynamic_section
+ dynamic_nent
;
5326 unsigned long offset
;
5329 if (entry
->d_tag
!= DT_STRTAB
)
5332 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5334 /* Since we do not know how big the string table is,
5335 we default to reading in the entire file (!) and
5336 processing that. This is overkill, I know, but it
5339 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5341 if (archive_file_offset
!= 0)
5342 str_tab_len
= archive_file_size
- offset
;
5345 if (fseek (file
, 0, SEEK_END
))
5346 error (_("Unable to seek to end of file\n"));
5347 str_tab_len
= ftell (file
) - offset
;
5350 if (str_tab_len
< 1)
5353 (_("Unable to determine the length of the dynamic string table\n"));
5357 dynamic_strings
= get_data (NULL
, file
, offset
, str_tab_len
,
5358 _("dynamic string table"));
5359 dynamic_strings_length
= str_tab_len
;
5364 /* And find the syminfo section if available. */
5365 if (dynamic_syminfo
== NULL
)
5367 unsigned long syminsz
= 0;
5369 for (entry
= dynamic_section
;
5370 entry
< dynamic_section
+ dynamic_nent
;
5373 if (entry
->d_tag
== DT_SYMINENT
)
5375 /* Note: these braces are necessary to avoid a syntax
5376 error from the SunOS4 C compiler. */
5377 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5379 else if (entry
->d_tag
== DT_SYMINSZ
)
5380 syminsz
= entry
->d_un
.d_val
;
5381 else if (entry
->d_tag
== DT_SYMINFO
)
5382 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5386 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5388 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5389 Elf_Internal_Syminfo
*syminfo
;
5391 /* There is a syminfo section. Read the data. */
5392 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, syminsz
,
5393 _("symbol information"));
5397 dynamic_syminfo
= malloc (syminsz
);
5398 if (dynamic_syminfo
== NULL
)
5400 error (_("Out of memory\n"));
5404 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5405 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5406 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5407 ++syminfo
, ++extsym
)
5409 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5410 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5417 if (do_dynamic
&& dynamic_addr
)
5418 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5419 dynamic_addr
, dynamic_nent
);
5421 printf (_(" Tag Type Name/Value\n"));
5423 for (entry
= dynamic_section
;
5424 entry
< dynamic_section
+ dynamic_nent
;
5432 print_vma (entry
->d_tag
, FULL_HEX
);
5433 dtype
= get_dynamic_type (entry
->d_tag
);
5434 printf (" (%s)%*s", dtype
,
5435 ((is_32bit_elf
? 27 : 19)
5436 - (int) strlen (dtype
)),
5440 switch (entry
->d_tag
)
5444 puts (get_dynamic_flags (entry
->d_un
.d_val
));
5454 switch (entry
->d_tag
)
5457 printf (_("Auxiliary library"));
5461 printf (_("Filter library"));
5465 printf (_("Configuration file"));
5469 printf (_("Dependency audit library"));
5473 printf (_("Audit library"));
5477 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5478 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5482 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5491 printf (_("Flags:"));
5493 if (entry
->d_un
.d_val
== 0)
5494 printf (_(" None\n"));
5497 unsigned long int val
= entry
->d_un
.d_val
;
5499 if (val
& DTF_1_PARINIT
)
5501 printf (" PARINIT");
5502 val
^= DTF_1_PARINIT
;
5504 if (val
& DTF_1_CONFEXP
)
5506 printf (" CONFEXP");
5507 val
^= DTF_1_CONFEXP
;
5510 printf (" %lx", val
);
5519 printf (_("Flags:"));
5521 if (entry
->d_un
.d_val
== 0)
5522 printf (_(" None\n"));
5525 unsigned long int val
= entry
->d_un
.d_val
;
5527 if (val
& DF_P1_LAZYLOAD
)
5529 printf (" LAZYLOAD");
5530 val
^= DF_P1_LAZYLOAD
;
5532 if (val
& DF_P1_GROUPPERM
)
5534 printf (" GROUPPERM");
5535 val
^= DF_P1_GROUPPERM
;
5538 printf (" %lx", val
);
5547 printf (_("Flags:"));
5548 if (entry
->d_un
.d_val
== 0)
5549 printf (_(" None\n"));
5552 unsigned long int val
= entry
->d_un
.d_val
;
5559 if (val
& DF_1_GLOBAL
)
5564 if (val
& DF_1_GROUP
)
5569 if (val
& DF_1_NODELETE
)
5571 printf (" NODELETE");
5572 val
^= DF_1_NODELETE
;
5574 if (val
& DF_1_LOADFLTR
)
5576 printf (" LOADFLTR");
5577 val
^= DF_1_LOADFLTR
;
5579 if (val
& DF_1_INITFIRST
)
5581 printf (" INITFIRST");
5582 val
^= DF_1_INITFIRST
;
5584 if (val
& DF_1_NOOPEN
)
5589 if (val
& DF_1_ORIGIN
)
5594 if (val
& DF_1_DIRECT
)
5599 if (val
& DF_1_TRANS
)
5604 if (val
& DF_1_INTERPOSE
)
5606 printf (" INTERPOSE");
5607 val
^= DF_1_INTERPOSE
;
5609 if (val
& DF_1_NODEFLIB
)
5611 printf (" NODEFLIB");
5612 val
^= DF_1_NODEFLIB
;
5614 if (val
& DF_1_NODUMP
)
5619 if (val
& DF_1_CONLFAT
)
5621 printf (" CONLFAT");
5622 val
^= DF_1_CONLFAT
;
5625 printf (" %lx", val
);
5632 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5634 puts (get_dynamic_type (entry
->d_un
.d_val
));
5654 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5660 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5661 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
5667 switch (entry
->d_tag
)
5670 printf (_("Shared library: [%s]"), name
);
5672 if (strcmp (name
, program_interpreter
) == 0)
5673 printf (_(" program interpreter"));
5677 printf (_("Library soname: [%s]"), name
);
5681 printf (_("Library rpath: [%s]"), name
);
5685 printf (_("Library runpath: [%s]"), name
);
5689 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5694 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5707 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5711 case DT_INIT_ARRAYSZ
:
5712 case DT_FINI_ARRAYSZ
:
5713 case DT_GNU_CONFLICTSZ
:
5714 case DT_GNU_LIBLISTSZ
:
5717 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5718 printf (" (bytes)\n");
5728 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5741 if (entry
->d_tag
== DT_USED
5742 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5744 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
5748 printf (_("Not needed object: [%s]\n"), name
);
5753 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5759 /* The value of this entry is ignored. */
5764 case DT_GNU_PRELINKED
:
5768 time_t time
= entry
->d_un
.d_val
;
5770 tmp
= gmtime (&time
);
5771 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5772 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5773 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5779 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5780 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5785 switch (elf_header
.e_machine
)
5788 case EM_MIPS_RS3_LE
:
5789 dynamic_section_mips_val (entry
);
5792 dynamic_section_parisc_val (entry
);
5795 dynamic_section_ia64_val (entry
);
5798 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5810 get_ver_flags (unsigned int flags
)
5812 static char buff
[32];
5819 if (flags
& VER_FLG_BASE
)
5820 strcat (buff
, "BASE ");
5822 if (flags
& VER_FLG_WEAK
)
5824 if (flags
& VER_FLG_BASE
)
5825 strcat (buff
, "| ");
5827 strcat (buff
, "WEAK ");
5830 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5831 strcat (buff
, "| <unknown>");
5836 /* Display the contents of the version sections. */
5838 process_version_sections (FILE *file
)
5840 Elf_Internal_Shdr
*section
;
5847 for (i
= 0, section
= section_headers
;
5848 i
< elf_header
.e_shnum
;
5851 switch (section
->sh_type
)
5853 case SHT_GNU_verdef
:
5855 Elf_External_Verdef
*edefs
;
5862 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5863 SECTION_NAME (section
), section
->sh_info
);
5865 printf (_(" Addr: 0x"));
5866 printf_vma (section
->sh_addr
);
5867 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5868 (unsigned long) section
->sh_offset
, section
->sh_link
,
5869 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5871 edefs
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5872 _("version definition section"));
5876 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5879 Elf_External_Verdef
*edef
;
5880 Elf_Internal_Verdef ent
;
5881 Elf_External_Verdaux
*eaux
;
5882 Elf_Internal_Verdaux aux
;
5886 vstart
= ((char *) edefs
) + idx
;
5888 edef
= (Elf_External_Verdef
*) vstart
;
5890 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5891 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5892 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5893 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5894 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5895 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5896 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5898 printf (_(" %#06x: Rev: %d Flags: %s"),
5899 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5901 printf (_(" Index: %d Cnt: %d "),
5902 ent
.vd_ndx
, ent
.vd_cnt
);
5904 vstart
+= ent
.vd_aux
;
5906 eaux
= (Elf_External_Verdaux
*) vstart
;
5908 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5909 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5911 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
5912 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
5914 printf (_("Name index: %ld\n"), aux
.vda_name
);
5916 isum
= idx
+ ent
.vd_aux
;
5918 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5920 isum
+= aux
.vda_next
;
5921 vstart
+= aux
.vda_next
;
5923 eaux
= (Elf_External_Verdaux
*) vstart
;
5925 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5926 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5928 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
5929 printf (_(" %#06x: Parent %d: %s\n"),
5930 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
5932 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5933 isum
, j
, aux
.vda_name
);
5943 case SHT_GNU_verneed
:
5945 Elf_External_Verneed
*eneed
;
5951 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5952 SECTION_NAME (section
), section
->sh_info
);
5954 printf (_(" Addr: 0x"));
5955 printf_vma (section
->sh_addr
);
5956 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5957 (unsigned long) section
->sh_offset
, section
->sh_link
,
5958 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5960 eneed
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
5961 _("version need section"));
5965 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5967 Elf_External_Verneed
*entry
;
5968 Elf_Internal_Verneed ent
;
5973 vstart
= ((char *) eneed
) + idx
;
5975 entry
= (Elf_External_Verneed
*) vstart
;
5977 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5978 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5979 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5980 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5981 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5983 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5985 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
5986 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
5988 printf (_(" File: %lx"), ent
.vn_file
);
5990 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5992 vstart
+= ent
.vn_aux
;
5994 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5996 Elf_External_Vernaux
*eaux
;
5997 Elf_Internal_Vernaux aux
;
5999 eaux
= (Elf_External_Vernaux
*) vstart
;
6001 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6002 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6003 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6004 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6005 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6007 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6008 printf (_(" %#06x: Name: %s"),
6009 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6011 printf (_(" %#06x: Name index: %lx"),
6012 isum
, aux
.vna_name
);
6014 printf (_(" Flags: %s Version: %d\n"),
6015 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6017 isum
+= aux
.vna_next
;
6018 vstart
+= aux
.vna_next
;
6028 case SHT_GNU_versym
:
6030 Elf_Internal_Shdr
*link_section
;
6033 unsigned char *edata
;
6034 unsigned short *data
;
6036 Elf_Internal_Sym
*symbols
;
6037 Elf_Internal_Shdr
*string_sec
;
6040 link_section
= SECTION_HEADER (section
->sh_link
);
6041 total
= section
->sh_size
/ section
->sh_entsize
;
6045 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6047 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6049 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6050 string_sec
->sh_size
, _("version string table"));
6054 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6055 SECTION_NAME (section
), total
);
6057 printf (_(" Addr: "));
6058 printf_vma (section
->sh_addr
);
6059 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6060 (unsigned long) section
->sh_offset
, section
->sh_link
,
6061 SECTION_NAME (link_section
));
6063 off
= offset_from_vma (file
,
6064 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6065 total
* sizeof (short));
6066 edata
= get_data (NULL
, file
, off
, total
* sizeof (short),
6067 _("version symbol data"));
6074 data
= malloc (total
* sizeof (short));
6076 for (cnt
= total
; cnt
--;)
6077 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6082 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6085 int check_def
, check_need
;
6088 printf (" %03x:", cnt
);
6090 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6091 switch (data
[cnt
+ j
])
6094 fputs (_(" 0 (*local*) "), stdout
);
6098 fputs (_(" 1 (*global*) "), stdout
);
6102 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6103 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6107 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6110 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6117 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6119 Elf_Internal_Verneed ivn
;
6120 unsigned long offset
;
6122 offset
= offset_from_vma
6123 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6124 sizeof (Elf_External_Verneed
));
6128 Elf_Internal_Vernaux ivna
;
6129 Elf_External_Verneed evn
;
6130 Elf_External_Vernaux evna
;
6131 unsigned long a_off
;
6133 get_data (&evn
, file
, offset
, sizeof (evn
),
6136 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6137 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6139 a_off
= offset
+ ivn
.vn_aux
;
6143 get_data (&evna
, file
, a_off
, sizeof (evna
),
6144 _("version need aux (2)"));
6146 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6147 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6149 a_off
+= ivna
.vna_next
;
6151 while (ivna
.vna_other
!= data
[cnt
+ j
]
6152 && ivna
.vna_next
!= 0);
6154 if (ivna
.vna_other
== data
[cnt
+ j
])
6156 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6158 name
= strtab
+ ivna
.vna_name
;
6159 nn
+= printf ("(%s%-*s",
6161 12 - (int) strlen (name
),
6167 offset
+= ivn
.vn_next
;
6169 while (ivn
.vn_next
);
6172 if (check_def
&& data
[cnt
+ j
] != 0x8001
6173 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6175 Elf_Internal_Verdef ivd
;
6176 Elf_External_Verdef evd
;
6177 unsigned long offset
;
6179 offset
= offset_from_vma
6180 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6185 get_data (&evd
, file
, offset
, sizeof (evd
),
6188 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6189 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6191 offset
+= ivd
.vd_next
;
6193 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6194 && ivd
.vd_next
!= 0);
6196 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6198 Elf_External_Verdaux evda
;
6199 Elf_Internal_Verdaux ivda
;
6201 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6203 get_data (&evda
, file
,
6204 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6205 sizeof (evda
), _("version def aux"));
6207 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6209 name
= strtab
+ ivda
.vda_name
;
6210 nn
+= printf ("(%s%-*s",
6212 12 - (int) strlen (name
),
6218 printf ("%*c", 18 - nn
, ' ');
6236 printf (_("\nNo version information found in this file.\n"));
6242 get_symbol_binding (unsigned int binding
)
6244 static char buff
[32];
6248 case STB_LOCAL
: return "LOCAL";
6249 case STB_GLOBAL
: return "GLOBAL";
6250 case STB_WEAK
: return "WEAK";
6252 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6253 sprintf (buff
, _("<processor specific>: %d"), binding
);
6254 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6255 sprintf (buff
, _("<OS specific>: %d"), binding
);
6257 sprintf (buff
, _("<unknown>: %d"), binding
);
6263 get_symbol_type (unsigned int type
)
6265 static char buff
[32];
6269 case STT_NOTYPE
: return "NOTYPE";
6270 case STT_OBJECT
: return "OBJECT";
6271 case STT_FUNC
: return "FUNC";
6272 case STT_SECTION
: return "SECTION";
6273 case STT_FILE
: return "FILE";
6274 case STT_COMMON
: return "COMMON";
6275 case STT_TLS
: return "TLS";
6277 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6279 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6280 return "THUMB_FUNC";
6282 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6285 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6286 return "PARISC_MILLI";
6288 sprintf (buff
, _("<processor specific>: %d"), type
);
6290 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6292 if (elf_header
.e_machine
== EM_PARISC
)
6294 if (type
== STT_HP_OPAQUE
)
6296 if (type
== STT_HP_STUB
)
6300 sprintf (buff
, _("<OS specific>: %d"), type
);
6303 sprintf (buff
, _("<unknown>: %d"), type
);
6309 get_symbol_visibility (unsigned int visibility
)
6313 case STV_DEFAULT
: return "DEFAULT";
6314 case STV_INTERNAL
: return "INTERNAL";
6315 case STV_HIDDEN
: return "HIDDEN";
6316 case STV_PROTECTED
: return "PROTECTED";
6322 get_symbol_index_type (unsigned int type
)
6324 static char buff
[32];
6328 case SHN_UNDEF
: return "UND";
6329 case SHN_ABS
: return "ABS";
6330 case SHN_COMMON
: return "COM";
6332 if (type
== SHN_IA_64_ANSI_COMMON
6333 && elf_header
.e_machine
== EM_IA_64
6334 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6336 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6337 sprintf (buff
, "PRC[0x%04x]", type
);
6338 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6339 sprintf (buff
, "OS [0x%04x]", type
);
6340 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6341 sprintf (buff
, "RSV[0x%04x]", type
);
6343 sprintf (buff
, "%3d", type
);
6351 get_dynamic_data (FILE *file
, unsigned int number
)
6353 unsigned char *e_data
;
6356 e_data
= malloc (number
* 4);
6360 error (_("Out of memory\n"));
6364 if (fread (e_data
, 4, number
, file
) != number
)
6366 error (_("Unable to read in dynamic data\n"));
6370 i_data
= malloc (number
* sizeof (*i_data
));
6374 error (_("Out of memory\n"));
6380 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
6387 /* Dump the symbol table. */
6389 process_symbol_table (FILE *file
)
6391 Elf_Internal_Shdr
*section
;
6392 unsigned char nb
[4];
6393 unsigned char nc
[4];
6396 int *buckets
= NULL
;
6399 if (! do_syms
&& !do_histogram
)
6402 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6406 (archive_file_offset
6407 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6408 sizeof nb
+ sizeof nc
)),
6411 error (_("Unable to seek to start of dynamic information"));
6415 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
6417 error (_("Failed to read in number of buckets\n"));
6421 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
6423 error (_("Failed to read in number of chains\n"));
6427 nbuckets
= byte_get (nb
, 4);
6428 nchains
= byte_get (nc
, 4);
6430 buckets
= get_dynamic_data (file
, nbuckets
);
6431 chains
= get_dynamic_data (file
, nchains
);
6433 if (buckets
== NULL
|| chains
== NULL
)
6438 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6443 printf (_("\nSymbol table for image:\n"));
6445 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6447 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6449 for (hn
= 0; hn
< nbuckets
; hn
++)
6454 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6456 Elf_Internal_Sym
*psym
;
6458 psym
= dynamic_symbols
+ si
;
6460 printf (" %3d %3d: ", si
, hn
);
6461 print_vma (psym
->st_value
, LONG_HEX
);
6463 print_vma (psym
->st_size
, DEC_5
);
6465 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6466 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6467 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6468 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6469 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6470 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6472 printf (" <corrupt: %14ld>", psym
->st_name
);
6477 else if (do_syms
&& !do_using_dynamic
)
6481 for (i
= 0, section
= section_headers
;
6482 i
< elf_header
.e_shnum
;
6487 Elf_Internal_Sym
*symtab
;
6488 Elf_Internal_Sym
*psym
;
6491 if ( section
->sh_type
!= SHT_SYMTAB
6492 && section
->sh_type
!= SHT_DYNSYM
)
6495 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6496 SECTION_NAME (section
),
6497 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6499 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6501 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6503 symtab
= GET_ELF_SYMBOLS (file
, section
);
6507 if (section
->sh_link
== elf_header
.e_shstrndx
)
6508 strtab
= string_table
;
6511 Elf_Internal_Shdr
*string_sec
;
6513 string_sec
= SECTION_HEADER (section
->sh_link
);
6515 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6516 string_sec
->sh_size
, _("string table"));
6519 for (si
= 0, psym
= symtab
;
6520 si
< section
->sh_size
/ section
->sh_entsize
;
6523 printf ("%6d: ", si
);
6524 print_vma (psym
->st_value
, LONG_HEX
);
6526 print_vma (psym
->st_size
, DEC_5
);
6527 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6528 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6529 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6530 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6531 print_symbol (25, strtab
+ psym
->st_name
);
6533 if (section
->sh_type
== SHT_DYNSYM
&&
6534 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6536 unsigned char data
[2];
6537 unsigned short vers_data
;
6538 unsigned long offset
;
6542 offset
= offset_from_vma
6543 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6544 sizeof data
+ si
* sizeof (vers_data
));
6546 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6547 sizeof (data
), _("version data"));
6549 vers_data
= byte_get (data
, 2);
6551 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6554 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6556 if ((vers_data
& 0x8000) || vers_data
> 1)
6558 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6559 && (is_nobits
|| ! check_def
))
6561 Elf_External_Verneed evn
;
6562 Elf_Internal_Verneed ivn
;
6563 Elf_Internal_Vernaux ivna
;
6565 /* We must test both. */
6566 offset
= offset_from_vma
6567 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6572 unsigned long vna_off
;
6574 get_data (&evn
, file
, offset
, sizeof (evn
),
6577 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6578 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6580 vna_off
= offset
+ ivn
.vn_aux
;
6584 Elf_External_Vernaux evna
;
6586 get_data (&evna
, file
, vna_off
,
6588 _("version need aux (3)"));
6590 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6591 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6592 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6594 vna_off
+= ivna
.vna_next
;
6596 while (ivna
.vna_other
!= vers_data
6597 && ivna
.vna_next
!= 0);
6599 if (ivna
.vna_other
== vers_data
)
6602 offset
+= ivn
.vn_next
;
6604 while (ivn
.vn_next
!= 0);
6606 if (ivna
.vna_other
== vers_data
)
6609 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6612 else if (! is_nobits
)
6613 error (_("bad dynamic symbol"));
6620 if (vers_data
!= 0x8001
6621 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6623 Elf_Internal_Verdef ivd
;
6624 Elf_Internal_Verdaux ivda
;
6625 Elf_External_Verdaux evda
;
6626 unsigned long offset
;
6628 offset
= offset_from_vma
6630 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6631 sizeof (Elf_External_Verdef
));
6635 Elf_External_Verdef evd
;
6637 get_data (&evd
, file
, offset
, sizeof (evd
),
6640 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6641 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6642 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6644 offset
+= ivd
.vd_next
;
6646 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6647 && ivd
.vd_next
!= 0);
6649 offset
-= ivd
.vd_next
;
6650 offset
+= ivd
.vd_aux
;
6652 get_data (&evda
, file
, offset
, sizeof (evda
),
6653 _("version def aux"));
6655 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6657 if (psym
->st_name
!= ivda
.vda_name
)
6658 printf ((vers_data
& 0x8000)
6660 strtab
+ ivda
.vda_name
);
6670 if (strtab
!= string_table
)
6676 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6678 if (do_histogram
&& buckets
!= NULL
)
6685 int nzero_counts
= 0;
6688 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6690 printf (_(" Length Number %% of total Coverage\n"));
6692 lengths
= calloc (nbuckets
, sizeof (int));
6693 if (lengths
== NULL
)
6695 error (_("Out of memory"));
6698 for (hn
= 0; hn
< nbuckets
; ++hn
)
6703 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6706 if (maxlength
< ++lengths
[hn
])
6711 counts
= calloc (maxlength
+ 1, sizeof (int));
6714 error (_("Out of memory"));
6718 for (hn
= 0; hn
< nbuckets
; ++hn
)
6719 ++counts
[lengths
[hn
]];
6723 printf (" 0 %-10d (%5.1f%%)\n",
6724 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6725 for (si
= 1; si
<= maxlength
; ++si
)
6727 nzero_counts
+= counts
[si
] * si
;
6728 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6729 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6730 (nzero_counts
* 100.0) / nsyms
);
6738 if (buckets
!= NULL
)
6748 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
6752 if (dynamic_syminfo
== NULL
6754 /* No syminfo, this is ok. */
6757 /* There better should be a dynamic symbol section. */
6758 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6762 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6763 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6765 printf (_(" Num: Name BoundTo Flags\n"));
6766 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6768 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6770 printf ("%4d: ", i
);
6771 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
6772 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
6774 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
6777 switch (dynamic_syminfo
[i
].si_boundto
)
6779 case SYMINFO_BT_SELF
:
6780 fputs ("SELF ", stdout
);
6782 case SYMINFO_BT_PARENT
:
6783 fputs ("PARENT ", stdout
);
6786 if (dynamic_syminfo
[i
].si_boundto
> 0
6787 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
6788 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
6790 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6794 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6798 if (flags
& SYMINFO_FLG_DIRECT
)
6800 if (flags
& SYMINFO_FLG_PASSTHRU
)
6801 printf (" PASSTHRU");
6802 if (flags
& SYMINFO_FLG_COPY
)
6804 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6805 printf (" LAZYLOAD");
6813 #ifdef SUPPORT_DISASSEMBLY
6815 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
6817 printf (_("\nAssembly dump of section %s\n"),
6818 SECTION_NAME (section
));
6820 /* XXX -- to be done --- XXX */
6827 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
6829 bfd_size_type bytes
;
6831 unsigned char *data
;
6832 unsigned char *start
;
6834 bytes
= section
->sh_size
;
6836 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
6838 printf (_("\nSection '%s' has no data to dump.\n"),
6839 SECTION_NAME (section
));
6843 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6845 addr
= section
->sh_addr
;
6847 start
= get_data (NULL
, file
, section
->sh_offset
, bytes
, _("section data"));
6859 lbytes
= (bytes
> 16 ? 16 : bytes
);
6861 printf (" 0x%8.8lx ", (unsigned long) addr
);
6863 switch (elf_header
.e_ident
[EI_DATA
])
6867 for (j
= 15; j
>= 0; j
--)
6870 printf ("%2.2x", data
[j
]);
6880 for (j
= 0; j
< 16; j
++)
6883 printf ("%2.2x", data
[j
]);
6893 for (j
= 0; j
< lbytes
; j
++)
6896 if (k
>= ' ' && k
< 0x7f)
6915 static unsigned long int
6916 read_leb128 (unsigned char *data
, int *length_return
, int sign
)
6918 unsigned long int result
= 0;
6919 unsigned int num_read
= 0;
6928 result
|= (byte
& 0x7f) << shift
;
6933 while (byte
& 0x80);
6935 if (length_return
!= NULL
)
6936 *length_return
= num_read
;
6938 if (sign
&& (shift
< 32) && (byte
& 0x40))
6939 result
|= -1 << shift
;
6944 typedef struct State_Machine_Registers
6946 unsigned long address
;
6949 unsigned int column
;
6953 /* This variable hold the number of the last entry seen
6954 in the File Table. */
6955 unsigned int last_file_entry
;
6958 static SMR state_machine_regs
;
6961 reset_state_machine (int is_stmt
)
6963 state_machine_regs
.address
= 0;
6964 state_machine_regs
.file
= 1;
6965 state_machine_regs
.line
= 1;
6966 state_machine_regs
.column
= 0;
6967 state_machine_regs
.is_stmt
= is_stmt
;
6968 state_machine_regs
.basic_block
= 0;
6969 state_machine_regs
.end_sequence
= 0;
6970 state_machine_regs
.last_file_entry
= 0;
6973 /* Handled an extend line op. Returns true if this is the end
6976 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
6978 unsigned char op_code
;
6981 unsigned char *name
;
6984 len
= read_leb128 (data
, & bytes_read
, 0);
6989 warn (_("badly formed extended line op encountered!\n"));
6996 printf (_(" Extended opcode %d: "), op_code
);
7000 case DW_LNE_end_sequence
:
7001 printf (_("End of Sequence\n\n"));
7002 reset_state_machine (is_stmt
);
7005 case DW_LNE_set_address
:
7006 adr
= byte_get (data
, pointer_size
);
7007 printf (_("set Address to 0x%lx\n"), adr
);
7008 state_machine_regs
.address
= adr
;
7011 case DW_LNE_define_file
:
7012 printf (_(" define new File Table entry\n"));
7013 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7015 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7017 data
+= strlen ((char *) data
) + 1;
7018 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7020 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7022 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7023 printf (_("%s\n\n"), name
);
7027 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
7034 /* Finds section NAME inside FILE and returns a
7035 pointer to it, or NULL upon failure. */
7037 static Elf_Internal_Shdr
*
7038 find_section (const char * name
)
7040 Elf_Internal_Shdr
*sec
;
7043 for (i
= elf_header
.e_shnum
, sec
= section_headers
+ i
- 1;
7045 if (strcmp (SECTION_NAME (sec
), name
) == 0)
7048 if (i
&& sec
&& sec
->sh_size
!= 0)
7054 /* Size of pointers in the .debug_line section. This information is not
7055 really present in that section. It's obtained before dumping the debug
7056 sections by doing some pre-scan of the .debug_info section. */
7057 static unsigned int * debug_line_pointer_sizes
= NULL
;
7058 static unsigned int num_debug_line_pointer_sizes
= 0;
7060 /* Locate and scan the .debug_info section in the file and record the pointer
7061 sizes for the compilation units in it. Usually an executable will have
7062 just one pointer size, but this is not guaranteed, and so we try not to
7063 make any assumptions. Returns zero upon failure, or the number of
7064 compilation units upon success. */
7067 get_debug_line_pointer_sizes (FILE * file
)
7069 Elf_Internal_Shdr
* section
;
7070 unsigned char * start
;
7071 unsigned char * end
;
7072 unsigned char * begin
;
7073 unsigned long length
;
7074 unsigned int num_units
;
7077 section
= find_section (".debug_info");
7078 if (section
== NULL
)
7081 length
= section
->sh_size
;
7082 start
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
7083 _("extracting pointer sizes from .debug_info section"));
7087 end
= start
+ section
->sh_size
;
7088 /* First scan the section to get the number of comp units. */
7089 for (begin
= start
, num_units
= 0; begin
< end
; num_units
++)
7091 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
7092 be the length. For a 64-bit DWARF section, it'll be the escape
7093 code 0xffffffff followed by an 8 byte length. */
7094 length
= byte_get (begin
, 4);
7096 if (length
== 0xffffffff)
7098 length
= byte_get (begin
+ 4, 8);
7099 begin
+= length
+ 12;
7102 begin
+= length
+ 4;
7107 error (_("No comp units in .debug_info section ?"));
7112 /* Then allocate an array to hold the pointer sizes. */
7113 debug_line_pointer_sizes
= malloc (num_units
* sizeof * debug_line_pointer_sizes
);
7114 if (debug_line_pointer_sizes
== NULL
)
7116 error (_("Not enough memory for a pointer size array of %u entries"),
7122 /* Populate the array. */
7123 for (begin
= start
, unit
= 0; begin
< end
; unit
++)
7125 length
= byte_get (begin
, 4);
7126 if (length
== 0xffffffff)
7128 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
7129 from the start of the section. This is computed as follows:
7131 unit_length: 12 bytes
7133 debug_abbrev_offset: 8 bytes
7134 -----------------------------
7137 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 22, 1);
7138 length
= byte_get (begin
+ 4, 8);
7139 begin
+= length
+ 12;
7143 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
7144 the start of the section:
7146 unit_length: 4 bytes
7148 debug_abbrev_offset: 4 bytes
7149 -----------------------------
7152 debug_line_pointer_sizes
[unit
] = byte_get (begin
+ 10, 1);
7153 begin
+= length
+ 4;
7158 num_debug_line_pointer_sizes
= num_units
;
7163 display_debug_lines (Elf_Internal_Shdr
*section
,
7164 unsigned char *start
, FILE *file
)
7166 unsigned char *hdrptr
;
7167 DWARF2_Internal_LineInfo info
;
7168 unsigned char *standard_opcodes
;
7169 unsigned char *data
= start
;
7170 unsigned char *end
= start
+ section
->sh_size
;
7171 unsigned char *end_of_sequence
;
7174 int initial_length_size
;
7175 unsigned int comp_unit
= 0;
7177 printf (_("\nDump of debug contents of section %s:\n\n"),
7178 SECTION_NAME (section
));
7180 if (num_debug_line_pointer_sizes
== 0)
7181 get_debug_line_pointer_sizes (file
);
7185 unsigned int pointer_size
;
7189 /* Check the length of the block. */
7190 info
.li_length
= byte_get (hdrptr
, 4);
7193 if (info
.li_length
== 0xffffffff)
7195 /* This section is 64-bit DWARF 3. */
7196 info
.li_length
= byte_get (hdrptr
, 8);
7199 initial_length_size
= 12;
7204 initial_length_size
= 4;
7207 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
7210 (_("The line info appears to be corrupt - the section is too small\n"));
7214 /* Check its version number. */
7215 info
.li_version
= byte_get (hdrptr
, 2);
7217 if (info
.li_version
!= 2 && info
.li_version
!= 3)
7219 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
7223 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
7224 hdrptr
+= offset_size
;
7225 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
7227 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
7229 info
.li_line_base
= byte_get (hdrptr
, 1);
7231 info
.li_line_range
= byte_get (hdrptr
, 1);
7233 info
.li_opcode_base
= byte_get (hdrptr
, 1);
7236 /* Sign extend the line base field. */
7237 info
.li_line_base
<<= 24;
7238 info
.li_line_base
>>= 24;
7240 /* Get the pointer size from the comp unit associated
7241 with this block of line number information. */
7242 if (comp_unit
>= num_debug_line_pointer_sizes
)
7244 error (_("Not enough comp units for .debug_line section\n"));
7249 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
7253 printf (_(" Length: %ld\n"), info
.li_length
);
7254 printf (_(" DWARF Version: %d\n"), info
.li_version
);
7255 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
7256 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
7257 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
7258 printf (_(" Line Base: %d\n"), info
.li_line_base
);
7259 printf (_(" Line Range: %d\n"), info
.li_line_range
);
7260 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
7261 printf (_(" (Pointer size: %u)\n"), pointer_size
);
7263 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
7265 reset_state_machine (info
.li_default_is_stmt
);
7267 /* Display the contents of the Opcodes table. */
7268 standard_opcodes
= hdrptr
;
7270 printf (_("\n Opcodes:\n"));
7272 for (i
= 1; i
< info
.li_opcode_base
; i
++)
7273 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
7275 /* Display the contents of the Directory table. */
7276 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
7279 printf (_("\n The Directory Table is empty.\n"));
7282 printf (_("\n The Directory Table:\n"));
7286 printf (_(" %s\n"), data
);
7288 data
+= strlen ((char *) data
) + 1;
7292 /* Skip the NUL at the end of the table. */
7295 /* Display the contents of the File Name table. */
7297 printf (_("\n The File Name Table is empty.\n"));
7300 printf (_("\n The File Name Table:\n"));
7301 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7305 unsigned char *name
;
7308 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7311 data
+= strlen ((char *) data
) + 1;
7313 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7315 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7317 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7319 printf (_("%s\n"), name
);
7323 /* Skip the NUL at the end of the table. */
7326 /* Now display the statements. */
7327 printf (_("\n Line Number Statements:\n"));
7330 while (data
< end_of_sequence
)
7332 unsigned char op_code
;
7338 if (op_code
>= info
.li_opcode_base
)
7340 op_code
-= info
.li_opcode_base
;
7341 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
7342 state_machine_regs
.address
+= adv
;
7343 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
7344 op_code
, adv
, state_machine_regs
.address
);
7345 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
7346 state_machine_regs
.line
+= adv
;
7347 printf (_(" and Line by %d to %d\n"),
7348 adv
, state_machine_regs
.line
);
7350 else switch (op_code
)
7352 case DW_LNS_extended_op
:
7353 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
7358 printf (_(" Copy\n"));
7361 case DW_LNS_advance_pc
:
7362 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
7364 state_machine_regs
.address
+= adv
;
7365 printf (_(" Advance PC by %d to %lx\n"), adv
,
7366 state_machine_regs
.address
);
7369 case DW_LNS_advance_line
:
7370 adv
= read_leb128 (data
, & bytes_read
, 1);
7372 state_machine_regs
.line
+= adv
;
7373 printf (_(" Advance Line by %d to %d\n"), adv
,
7374 state_machine_regs
.line
);
7377 case DW_LNS_set_file
:
7378 adv
= read_leb128 (data
, & bytes_read
, 0);
7380 printf (_(" Set File Name to entry %d in the File Name Table\n"),
7382 state_machine_regs
.file
= adv
;
7385 case DW_LNS_set_column
:
7386 adv
= read_leb128 (data
, & bytes_read
, 0);
7388 printf (_(" Set column to %d\n"), adv
);
7389 state_machine_regs
.column
= adv
;
7392 case DW_LNS_negate_stmt
:
7393 adv
= state_machine_regs
.is_stmt
;
7395 printf (_(" Set is_stmt to %d\n"), adv
);
7396 state_machine_regs
.is_stmt
= adv
;
7399 case DW_LNS_set_basic_block
:
7400 printf (_(" Set basic block\n"));
7401 state_machine_regs
.basic_block
= 1;
7404 case DW_LNS_const_add_pc
:
7405 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
7406 * info
.li_min_insn_length
);
7407 state_machine_regs
.address
+= adv
;
7408 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
7409 state_machine_regs
.address
);
7412 case DW_LNS_fixed_advance_pc
:
7413 adv
= byte_get (data
, 2);
7415 state_machine_regs
.address
+= adv
;
7416 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
7417 adv
, state_machine_regs
.address
);
7420 case DW_LNS_set_prologue_end
:
7421 printf (_(" Set prologue_end to true\n"));
7424 case DW_LNS_set_epilogue_begin
:
7425 printf (_(" Set epilogue_begin to true\n"));
7428 case DW_LNS_set_isa
:
7429 adv
= read_leb128 (data
, & bytes_read
, 0);
7431 printf (_(" Set ISA to %d\n"), adv
);
7435 printf (_(" Unknown opcode %d with operands: "), op_code
);
7438 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
7440 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
7441 i
== 1 ? "" : ", ");
7456 display_debug_pubnames (Elf_Internal_Shdr
*section
,
7457 unsigned char *start
,
7458 FILE *file ATTRIBUTE_UNUSED
)
7460 DWARF2_Internal_PubNames pubnames
;
7463 end
= start
+ section
->sh_size
;
7465 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7469 unsigned char *data
;
7470 unsigned long offset
;
7471 int offset_size
, initial_length_size
;
7475 pubnames
.pn_length
= byte_get (data
, 4);
7477 if (pubnames
.pn_length
== 0xffffffff)
7479 pubnames
.pn_length
= byte_get (data
, 8);
7482 initial_length_size
= 12;
7487 initial_length_size
= 4;
7490 pubnames
.pn_version
= byte_get (data
, 2);
7492 pubnames
.pn_offset
= byte_get (data
, offset_size
);
7493 data
+= offset_size
;
7494 pubnames
.pn_size
= byte_get (data
, offset_size
);
7495 data
+= offset_size
;
7497 start
+= pubnames
.pn_length
+ initial_length_size
;
7499 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
7501 static int warned
= 0;
7505 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
7512 printf (_(" Length: %ld\n"),
7513 pubnames
.pn_length
);
7514 printf (_(" Version: %d\n"),
7515 pubnames
.pn_version
);
7516 printf (_(" Offset into .debug_info section: %ld\n"),
7517 pubnames
.pn_offset
);
7518 printf (_(" Size of area in .debug_info section: %ld\n"),
7521 printf (_("\n Offset\tName\n"));
7525 offset
= byte_get (data
, offset_size
);
7529 data
+= offset_size
;
7530 printf (" %-6ld\t\t%s\n", offset
, data
);
7531 data
+= strlen ((char *) data
) + 1;
7534 while (offset
!= 0);
7542 get_TAG_name (unsigned long tag
)
7546 case DW_TAG_padding
: return "DW_TAG_padding";
7547 case DW_TAG_array_type
: return "DW_TAG_array_type";
7548 case DW_TAG_class_type
: return "DW_TAG_class_type";
7549 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7550 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7551 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7552 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7553 case DW_TAG_label
: return "DW_TAG_label";
7554 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7555 case DW_TAG_member
: return "DW_TAG_member";
7556 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7557 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7558 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7559 case DW_TAG_string_type
: return "DW_TAG_string_type";
7560 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7561 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7562 case DW_TAG_typedef
: return "DW_TAG_typedef";
7563 case DW_TAG_union_type
: return "DW_TAG_union_type";
7564 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7565 case DW_TAG_variant
: return "DW_TAG_variant";
7566 case DW_TAG_common_block
: return "DW_TAG_common_block";
7567 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7568 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7569 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7570 case DW_TAG_module
: return "DW_TAG_module";
7571 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7572 case DW_TAG_set_type
: return "DW_TAG_set_type";
7573 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7574 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7575 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7576 case DW_TAG_base_type
: return "DW_TAG_base_type";
7577 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7578 case DW_TAG_const_type
: return "DW_TAG_const_type";
7579 case DW_TAG_constant
: return "DW_TAG_constant";
7580 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7581 case DW_TAG_file_type
: return "DW_TAG_file_type";
7582 case DW_TAG_friend
: return "DW_TAG_friend";
7583 case DW_TAG_namelist
: return "DW_TAG_namelist";
7584 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7585 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7586 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7587 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7588 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7589 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7590 case DW_TAG_try_block
: return "DW_TAG_try_block";
7591 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7592 case DW_TAG_variable
: return "DW_TAG_variable";
7593 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7594 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7595 case DW_TAG_format_label
: return "DW_TAG_format_label";
7596 case DW_TAG_function_template
: return "DW_TAG_function_template";
7597 case DW_TAG_class_template
: return "DW_TAG_class_template";
7598 /* DWARF 2.1 values. */
7599 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7600 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7601 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7602 case DW_TAG_namespace
: return "DW_TAG_namespace";
7603 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7604 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7605 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7606 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7608 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7609 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7610 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7613 static char buffer
[100];
7615 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
7622 get_AT_name (unsigned long attribute
)
7626 case DW_AT_sibling
: return "DW_AT_sibling";
7627 case DW_AT_location
: return "DW_AT_location";
7628 case DW_AT_name
: return "DW_AT_name";
7629 case DW_AT_ordering
: return "DW_AT_ordering";
7630 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
7631 case DW_AT_byte_size
: return "DW_AT_byte_size";
7632 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
7633 case DW_AT_bit_size
: return "DW_AT_bit_size";
7634 case DW_AT_element_list
: return "DW_AT_element_list";
7635 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
7636 case DW_AT_low_pc
: return "DW_AT_low_pc";
7637 case DW_AT_high_pc
: return "DW_AT_high_pc";
7638 case DW_AT_language
: return "DW_AT_language";
7639 case DW_AT_member
: return "DW_AT_member";
7640 case DW_AT_discr
: return "DW_AT_discr";
7641 case DW_AT_discr_value
: return "DW_AT_discr_value";
7642 case DW_AT_visibility
: return "DW_AT_visibility";
7643 case DW_AT_import
: return "DW_AT_import";
7644 case DW_AT_string_length
: return "DW_AT_string_length";
7645 case DW_AT_common_reference
: return "DW_AT_common_reference";
7646 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7647 case DW_AT_const_value
: return "DW_AT_const_value";
7648 case DW_AT_containing_type
: return "DW_AT_containing_type";
7649 case DW_AT_default_value
: return "DW_AT_default_value";
7650 case DW_AT_inline
: return "DW_AT_inline";
7651 case DW_AT_is_optional
: return "DW_AT_is_optional";
7652 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7653 case DW_AT_producer
: return "DW_AT_producer";
7654 case DW_AT_prototyped
: return "DW_AT_prototyped";
7655 case DW_AT_return_addr
: return "DW_AT_return_addr";
7656 case DW_AT_start_scope
: return "DW_AT_start_scope";
7657 case DW_AT_stride_size
: return "DW_AT_stride_size";
7658 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7659 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7660 case DW_AT_accessibility
: return "DW_AT_accessibility";
7661 case DW_AT_address_class
: return "DW_AT_address_class";
7662 case DW_AT_artificial
: return "DW_AT_artificial";
7663 case DW_AT_base_types
: return "DW_AT_base_types";
7664 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7665 case DW_AT_count
: return "DW_AT_count";
7666 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7667 case DW_AT_decl_column
: return "DW_AT_decl_column";
7668 case DW_AT_decl_file
: return "DW_AT_decl_file";
7669 case DW_AT_decl_line
: return "DW_AT_decl_line";
7670 case DW_AT_declaration
: return "DW_AT_declaration";
7671 case DW_AT_discr_list
: return "DW_AT_discr_list";
7672 case DW_AT_encoding
: return "DW_AT_encoding";
7673 case DW_AT_external
: return "DW_AT_external";
7674 case DW_AT_frame_base
: return "DW_AT_frame_base";
7675 case DW_AT_friend
: return "DW_AT_friend";
7676 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7677 case DW_AT_macro_info
: return "DW_AT_macro_info";
7678 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7679 case DW_AT_priority
: return "DW_AT_priority";
7680 case DW_AT_segment
: return "DW_AT_segment";
7681 case DW_AT_specification
: return "DW_AT_specification";
7682 case DW_AT_static_link
: return "DW_AT_static_link";
7683 case DW_AT_type
: return "DW_AT_type";
7684 case DW_AT_use_location
: return "DW_AT_use_location";
7685 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7686 case DW_AT_virtuality
: return "DW_AT_virtuality";
7687 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7688 /* DWARF 2.1 values. */
7689 case DW_AT_allocated
: return "DW_AT_allocated";
7690 case DW_AT_associated
: return "DW_AT_associated";
7691 case DW_AT_data_location
: return "DW_AT_data_location";
7692 case DW_AT_stride
: return "DW_AT_stride";
7693 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7694 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7695 case DW_AT_extension
: return "DW_AT_extension";
7696 case DW_AT_ranges
: return "DW_AT_ranges";
7697 case DW_AT_trampoline
: return "DW_AT_trampoline";
7698 case DW_AT_call_column
: return "DW_AT_call_column";
7699 case DW_AT_call_file
: return "DW_AT_call_file";
7700 case DW_AT_call_line
: return "DW_AT_call_line";
7701 /* SGI/MIPS extensions. */
7702 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7703 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7704 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7705 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7706 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7707 case DW_AT_MIPS_software_pipeline_depth
:
7708 return "DW_AT_MIPS_software_pipeline_depth";
7709 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7710 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7711 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7712 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7713 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7714 /* GNU extensions. */
7715 case DW_AT_sf_names
: return "DW_AT_sf_names";
7716 case DW_AT_src_info
: return "DW_AT_src_info";
7717 case DW_AT_mac_info
: return "DW_AT_mac_info";
7718 case DW_AT_src_coords
: return "DW_AT_src_coords";
7719 case DW_AT_body_begin
: return "DW_AT_body_begin";
7720 case DW_AT_body_end
: return "DW_AT_body_end";
7721 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7722 /* UPC extension. */
7723 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7726 static char buffer
[100];
7728 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7735 get_FORM_name (unsigned long form
)
7739 case DW_FORM_addr
: return "DW_FORM_addr";
7740 case DW_FORM_block2
: return "DW_FORM_block2";
7741 case DW_FORM_block4
: return "DW_FORM_block4";
7742 case DW_FORM_data2
: return "DW_FORM_data2";
7743 case DW_FORM_data4
: return "DW_FORM_data4";
7744 case DW_FORM_data8
: return "DW_FORM_data8";
7745 case DW_FORM_string
: return "DW_FORM_string";
7746 case DW_FORM_block
: return "DW_FORM_block";
7747 case DW_FORM_block1
: return "DW_FORM_block1";
7748 case DW_FORM_data1
: return "DW_FORM_data1";
7749 case DW_FORM_flag
: return "DW_FORM_flag";
7750 case DW_FORM_sdata
: return "DW_FORM_sdata";
7751 case DW_FORM_strp
: return "DW_FORM_strp";
7752 case DW_FORM_udata
: return "DW_FORM_udata";
7753 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7754 case DW_FORM_ref1
: return "DW_FORM_ref1";
7755 case DW_FORM_ref2
: return "DW_FORM_ref2";
7756 case DW_FORM_ref4
: return "DW_FORM_ref4";
7757 case DW_FORM_ref8
: return "DW_FORM_ref8";
7758 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7759 case DW_FORM_indirect
: return "DW_FORM_indirect";
7762 static char buffer
[100];
7764 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7770 /* FIXME: There are better and more efficient ways to handle
7771 these structures. For now though, I just want something that
7772 is simple to implement. */
7773 typedef struct abbrev_attr
7775 unsigned long attribute
;
7777 struct abbrev_attr
*next
;
7781 typedef struct abbrev_entry
7783 unsigned long entry
;
7786 struct abbrev_attr
*first_attr
;
7787 struct abbrev_attr
*last_attr
;
7788 struct abbrev_entry
*next
;
7792 static abbrev_entry
*first_abbrev
= NULL
;
7793 static abbrev_entry
*last_abbrev
= NULL
;
7798 abbrev_entry
*abbrev
;
7800 for (abbrev
= first_abbrev
; abbrev
;)
7802 abbrev_entry
*next
= abbrev
->next
;
7805 for (attr
= abbrev
->first_attr
; attr
;)
7807 abbrev_attr
*next
= attr
->next
;
7817 last_abbrev
= first_abbrev
= NULL
;
7821 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7823 abbrev_entry
*entry
;
7825 entry
= malloc (sizeof (*entry
));
7831 entry
->entry
= number
;
7833 entry
->children
= children
;
7834 entry
->first_attr
= NULL
;
7835 entry
->last_attr
= NULL
;
7838 if (first_abbrev
== NULL
)
7839 first_abbrev
= entry
;
7841 last_abbrev
->next
= entry
;
7843 last_abbrev
= entry
;
7847 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7851 attr
= malloc (sizeof (*attr
));
7857 attr
->attribute
= attribute
;
7861 if (last_abbrev
->first_attr
== NULL
)
7862 last_abbrev
->first_attr
= attr
;
7864 last_abbrev
->last_attr
->next
= attr
;
7866 last_abbrev
->last_attr
= attr
;
7869 /* Processes the (partial) contents of a .debug_abbrev section.
7870 Returns NULL if the end of the section was encountered.
7871 Returns the address after the last byte read if the end of
7872 an abbreviation set was found. */
7874 static unsigned char *
7875 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7877 if (first_abbrev
!= NULL
)
7883 unsigned long entry
;
7885 unsigned long attribute
;
7888 entry
= read_leb128 (start
, & bytes_read
, 0);
7889 start
+= bytes_read
;
7891 /* A single zero is supposed to end the section according
7892 to the standard. If there's more, then signal that to
7895 return start
== end
? NULL
: start
;
7897 tag
= read_leb128 (start
, & bytes_read
, 0);
7898 start
+= bytes_read
;
7900 children
= *start
++;
7902 add_abbrev (entry
, tag
, children
);
7908 attribute
= read_leb128 (start
, & bytes_read
, 0);
7909 start
+= bytes_read
;
7911 form
= read_leb128 (start
, & bytes_read
, 0);
7912 start
+= bytes_read
;
7915 add_abbrev_attr (attribute
, form
);
7917 while (attribute
!= 0);
7925 display_debug_macinfo (Elf_Internal_Shdr
*section
,
7926 unsigned char *start
,
7927 FILE *file ATTRIBUTE_UNUSED
)
7929 unsigned char *end
= start
+ section
->sh_size
;
7930 unsigned char *curr
= start
;
7931 unsigned int bytes_read
;
7932 enum dwarf_macinfo_record_type op
;
7934 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7938 unsigned int lineno
;
7946 case DW_MACINFO_start_file
:
7948 unsigned int filenum
;
7950 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7952 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7955 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7959 case DW_MACINFO_end_file
:
7960 printf (_(" DW_MACINFO_end_file\n"));
7963 case DW_MACINFO_define
:
7964 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7967 curr
+= strlen (string
) + 1;
7968 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7971 case DW_MACINFO_undef
:
7972 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7975 curr
+= strlen (string
) + 1;
7976 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7979 case DW_MACINFO_vendor_ext
:
7981 unsigned int constant
;
7983 constant
= read_leb128 (curr
, & bytes_read
, 0);
7986 curr
+= strlen (string
) + 1;
7987 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7998 display_debug_abbrev (Elf_Internal_Shdr
*section
,
7999 unsigned char *start
,
8000 FILE *file ATTRIBUTE_UNUSED
)
8002 abbrev_entry
*entry
;
8003 unsigned char *end
= start
+ section
->sh_size
;
8005 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
8009 start
= process_abbrev_section (start
, end
);
8011 if (first_abbrev
== NULL
)
8014 printf (_(" Number TAG\n"));
8016 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
8020 printf (_(" %ld %s [%s]\n"),
8022 get_TAG_name (entry
->tag
),
8023 entry
->children
? _("has children") : _("no children"));
8025 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8027 printf (_(" %-18s %s\n"),
8028 get_AT_name (attr
->attribute
),
8029 get_FORM_name (attr
->form
));
8043 static unsigned char *
8044 display_block (unsigned char *data
, unsigned long length
)
8046 printf (_(" %lu byte block: "), length
);
8049 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
8055 decode_location_expression (unsigned char * data
,
8056 unsigned int pointer_size
,
8057 unsigned long length
)
8061 unsigned long uvalue
;
8062 unsigned char *end
= data
+ length
;
8071 printf ("DW_OP_addr: %lx",
8072 (unsigned long) byte_get (data
, pointer_size
));
8073 data
+= pointer_size
;
8076 printf ("DW_OP_deref");
8079 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
8082 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
8085 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
8089 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
8093 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
8097 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
8101 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
8102 (unsigned long) byte_get (data
+ 4, 4));
8106 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
8107 (long) byte_get (data
+ 4, 4));
8111 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
8115 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
8119 printf ("DW_OP_dup");
8122 printf ("DW_OP_drop");
8125 printf ("DW_OP_over");
8128 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
8131 printf ("DW_OP_swap");
8134 printf ("DW_OP_rot");
8137 printf ("DW_OP_xderef");
8140 printf ("DW_OP_abs");
8143 printf ("DW_OP_and");
8146 printf ("DW_OP_div");
8149 printf ("DW_OP_minus");
8152 printf ("DW_OP_mod");
8155 printf ("DW_OP_mul");
8158 printf ("DW_OP_neg");
8161 printf ("DW_OP_not");
8164 printf ("DW_OP_or");
8167 printf ("DW_OP_plus");
8169 case DW_OP_plus_uconst
:
8170 printf ("DW_OP_plus_uconst: %lu",
8171 read_leb128 (data
, &bytes_read
, 0));
8175 printf ("DW_OP_shl");
8178 printf ("DW_OP_shr");
8181 printf ("DW_OP_shra");
8184 printf ("DW_OP_xor");
8187 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
8191 printf ("DW_OP_eq");
8194 printf ("DW_OP_ge");
8197 printf ("DW_OP_gt");
8200 printf ("DW_OP_le");
8203 printf ("DW_OP_lt");
8206 printf ("DW_OP_ne");
8209 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
8245 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
8280 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
8315 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
8316 read_leb128 (data
, &bytes_read
, 1));
8321 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
8325 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
8329 uvalue
= read_leb128 (data
, &bytes_read
, 0);
8331 printf ("DW_OP_bregx: %lu %ld", uvalue
,
8332 read_leb128 (data
, &bytes_read
, 1));
8336 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
8339 case DW_OP_deref_size
:
8340 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
8342 case DW_OP_xderef_size
:
8343 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
8346 printf ("DW_OP_nop");
8349 /* DWARF 3 extensions. */
8350 case DW_OP_push_object_address
:
8351 printf ("DW_OP_push_object_address");
8354 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
8358 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
8361 case DW_OP_call_ref
:
8362 printf ("DW_OP_call_ref");
8365 /* GNU extensions. */
8366 case DW_OP_GNU_push_tls_address
:
8367 printf ("DW_OP_GNU_push_tls_address");
8371 if (op
>= DW_OP_lo_user
8372 && op
<= DW_OP_hi_user
)
8373 printf (_("(User defined location op)"));
8375 printf (_("(Unknown location op)"));
8376 /* No way to tell where the next op is, so just bail. */
8380 /* Separate the ops. */
8386 static const char *debug_loc_contents
;
8387 static bfd_vma debug_loc_size
;
8390 load_debug_loc (FILE *file
)
8392 Elf_Internal_Shdr
*sec
;
8394 /* If it is already loaded, do nothing. */
8395 if (debug_loc_contents
!= NULL
)
8398 /* Locate the .debug_loc section. */
8399 sec
= find_section (".debug_loc");
8403 debug_loc_size
= sec
->sh_size
;
8405 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8406 _("debug_loc section data"));
8410 free_debug_loc (void)
8412 if (debug_loc_contents
== NULL
)
8415 free ((char *) debug_loc_contents
);
8416 debug_loc_contents
= NULL
;
8422 display_debug_loc (Elf_Internal_Shdr
*section
,
8423 unsigned char *start
, FILE *file
)
8425 unsigned char *section_end
;
8426 unsigned long bytes
;
8427 unsigned char *section_begin
= start
;
8429 unsigned int comp_unit
= 0;
8431 addr
= section
->sh_addr
;
8432 bytes
= section
->sh_size
;
8433 section_end
= start
+ bytes
;
8437 printf (_("\nThe .debug_loc section is empty.\n"));
8441 if (num_debug_line_pointer_sizes
== 0)
8442 get_debug_line_pointer_sizes (file
);
8444 printf (_("Contents of the .debug_loc section:\n\n"));
8445 printf (_("\n Offset Begin End Expression\n"));
8447 while (start
< section_end
)
8449 unsigned long begin
;
8451 unsigned short length
;
8452 unsigned long offset
;
8453 unsigned int pointer_size
;
8455 offset
= start
- section_begin
;
8457 /* Get the pointer size from the comp unit associated
8458 with this block of location information. */
8459 if (comp_unit
>= num_debug_line_pointer_sizes
)
8461 error (_("Not enough comp units for .debug_loc section\n"));
8466 pointer_size
= debug_line_pointer_sizes
[comp_unit
];
8472 begin
= byte_get (start
, pointer_size
);
8473 start
+= pointer_size
;
8474 end
= byte_get (start
, pointer_size
);
8475 start
+= pointer_size
;
8477 if (begin
== 0 && end
== 0)
8480 /* For now, skip any base address specifiers. */
8481 if (begin
== 0xffffffff)
8487 length
= byte_get (start
, 2);
8490 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
8491 decode_location_expression (start
, pointer_size
, length
);
8501 static const char *debug_str_contents
;
8502 static bfd_vma debug_str_size
;
8505 load_debug_str (FILE *file
)
8507 Elf_Internal_Shdr
*sec
;
8509 /* If it is already loaded, do nothing. */
8510 if (debug_str_contents
!= NULL
)
8513 /* Locate the .debug_str section. */
8514 sec
= find_section (".debug_str");
8518 debug_str_size
= sec
->sh_size
;
8520 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8521 _("debug_str section data"));
8525 free_debug_str (void)
8527 if (debug_str_contents
== NULL
)
8530 free ((char *) debug_str_contents
);
8531 debug_str_contents
= NULL
;
8536 fetch_indirect_string (unsigned long offset
)
8538 if (debug_str_contents
== NULL
)
8539 return _("<no .debug_str section>");
8541 if (offset
> debug_str_size
)
8542 return _("<offset is too big>");
8544 return debug_str_contents
+ offset
;
8548 display_debug_str (Elf_Internal_Shdr
*section
,
8549 unsigned char *start
,
8550 FILE *file ATTRIBUTE_UNUSED
)
8552 unsigned long bytes
;
8555 addr
= section
->sh_addr
;
8556 bytes
= section
->sh_size
;
8560 printf (_("\nThe .debug_str section is empty.\n"));
8564 printf (_("Contents of the .debug_str section:\n\n"));
8572 lbytes
= (bytes
> 16 ? 16 : bytes
);
8574 printf (" 0x%8.8lx ", (unsigned long) addr
);
8576 for (j
= 0; j
< 16; j
++)
8579 printf ("%2.2x", start
[j
]);
8587 for (j
= 0; j
< lbytes
; j
++)
8590 if (k
>= ' ' && k
< 0x80)
8606 static unsigned char *
8607 read_and_display_attr_value (unsigned long attribute
,
8609 unsigned char *data
,
8610 unsigned long cu_offset
,
8611 unsigned long pointer_size
,
8612 unsigned long offset_size
,
8615 unsigned long uvalue
= 0;
8616 unsigned char *block_start
= NULL
;
8624 case DW_FORM_ref_addr
:
8625 if (dwarf_version
== 2)
8627 uvalue
= byte_get (data
, pointer_size
);
8628 data
+= pointer_size
;
8630 else if (dwarf_version
== 3)
8632 uvalue
= byte_get (data
, offset_size
);
8633 data
+= offset_size
;
8637 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8642 uvalue
= byte_get (data
, pointer_size
);
8643 data
+= pointer_size
;
8647 uvalue
= byte_get (data
, offset_size
);
8648 data
+= offset_size
;
8654 uvalue
= byte_get (data
++, 1);
8659 uvalue
= byte_get (data
, 2);
8665 uvalue
= byte_get (data
, 4);
8670 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8674 case DW_FORM_ref_udata
:
8676 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8680 case DW_FORM_indirect
:
8681 form
= read_leb128 (data
, & bytes_read
, 0);
8683 printf (" %s", get_FORM_name (form
));
8684 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8685 pointer_size
, offset_size
,
8691 case DW_FORM_ref_addr
:
8692 printf (" <#%lx>", uvalue
);
8698 case DW_FORM_ref_udata
:
8699 printf (" <%lx>", uvalue
+ cu_offset
);
8703 printf (" %#lx", uvalue
);
8712 printf (" %ld", uvalue
);
8717 uvalue
= byte_get (data
, 4);
8718 printf (" %lx", uvalue
);
8719 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8723 case DW_FORM_string
:
8724 printf (" %s", data
);
8725 data
+= strlen ((char *) data
) + 1;
8729 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8730 block_start
= data
+ bytes_read
;
8731 data
= display_block (block_start
, uvalue
);
8734 case DW_FORM_block1
:
8735 uvalue
= byte_get (data
, 1);
8736 block_start
= data
+ 1;
8737 data
= display_block (block_start
, uvalue
);
8740 case DW_FORM_block2
:
8741 uvalue
= byte_get (data
, 2);
8742 block_start
= data
+ 2;
8743 data
= display_block (block_start
, uvalue
);
8746 case DW_FORM_block4
:
8747 uvalue
= byte_get (data
, 4);
8748 block_start
= data
+ 4;
8749 data
= display_block (block_start
, uvalue
);
8753 printf (_(" (indirect string, offset: 0x%lx): %s"),
8754 uvalue
, fetch_indirect_string (uvalue
));
8757 case DW_FORM_indirect
:
8758 /* Handled above. */
8762 warn (_("Unrecognized form: %d\n"), form
);
8766 /* For some attributes we can display further information. */
8775 case DW_INL_not_inlined
:
8776 printf (_("(not inlined)"));
8778 case DW_INL_inlined
:
8779 printf (_("(inlined)"));
8781 case DW_INL_declared_not_inlined
:
8782 printf (_("(declared as inline but ignored)"));
8784 case DW_INL_declared_inlined
:
8785 printf (_("(declared as inline and inlined)"));
8788 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8793 case DW_AT_language
:
8796 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8797 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8798 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8799 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8800 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8801 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8802 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8803 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8804 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8805 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8806 /* DWARF 2.1 values. */
8807 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8808 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8809 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8810 /* MIPS extension. */
8811 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8812 /* UPC extension. */
8813 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8815 printf ("(Unknown: %lx)", uvalue
);
8820 case DW_AT_encoding
:
8823 case DW_ATE_void
: printf ("(void)"); break;
8824 case DW_ATE_address
: printf ("(machine address)"); break;
8825 case DW_ATE_boolean
: printf ("(boolean)"); break;
8826 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8827 case DW_ATE_float
: printf ("(float)"); break;
8828 case DW_ATE_signed
: printf ("(signed)"); break;
8829 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8830 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8831 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8832 /* DWARF 2.1 value. */
8833 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8835 if (uvalue
>= DW_ATE_lo_user
8836 && uvalue
<= DW_ATE_hi_user
)
8837 printf ("(user defined type)");
8839 printf ("(unknown type)");
8844 case DW_AT_accessibility
:
8847 case DW_ACCESS_public
: printf ("(public)"); break;
8848 case DW_ACCESS_protected
: printf ("(protected)"); break;
8849 case DW_ACCESS_private
: printf ("(private)"); break;
8851 printf ("(unknown accessibility)");
8856 case DW_AT_visibility
:
8859 case DW_VIS_local
: printf ("(local)"); break;
8860 case DW_VIS_exported
: printf ("(exported)"); break;
8861 case DW_VIS_qualified
: printf ("(qualified)"); break;
8862 default: printf ("(unknown visibility)"); break;
8866 case DW_AT_virtuality
:
8869 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8870 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8871 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8872 default: printf ("(unknown virtuality)"); break;
8876 case DW_AT_identifier_case
:
8879 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8880 case DW_ID_up_case
: printf ("(up_case)"); break;
8881 case DW_ID_down_case
: printf ("(down_case)"); break;
8882 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8883 default: printf ("(unknown case)"); break;
8887 case DW_AT_calling_convention
:
8890 case DW_CC_normal
: printf ("(normal)"); break;
8891 case DW_CC_program
: printf ("(program)"); break;
8892 case DW_CC_nocall
: printf ("(nocall)"); break;
8894 if (uvalue
>= DW_CC_lo_user
8895 && uvalue
<= DW_CC_hi_user
)
8896 printf ("(user defined)");
8898 printf ("(unknown convention)");
8902 case DW_AT_ordering
:
8905 case -1: printf ("(undefined)"); break;
8906 case 0: printf ("(row major)"); break;
8907 case 1: printf ("(column major)"); break;
8911 case DW_AT_frame_base
:
8912 case DW_AT_location
:
8913 case DW_AT_data_member_location
:
8914 case DW_AT_vtable_elem_location
:
8915 case DW_AT_allocated
:
8916 case DW_AT_associated
:
8917 case DW_AT_data_location
:
8919 case DW_AT_upper_bound
:
8920 case DW_AT_lower_bound
:
8924 decode_location_expression (block_start
, pointer_size
, uvalue
);
8927 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8930 printf ("location list");
8942 static unsigned char *
8943 read_and_display_attr (unsigned long attribute
,
8945 unsigned char *data
,
8946 unsigned long cu_offset
,
8947 unsigned long pointer_size
,
8948 unsigned long offset_size
,
8951 printf (" %-18s:", get_AT_name (attribute
));
8952 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8953 pointer_size
, offset_size
, dwarf_version
);
8958 /* Apply addends of RELA relocations. */
8961 debug_apply_rela_addends (FILE *file
,
8962 Elf_Internal_Shdr
*section
,
8964 unsigned char *sec_data
,
8965 unsigned char *start
,
8968 Elf_Internal_Shdr
*relsec
;
8970 if (end
- start
< reloc_size
)
8973 for (relsec
= section_headers
;
8974 relsec
< section_headers
+ elf_header
.e_shnum
;
8977 unsigned long nrelas
;
8978 Elf_Internal_Rela
*rela
, *rp
;
8979 Elf_Internal_Shdr
*symsec
;
8980 Elf_Internal_Sym
*symtab
;
8981 Elf_Internal_Sym
*sym
;
8983 if (relsec
->sh_type
!= SHT_RELA
8984 || SECTION_HEADER (relsec
->sh_info
) != section
8985 || relsec
->sh_size
== 0)
8988 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8992 symsec
= SECTION_HEADER (relsec
->sh_link
);
8993 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8995 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8999 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
9000 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
9001 loc
= sec_data
+ rp
->r_offset
;
9007 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
9009 if (ELF32_R_SYM (rp
->r_info
) != 0
9010 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
9012 warn (_("Skipping unexpected symbol type %u\n"),
9013 ELF32_ST_TYPE (sym
->st_info
));
9019 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
9021 if (ELF64_R_SYM (rp
->r_info
) != 0
9022 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
9024 warn (_("Skipping unexpected symbol type %u\n"),
9025 ELF64_ST_TYPE (sym
->st_info
));
9030 byte_put (loc
, rp
->r_addend
, reloc_size
);
9041 display_debug_info (Elf_Internal_Shdr
*section
,
9042 unsigned char *start
,
9045 unsigned char *end
= start
+ section
->sh_size
;
9046 unsigned char *section_begin
= start
;
9048 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
9050 load_debug_str (file
);
9051 load_debug_loc (file
);
9055 DWARF2_Internal_CompUnit compunit
;
9056 unsigned char *hdrptr
;
9057 unsigned char *cu_abbrev_offset_ptr
;
9058 unsigned char *tags
;
9060 unsigned long cu_offset
;
9062 int initial_length_size
;
9066 compunit
.cu_length
= byte_get (hdrptr
, 4);
9069 if (compunit
.cu_length
== 0xffffffff)
9071 compunit
.cu_length
= byte_get (hdrptr
, 8);
9074 initial_length_size
= 12;
9079 initial_length_size
= 4;
9082 compunit
.cu_version
= byte_get (hdrptr
, 2);
9085 cu_offset
= start
- section_begin
;
9086 start
+= compunit
.cu_length
+ initial_length_size
;
9088 if (elf_header
.e_type
== ET_REL
9089 && !debug_apply_rela_addends (file
, section
, offset_size
,
9090 section_begin
, hdrptr
, start
))
9093 cu_abbrev_offset_ptr
= hdrptr
;
9094 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
9095 hdrptr
+= offset_size
;
9097 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
9102 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
9103 printf (_(" Length: %ld\n"), compunit
.cu_length
);
9104 printf (_(" Version: %d\n"), compunit
.cu_version
);
9105 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
9106 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
9108 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
9110 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
9116 /* Read in the abbrevs used by this compilation unit. */
9118 Elf_Internal_Shdr
*sec
;
9119 unsigned char *begin
;
9121 /* Locate the .debug_abbrev section and process it. */
9122 sec
= find_section (".debug_abbrev");
9125 warn (_("Unable to locate .debug_abbrev section!\n"));
9129 begin
= get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
9130 _("debug_abbrev section data"));
9134 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
9135 begin
+ sec
->sh_size
);
9141 while (tags
< start
)
9144 unsigned long abbrev_number
;
9145 abbrev_entry
*entry
;
9148 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
9151 /* A null DIE marks the end of a list of children. */
9152 if (abbrev_number
== 0)
9158 /* Scan through the abbreviation list until we reach the
9160 for (entry
= first_abbrev
;
9161 entry
&& entry
->entry
!= abbrev_number
;
9162 entry
= entry
->next
)
9167 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
9172 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
9174 (unsigned long) (tags
- section_begin
- bytes_read
),
9176 get_TAG_name (entry
->tag
));
9178 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9179 tags
= read_and_display_attr (attr
->attribute
,
9182 compunit
.cu_pointer_size
,
9184 compunit
.cu_version
);
9186 if (entry
->children
)
9200 display_debug_aranges (Elf_Internal_Shdr
*section
,
9201 unsigned char *start
,
9202 FILE *file ATTRIBUTE_UNUSED
)
9204 unsigned char *end
= start
+ section
->sh_size
;
9206 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
9210 unsigned char *hdrptr
;
9211 DWARF2_Internal_ARange arange
;
9212 unsigned char *ranges
;
9213 unsigned long length
;
9214 unsigned long address
;
9217 int initial_length_size
;
9221 arange
.ar_length
= byte_get (hdrptr
, 4);
9224 if (arange
.ar_length
== 0xffffffff)
9226 arange
.ar_length
= byte_get (hdrptr
, 8);
9229 initial_length_size
= 12;
9234 initial_length_size
= 4;
9237 arange
.ar_version
= byte_get (hdrptr
, 2);
9240 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
9241 hdrptr
+= offset_size
;
9243 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
9246 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
9249 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
9251 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
9255 printf (_(" Length: %ld\n"), arange
.ar_length
);
9256 printf (_(" Version: %d\n"), arange
.ar_version
);
9257 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
9258 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
9259 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
9261 printf (_("\n Address Length\n"));
9265 /* Must pad to an alignment boundary that is twice the pointer size. */
9266 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
9268 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
9272 address
= byte_get (ranges
, arange
.ar_pointer_size
);
9274 ranges
+= arange
.ar_pointer_size
;
9276 length
= byte_get (ranges
, arange
.ar_pointer_size
);
9278 ranges
+= arange
.ar_pointer_size
;
9280 /* A pair of zeros marks the end of the list. */
9281 if (address
== 0 && length
== 0)
9284 printf (" %8.8lx %lu\n", address
, length
);
9287 start
+= arange
.ar_length
+ initial_length_size
;
9295 typedef struct Frame_Chunk
9297 struct Frame_Chunk
*next
;
9298 unsigned char *chunk_start
;
9300 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
9301 short int *col_type
;
9304 unsigned int code_factor
;
9306 unsigned long pc_begin
;
9307 unsigned long pc_range
;
9311 unsigned char fde_encoding
;
9312 unsigned char cfa_exp
;
9316 /* A marker for a col_type that means this column was never referenced
9317 in the frame info. */
9318 #define DW_CFA_unreferenced (-1)
9321 frame_need_space (Frame_Chunk
*fc
, int reg
)
9323 int prev
= fc
->ncols
;
9325 if (reg
< fc
->ncols
)
9328 fc
->ncols
= reg
+ 1;
9329 fc
->col_type
= xrealloc (fc
->col_type
, fc
->ncols
* sizeof (short int));
9330 fc
->col_offset
= xrealloc (fc
->col_offset
, fc
->ncols
* sizeof (int));
9332 while (prev
< fc
->ncols
)
9334 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
9335 fc
->col_offset
[prev
] = 0;
9341 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
9346 if (*max_regs
< fc
->ncols
)
9347 *max_regs
= fc
->ncols
;
9349 if (*need_col_headers
)
9351 *need_col_headers
= 0;
9353 printf (" LOC CFA ");
9355 for (r
= 0; r
< *max_regs
; r
++)
9356 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
9361 printf ("r%-4d", r
);
9367 printf ("%08lx ", fc
->pc_begin
);
9369 strcpy (tmp
, "exp");
9371 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
9372 printf ("%-8s ", tmp
);
9374 for (r
= 0; r
< fc
->ncols
; r
++)
9376 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
9378 switch (fc
->col_type
[r
])
9380 case DW_CFA_undefined
:
9383 case DW_CFA_same_value
:
9387 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
9389 case DW_CFA_register
:
9390 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
9392 case DW_CFA_expression
:
9393 strcpy (tmp
, "exp");
9396 strcpy (tmp
, "n/a");
9399 printf ("%-5s", tmp
);
9406 size_of_encoded_value (int encoding
)
9408 switch (encoding
& 0x7)
9411 case 0: return is_32bit_elf
? 4 : 8;
9419 get_encoded_value (unsigned char *data
, int encoding
)
9421 int size
= size_of_encoded_value (encoding
);
9422 if (encoding
& DW_EH_PE_signed
)
9423 return byte_get_signed (data
, size
);
9425 return byte_get (data
, size
);
9428 #define GET(N) byte_get (start, N); start += N
9429 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
9430 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
9433 display_debug_frames (Elf_Internal_Shdr
*section
,
9434 unsigned char *start
,
9435 FILE *file ATTRIBUTE_UNUSED
)
9437 unsigned char *end
= start
+ section
->sh_size
;
9438 unsigned char *section_start
= start
;
9439 Frame_Chunk
*chunks
= 0;
9440 Frame_Chunk
*remembered_state
= 0;
9442 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
9445 int addr_size
= is_32bit_elf
? 4 : 8;
9447 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
9451 unsigned char *saved_start
;
9452 unsigned char *block_end
;
9453 unsigned long length
;
9454 unsigned long cie_id
;
9457 int need_col_headers
= 1;
9458 unsigned char *augmentation_data
= NULL
;
9459 unsigned long augmentation_data_len
= 0;
9460 int encoded_ptr_size
= addr_size
;
9462 int initial_length_size
;
9464 saved_start
= start
;
9465 length
= byte_get (start
, 4); start
+= 4;
9469 printf ("\n%08lx ZERO terminator\n\n",
9470 (unsigned long)(saved_start
- section_start
));
9474 if (length
== 0xffffffff)
9476 length
= byte_get (start
, 8);
9479 initial_length_size
= 12;
9484 initial_length_size
= 4;
9487 block_end
= saved_start
+ length
+ initial_length_size
;
9488 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
9490 if (elf_header
.e_type
== ET_REL
9491 && !debug_apply_rela_addends (file
, section
, offset_size
,
9492 section_start
, start
, block_end
))
9495 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
9499 fc
= xmalloc (sizeof (Frame_Chunk
));
9500 memset (fc
, 0, sizeof (Frame_Chunk
));
9504 fc
->chunk_start
= saved_start
;
9506 fc
->col_type
= xmalloc (sizeof (short int));
9507 fc
->col_offset
= xmalloc (sizeof (int));
9508 frame_need_space (fc
, max_regs
-1);
9512 fc
->augmentation
= start
;
9513 start
= strchr (start
, '\0') + 1;
9515 if (fc
->augmentation
[0] == 'z')
9517 fc
->code_factor
= LEB ();
9518 fc
->data_factor
= SLEB ();
9527 augmentation_data_len
= LEB ();
9528 augmentation_data
= start
;
9529 start
+= augmentation_data_len
;
9531 else if (strcmp (fc
->augmentation
, "eh") == 0)
9534 fc
->code_factor
= LEB ();
9535 fc
->data_factor
= SLEB ();
9547 fc
->code_factor
= LEB ();
9548 fc
->data_factor
= SLEB ();
9560 if (do_debug_frames_interp
)
9561 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
9562 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9563 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
9567 printf ("\n%08lx %08lx %08lx CIE\n",
9568 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
9569 printf (" Version: %d\n", version
);
9570 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
9571 printf (" Code alignment factor: %u\n", fc
->code_factor
);
9572 printf (" Data alignment factor: %d\n", fc
->data_factor
);
9573 printf (" Return address column: %d\n", fc
->ra
);
9575 if (augmentation_data_len
)
9578 printf (" Augmentation data: ");
9579 for (i
= 0; i
< augmentation_data_len
; ++i
)
9580 printf (" %02x", augmentation_data
[i
]);
9586 if (augmentation_data_len
)
9588 unsigned char *p
, *q
;
9589 p
= fc
->augmentation
+ 1;
9590 q
= augmentation_data
;
9597 q
+= 1 + size_of_encoded_value (*q
);
9599 fc
->fde_encoding
= *q
++;
9605 if (fc
->fde_encoding
)
9606 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9609 frame_need_space (fc
, fc
->ra
);
9613 unsigned char *look_for
;
9614 static Frame_Chunk fde_fc
;
9617 memset (fc
, 0, sizeof (Frame_Chunk
));
9619 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
9621 for (cie
= chunks
; cie
; cie
= cie
->next
)
9622 if (cie
->chunk_start
== look_for
)
9627 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
9628 cie_id
, saved_start
);
9631 fc
->col_type
= xmalloc (sizeof (short int));
9632 fc
->col_offset
= xmalloc (sizeof (int));
9633 frame_need_space (fc
, max_regs
- 1);
9635 fc
->augmentation
= "";
9636 fc
->fde_encoding
= 0;
9640 fc
->ncols
= cie
->ncols
;
9641 fc
->col_type
= xmalloc (fc
->ncols
* sizeof (short int));
9642 fc
->col_offset
= xmalloc (fc
->ncols
* sizeof (int));
9643 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9644 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9645 fc
->augmentation
= cie
->augmentation
;
9646 fc
->code_factor
= cie
->code_factor
;
9647 fc
->data_factor
= cie
->data_factor
;
9648 fc
->cfa_reg
= cie
->cfa_reg
;
9649 fc
->cfa_offset
= cie
->cfa_offset
;
9651 frame_need_space (fc
, max_regs
-1);
9652 fc
->fde_encoding
= cie
->fde_encoding
;
9655 if (fc
->fde_encoding
)
9656 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9658 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9659 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
9660 /* Don't adjust for ET_REL since there's invariably a pcrel
9661 reloc here, which we haven't applied. */
9662 && elf_header
.e_type
!= ET_REL
)
9663 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9664 start
+= encoded_ptr_size
;
9665 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9666 start
+= encoded_ptr_size
;
9668 if (cie
->augmentation
[0] == 'z')
9670 augmentation_data_len
= LEB ();
9671 augmentation_data
= start
;
9672 start
+= augmentation_data_len
;
9675 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9676 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9677 (unsigned long)(cie
->chunk_start
- section_start
),
9678 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9679 if (! do_debug_frames_interp
&& augmentation_data_len
)
9682 printf (" Augmentation data: ");
9683 for (i
= 0; i
< augmentation_data_len
; ++i
)
9684 printf (" %02x", augmentation_data
[i
]);
9690 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9691 about to interpret instructions for the chunk. */
9692 /* ??? At present we need to do this always, since this sizes the
9693 fc->col_type and fc->col_offset arrays, which we write into always.
9694 We should probably split the interpreted and non-interpreted bits
9695 into two different routines, since there's so much that doesn't
9696 really overlap between them. */
9697 if (1 || do_debug_frames_interp
)
9699 /* Start by making a pass over the chunk, allocating storage
9700 and taking note of what registers are used. */
9701 unsigned char *tmp
= start
;
9703 while (start
< block_end
)
9706 unsigned long reg
, tmp
;
9713 /* Warning: if you add any more cases to this switch, be
9714 sure to add them to the corresponding switch below. */
9717 case DW_CFA_advance_loc
:
9721 frame_need_space (fc
, opa
);
9722 fc
->col_type
[opa
] = DW_CFA_undefined
;
9724 case DW_CFA_restore
:
9725 frame_need_space (fc
, opa
);
9726 fc
->col_type
[opa
] = DW_CFA_undefined
;
9728 case DW_CFA_set_loc
:
9729 start
+= encoded_ptr_size
;
9731 case DW_CFA_advance_loc1
:
9734 case DW_CFA_advance_loc2
:
9737 case DW_CFA_advance_loc4
:
9740 case DW_CFA_offset_extended
:
9741 reg
= LEB (); LEB ();
9742 frame_need_space (fc
, reg
);
9743 fc
->col_type
[reg
] = DW_CFA_undefined
;
9745 case DW_CFA_restore_extended
:
9747 frame_need_space (fc
, reg
);
9748 fc
->col_type
[reg
] = DW_CFA_undefined
;
9750 case DW_CFA_undefined
:
9752 frame_need_space (fc
, reg
);
9753 fc
->col_type
[reg
] = DW_CFA_undefined
;
9755 case DW_CFA_same_value
:
9757 frame_need_space (fc
, reg
);
9758 fc
->col_type
[reg
] = DW_CFA_undefined
;
9760 case DW_CFA_register
:
9761 reg
= LEB (); LEB ();
9762 frame_need_space (fc
, reg
);
9763 fc
->col_type
[reg
] = DW_CFA_undefined
;
9765 case DW_CFA_def_cfa
:
9768 case DW_CFA_def_cfa_register
:
9771 case DW_CFA_def_cfa_offset
:
9774 case DW_CFA_def_cfa_expression
:
9778 case DW_CFA_expression
:
9782 frame_need_space (fc
, reg
);
9783 fc
->col_type
[reg
] = DW_CFA_undefined
;
9785 case DW_CFA_offset_extended_sf
:
9786 reg
= LEB (); SLEB ();
9787 frame_need_space (fc
, reg
);
9788 fc
->col_type
[reg
] = DW_CFA_undefined
;
9790 case DW_CFA_def_cfa_sf
:
9793 case DW_CFA_def_cfa_offset_sf
:
9796 case DW_CFA_MIPS_advance_loc8
:
9799 case DW_CFA_GNU_args_size
:
9802 case DW_CFA_GNU_negative_offset_extended
:
9803 reg
= LEB (); LEB ();
9804 frame_need_space (fc
, reg
);
9805 fc
->col_type
[reg
] = DW_CFA_undefined
;
9814 /* Now we know what registers are used, make a second pass over
9815 the chunk, this time actually printing out the info. */
9817 while (start
< block_end
)
9820 unsigned long ul
, reg
, roffs
;
9829 /* Warning: if you add any more cases to this switch, be
9830 sure to add them to the corresponding switch above. */
9833 case DW_CFA_advance_loc
:
9834 if (do_debug_frames_interp
)
9835 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9837 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9838 opa
* fc
->code_factor
,
9839 fc
->pc_begin
+ opa
* fc
->code_factor
);
9840 fc
->pc_begin
+= opa
* fc
->code_factor
;
9845 if (! do_debug_frames_interp
)
9846 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9847 opa
, roffs
* fc
->data_factor
);
9848 fc
->col_type
[opa
] = DW_CFA_offset
;
9849 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9852 case DW_CFA_restore
:
9853 if (! do_debug_frames_interp
)
9854 printf (" DW_CFA_restore: r%d\n", opa
);
9855 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9856 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9859 case DW_CFA_set_loc
:
9860 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9861 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
9862 && elf_header
.e_type
!= ET_REL
)
9863 vma
+= section
->sh_addr
+ (start
- section_start
);
9864 start
+= encoded_ptr_size
;
9865 if (do_debug_frames_interp
)
9866 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9868 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9872 case DW_CFA_advance_loc1
:
9873 ofs
= byte_get (start
, 1); start
+= 1;
9874 if (do_debug_frames_interp
)
9875 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9877 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9878 ofs
* fc
->code_factor
,
9879 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9880 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9883 case DW_CFA_advance_loc2
:
9884 ofs
= byte_get (start
, 2); start
+= 2;
9885 if (do_debug_frames_interp
)
9886 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9888 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9889 ofs
* fc
->code_factor
,
9890 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9891 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9894 case DW_CFA_advance_loc4
:
9895 ofs
= byte_get (start
, 4); start
+= 4;
9896 if (do_debug_frames_interp
)
9897 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9899 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9900 ofs
* fc
->code_factor
,
9901 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9902 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9905 case DW_CFA_offset_extended
:
9908 if (! do_debug_frames_interp
)
9909 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9910 reg
, roffs
* fc
->data_factor
);
9911 fc
->col_type
[reg
] = DW_CFA_offset
;
9912 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9915 case DW_CFA_restore_extended
:
9917 if (! do_debug_frames_interp
)
9918 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9919 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9920 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9923 case DW_CFA_undefined
:
9925 if (! do_debug_frames_interp
)
9926 printf (" DW_CFA_undefined: r%ld\n", reg
);
9927 fc
->col_type
[reg
] = DW_CFA_undefined
;
9928 fc
->col_offset
[reg
] = 0;
9931 case DW_CFA_same_value
:
9933 if (! do_debug_frames_interp
)
9934 printf (" DW_CFA_same_value: r%ld\n", reg
);
9935 fc
->col_type
[reg
] = DW_CFA_same_value
;
9936 fc
->col_offset
[reg
] = 0;
9939 case DW_CFA_register
:
9942 if (! do_debug_frames_interp
)
9943 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9944 fc
->col_type
[reg
] = DW_CFA_register
;
9945 fc
->col_offset
[reg
] = roffs
;
9948 case DW_CFA_remember_state
:
9949 if (! do_debug_frames_interp
)
9950 printf (" DW_CFA_remember_state\n");
9951 rs
= xmalloc (sizeof (Frame_Chunk
));
9952 rs
->ncols
= fc
->ncols
;
9953 rs
->col_type
= xmalloc (rs
->ncols
* sizeof (short int));
9954 rs
->col_offset
= xmalloc (rs
->ncols
* sizeof (int));
9955 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9956 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9957 rs
->next
= remembered_state
;
9958 remembered_state
= rs
;
9961 case DW_CFA_restore_state
:
9962 if (! do_debug_frames_interp
)
9963 printf (" DW_CFA_restore_state\n");
9964 rs
= remembered_state
;
9967 remembered_state
= rs
->next
;
9968 frame_need_space (fc
, rs
->ncols
-1);
9969 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9970 memcpy (fc
->col_offset
, rs
->col_offset
,
9971 rs
->ncols
* sizeof (int));
9972 free (rs
->col_type
);
9973 free (rs
->col_offset
);
9976 else if (do_debug_frames_interp
)
9977 printf ("Mismatched DW_CFA_restore_state\n");
9980 case DW_CFA_def_cfa
:
9981 fc
->cfa_reg
= LEB ();
9982 fc
->cfa_offset
= LEB ();
9984 if (! do_debug_frames_interp
)
9985 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9986 fc
->cfa_reg
, fc
->cfa_offset
);
9989 case DW_CFA_def_cfa_register
:
9990 fc
->cfa_reg
= LEB ();
9992 if (! do_debug_frames_interp
)
9993 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9996 case DW_CFA_def_cfa_offset
:
9997 fc
->cfa_offset
= LEB ();
9998 if (! do_debug_frames_interp
)
9999 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
10003 if (! do_debug_frames_interp
)
10004 printf (" DW_CFA_nop\n");
10007 case DW_CFA_def_cfa_expression
:
10009 if (! do_debug_frames_interp
)
10011 printf (" DW_CFA_def_cfa_expression (");
10012 decode_location_expression (start
, addr_size
, ul
);
10019 case DW_CFA_expression
:
10022 if (! do_debug_frames_interp
)
10024 printf (" DW_CFA_expression: r%ld (", reg
);
10025 decode_location_expression (start
, addr_size
, ul
);
10028 fc
->col_type
[reg
] = DW_CFA_expression
;
10032 case DW_CFA_offset_extended_sf
:
10035 frame_need_space (fc
, reg
);
10036 if (! do_debug_frames_interp
)
10037 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10038 reg
, l
* fc
->data_factor
);
10039 fc
->col_type
[reg
] = DW_CFA_offset
;
10040 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10043 case DW_CFA_def_cfa_sf
:
10044 fc
->cfa_reg
= LEB ();
10045 fc
->cfa_offset
= SLEB ();
10047 if (! do_debug_frames_interp
)
10048 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10049 fc
->cfa_reg
, fc
->cfa_offset
);
10052 case DW_CFA_def_cfa_offset_sf
:
10053 fc
->cfa_offset
= SLEB ();
10054 if (! do_debug_frames_interp
)
10055 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
10058 case DW_CFA_MIPS_advance_loc8
:
10059 ofs
= byte_get (start
, 8); start
+= 8;
10060 if (do_debug_frames_interp
)
10061 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10063 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10064 ofs
* fc
->code_factor
,
10065 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10066 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10069 case DW_CFA_GNU_window_save
:
10070 if (! do_debug_frames_interp
)
10071 printf (" DW_CFA_GNU_window_save\n");
10074 case DW_CFA_GNU_args_size
:
10076 if (! do_debug_frames_interp
)
10077 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
10080 case DW_CFA_GNU_negative_offset_extended
:
10083 frame_need_space (fc
, reg
);
10084 if (! do_debug_frames_interp
)
10085 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10086 reg
, l
* fc
->data_factor
);
10087 fc
->col_type
[reg
] = DW_CFA_offset
;
10088 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10092 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
10097 if (do_debug_frames_interp
)
10098 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10113 display_debug_not_supported (Elf_Internal_Shdr
*section
,
10114 unsigned char *start ATTRIBUTE_UNUSED
,
10115 FILE *file ATTRIBUTE_UNUSED
)
10117 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10118 SECTION_NAME (section
));
10123 /* A structure containing the name of a debug section
10124 and a pointer to a function that can decode it. */
10127 const char *const name
;
10128 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
10132 { ".debug_abbrev", display_debug_abbrev
},
10133 { ".debug_aranges", display_debug_aranges
},
10134 { ".debug_frame", display_debug_frames
},
10135 { ".debug_info", display_debug_info
},
10136 { ".debug_line", display_debug_lines
},
10137 { ".debug_pubnames", display_debug_pubnames
},
10138 { ".eh_frame", display_debug_frames
},
10139 { ".debug_macinfo", display_debug_macinfo
},
10140 { ".debug_str", display_debug_str
},
10141 { ".debug_loc", display_debug_loc
},
10142 { ".debug_pubtypes", display_debug_pubnames
},
10143 { ".debug_ranges", display_debug_not_supported
},
10144 { ".debug_static_func", display_debug_not_supported
},
10145 { ".debug_static_vars", display_debug_not_supported
},
10146 { ".debug_types", display_debug_not_supported
},
10147 { ".debug_weaknames", display_debug_not_supported
}
10151 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
10153 char *name
= SECTION_NAME (section
);
10154 bfd_size_type length
;
10155 unsigned char *start
;
10158 length
= section
->sh_size
;
10161 printf (_("\nSection '%s' has no debugging data.\n"), name
);
10165 start
= get_data (NULL
, file
, section
->sh_offset
, length
,
10166 _("debug section data"));
10170 /* See if we know how to display the contents of this section. */
10171 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
10172 name
= ".debug_info";
10174 for (i
= NUM_ELEM (debug_displays
); i
--;)
10175 if (strcmp (debug_displays
[i
].name
, name
) == 0)
10177 debug_displays
[i
].display (section
, start
, file
);
10182 printf (_("Unrecognized debug section: %s\n"), name
);
10186 /* If we loaded in the abbrev section at some point,
10187 we must release it here. */
10194 process_section_contents (FILE *file
)
10196 Elf_Internal_Shdr
*section
;
10202 for (i
= 0, section
= section_headers
;
10203 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
10206 #ifdef SUPPORT_DISASSEMBLY
10207 if (dump_sects
[i
] & DISASS_DUMP
)
10208 disassemble_section (section
, file
);
10210 if (dump_sects
[i
] & HEX_DUMP
)
10211 dump_section (section
, file
);
10213 if (dump_sects
[i
] & DEBUG_DUMP
)
10214 display_debug_section (section
, file
);
10217 if (i
< num_dump_sects
)
10218 warn (_("Some sections were not dumped because they do not exist!\n"));
10224 process_mips_fpe_exception (int mask
)
10229 if (mask
& OEX_FPU_INEX
)
10230 fputs ("INEX", stdout
), first
= 0;
10231 if (mask
& OEX_FPU_UFLO
)
10232 printf ("%sUFLO", first
? "" : "|"), first
= 0;
10233 if (mask
& OEX_FPU_OFLO
)
10234 printf ("%sOFLO", first
? "" : "|"), first
= 0;
10235 if (mask
& OEX_FPU_DIV0
)
10236 printf ("%sDIV0", first
? "" : "|"), first
= 0;
10237 if (mask
& OEX_FPU_INVAL
)
10238 printf ("%sINVAL", first
? "" : "|");
10241 fputs ("0", stdout
);
10245 process_mips_specific (FILE *file
)
10247 Elf_Internal_Dyn
*entry
;
10248 size_t liblist_offset
= 0;
10249 size_t liblistno
= 0;
10250 size_t conflictsno
= 0;
10251 size_t options_offset
= 0;
10252 size_t conflicts_offset
= 0;
10254 /* We have a lot of special sections. Thanks SGI! */
10255 if (dynamic_section
== NULL
)
10256 /* No information available. */
10259 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
10260 switch (entry
->d_tag
)
10262 case DT_MIPS_LIBLIST
:
10264 = offset_from_vma (file
, entry
->d_un
.d_val
,
10265 liblistno
* sizeof (Elf32_External_Lib
));
10267 case DT_MIPS_LIBLISTNO
:
10268 liblistno
= entry
->d_un
.d_val
;
10270 case DT_MIPS_OPTIONS
:
10271 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
10273 case DT_MIPS_CONFLICT
:
10275 = offset_from_vma (file
, entry
->d_un
.d_val
,
10276 conflictsno
* sizeof (Elf32_External_Conflict
));
10278 case DT_MIPS_CONFLICTNO
:
10279 conflictsno
= entry
->d_un
.d_val
;
10285 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
10287 Elf32_External_Lib
*elib
;
10290 elib
= get_data (NULL
, file
, liblist_offset
,
10291 liblistno
* sizeof (Elf32_External_Lib
),
10295 printf ("\nSection '.liblist' contains %lu entries:\n",
10296 (unsigned long) liblistno
);
10297 fputs (" Library Time Stamp Checksum Version Flags\n",
10300 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
10307 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10308 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10309 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10310 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10311 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10313 tmp
= gmtime (&time
);
10314 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10315 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10316 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10318 printf ("%3lu: ", (unsigned long) cnt
);
10319 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
10320 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
10322 printf ("<corrupt: %9ld>", liblist
.l_name
);
10323 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
10324 liblist
.l_version
);
10326 if (liblist
.l_flags
== 0)
10330 static const struct
10337 { " EXACT_MATCH", LL_EXACT_MATCH
},
10338 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
10339 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
10340 { " EXPORTS", LL_EXPORTS
},
10341 { " DELAY_LOAD", LL_DELAY_LOAD
},
10342 { " DELTA", LL_DELTA
}
10344 int flags
= liblist
.l_flags
;
10348 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
10350 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
10352 fputs (l_flags_vals
[fcnt
].name
, stdout
);
10353 flags
^= l_flags_vals
[fcnt
].bit
;
10356 printf (" %#x", (unsigned int) flags
);
10366 if (options_offset
!= 0)
10368 Elf_External_Options
*eopt
;
10369 Elf_Internal_Shdr
*sect
= section_headers
;
10370 Elf_Internal_Options
*iopt
;
10371 Elf_Internal_Options
*option
;
10375 /* Find the section header so that we get the size. */
10376 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
10379 eopt
= get_data (NULL
, file
, options_offset
, sect
->sh_size
,
10383 iopt
= malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
));
10386 error (_("Out of memory"));
10393 while (offset
< sect
->sh_size
)
10395 Elf_External_Options
*eoption
;
10397 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
10399 option
->kind
= BYTE_GET (eoption
->kind
);
10400 option
->size
= BYTE_GET (eoption
->size
);
10401 option
->section
= BYTE_GET (eoption
->section
);
10402 option
->info
= BYTE_GET (eoption
->info
);
10404 offset
+= option
->size
;
10410 printf (_("\nSection '%s' contains %d entries:\n"),
10411 SECTION_NAME (sect
), cnt
);
10419 switch (option
->kind
)
10422 /* This shouldn't happen. */
10423 printf (" NULL %d %lx", option
->section
, option
->info
);
10426 printf (" REGINFO ");
10427 if (elf_header
.e_machine
== EM_MIPS
)
10430 Elf32_External_RegInfo
*ereg
;
10431 Elf32_RegInfo reginfo
;
10433 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
10434 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
10435 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
10436 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
10437 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
10438 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
10439 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
10441 printf ("GPR %08lx GP 0x%lx\n",
10442 reginfo
.ri_gprmask
,
10443 (unsigned long) reginfo
.ri_gp_value
);
10444 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
10445 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
10446 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
10451 Elf64_External_RegInfo
*ereg
;
10452 Elf64_Internal_RegInfo reginfo
;
10454 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
10455 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
10456 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
10457 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
10458 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
10459 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
10460 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
10462 printf ("GPR %08lx GP 0x",
10463 reginfo
.ri_gprmask
);
10464 printf_vma (reginfo
.ri_gp_value
);
10467 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
10468 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
10469 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
10473 case ODK_EXCEPTIONS
:
10474 fputs (" EXCEPTIONS fpe_min(", stdout
);
10475 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
10476 fputs (") fpe_max(", stdout
);
10477 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
10478 fputs (")", stdout
);
10480 if (option
->info
& OEX_PAGE0
)
10481 fputs (" PAGE0", stdout
);
10482 if (option
->info
& OEX_SMM
)
10483 fputs (" SMM", stdout
);
10484 if (option
->info
& OEX_FPDBUG
)
10485 fputs (" FPDBUG", stdout
);
10486 if (option
->info
& OEX_DISMISS
)
10487 fputs (" DISMISS", stdout
);
10490 fputs (" PAD ", stdout
);
10491 if (option
->info
& OPAD_PREFIX
)
10492 fputs (" PREFIX", stdout
);
10493 if (option
->info
& OPAD_POSTFIX
)
10494 fputs (" POSTFIX", stdout
);
10495 if (option
->info
& OPAD_SYMBOL
)
10496 fputs (" SYMBOL", stdout
);
10499 fputs (" HWPATCH ", stdout
);
10500 if (option
->info
& OHW_R4KEOP
)
10501 fputs (" R4KEOP", stdout
);
10502 if (option
->info
& OHW_R8KPFETCH
)
10503 fputs (" R8KPFETCH", stdout
);
10504 if (option
->info
& OHW_R5KEOP
)
10505 fputs (" R5KEOP", stdout
);
10506 if (option
->info
& OHW_R5KCVTL
)
10507 fputs (" R5KCVTL", stdout
);
10510 fputs (" FILL ", stdout
);
10511 /* XXX Print content of info word? */
10514 fputs (" TAGS ", stdout
);
10515 /* XXX Print content of info word? */
10518 fputs (" HWAND ", stdout
);
10519 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10520 fputs (" R4KEOP_CHECKED", stdout
);
10521 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10522 fputs (" R4KEOP_CLEAN", stdout
);
10525 fputs (" HWOR ", stdout
);
10526 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
10527 fputs (" R4KEOP_CHECKED", stdout
);
10528 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
10529 fputs (" R4KEOP_CLEAN", stdout
);
10532 printf (" GP_GROUP %#06lx self-contained %#06lx",
10533 option
->info
& OGP_GROUP
,
10534 (option
->info
& OGP_SELF
) >> 16);
10537 printf (" IDENT %#06lx self-contained %#06lx",
10538 option
->info
& OGP_GROUP
,
10539 (option
->info
& OGP_SELF
) >> 16);
10542 /* This shouldn't happen. */
10543 printf (" %3d ??? %d %lx",
10544 option
->kind
, option
->section
, option
->info
);
10548 len
= sizeof (*eopt
);
10549 while (len
< option
->size
)
10550 if (((char *) option
)[len
] >= ' '
10551 && ((char *) option
)[len
] < 0x7f)
10552 printf ("%c", ((char *) option
)[len
++]);
10554 printf ("\\%03o", ((char *) option
)[len
++]);
10556 fputs ("\n", stdout
);
10564 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10566 Elf32_Conflict
*iconf
;
10569 if (dynamic_symbols
== NULL
)
10571 error (_("conflict list found without a dynamic symbol table"));
10575 iconf
= malloc (conflictsno
* sizeof (*iconf
));
10578 error (_("Out of memory"));
10584 Elf32_External_Conflict
*econf32
;
10586 econf32
= get_data (NULL
, file
, conflicts_offset
,
10587 conflictsno
* sizeof (*econf32
), _("conflict"));
10591 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10592 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10598 Elf64_External_Conflict
*econf64
;
10600 econf64
= get_data (NULL
, file
, conflicts_offset
,
10601 conflictsno
* sizeof (*econf64
), _("conflict"));
10605 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10606 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10611 printf (_("\nSection '.conflict' contains %lu entries:\n"),
10612 (unsigned long) conflictsno
);
10613 puts (_(" Num: Index Value Name"));
10615 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10617 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10619 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10620 print_vma (psym
->st_value
, FULL_HEX
);
10622 if (VALID_DYNAMIC_NAME (psym
->st_name
))
10623 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
10625 printf ("<corrupt: %14ld>", psym
->st_name
);
10636 process_gnu_liblist (FILE *file
)
10638 Elf_Internal_Shdr
*section
, *string_sec
;
10639 Elf32_External_Lib
*elib
;
10647 for (i
= 0, section
= section_headers
;
10648 i
< elf_header
.e_shnum
;
10651 switch (section
->sh_type
)
10653 case SHT_GNU_LIBLIST
:
10654 elib
= get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10659 string_sec
= SECTION_HEADER (section
->sh_link
);
10661 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
10662 string_sec
->sh_size
, _("liblist string table"));
10665 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10671 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10672 SECTION_NAME (section
),
10673 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10675 puts (" Library Time Stamp Checksum Version Flags");
10677 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10685 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10686 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10687 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10688 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10689 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10691 tmp
= gmtime (&time
);
10692 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10693 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10694 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10696 printf ("%3lu: ", (unsigned long) cnt
);
10698 printf ("%-20s", strtab
+ liblist
.l_name
);
10700 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10701 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10702 liblist
.l_version
, liblist
.l_flags
);
10712 static const char *
10713 get_note_type (unsigned e_type
)
10715 static char buff
[64];
10717 if (elf_header
.e_type
== ET_CORE
)
10721 return _("NT_AUXV (auxiliary vector)");
10723 return _("NT_PRSTATUS (prstatus structure)");
10725 return _("NT_FPREGSET (floating point registers)");
10727 return _("NT_PRPSINFO (prpsinfo structure)");
10728 case NT_TASKSTRUCT
:
10729 return _("NT_TASKSTRUCT (task structure)");
10731 return _("NT_PRXFPREG (user_xfpregs structure)");
10733 return _("NT_PSTATUS (pstatus structure)");
10735 return _("NT_FPREGS (floating point registers)");
10737 return _("NT_PSINFO (psinfo structure)");
10739 return _("NT_LWPSTATUS (lwpstatus_t structure)");
10741 return _("NT_LWPSINFO (lwpsinfo_t structure)");
10742 case NT_WIN32PSTATUS
:
10743 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10751 return _("NT_VERSION (version)");
10753 return _("NT_ARCH (architecture)");
10758 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10762 static const char *
10763 get_netbsd_elfcore_note_type (unsigned e_type
)
10765 static char buff
[64];
10767 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10769 /* NetBSD core "procinfo" structure. */
10770 return _("NetBSD procinfo structure");
10773 /* As of Jan 2002 there are no other machine-independent notes
10774 defined for NetBSD core files. If the note type is less
10775 than the start of the machine-dependent note types, we don't
10778 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10780 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10784 switch (elf_header
.e_machine
)
10786 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10787 and PT_GETFPREGS == mach+2. */
10792 case EM_SPARC32PLUS
:
10796 case NT_NETBSDCORE_FIRSTMACH
+0:
10797 return _("PT_GETREGS (reg structure)");
10798 case NT_NETBSDCORE_FIRSTMACH
+2:
10799 return _("PT_GETFPREGS (fpreg structure)");
10805 /* On all other arch's, PT_GETREGS == mach+1 and
10806 PT_GETFPREGS == mach+3. */
10810 case NT_NETBSDCORE_FIRSTMACH
+1:
10811 return _("PT_GETREGS (reg structure)");
10812 case NT_NETBSDCORE_FIRSTMACH
+3:
10813 return _("PT_GETFPREGS (fpreg structure)");
10819 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10823 /* Note that by the ELF standard, the name field is already null byte
10824 terminated, and namesz includes the terminating null byte.
10825 I.E. the value of namesz for the name "FSF" is 4.
10827 If the value of namesz is zero, there is no name present. */
10829 process_note (Elf_Internal_Note
*pnote
)
10833 if (pnote
->namesz
== 0)
10834 /* If there is no note name, then use the default set of
10835 note type strings. */
10836 nt
= get_note_type (pnote
->type
);
10838 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10839 /* NetBSD-specific core file notes. */
10840 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10843 /* Don't recognize this note name; just use the default set of
10844 note type strings. */
10845 nt
= get_note_type (pnote
->type
);
10847 printf (" %s\t\t0x%08lx\t%s\n",
10848 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10849 pnote
->descsz
, nt
);
10855 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10857 Elf_External_Note
*pnotes
;
10858 Elf_External_Note
*external
;
10864 pnotes
= get_data (NULL
, file
, offset
, length
, _("notes"));
10870 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10871 (unsigned long) offset
, (unsigned long) length
);
10872 printf (_(" Owner\t\tData size\tDescription\n"));
10874 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10876 Elf_External_Note
*next
;
10877 Elf_Internal_Note inote
;
10880 inote
.type
= BYTE_GET (external
->type
);
10881 inote
.namesz
= BYTE_GET (external
->namesz
);
10882 inote
.namedata
= external
->name
;
10883 inote
.descsz
= BYTE_GET (external
->descsz
);
10884 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10885 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10887 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10889 if (((char *) next
) > (((char *) pnotes
) + length
))
10891 warn (_("corrupt note found at offset %x into core notes\n"),
10892 ((char *) external
) - ((char *) pnotes
));
10893 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10894 inote
.type
, inote
.namesz
, inote
.descsz
);
10900 /* Verify that name is null terminated. It appears that at least
10901 one version of Linux (RedHat 6.0) generates corefiles that don't
10902 comply with the ELF spec by failing to include the null byte in
10904 if (inote
.namedata
[inote
.namesz
] != '\0')
10906 temp
= malloc (inote
.namesz
+ 1);
10910 error (_("Out of memory\n"));
10915 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10916 temp
[inote
.namesz
] = 0;
10918 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10919 inote
.namedata
= temp
;
10922 res
&= process_note (& inote
);
10937 process_corefile_note_segments (FILE *file
)
10939 Elf_Internal_Phdr
*segment
;
10943 if (! get_program_headers (file
))
10946 for (i
= 0, segment
= program_headers
;
10947 i
< elf_header
.e_phnum
;
10950 if (segment
->p_type
== PT_NOTE
)
10951 res
&= process_corefile_note_segment (file
,
10952 (bfd_vma
) segment
->p_offset
,
10953 (bfd_vma
) segment
->p_filesz
);
10960 process_note_sections (FILE *file
)
10962 Elf_Internal_Shdr
*section
;
10966 for (i
= 0, section
= section_headers
;
10967 i
< elf_header
.e_shnum
;
10969 if (section
->sh_type
== SHT_NOTE
)
10970 res
&= process_corefile_note_segment (file
,
10971 (bfd_vma
) section
->sh_offset
,
10972 (bfd_vma
) section
->sh_size
);
10978 process_notes (FILE *file
)
10980 /* If we have not been asked to display the notes then do nothing. */
10984 if (elf_header
.e_type
!= ET_CORE
)
10985 return process_note_sections (file
);
10987 /* No program headers means no NOTE segment. */
10988 if (elf_header
.e_phnum
> 0)
10989 return process_corefile_note_segments (file
);
10991 printf (_("No note segments present in the core file.\n"));
10996 process_arch_specific (FILE *file
)
11001 switch (elf_header
.e_machine
)
11004 case EM_MIPS_RS3_LE
:
11005 return process_mips_specific (file
);
11014 get_file_header (FILE *file
)
11016 /* Read in the identity array. */
11017 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
11020 /* Determine how to read the rest of the header. */
11021 switch (elf_header
.e_ident
[EI_DATA
])
11023 default: /* fall through */
11024 case ELFDATANONE
: /* fall through */
11026 byte_get
= byte_get_little_endian
;
11027 byte_put
= byte_put_little_endian
;
11030 byte_get
= byte_get_big_endian
;
11031 byte_put
= byte_put_big_endian
;
11035 /* For now we only support 32 bit and 64 bit ELF files. */
11036 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
11038 /* Read in the rest of the header. */
11041 Elf32_External_Ehdr ehdr32
;
11043 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
11046 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
11047 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
11048 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
11049 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
11050 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
11051 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
11052 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
11053 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
11054 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
11055 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
11056 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
11057 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
11058 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
11062 Elf64_External_Ehdr ehdr64
;
11064 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11065 we will not be able to cope with the 64bit data found in
11066 64 ELF files. Detect this now and abort before we start
11067 overwriting things. */
11068 if (sizeof (bfd_vma
) < 8)
11070 error (_("This instance of readelf has been built without support for a\n\
11071 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11075 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
11078 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
11079 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
11080 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
11081 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
11082 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
11083 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
11084 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
11085 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
11086 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
11087 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
11088 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
11089 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
11090 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
11093 if (elf_header
.e_shoff
)
11095 /* There may be some extensions in the first section header. Don't
11096 bomb if we can't read it. */
11098 get_32bit_section_headers (file
, 1);
11100 get_64bit_section_headers (file
, 1);
11106 /* Process one ELF object file according to the command line options.
11107 This file may actually be stored in an archive. The file is
11108 positioned at the start of the ELF object. */
11111 process_object (char *file_name
, FILE *file
)
11115 if (! get_file_header (file
))
11117 error (_("%s: Failed to read file header\n"), file_name
);
11121 /* Initialise per file variables. */
11122 for (i
= NUM_ELEM (version_info
); i
--;)
11123 version_info
[i
] = 0;
11125 for (i
= NUM_ELEM (dynamic_info
); i
--;)
11126 dynamic_info
[i
] = 0;
11128 /* Process the file. */
11130 printf (_("\nFile: %s\n"), file_name
);
11132 if (! process_file_header ())
11135 if (! process_section_headers (file
)
11136 || ! process_section_groups (file
))
11138 /* Without loaded section headers and section groups we
11139 cannot process lots of things. */
11140 do_unwind
= do_version
= do_dump
= do_arch
= 0;
11142 if (! do_using_dynamic
)
11143 do_syms
= do_reloc
= 0;
11146 if (process_program_headers (file
))
11147 process_dynamic_section (file
);
11149 process_relocs (file
);
11151 process_unwind (file
);
11153 process_symbol_table (file
);
11155 process_syminfo (file
);
11157 process_version_sections (file
);
11159 process_section_contents (file
);
11161 process_notes (file
);
11163 process_gnu_liblist (file
);
11165 process_arch_specific (file
);
11167 if (program_headers
)
11169 free (program_headers
);
11170 program_headers
= NULL
;
11173 if (section_headers
)
11175 free (section_headers
);
11176 section_headers
= NULL
;
11181 free (string_table
);
11182 string_table
= NULL
;
11183 string_table_length
= 0;
11186 if (dynamic_strings
)
11188 free (dynamic_strings
);
11189 dynamic_strings
= NULL
;
11190 dynamic_strings_length
= 0;
11193 if (dynamic_symbols
)
11195 free (dynamic_symbols
);
11196 dynamic_symbols
= NULL
;
11197 num_dynamic_syms
= 0;
11200 if (dynamic_syminfo
)
11202 free (dynamic_syminfo
);
11203 dynamic_syminfo
= NULL
;
11206 if (section_headers_groups
)
11208 free (section_headers_groups
);
11209 section_headers_groups
= NULL
;
11212 if (section_groups
)
11214 struct group_list
*g
, *next
;
11216 for (i
= 0; i
< group_count
; i
++)
11218 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
11225 free (section_groups
);
11226 section_groups
= NULL
;
11232 /* Process an ELF archive. The file is positioned just after the
11236 process_archive (char *file_name
, FILE *file
)
11238 struct ar_hdr arhdr
;
11240 unsigned long size
;
11241 char *longnames
= NULL
;
11242 unsigned long longnames_size
= 0;
11243 size_t file_name_size
;
11248 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11249 if (got
!= sizeof arhdr
)
11254 error (_("%s: failed to read archive header\n"), file_name
);
11258 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
11260 /* This is the archive symbol table. Skip it.
11261 FIXME: We should have an option to dump it. */
11262 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11263 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
11265 error (_("%s: failed to skip archive symbol table\n"), file_name
);
11269 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11270 if (got
!= sizeof arhdr
)
11275 error (_("%s: failed to read archive header\n"), file_name
);
11280 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
11282 /* This is the archive string table holding long member
11285 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11287 longnames
= malloc (longnames_size
);
11288 if (longnames
== NULL
)
11290 error (_("Out of memory\n"));
11294 if (fread (longnames
, longnames_size
, 1, file
) != 1)
11297 error(_("%s: failed to read string table\n"), file_name
);
11301 if ((longnames_size
& 1) != 0)
11304 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11305 if (got
!= sizeof arhdr
)
11312 error (_("%s: failed to read archive header\n"), file_name
);
11317 file_name_size
= strlen (file_name
);
11326 if (arhdr
.ar_name
[0] == '/')
11330 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
11331 if (off
>= longnames_size
)
11333 error (_("%s: invalid archive string table offset %lu\n"), off
);
11338 name
= longnames
+ off
;
11339 nameend
= memchr (name
, '/', longnames_size
- off
);
11343 name
= arhdr
.ar_name
;
11344 nameend
= memchr (name
, '/', 16);
11347 if (nameend
== NULL
)
11349 error (_("%s: bad archive file name\n"));
11354 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
11355 if (namealc
== NULL
)
11357 error (_("Out of memory\n"));
11362 memcpy (namealc
, file_name
, file_name_size
);
11363 namealc
[file_name_size
] = '(';
11364 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
11365 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
11366 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
11368 archive_file_offset
= ftell (file
);
11369 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
11371 ret
|= process_object (namealc
, file
);
11376 (archive_file_offset
11377 + archive_file_size
11378 + (archive_file_size
& 1)),
11381 error (_("%s: failed to seek to next archive header\n"), file_name
);
11386 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
11387 if (got
!= sizeof arhdr
)
11392 error (_("%s: failed to read archive header\n"), file_name
);
11398 if (longnames
!= 0)
11405 process_file (char *file_name
)
11408 struct stat statbuf
;
11409 char armag
[SARMAG
];
11412 if (stat (file_name
, &statbuf
) < 0)
11414 if (errno
== ENOENT
)
11415 error (_("'%s': No such file\n"), file_name
);
11417 error (_("Could not locate '%s'. System error message: %s\n"),
11418 file_name
, strerror (errno
));
11422 if (! S_ISREG (statbuf
.st_mode
))
11424 error (_("'%s' is not an ordinary file\n"), file_name
);
11428 file
= fopen (file_name
, "rb");
11431 error (_("Input file '%s' is not readable.\n"), file_name
);
11435 if (fread (armag
, SARMAG
, 1, file
) != 1)
11437 error (_("%s: Failed to read file header\n"), file_name
);
11442 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11443 ret
= process_archive (file_name
, file
);
11447 archive_file_size
= archive_file_offset
= 0;
11448 ret
= process_object (file_name
, file
);
11456 #ifdef SUPPORT_DISASSEMBLY
11457 /* Needed by the i386 disassembler. For extra credit, someone could
11458 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11462 print_address (unsigned int addr
, FILE *outfile
)
11464 fprintf (outfile
,"0x%8.8x", addr
);
11467 /* Needed by the i386 disassembler. */
11469 db_task_printsym (unsigned int addr
)
11471 print_address (addr
, stderr
);
11476 main (int argc
, char **argv
)
11479 char *cmdline_dump_sects
= NULL
;
11480 unsigned num_cmdline_dump_sects
= 0;
11482 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11483 setlocale (LC_MESSAGES
, "");
11485 #if defined (HAVE_SETLOCALE)
11486 setlocale (LC_CTYPE
, "");
11488 bindtextdomain (PACKAGE
, LOCALEDIR
);
11489 textdomain (PACKAGE
);
11491 parse_args (argc
, argv
);
11493 if (optind
< (argc
- 1))
11496 /* When processing more than one file remember the dump requests
11497 issued on command line to reset them after each file. */
11498 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
11500 cmdline_dump_sects
= malloc (num_dump_sects
);
11501 if (cmdline_dump_sects
== NULL
)
11502 error (_("Out of memory allocating dump request table."));
11505 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
11506 num_cmdline_dump_sects
= num_dump_sects
;
11511 while (optind
< argc
)
11513 err
|= process_file (argv
[optind
++]);
11515 /* Reset dump requests. */
11516 if (optind
< argc
&& dump_sects
!= NULL
)
11518 num_dump_sects
= num_cmdline_dump_sects
;
11519 if (num_cmdline_dump_sects
> 0)
11520 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
11524 if (dump_sects
!= NULL
)
11526 if (cmdline_dump_sects
!= NULL
)
11527 free (cmdline_dump_sects
);