1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
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"
98 #include "elf/msp430.h"
102 #include "elf/ppc64.h"
103 #include "elf/s390.h"
105 #include "elf/sparc.h"
106 #include "elf/v850.h"
108 #include "elf/x86-64.h"
109 #include "elf/xstormy16.h"
111 #include "elf/iq2000.h"
112 #include "elf/xtensa.h"
118 #include "libiberty.h"
120 char *program_name
= "readelf";
121 static long archive_file_offset
;
122 static unsigned long archive_file_size
;
123 static unsigned long dynamic_addr
;
124 static bfd_size_type dynamic_size
;
125 static unsigned int dynamic_nent
;
126 static char *dynamic_strings
;
127 static unsigned long dynamic_strings_length
;
128 static char *string_table
;
129 static unsigned long string_table_length
;
130 static unsigned long num_dynamic_syms
;
131 static Elf_Internal_Sym
*dynamic_symbols
;
132 static Elf_Internal_Syminfo
*dynamic_syminfo
;
133 static unsigned long dynamic_syminfo_offset
;
134 static unsigned int dynamic_syminfo_nent
;
135 static char program_interpreter
[64];
136 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
137 static bfd_vma version_info
[16];
138 static Elf_Internal_Ehdr elf_header
;
139 static Elf_Internal_Shdr
*section_headers
;
140 static Elf_Internal_Phdr
*program_headers
;
141 static Elf_Internal_Dyn
*dynamic_section
;
142 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
143 static int show_name
;
144 static int do_dynamic
;
147 static int do_sections
;
148 static int do_section_groups
;
149 static int do_full_section_name
;
150 static int do_segments
;
151 static int do_unwind
;
152 static int do_using_dynamic
;
153 static int do_header
;
155 static int do_version
;
157 static int do_histogram
;
158 static int do_debugging
;
159 static int do_debug_info
;
160 static int do_debug_abbrevs
;
161 static int do_debug_lines
;
162 static int do_debug_pubnames
;
163 static int do_debug_aranges
;
164 static int do_debug_ranges
;
165 static int do_debug_frames
;
166 static int do_debug_frames_interp
;
167 static int do_debug_macinfo
;
168 static int do_debug_str
;
169 static int do_debug_loc
;
172 static int is_32bit_elf
;
173 static int have_frame_base
;
174 static int need_base_address
;
175 static bfd_vma eh_addr_size
;
179 struct group_list
*next
;
180 unsigned int section_index
;
185 struct group_list
*root
;
186 unsigned int group_index
;
189 static size_t group_count
;
190 static struct group
*section_groups
;
191 static struct group
**section_headers_groups
;
193 /* A dynamic array of flags indicating for which sections a hex dump
194 has been requested (via the -x switch) and/or a disassembly dump
195 (via the -i switch). */
196 char *cmdline_dump_sects
= NULL
;
197 unsigned num_cmdline_dump_sects
= 0;
199 /* A dynamic array of flags indicating for which sections a dump of
200 some kind has been requested. It is reset on a per-object file
201 basis and then initialised from the cmdline_dump_sects array and
202 the results of interpreting the -w switch. */
203 char *dump_sects
= NULL
;
204 unsigned int num_dump_sects
= 0;
206 #define HEX_DUMP (1 << 0)
207 #define DISASS_DUMP (1 << 1)
208 #define DEBUG_DUMP (1 << 2)
210 /* How to print a vma value. */
211 typedef enum print_mode
223 static bfd_vma (*byte_get
) (unsigned char *, int);
224 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
228 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
229 ((X)->sh_name >= string_table_length \
230 ? "<corrupt>" : string_table + (X)->sh_name))
232 /* Given st_shndx I, map to section_headers index. */
233 #define SECTION_HEADER_INDEX(I) \
234 ((I) < SHN_LORESERVE \
236 : ((I) <= SHN_HIRESERVE \
238 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
240 /* Reverse of the above. */
241 #define SECTION_HEADER_NUM(N) \
242 ((N) < SHN_LORESERVE \
244 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
246 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
248 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
250 #define BYTE_GET(field) byte_get (field, sizeof (field))
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_ELF_SYMBOLS(file, section) \
255 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
256 : get_64bit_elf_symbols (file, section))
258 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
259 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
260 already been called and verified that the string exists. */
261 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
263 /* This is just a bit of syntatic sugar. */
264 #define streq(a,b) (strcmp ((a), (b)) == 0)
265 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
268 error (const char *message
, ...)
272 va_start (args
, message
);
273 fprintf (stderr
, _("%s: Error: "), program_name
);
274 vfprintf (stderr
, message
, args
);
279 warn (const char *message
, ...)
283 va_start (args
, message
);
284 fprintf (stderr
, _("%s: Warning: "), program_name
);
285 vfprintf (stderr
, message
, args
);
290 cmalloc (size_t nmemb
, size_t size
)
292 /* Check for overflow. */
293 if (nmemb
>= ~(size_t) 0 / size
)
296 return malloc (nmemb
* size
);
300 xcmalloc (size_t nmemb
, size_t size
)
302 /* Check for overflow. */
303 if (nmemb
>= ~(size_t) 0 / size
)
306 return xmalloc (nmemb
* size
);
310 xcrealloc (void *ptr
, size_t nmemb
, size_t size
)
312 /* Check for overflow. */
313 if (nmemb
>= ~(size_t) 0 / size
)
316 return xrealloc (ptr
, nmemb
* size
);
320 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
325 if (size
== 0 || nmemb
== 0)
328 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
330 error (_("Unable to seek to 0x%x for %s\n"),
331 archive_file_offset
+ offset
, reason
);
338 /* Check for overflow. */
339 if (nmemb
< (~(size_t) 0 - 1) / size
)
340 /* + 1 so that we can '\0' terminate invalid string table sections. */
341 mvar
= malloc (size
* nmemb
+ 1);
345 error (_("Out of memory allocating 0x%x bytes for %s\n"),
346 size
* nmemb
, reason
);
350 ((char *) mvar
)[size
* nmemb
] = '\0';
353 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
355 error (_("Unable to read in 0x%x bytes of %s\n"), size
* nmemb
, reason
);
365 byte_get_little_endian (unsigned char *field
, int size
)
373 return ((unsigned int) (field
[0]))
374 | (((unsigned int) (field
[1])) << 8);
378 /* We want to extract data from an 8 byte wide field and
379 place it into a 4 byte wide field. Since this is a little
380 endian source we can just use the 4 byte extraction code. */
384 return ((unsigned long) (field
[0]))
385 | (((unsigned long) (field
[1])) << 8)
386 | (((unsigned long) (field
[2])) << 16)
387 | (((unsigned long) (field
[3])) << 24);
391 return ((bfd_vma
) (field
[0]))
392 | (((bfd_vma
) (field
[1])) << 8)
393 | (((bfd_vma
) (field
[2])) << 16)
394 | (((bfd_vma
) (field
[3])) << 24)
395 | (((bfd_vma
) (field
[4])) << 32)
396 | (((bfd_vma
) (field
[5])) << 40)
397 | (((bfd_vma
) (field
[6])) << 48)
398 | (((bfd_vma
) (field
[7])) << 56);
401 error (_("Unhandled data length: %d\n"), size
);
407 byte_get_signed (unsigned char *field
, int size
)
409 bfd_vma x
= byte_get (field
, size
);
414 return (x
^ 0x80) - 0x80;
416 return (x
^ 0x8000) - 0x8000;
418 return (x
^ 0x80000000) - 0x80000000;
427 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
432 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
433 field
[6] = ((value
>> 24) >> 24) & 0xff;
434 field
[5] = ((value
>> 24) >> 16) & 0xff;
435 field
[4] = ((value
>> 24) >> 8) & 0xff;
438 field
[3] = (value
>> 24) & 0xff;
439 field
[2] = (value
>> 16) & 0xff;
442 field
[1] = (value
>> 8) & 0xff;
445 field
[0] = value
& 0xff;
449 error (_("Unhandled data length: %d\n"), size
);
454 #if defined BFD64 && !BFD_HOST_64BIT_LONG
456 print_dec_vma (bfd_vma vma
, int is_signed
)
462 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
471 *bufp
++ = '0' + vma
% 10;
483 print_hex_vma (bfd_vma vma
)
491 char digit
= '0' + (vma
& 0x0f);
493 digit
+= 'a' - '0' - 10;
506 /* Print a VMA value. */
508 print_vma (bfd_vma vma
, print_mode mode
)
517 return printf ("0x%8.8lx", (unsigned long) vma
);
520 return printf ("%8.8lx", (unsigned long) vma
);
524 return printf ("%5ld", (long) vma
);
528 return printf ("0x%lx", (unsigned long) vma
);
531 return printf ("%lx", (unsigned long) vma
);
534 return printf ("%ld", (unsigned long) vma
);
537 return printf ("%lu", (unsigned long) vma
);
560 #if BFD_HOST_64BIT_LONG
561 return nc
+ printf ("%lx", vma
);
563 return nc
+ print_hex_vma (vma
);
567 #if BFD_HOST_64BIT_LONG
568 return printf ("%ld", vma
);
570 return print_dec_vma (vma
, 1);
574 #if BFD_HOST_64BIT_LONG
576 return printf ("%5ld", vma
);
578 return printf ("%#lx", vma
);
581 return printf ("%5ld", _bfd_int64_low (vma
));
583 return print_hex_vma (vma
);
587 #if BFD_HOST_64BIT_LONG
588 return printf ("%lu", vma
);
590 return print_dec_vma (vma
, 0);
598 /* Display a symbol on stdout. If do_wide is not true then
599 format the symbol to be at most WIDTH characters,
600 truncating as necessary. If WIDTH is negative then
601 format the string to be exactly - WIDTH characters,
602 truncating or padding as necessary. */
605 print_symbol (int width
, const char *symbol
)
608 printf ("%s", symbol
);
610 printf ("%-*.*s", width
, width
, symbol
);
612 printf ("%-.*s", width
, symbol
);
616 byte_get_big_endian (unsigned char *field
, int size
)
624 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
628 /* Although we are extracing data from an 8 byte wide field,
629 we are returning only 4 bytes of data. */
634 return ((unsigned long) (field
[3]))
635 | (((unsigned long) (field
[2])) << 8)
636 | (((unsigned long) (field
[1])) << 16)
637 | (((unsigned long) (field
[0])) << 24);
641 return ((bfd_vma
) (field
[7]))
642 | (((bfd_vma
) (field
[6])) << 8)
643 | (((bfd_vma
) (field
[5])) << 16)
644 | (((bfd_vma
) (field
[4])) << 24)
645 | (((bfd_vma
) (field
[3])) << 32)
646 | (((bfd_vma
) (field
[2])) << 40)
647 | (((bfd_vma
) (field
[1])) << 48)
648 | (((bfd_vma
) (field
[0])) << 56);
652 error (_("Unhandled data length: %d\n"), size
);
658 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
663 field
[7] = value
& 0xff;
664 field
[6] = (value
>> 8) & 0xff;
665 field
[5] = (value
>> 16) & 0xff;
666 field
[4] = (value
>> 24) & 0xff;
671 field
[3] = value
& 0xff;
672 field
[2] = (value
>> 8) & 0xff;
676 field
[1] = value
& 0xff;
680 field
[0] = value
& 0xff;
684 error (_("Unhandled data length: %d\n"), size
);
689 /* Return a pointer to section NAME, or NULL if no such section exists. */
691 static Elf_Internal_Shdr
*
692 find_section (const char *name
)
696 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
697 if (streq (SECTION_NAME (section_headers
+ i
), name
))
698 return section_headers
+ i
;
703 /* Guess the relocation size commonly used by the specific machines. */
706 guess_is_rela (unsigned long e_machine
)
710 /* Targets that use REL relocations. */
725 /* Targets that use RELA relocations. */
740 case EM_CYGNUS_MN10200
:
742 case EM_CYGNUS_MN10300
:
790 warn (_("Don't know about relocations on this machine architecture\n"));
796 slurp_rela_relocs (FILE *file
,
797 unsigned long rel_offset
,
798 unsigned long rel_size
,
799 Elf_Internal_Rela
**relasp
,
800 unsigned long *nrelasp
)
802 Elf_Internal_Rela
*relas
;
803 unsigned long nrelas
;
808 Elf32_External_Rela
*erelas
;
810 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
814 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
816 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
821 error (_("out of memory parsing relocs"));
825 for (i
= 0; i
< nrelas
; i
++)
827 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
828 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
829 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
836 Elf64_External_Rela
*erelas
;
838 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
842 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
844 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
849 error (_("out of memory parsing relocs"));
853 for (i
= 0; i
< nrelas
; i
++)
855 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
856 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
857 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
868 slurp_rel_relocs (FILE *file
,
869 unsigned long rel_offset
,
870 unsigned long rel_size
,
871 Elf_Internal_Rela
**relsp
,
872 unsigned long *nrelsp
)
874 Elf_Internal_Rela
*rels
;
880 Elf32_External_Rel
*erels
;
882 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
886 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
888 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
893 error (_("out of memory parsing relocs"));
897 for (i
= 0; i
< nrels
; i
++)
899 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
900 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
901 rels
[i
].r_addend
= 0;
908 Elf64_External_Rel
*erels
;
910 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
914 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
916 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
921 error (_("out of memory parsing relocs"));
925 for (i
= 0; i
< nrels
; i
++)
927 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
928 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
929 rels
[i
].r_addend
= 0;
939 /* Display the contents of the relocation data found at the specified
943 dump_relocations (FILE *file
,
944 unsigned long rel_offset
,
945 unsigned long rel_size
,
946 Elf_Internal_Sym
*symtab
,
949 unsigned long strtablen
,
953 Elf_Internal_Rela
*rels
;
956 if (is_rela
== UNKNOWN
)
957 is_rela
= guess_is_rela (elf_header
.e_machine
);
961 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
966 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
975 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
977 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
982 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
984 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
992 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
994 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
999 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1001 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1005 for (i
= 0; i
< rel_size
; i
++)
1008 const char *rtype2
= NULL
;
1009 const char *rtype3
= NULL
;
1012 bfd_vma symtab_index
;
1017 offset
= rels
[i
].r_offset
;
1018 info
= rels
[i
].r_info
;
1022 type
= ELF32_R_TYPE (info
);
1023 symtab_index
= ELF32_R_SYM (info
);
1027 /* The #ifdef BFD64 below is to prevent a compile time warning.
1028 We know that if we do not have a 64 bit data type that we
1029 will never execute this code anyway. */
1031 if (elf_header
.e_machine
== EM_MIPS
)
1033 /* In little-endian objects, r_info isn't really a 64-bit
1034 little-endian value: it has a 32-bit little-endian
1035 symbol index followed by four individual byte fields.
1036 Reorder INFO accordingly. */
1037 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1038 info
= (((info
& 0xffffffff) << 32)
1039 | ((info
>> 56) & 0xff)
1040 | ((info
>> 40) & 0xff00)
1041 | ((info
>> 24) & 0xff0000)
1042 | ((info
>> 8) & 0xff000000));
1043 type
= ELF64_MIPS_R_TYPE (info
);
1044 type2
= ELF64_MIPS_R_TYPE2 (info
);
1045 type3
= ELF64_MIPS_R_TYPE3 (info
);
1047 else if (elf_header
.e_machine
== EM_SPARCV9
)
1048 type
= ELF64_R_TYPE_ID (info
);
1050 type
= ELF64_R_TYPE (info
);
1052 symtab_index
= ELF64_R_SYM (info
);
1058 #ifdef _bfd_int64_low
1059 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1061 printf ("%8.8lx %8.8lx ", offset
, info
);
1066 #ifdef _bfd_int64_low
1068 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1069 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1070 _bfd_int64_high (offset
),
1071 _bfd_int64_low (offset
),
1072 _bfd_int64_high (info
),
1073 _bfd_int64_low (info
));
1076 ? "%16.16lx %16.16lx "
1077 : "%12.12lx %12.12lx ",
1082 switch (elf_header
.e_machine
)
1089 case EM_CYGNUS_M32R
:
1090 rtype
= elf_m32r_reloc_type (type
);
1095 rtype
= elf_i386_reloc_type (type
);
1100 rtype
= elf_m68hc11_reloc_type (type
);
1104 rtype
= elf_m68k_reloc_type (type
);
1108 rtype
= elf_i960_reloc_type (type
);
1113 rtype
= elf_avr_reloc_type (type
);
1116 case EM_OLD_SPARCV9
:
1117 case EM_SPARC32PLUS
:
1120 rtype
= elf_sparc_reloc_type (type
);
1124 case EM_CYGNUS_V850
:
1125 rtype
= v850_reloc_type (type
);
1129 case EM_CYGNUS_D10V
:
1130 rtype
= elf_d10v_reloc_type (type
);
1134 case EM_CYGNUS_D30V
:
1135 rtype
= elf_d30v_reloc_type (type
);
1139 rtype
= elf_dlx_reloc_type (type
);
1143 rtype
= elf_sh_reloc_type (type
);
1147 case EM_CYGNUS_MN10300
:
1148 rtype
= elf_mn10300_reloc_type (type
);
1152 case EM_CYGNUS_MN10200
:
1153 rtype
= elf_mn10200_reloc_type (type
);
1157 case EM_CYGNUS_FR30
:
1158 rtype
= elf_fr30_reloc_type (type
);
1162 rtype
= elf_frv_reloc_type (type
);
1166 rtype
= elf_mcore_reloc_type (type
);
1170 rtype
= elf_mmix_reloc_type (type
);
1175 rtype
= elf_msp430_reloc_type (type
);
1179 rtype
= elf_ppc_reloc_type (type
);
1183 rtype
= elf_ppc64_reloc_type (type
);
1187 case EM_MIPS_RS3_LE
:
1188 rtype
= elf_mips_reloc_type (type
);
1191 rtype2
= elf_mips_reloc_type (type2
);
1192 rtype3
= elf_mips_reloc_type (type3
);
1197 rtype
= elf_alpha_reloc_type (type
);
1201 rtype
= elf_arm_reloc_type (type
);
1205 rtype
= elf_arc_reloc_type (type
);
1209 rtype
= elf_hppa_reloc_type (type
);
1215 rtype
= elf_h8_reloc_type (type
);
1220 rtype
= elf_or32_reloc_type (type
);
1225 rtype
= elf_pj_reloc_type (type
);
1228 rtype
= elf_ia64_reloc_type (type
);
1232 rtype
= elf_cris_reloc_type (type
);
1236 rtype
= elf_i860_reloc_type (type
);
1240 rtype
= elf_x86_64_reloc_type (type
);
1244 rtype
= i370_reloc_type (type
);
1249 rtype
= elf_s390_reloc_type (type
);
1253 rtype
= elf_xstormy16_reloc_type (type
);
1257 rtype
= elf_crx_reloc_type (type
);
1261 rtype
= elf_vax_reloc_type (type
);
1266 rtype
= elf_ip2k_reloc_type (type
);
1270 rtype
= elf_iq2000_reloc_type (type
);
1275 rtype
= elf_xtensa_reloc_type (type
);
1279 rtype
= elf_ms1_reloc_type (type
);
1284 #ifdef _bfd_int64_low
1285 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1287 printf (_("unrecognized: %-7lx"), type
);
1290 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1292 if (elf_header
.e_machine
== EM_ALPHA
1293 && streq (rtype
, "R_ALPHA_LITUSE")
1296 switch (rels
[i
].r_addend
)
1298 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1299 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1300 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1301 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1302 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1303 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1304 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1305 default: rtype
= NULL
;
1308 printf (" (%s)", rtype
);
1312 printf (_("<unknown addend: %lx>"),
1313 (unsigned long) rels
[i
].r_addend
);
1316 else if (symtab_index
)
1318 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1319 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1322 Elf_Internal_Sym
*psym
;
1324 psym
= symtab
+ symtab_index
;
1327 print_vma (psym
->st_value
, LONG_HEX
);
1328 printf (is_32bit_elf
? " " : " ");
1330 if (psym
->st_name
== 0)
1332 const char *sec_name
= "<null>";
1335 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1337 bfd_vma sec_index
= (bfd_vma
) -1;
1339 if (psym
->st_shndx
< SHN_LORESERVE
)
1340 sec_index
= psym
->st_shndx
;
1341 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1342 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1345 if (sec_index
!= (bfd_vma
) -1)
1346 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1347 else if (psym
->st_shndx
== SHN_ABS
)
1349 else if (psym
->st_shndx
== SHN_COMMON
)
1350 sec_name
= "COMMON";
1351 else if (elf_header
.e_machine
== EM_IA_64
1352 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1353 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1354 sec_name
= "ANSI_COM";
1357 sprintf (name_buf
, "<section 0x%x>",
1358 (unsigned int) psym
->st_shndx
);
1359 sec_name
= name_buf
;
1362 print_symbol (22, sec_name
);
1364 else if (strtab
== NULL
)
1365 printf (_("<string table index: %3ld>"), psym
->st_name
);
1366 else if (psym
->st_name
>= strtablen
)
1367 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1369 print_symbol (22, strtab
+ psym
->st_name
);
1372 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1377 printf ("%*c", is_32bit_elf
?
1378 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1379 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1382 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1383 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1387 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1389 printf (" Type2: ");
1392 #ifdef _bfd_int64_low
1393 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1395 printf (_("unrecognized: %-7lx"), type2
);
1398 printf ("%-17.17s", rtype2
);
1400 printf ("\n Type3: ");
1403 #ifdef _bfd_int64_low
1404 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1406 printf (_("unrecognized: %-7lx"), type3
);
1409 printf ("%-17.17s", rtype3
);
1421 get_mips_dynamic_type (unsigned long type
)
1425 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1426 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1427 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1428 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1429 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1430 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1431 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1432 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1433 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1434 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1435 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1436 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1437 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1438 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1439 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1440 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1441 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1442 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1443 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1444 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1445 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1446 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1447 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1448 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1449 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1450 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1451 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1452 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1453 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1454 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1455 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1456 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1457 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1458 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1459 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1460 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1461 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1462 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1463 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1464 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1465 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1466 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1467 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1474 get_sparc64_dynamic_type (unsigned long type
)
1478 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1485 get_ppc_dynamic_type (unsigned long type
)
1489 case DT_PPC_GOT
: return "PPC_GOT";
1496 get_ppc64_dynamic_type (unsigned long type
)
1500 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1501 case DT_PPC64_OPD
: return "PPC64_OPD";
1502 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1509 get_parisc_dynamic_type (unsigned long type
)
1513 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1514 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1515 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1516 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1517 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1518 case DT_HP_PREINIT
: return "HP_PREINIT";
1519 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1520 case DT_HP_NEEDED
: return "HP_NEEDED";
1521 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1522 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1523 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1524 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1525 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1532 get_ia64_dynamic_type (unsigned long type
)
1536 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1543 get_alpha_dynamic_type (unsigned long type
)
1547 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1554 get_dynamic_type (unsigned long type
)
1556 static char buff
[64];
1560 case DT_NULL
: return "NULL";
1561 case DT_NEEDED
: return "NEEDED";
1562 case DT_PLTRELSZ
: return "PLTRELSZ";
1563 case DT_PLTGOT
: return "PLTGOT";
1564 case DT_HASH
: return "HASH";
1565 case DT_STRTAB
: return "STRTAB";
1566 case DT_SYMTAB
: return "SYMTAB";
1567 case DT_RELA
: return "RELA";
1568 case DT_RELASZ
: return "RELASZ";
1569 case DT_RELAENT
: return "RELAENT";
1570 case DT_STRSZ
: return "STRSZ";
1571 case DT_SYMENT
: return "SYMENT";
1572 case DT_INIT
: return "INIT";
1573 case DT_FINI
: return "FINI";
1574 case DT_SONAME
: return "SONAME";
1575 case DT_RPATH
: return "RPATH";
1576 case DT_SYMBOLIC
: return "SYMBOLIC";
1577 case DT_REL
: return "REL";
1578 case DT_RELSZ
: return "RELSZ";
1579 case DT_RELENT
: return "RELENT";
1580 case DT_PLTREL
: return "PLTREL";
1581 case DT_DEBUG
: return "DEBUG";
1582 case DT_TEXTREL
: return "TEXTREL";
1583 case DT_JMPREL
: return "JMPREL";
1584 case DT_BIND_NOW
: return "BIND_NOW";
1585 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1586 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1587 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1588 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1589 case DT_RUNPATH
: return "RUNPATH";
1590 case DT_FLAGS
: return "FLAGS";
1592 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1593 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1595 case DT_CHECKSUM
: return "CHECKSUM";
1596 case DT_PLTPADSZ
: return "PLTPADSZ";
1597 case DT_MOVEENT
: return "MOVEENT";
1598 case DT_MOVESZ
: return "MOVESZ";
1599 case DT_FEATURE
: return "FEATURE";
1600 case DT_POSFLAG_1
: return "POSFLAG_1";
1601 case DT_SYMINSZ
: return "SYMINSZ";
1602 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1604 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1605 case DT_CONFIG
: return "CONFIG";
1606 case DT_DEPAUDIT
: return "DEPAUDIT";
1607 case DT_AUDIT
: return "AUDIT";
1608 case DT_PLTPAD
: return "PLTPAD";
1609 case DT_MOVETAB
: return "MOVETAB";
1610 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1612 case DT_VERSYM
: return "VERSYM";
1614 case DT_RELACOUNT
: return "RELACOUNT";
1615 case DT_RELCOUNT
: return "RELCOUNT";
1616 case DT_FLAGS_1
: return "FLAGS_1";
1617 case DT_VERDEF
: return "VERDEF";
1618 case DT_VERDEFNUM
: return "VERDEFNUM";
1619 case DT_VERNEED
: return "VERNEED";
1620 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1622 case DT_AUXILIARY
: return "AUXILIARY";
1623 case DT_USED
: return "USED";
1624 case DT_FILTER
: return "FILTER";
1626 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1627 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1628 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1629 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1630 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1633 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1637 switch (elf_header
.e_machine
)
1640 case EM_MIPS_RS3_LE
:
1641 result
= get_mips_dynamic_type (type
);
1644 result
= get_sparc64_dynamic_type (type
);
1647 result
= get_ppc_dynamic_type (type
);
1650 result
= get_ppc64_dynamic_type (type
);
1653 result
= get_ia64_dynamic_type (type
);
1656 result
= get_alpha_dynamic_type (type
);
1666 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1668 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1672 switch (elf_header
.e_machine
)
1675 result
= get_parisc_dynamic_type (type
);
1685 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1689 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1696 get_file_type (unsigned e_type
)
1698 static char buff
[32];
1702 case ET_NONE
: return _("NONE (None)");
1703 case ET_REL
: return _("REL (Relocatable file)");
1704 case ET_EXEC
: return _("EXEC (Executable file)");
1705 case ET_DYN
: return _("DYN (Shared object file)");
1706 case ET_CORE
: return _("CORE (Core file)");
1709 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1710 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1711 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1712 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1714 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1720 get_machine_name (unsigned e_machine
)
1722 static char buff
[64]; /* XXX */
1726 case EM_NONE
: return _("None");
1727 case EM_M32
: return "WE32100";
1728 case EM_SPARC
: return "Sparc";
1729 case EM_386
: return "Intel 80386";
1730 case EM_68K
: return "MC68000";
1731 case EM_88K
: return "MC88000";
1732 case EM_486
: return "Intel 80486";
1733 case EM_860
: return "Intel 80860";
1734 case EM_MIPS
: return "MIPS R3000";
1735 case EM_S370
: return "IBM System/370";
1736 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1737 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1738 case EM_PARISC
: return "HPPA";
1739 case EM_PPC_OLD
: return "Power PC (old)";
1740 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1741 case EM_960
: return "Intel 90860";
1742 case EM_PPC
: return "PowerPC";
1743 case EM_PPC64
: return "PowerPC64";
1744 case EM_V800
: return "NEC V800";
1745 case EM_FR20
: return "Fujitsu FR20";
1746 case EM_RH32
: return "TRW RH32";
1747 case EM_MCORE
: return "MCORE";
1748 case EM_ARM
: return "ARM";
1749 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1750 case EM_SH
: return "Renesas / SuperH SH";
1751 case EM_SPARCV9
: return "Sparc v9";
1752 case EM_TRICORE
: return "Siemens Tricore";
1753 case EM_ARC
: return "ARC";
1754 case EM_H8_300
: return "Renesas H8/300";
1755 case EM_H8_300H
: return "Renesas H8/300H";
1756 case EM_H8S
: return "Renesas H8S";
1757 case EM_H8_500
: return "Renesas H8/500";
1758 case EM_IA_64
: return "Intel IA-64";
1759 case EM_MIPS_X
: return "Stanford MIPS-X";
1760 case EM_COLDFIRE
: return "Motorola Coldfire";
1761 case EM_68HC12
: return "Motorola M68HC12";
1762 case EM_ALPHA
: return "Alpha";
1763 case EM_CYGNUS_D10V
:
1764 case EM_D10V
: return "d10v";
1765 case EM_CYGNUS_D30V
:
1766 case EM_D30V
: return "d30v";
1767 case EM_CYGNUS_M32R
:
1768 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1769 case EM_CYGNUS_V850
:
1770 case EM_V850
: return "NEC v850";
1771 case EM_CYGNUS_MN10300
:
1772 case EM_MN10300
: return "mn10300";
1773 case EM_CYGNUS_MN10200
:
1774 case EM_MN10200
: return "mn10200";
1775 case EM_CYGNUS_FR30
:
1776 case EM_FR30
: return "Fujitsu FR30";
1777 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1779 case EM_PJ
: return "picoJava";
1780 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1781 case EM_PCP
: return "Siemens PCP";
1782 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1783 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1784 case EM_STARCORE
: return "Motorola Star*Core processor";
1785 case EM_ME16
: return "Toyota ME16 processor";
1786 case EM_ST100
: return "STMicroelectronics ST100 processor";
1787 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1788 case EM_FX66
: return "Siemens FX66 microcontroller";
1789 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1790 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1791 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1792 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1793 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1794 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1795 case EM_SVX
: return "Silicon Graphics SVx";
1796 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1797 case EM_VAX
: return "Digital VAX";
1799 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1800 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1801 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1802 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1803 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1804 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1805 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1806 case EM_PRISM
: return "Vitesse Prism";
1807 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1809 case EM_S390
: return "IBM S/390";
1810 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1812 case EM_OR32
: return "OpenRISC";
1813 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1814 case EM_DLX
: return "OpenDLX";
1816 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1817 case EM_IQ2000
: return "Vitesse IQ2000";
1819 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1820 case EM_MS1
: return "Morpho Techologies MS1 processor";
1822 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1828 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1833 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1834 e_flags
&= ~ EF_ARM_EABIMASK
;
1836 /* Handle "generic" ARM flags. */
1837 if (e_flags
& EF_ARM_RELEXEC
)
1839 strcat (buf
, ", relocatable executable");
1840 e_flags
&= ~ EF_ARM_RELEXEC
;
1843 if (e_flags
& EF_ARM_HASENTRY
)
1845 strcat (buf
, ", has entry point");
1846 e_flags
&= ~ EF_ARM_HASENTRY
;
1849 /* Now handle EABI specific flags. */
1853 strcat (buf
, ", <unrecognized EABI>");
1858 case EF_ARM_EABI_VER1
:
1859 strcat (buf
, ", Version1 EABI");
1864 /* Process flags one bit at a time. */
1865 flag
= e_flags
& - e_flags
;
1870 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1871 strcat (buf
, ", sorted symbol tables");
1881 case EF_ARM_EABI_VER2
:
1882 strcat (buf
, ", Version2 EABI");
1887 /* Process flags one bit at a time. */
1888 flag
= e_flags
& - e_flags
;
1893 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1894 strcat (buf
, ", sorted symbol tables");
1897 case EF_ARM_DYNSYMSUSESEGIDX
:
1898 strcat (buf
, ", dynamic symbols use segment index");
1901 case EF_ARM_MAPSYMSFIRST
:
1902 strcat (buf
, ", mapping symbols precede others");
1912 case EF_ARM_EABI_VER3
:
1913 strcat (buf
, ", Version3 EABI");
1916 case EF_ARM_EABI_VER4
:
1917 strcat (buf
, ", Version4 EABI");
1922 /* Process flags one bit at a time. */
1923 flag
= e_flags
& - e_flags
;
1929 strcat (buf
, ", BE8");
1933 strcat (buf
, ", LE8");
1943 case EF_ARM_EABI_UNKNOWN
:
1944 strcat (buf
, ", GNU EABI");
1949 /* Process flags one bit at a time. */
1950 flag
= e_flags
& - e_flags
;
1955 case EF_ARM_INTERWORK
:
1956 strcat (buf
, ", interworking enabled");
1959 case EF_ARM_APCS_26
:
1960 strcat (buf
, ", uses APCS/26");
1963 case EF_ARM_APCS_FLOAT
:
1964 strcat (buf
, ", uses APCS/float");
1968 strcat (buf
, ", position independent");
1972 strcat (buf
, ", 8 bit structure alignment");
1975 case EF_ARM_NEW_ABI
:
1976 strcat (buf
, ", uses new ABI");
1979 case EF_ARM_OLD_ABI
:
1980 strcat (buf
, ", uses old ABI");
1983 case EF_ARM_SOFT_FLOAT
:
1984 strcat (buf
, ", software FP");
1987 case EF_ARM_VFP_FLOAT
:
1988 strcat (buf
, ", VFP");
1991 case EF_ARM_MAVERICK_FLOAT
:
1992 strcat (buf
, ", Maverick FP");
2003 strcat (buf
,", <unknown>");
2007 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2009 static char buf
[1024];
2021 decode_ARM_machine_flags (e_flags
, buf
);
2025 switch (e_flags
& EF_FRV_CPU_MASK
)
2027 case EF_FRV_CPU_GENERIC
:
2031 strcat (buf
, ", fr???");
2034 case EF_FRV_CPU_FR300
:
2035 strcat (buf
, ", fr300");
2038 case EF_FRV_CPU_FR400
:
2039 strcat (buf
, ", fr400");
2041 case EF_FRV_CPU_FR405
:
2042 strcat (buf
, ", fr405");
2045 case EF_FRV_CPU_FR450
:
2046 strcat (buf
, ", fr450");
2049 case EF_FRV_CPU_FR500
:
2050 strcat (buf
, ", fr500");
2052 case EF_FRV_CPU_FR550
:
2053 strcat (buf
, ", fr550");
2056 case EF_FRV_CPU_SIMPLE
:
2057 strcat (buf
, ", simple");
2059 case EF_FRV_CPU_TOMCAT
:
2060 strcat (buf
, ", tomcat");
2066 if (e_flags
& EF_CPU32
)
2067 strcat (buf
, ", cpu32");
2068 if (e_flags
& EF_M68000
)
2069 strcat (buf
, ", m68000");
2073 if (e_flags
& EF_PPC_EMB
)
2074 strcat (buf
, ", emb");
2076 if (e_flags
& EF_PPC_RELOCATABLE
)
2077 strcat (buf
, ", relocatable");
2079 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2080 strcat (buf
, ", relocatable-lib");
2084 case EM_CYGNUS_V850
:
2085 switch (e_flags
& EF_V850_ARCH
)
2088 strcat (buf
, ", v850e1");
2091 strcat (buf
, ", v850e");
2094 strcat (buf
, ", v850");
2097 strcat (buf
, ", unknown v850 architecture variant");
2103 case EM_CYGNUS_M32R
:
2104 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2105 strcat (buf
, ", m32r");
2110 case EM_MIPS_RS3_LE
:
2111 if (e_flags
& EF_MIPS_NOREORDER
)
2112 strcat (buf
, ", noreorder");
2114 if (e_flags
& EF_MIPS_PIC
)
2115 strcat (buf
, ", pic");
2117 if (e_flags
& EF_MIPS_CPIC
)
2118 strcat (buf
, ", cpic");
2120 if (e_flags
& EF_MIPS_UCODE
)
2121 strcat (buf
, ", ugen_reserved");
2123 if (e_flags
& EF_MIPS_ABI2
)
2124 strcat (buf
, ", abi2");
2126 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2127 strcat (buf
, ", odk first");
2129 if (e_flags
& EF_MIPS_32BITMODE
)
2130 strcat (buf
, ", 32bitmode");
2132 switch ((e_flags
& EF_MIPS_MACH
))
2134 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2135 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2136 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2137 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2138 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2139 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2140 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2141 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2142 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2143 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2145 /* We simply ignore the field in this case to avoid confusion:
2146 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2149 default: strcat (buf
, ", unknown CPU"); break;
2152 switch ((e_flags
& EF_MIPS_ABI
))
2154 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2155 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2156 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2157 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2159 /* We simply ignore the field in this case to avoid confusion:
2160 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2161 This means it is likely to be an o32 file, but not for
2164 default: strcat (buf
, ", unknown ABI"); break;
2167 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2168 strcat (buf
, ", mdmx");
2170 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2171 strcat (buf
, ", mips16");
2173 switch ((e_flags
& EF_MIPS_ARCH
))
2175 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2176 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2177 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2178 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2179 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2180 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2181 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2182 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2183 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2184 default: strcat (buf
, ", unknown ISA"); break;
2190 switch ((e_flags
& EF_SH_MACH_MASK
))
2192 case EF_SH1
: strcat (buf
, ", sh1"); break;
2193 case EF_SH2
: strcat (buf
, ", sh2"); break;
2194 case EF_SH3
: strcat (buf
, ", sh3"); break;
2195 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2196 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2197 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2198 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2199 case EF_SH4
: strcat (buf
, ", sh4"); break;
2200 case EF_SH5
: strcat (buf
, ", sh5"); break;
2201 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2202 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2203 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2204 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2205 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2206 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2207 default: strcat (buf
, ", unknown ISA"); break;
2213 if (e_flags
& EF_SPARC_32PLUS
)
2214 strcat (buf
, ", v8+");
2216 if (e_flags
& EF_SPARC_SUN_US1
)
2217 strcat (buf
, ", ultrasparcI");
2219 if (e_flags
& EF_SPARC_SUN_US3
)
2220 strcat (buf
, ", ultrasparcIII");
2222 if (e_flags
& EF_SPARC_HAL_R1
)
2223 strcat (buf
, ", halr1");
2225 if (e_flags
& EF_SPARC_LEDATA
)
2226 strcat (buf
, ", ledata");
2228 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2229 strcat (buf
, ", tso");
2231 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2232 strcat (buf
, ", pso");
2234 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2235 strcat (buf
, ", rmo");
2239 switch (e_flags
& EF_PARISC_ARCH
)
2241 case EFA_PARISC_1_0
:
2242 strcpy (buf
, ", PA-RISC 1.0");
2244 case EFA_PARISC_1_1
:
2245 strcpy (buf
, ", PA-RISC 1.1");
2247 case EFA_PARISC_2_0
:
2248 strcpy (buf
, ", PA-RISC 2.0");
2253 if (e_flags
& EF_PARISC_TRAPNIL
)
2254 strcat (buf
, ", trapnil");
2255 if (e_flags
& EF_PARISC_EXT
)
2256 strcat (buf
, ", ext");
2257 if (e_flags
& EF_PARISC_LSB
)
2258 strcat (buf
, ", lsb");
2259 if (e_flags
& EF_PARISC_WIDE
)
2260 strcat (buf
, ", wide");
2261 if (e_flags
& EF_PARISC_NO_KABP
)
2262 strcat (buf
, ", no kabp");
2263 if (e_flags
& EF_PARISC_LAZYSWAP
)
2264 strcat (buf
, ", lazyswap");
2269 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2270 strcat (buf
, ", new calling convention");
2272 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2273 strcat (buf
, ", gnu calling convention");
2277 if ((e_flags
& EF_IA_64_ABI64
))
2278 strcat (buf
, ", 64-bit");
2280 strcat (buf
, ", 32-bit");
2281 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2282 strcat (buf
, ", reduced fp model");
2283 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2284 strcat (buf
, ", no function descriptors, constant gp");
2285 else if ((e_flags
& EF_IA_64_CONS_GP
))
2286 strcat (buf
, ", constant gp");
2287 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2288 strcat (buf
, ", absolute");
2292 if ((e_flags
& EF_VAX_NONPIC
))
2293 strcat (buf
, ", non-PIC");
2294 if ((e_flags
& EF_VAX_DFLOAT
))
2295 strcat (buf
, ", D-Float");
2296 if ((e_flags
& EF_VAX_GFLOAT
))
2297 strcat (buf
, ", G-Float");
2306 get_osabi_name (unsigned int osabi
)
2308 static char buff
[32];
2312 case ELFOSABI_NONE
: return "UNIX - System V";
2313 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2314 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2315 case ELFOSABI_LINUX
: return "UNIX - Linux";
2316 case ELFOSABI_HURD
: return "GNU/Hurd";
2317 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2318 case ELFOSABI_AIX
: return "UNIX - AIX";
2319 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2320 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2321 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2322 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2323 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2324 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2325 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2326 case ELFOSABI_AROS
: return "Amiga Research OS";
2327 case ELFOSABI_STANDALONE
: return _("Standalone App");
2328 case ELFOSABI_ARM
: return "ARM";
2330 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2336 get_arm_segment_type (unsigned long type
)
2350 get_mips_segment_type (unsigned long type
)
2354 case PT_MIPS_REGINFO
:
2356 case PT_MIPS_RTPROC
:
2358 case PT_MIPS_OPTIONS
:
2368 get_parisc_segment_type (unsigned long type
)
2372 case PT_HP_TLS
: return "HP_TLS";
2373 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2374 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2375 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2376 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2377 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2378 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2379 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2380 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2381 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2382 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2383 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2384 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2385 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2394 get_ia64_segment_type (unsigned long type
)
2398 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2399 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2400 case PT_HP_TLS
: return "HP_TLS";
2401 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2402 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2403 case PT_IA_64_HP_STACK
: return "HP_STACK";
2412 get_segment_type (unsigned long p_type
)
2414 static char buff
[32];
2418 case PT_NULL
: return "NULL";
2419 case PT_LOAD
: return "LOAD";
2420 case PT_DYNAMIC
: return "DYNAMIC";
2421 case PT_INTERP
: return "INTERP";
2422 case PT_NOTE
: return "NOTE";
2423 case PT_SHLIB
: return "SHLIB";
2424 case PT_PHDR
: return "PHDR";
2425 case PT_TLS
: return "TLS";
2427 case PT_GNU_EH_FRAME
:
2428 return "GNU_EH_FRAME";
2429 case PT_GNU_STACK
: return "GNU_STACK";
2430 case PT_GNU_RELRO
: return "GNU_RELRO";
2433 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2437 switch (elf_header
.e_machine
)
2440 result
= get_arm_segment_type (p_type
);
2443 case EM_MIPS_RS3_LE
:
2444 result
= get_mips_segment_type (p_type
);
2447 result
= get_parisc_segment_type (p_type
);
2450 result
= get_ia64_segment_type (p_type
);
2460 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2462 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2466 switch (elf_header
.e_machine
)
2469 result
= get_parisc_segment_type (p_type
);
2472 result
= get_ia64_segment_type (p_type
);
2482 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2485 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2492 get_mips_section_type_name (unsigned int sh_type
)
2496 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2497 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2498 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2499 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2500 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2501 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2502 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2503 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2504 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2505 case SHT_MIPS_RELD
: return "MIPS_RELD";
2506 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2507 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2508 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2509 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2510 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2511 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2512 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2513 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2514 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2515 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2516 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2517 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2518 case SHT_MIPS_LINE
: return "MIPS_LINE";
2519 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2520 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2521 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2522 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2523 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2524 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2525 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2526 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2527 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2528 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2529 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2530 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2531 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2532 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2533 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2534 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2542 get_parisc_section_type_name (unsigned int sh_type
)
2546 case SHT_PARISC_EXT
: return "PARISC_EXT";
2547 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2548 case SHT_PARISC_DOC
: return "PARISC_DOC";
2556 get_ia64_section_type_name (unsigned int sh_type
)
2558 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2559 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2560 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2564 case SHT_IA_64_EXT
: return "IA_64_EXT";
2565 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2566 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2574 get_x86_64_section_type_name (unsigned int sh_type
)
2578 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2586 get_arm_section_type_name (unsigned int sh_type
)
2599 get_section_type_name (unsigned int sh_type
)
2601 static char buff
[32];
2605 case SHT_NULL
: return "NULL";
2606 case SHT_PROGBITS
: return "PROGBITS";
2607 case SHT_SYMTAB
: return "SYMTAB";
2608 case SHT_STRTAB
: return "STRTAB";
2609 case SHT_RELA
: return "RELA";
2610 case SHT_HASH
: return "HASH";
2611 case SHT_DYNAMIC
: return "DYNAMIC";
2612 case SHT_NOTE
: return "NOTE";
2613 case SHT_NOBITS
: return "NOBITS";
2614 case SHT_REL
: return "REL";
2615 case SHT_SHLIB
: return "SHLIB";
2616 case SHT_DYNSYM
: return "DYNSYM";
2617 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2618 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2619 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2620 case SHT_GROUP
: return "GROUP";
2621 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2622 case SHT_GNU_verdef
: return "VERDEF";
2623 case SHT_GNU_verneed
: return "VERNEED";
2624 case SHT_GNU_versym
: return "VERSYM";
2625 case 0x6ffffff0: return "VERSYM";
2626 case 0x6ffffffc: return "VERDEF";
2627 case 0x7ffffffd: return "AUXILIARY";
2628 case 0x7fffffff: return "FILTER";
2629 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2632 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2636 switch (elf_header
.e_machine
)
2639 case EM_MIPS_RS3_LE
:
2640 result
= get_mips_section_type_name (sh_type
);
2643 result
= get_parisc_section_type_name (sh_type
);
2646 result
= get_ia64_section_type_name (sh_type
);
2649 result
= get_x86_64_section_type_name (sh_type
);
2652 result
= get_arm_section_type_name (sh_type
);
2662 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2664 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2665 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2666 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2667 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2669 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2675 #define OPTION_DEBUG_DUMP 512
2677 static struct option options
[] =
2679 {"all", no_argument
, 0, 'a'},
2680 {"file-header", no_argument
, 0, 'h'},
2681 {"program-headers", no_argument
, 0, 'l'},
2682 {"headers", no_argument
, 0, 'e'},
2683 {"histogram", no_argument
, 0, 'I'},
2684 {"segments", no_argument
, 0, 'l'},
2685 {"sections", no_argument
, 0, 'S'},
2686 {"section-headers", no_argument
, 0, 'S'},
2687 {"section-groups", no_argument
, 0, 'g'},
2688 {"full-section-name",no_argument
, 0, 'N'},
2689 {"symbols", no_argument
, 0, 's'},
2690 {"syms", no_argument
, 0, 's'},
2691 {"relocs", no_argument
, 0, 'r'},
2692 {"notes", no_argument
, 0, 'n'},
2693 {"dynamic", no_argument
, 0, 'd'},
2694 {"arch-specific", no_argument
, 0, 'A'},
2695 {"version-info", no_argument
, 0, 'V'},
2696 {"use-dynamic", no_argument
, 0, 'D'},
2697 {"hex-dump", required_argument
, 0, 'x'},
2698 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2699 {"unwind", no_argument
, 0, 'u'},
2700 #ifdef SUPPORT_DISASSEMBLY
2701 {"instruction-dump", required_argument
, 0, 'i'},
2704 {"version", no_argument
, 0, 'v'},
2705 {"wide", no_argument
, 0, 'W'},
2706 {"help", no_argument
, 0, 'H'},
2707 {0, no_argument
, 0, 0}
2713 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2714 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2715 fprintf (stdout
, _(" Options are:\n\
2716 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2717 -h --file-header Display the ELF file header\n\
2718 -l --program-headers Display the program headers\n\
2719 --segments An alias for --program-headers\n\
2720 -S --section-headers Display the sections' header\n\
2721 --sections An alias for --section-headers\n\
2722 -g --section-groups Display the section groups\n\
2723 -N --full-section-name\n\
2724 Display the full section name\n\
2725 -e --headers Equivalent to: -h -l -S\n\
2726 -s --syms Display the symbol table\n\
2727 --symbols An alias for --syms\n\
2728 -n --notes Display the core notes (if present)\n\
2729 -r --relocs Display the relocations (if present)\n\
2730 -u --unwind Display the unwind info (if present)\n\
2731 -d --dynamic Display the dynamic section (if present)\n\
2732 -V --version-info Display the version sections (if present)\n\
2733 -A --arch-specific Display architecture specific information (if any).\n\
2734 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2735 -x --hex-dump=<number> Dump the contents of section <number>\n\
2736 -w[liaprmfFsoR] or\n\
2737 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2738 Display the contents of DWARF2 debug sections\n"));
2739 #ifdef SUPPORT_DISASSEMBLY
2740 fprintf (stdout
, _("\
2741 -i --instruction-dump=<number>\n\
2742 Disassemble the contents of section <number>\n"));
2744 fprintf (stdout
, _("\
2745 -I --histogram Display histogram of bucket list lengths\n\
2746 -W --wide Allow output width to exceed 80 characters\n\
2747 -H --help Display this information\n\
2748 -v --version Display the version number of readelf\n"));
2749 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2754 /* Record the fact that the user wants the contents of section number
2755 SECTION to be displayed using the method(s) encoded as flags bits
2756 in TYPE. Note, TYPE can be zero if we are creating the array for
2760 request_dump (unsigned int section
, int type
)
2762 if (section
>= num_dump_sects
)
2764 char *new_dump_sects
;
2766 new_dump_sects
= calloc (section
+ 1, 1);
2768 if (new_dump_sects
== NULL
)
2769 error (_("Out of memory allocating dump request table."));
2772 /* Copy current flag settings. */
2773 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2777 dump_sects
= new_dump_sects
;
2778 num_dump_sects
= section
+ 1;
2783 dump_sects
[section
] |= type
;
2789 parse_args (int argc
, char **argv
)
2796 while ((c
= getopt_long
2797 (argc
, argv
, "ersuahnldSDAINgw::x:i:vVWH", options
, NULL
)) != EOF
)
2818 do_section_groups
++;
2826 do_section_groups
++;
2829 do_full_section_name
++;
2871 section
= strtoul (optarg
, & cp
, 0);
2872 if (! *cp
&& section
>= 0)
2874 request_dump (section
, HEX_DUMP
);
2884 unsigned int index
= 0;
2888 while (optarg
[index
])
2889 switch (optarg
[index
++])
2898 do_debug_abbrevs
= 1;
2908 do_debug_pubnames
= 1;
2912 do_debug_aranges
= 1;
2916 do_debug_ranges
= 1;
2920 do_debug_frames_interp
= 1;
2922 do_debug_frames
= 1;
2927 do_debug_macinfo
= 1;
2941 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2946 case OPTION_DEBUG_DUMP
:
2954 const char * option
;
2957 debug_dump_long_opts
;
2959 debug_dump_long_opts opts_table
[] =
2961 /* Please keep this table alpha- sorted. */
2962 { "Ranges", & do_debug_ranges
},
2963 { "abbrev", & do_debug_abbrevs
},
2964 { "aranges", & do_debug_aranges
},
2965 { "frames", & do_debug_frames
},
2966 { "frames-interp", & do_debug_frames_interp
},
2967 { "info", & do_debug_info
},
2968 { "line", & do_debug_lines
},
2969 { "loc", & do_debug_loc
},
2970 { "macro", & do_debug_macinfo
},
2971 { "pubnames", & do_debug_pubnames
},
2972 /* This entry is for compatability
2973 with earlier versions of readelf. */
2974 { "ranges", & do_debug_aranges
},
2975 { "str", & do_debug_str
},
2986 debug_dump_long_opts
* entry
;
2988 for (entry
= opts_table
; entry
->option
; entry
++)
2990 size_t len
= strlen (entry
->option
);
2992 if (strneq (p
, entry
->option
, len
)
2993 && (p
[len
] == ',' || p
[len
] == '\0'))
2995 * entry
->variable
= 1;
2997 /* The --debug-dump=frames-interp option also
2998 enables the --debug-dump=frames option. */
2999 if (do_debug_frames_interp
)
3000 do_debug_frames
= 1;
3007 if (entry
->option
== NULL
)
3009 warn (_("Unrecognized debug option '%s'\n"), p
);
3010 p
= strchr (p
, ',');
3020 #ifdef SUPPORT_DISASSEMBLY
3023 section
= strtoul (optarg
, & cp
, 0);
3024 if (! *cp
&& section
>= 0)
3026 request_dump (section
, DISASS_DUMP
);
3032 print_version (program_name
);
3042 /* xgettext:c-format */
3043 error (_("Invalid option '-%c'\n"), c
);
3050 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3051 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3052 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3053 && !do_section_groups
)
3057 warn (_("Nothing to do.\n"));
3063 get_elf_class (unsigned int elf_class
)
3065 static char buff
[32];
3069 case ELFCLASSNONE
: return _("none");
3070 case ELFCLASS32
: return "ELF32";
3071 case ELFCLASS64
: return "ELF64";
3073 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3079 get_data_encoding (unsigned int encoding
)
3081 static char buff
[32];
3085 case ELFDATANONE
: return _("none");
3086 case ELFDATA2LSB
: return _("2's complement, little endian");
3087 case ELFDATA2MSB
: return _("2's complement, big endian");
3089 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3094 /* Decode the data held in 'elf_header'. */
3097 process_file_header (void)
3099 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3100 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3101 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3102 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3105 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3113 printf (_("ELF Header:\n"));
3114 printf (_(" Magic: "));
3115 for (i
= 0; i
< EI_NIDENT
; i
++)
3116 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3118 printf (_(" Class: %s\n"),
3119 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3120 printf (_(" Data: %s\n"),
3121 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3122 printf (_(" Version: %d %s\n"),
3123 elf_header
.e_ident
[EI_VERSION
],
3124 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3126 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3129 printf (_(" OS/ABI: %s\n"),
3130 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3131 printf (_(" ABI Version: %d\n"),
3132 elf_header
.e_ident
[EI_ABIVERSION
]);
3133 printf (_(" Type: %s\n"),
3134 get_file_type (elf_header
.e_type
));
3135 printf (_(" Machine: %s\n"),
3136 get_machine_name (elf_header
.e_machine
));
3137 printf (_(" Version: 0x%lx\n"),
3138 (unsigned long) elf_header
.e_version
);
3140 printf (_(" Entry point address: "));
3141 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3142 printf (_("\n Start of program headers: "));
3143 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3144 printf (_(" (bytes into file)\n Start of section headers: "));
3145 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3146 printf (_(" (bytes into file)\n"));
3148 printf (_(" Flags: 0x%lx%s\n"),
3149 (unsigned long) elf_header
.e_flags
,
3150 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3151 printf (_(" Size of this header: %ld (bytes)\n"),
3152 (long) elf_header
.e_ehsize
);
3153 printf (_(" Size of program headers: %ld (bytes)\n"),
3154 (long) elf_header
.e_phentsize
);
3155 printf (_(" Number of program headers: %ld\n"),
3156 (long) elf_header
.e_phnum
);
3157 printf (_(" Size of section headers: %ld (bytes)\n"),
3158 (long) elf_header
.e_shentsize
);
3159 printf (_(" Number of section headers: %ld"),
3160 (long) elf_header
.e_shnum
);
3161 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3162 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3163 putc ('\n', stdout
);
3164 printf (_(" Section header string table index: %ld"),
3165 (long) elf_header
.e_shstrndx
);
3166 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3167 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3168 putc ('\n', stdout
);
3171 if (section_headers
!= NULL
)
3173 if (elf_header
.e_shnum
== 0)
3174 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3175 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3176 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3177 free (section_headers
);
3178 section_headers
= NULL
;
3186 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3188 Elf32_External_Phdr
*phdrs
;
3189 Elf32_External_Phdr
*external
;
3190 Elf_Internal_Phdr
*internal
;
3193 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3194 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3195 _("program headers"));
3199 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3200 i
< elf_header
.e_phnum
;
3201 i
++, internal
++, external
++)
3203 internal
->p_type
= BYTE_GET (external
->p_type
);
3204 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3205 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3206 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3207 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3208 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3209 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3210 internal
->p_align
= BYTE_GET (external
->p_align
);
3219 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3221 Elf64_External_Phdr
*phdrs
;
3222 Elf64_External_Phdr
*external
;
3223 Elf_Internal_Phdr
*internal
;
3226 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3227 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3228 _("program headers"));
3232 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3233 i
< elf_header
.e_phnum
;
3234 i
++, internal
++, external
++)
3236 internal
->p_type
= BYTE_GET (external
->p_type
);
3237 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3238 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3239 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3240 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3241 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3242 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3243 internal
->p_align
= BYTE_GET (external
->p_align
);
3251 /* Returns 1 if the program headers were read into `program_headers'. */
3254 get_program_headers (FILE *file
)
3256 Elf_Internal_Phdr
*phdrs
;
3258 /* Check cache of prior read. */
3259 if (program_headers
!= NULL
)
3262 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3266 error (_("Out of memory\n"));
3271 ? get_32bit_program_headers (file
, phdrs
)
3272 : get_64bit_program_headers (file
, phdrs
))
3274 program_headers
= phdrs
;
3282 /* Returns 1 if the program headers were loaded. */
3285 process_program_headers (FILE *file
)
3287 Elf_Internal_Phdr
*segment
;
3290 if (elf_header
.e_phnum
== 0)
3293 printf (_("\nThere are no program headers in this file.\n"));
3297 if (do_segments
&& !do_header
)
3299 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3300 printf (_("Entry point "));
3301 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3302 printf (_("\nThere are %d program headers, starting at offset "),
3303 elf_header
.e_phnum
);
3304 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3308 if (! get_program_headers (file
))
3313 if (elf_header
.e_phnum
> 1)
3314 printf (_("\nProgram Headers:\n"));
3316 printf (_("\nProgram Headers:\n"));
3320 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3323 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3327 (_(" Type Offset VirtAddr PhysAddr\n"));
3329 (_(" FileSiz MemSiz Flags Align\n"));
3336 for (i
= 0, segment
= program_headers
;
3337 i
< elf_header
.e_phnum
;
3342 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3346 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3347 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3348 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3349 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3350 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3352 (segment
->p_flags
& PF_R
? 'R' : ' '),
3353 (segment
->p_flags
& PF_W
? 'W' : ' '),
3354 (segment
->p_flags
& PF_X
? 'E' : ' '));
3355 printf ("%#lx", (unsigned long) segment
->p_align
);
3359 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3360 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3363 print_vma (segment
->p_offset
, FULL_HEX
);
3367 print_vma (segment
->p_vaddr
, FULL_HEX
);
3369 print_vma (segment
->p_paddr
, FULL_HEX
);
3372 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3373 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3376 print_vma (segment
->p_filesz
, FULL_HEX
);
3380 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3381 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3384 print_vma (segment
->p_offset
, FULL_HEX
);
3388 (segment
->p_flags
& PF_R
? 'R' : ' '),
3389 (segment
->p_flags
& PF_W
? 'W' : ' '),
3390 (segment
->p_flags
& PF_X
? 'E' : ' '));
3392 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3393 printf ("%#lx", (unsigned long) segment
->p_align
);
3396 print_vma (segment
->p_align
, PREFIX_HEX
);
3401 print_vma (segment
->p_offset
, FULL_HEX
);
3403 print_vma (segment
->p_vaddr
, FULL_HEX
);
3405 print_vma (segment
->p_paddr
, FULL_HEX
);
3407 print_vma (segment
->p_filesz
, FULL_HEX
);
3409 print_vma (segment
->p_memsz
, FULL_HEX
);
3411 (segment
->p_flags
& PF_R
? 'R' : ' '),
3412 (segment
->p_flags
& PF_W
? 'W' : ' '),
3413 (segment
->p_flags
& PF_X
? 'E' : ' '));
3414 print_vma (segment
->p_align
, HEX
);
3418 switch (segment
->p_type
)
3422 error (_("more than one dynamic segment\n"));
3424 /* Try to locate the .dynamic section. If there is
3425 a section header table, we can easily locate it. */
3426 if (section_headers
!= NULL
)
3428 Elf_Internal_Shdr
*sec
;
3430 sec
= find_section (".dynamic");
3431 if (sec
== NULL
|| sec
->sh_size
== 0)
3433 error (_("no .dynamic section in the dynamic segment"));
3437 dynamic_addr
= sec
->sh_offset
;
3438 dynamic_size
= sec
->sh_size
;
3440 if (dynamic_addr
< segment
->p_offset
3441 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3442 warn (_("the .dynamic section is not contained within the dynamic segment"));
3443 else if (dynamic_addr
> segment
->p_offset
)
3444 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3448 /* Otherwise, we can only assume that the .dynamic
3449 section is the first section in the DYNAMIC segment. */
3450 dynamic_addr
= segment
->p_offset
;
3451 dynamic_size
= segment
->p_filesz
;
3456 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3458 error (_("Unable to find program interpreter name\n"));
3461 program_interpreter
[0] = 0;
3462 fscanf (file
, "%63s", program_interpreter
);
3465 printf (_("\n [Requesting program interpreter: %s]"),
3466 program_interpreter
);
3472 putc ('\n', stdout
);
3475 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3477 printf (_("\n Section to Segment mapping:\n"));
3478 printf (_(" Segment Sections...\n"));
3480 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3483 Elf_Internal_Shdr
*section
;
3485 segment
= program_headers
+ i
;
3486 section
= section_headers
;
3488 printf (" %2.2d ", i
);
3490 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3492 if (section
->sh_size
> 0
3493 /* Compare allocated sections by VMA, unallocated
3494 sections by file offset. */
3495 && (section
->sh_flags
& SHF_ALLOC
3496 ? (section
->sh_addr
>= segment
->p_vaddr
3497 && section
->sh_addr
+ section
->sh_size
3498 <= segment
->p_vaddr
+ segment
->p_memsz
)
3499 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3500 && (section
->sh_offset
+ section
->sh_size
3501 <= segment
->p_offset
+ segment
->p_filesz
)))
3502 /* .tbss is special. It doesn't contribute memory space
3503 to normal segments. */
3504 && (!((section
->sh_flags
& SHF_TLS
) != 0
3505 && section
->sh_type
== SHT_NOBITS
)
3506 || segment
->p_type
== PT_TLS
))
3507 printf ("%s ", SECTION_NAME (section
));
3518 /* Find the file offset corresponding to VMA by using the program headers. */
3521 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3523 Elf_Internal_Phdr
*seg
;
3525 if (! get_program_headers (file
))
3527 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3531 for (seg
= program_headers
;
3532 seg
< program_headers
+ elf_header
.e_phnum
;
3535 if (seg
->p_type
!= PT_LOAD
)
3538 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3539 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3540 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3543 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3550 get_32bit_section_headers (FILE *file
, unsigned int num
)
3552 Elf32_External_Shdr
*shdrs
;
3553 Elf_Internal_Shdr
*internal
;
3556 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3557 elf_header
.e_shentsize
, num
, _("section headers"));
3561 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3563 if (section_headers
== NULL
)
3565 error (_("Out of memory\n"));
3569 for (i
= 0, internal
= section_headers
;
3573 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3574 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3575 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3576 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3577 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3578 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3579 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3580 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3581 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3582 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3591 get_64bit_section_headers (FILE *file
, unsigned int num
)
3593 Elf64_External_Shdr
*shdrs
;
3594 Elf_Internal_Shdr
*internal
;
3597 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3598 elf_header
.e_shentsize
, num
, _("section headers"));
3602 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3604 if (section_headers
== NULL
)
3606 error (_("Out of memory\n"));
3610 for (i
= 0, internal
= section_headers
;
3614 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3615 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3616 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3617 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3618 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3619 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3620 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3621 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3622 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3623 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3631 static Elf_Internal_Sym
*
3632 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3634 unsigned long number
;
3635 Elf32_External_Sym
*esyms
;
3636 Elf_External_Sym_Shndx
*shndx
;
3637 Elf_Internal_Sym
*isyms
;
3638 Elf_Internal_Sym
*psym
;
3641 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3647 if (symtab_shndx_hdr
!= NULL
3648 && (symtab_shndx_hdr
->sh_link
3649 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3651 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3652 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3660 number
= section
->sh_size
/ section
->sh_entsize
;
3661 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3665 error (_("Out of memory\n"));
3672 for (j
= 0, psym
= isyms
;
3676 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3677 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3678 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3679 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3680 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3682 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3683 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3684 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3694 static Elf_Internal_Sym
*
3695 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3697 unsigned long number
;
3698 Elf64_External_Sym
*esyms
;
3699 Elf_External_Sym_Shndx
*shndx
;
3700 Elf_Internal_Sym
*isyms
;
3701 Elf_Internal_Sym
*psym
;
3704 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3710 if (symtab_shndx_hdr
!= NULL
3711 && (symtab_shndx_hdr
->sh_link
3712 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3714 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3715 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3723 number
= section
->sh_size
/ section
->sh_entsize
;
3724 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3728 error (_("Out of memory\n"));
3735 for (j
= 0, psym
= isyms
;
3739 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3740 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3741 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3742 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3743 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3745 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3746 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3747 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3758 get_elf_section_flags (bfd_vma sh_flags
)
3760 static char buff
[33];
3767 flag
= sh_flags
& - sh_flags
;
3772 case SHF_WRITE
: *p
= 'W'; break;
3773 case SHF_ALLOC
: *p
= 'A'; break;
3774 case SHF_EXECINSTR
: *p
= 'X'; break;
3775 case SHF_MERGE
: *p
= 'M'; break;
3776 case SHF_STRINGS
: *p
= 'S'; break;
3777 case SHF_INFO_LINK
: *p
= 'I'; break;
3778 case SHF_LINK_ORDER
: *p
= 'L'; break;
3779 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3780 case SHF_GROUP
: *p
= 'G'; break;
3781 case SHF_TLS
: *p
= 'T'; break;
3784 if (flag
& SHF_MASKOS
)
3787 sh_flags
&= ~ SHF_MASKOS
;
3789 else if (flag
& SHF_MASKPROC
)
3792 sh_flags
&= ~ SHF_MASKPROC
;
3806 process_section_headers (FILE *file
)
3808 Elf_Internal_Shdr
*section
;
3811 section_headers
= NULL
;
3813 if (elf_header
.e_shnum
== 0)
3816 printf (_("\nThere are no sections in this file.\n"));
3821 if (do_sections
&& !do_header
)
3822 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3823 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3827 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3830 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3833 /* Read in the string table, so that we have names to display. */
3834 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3836 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3838 if (section
->sh_size
!= 0)
3840 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3841 1, section
->sh_size
, _("string table"));
3843 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3847 /* Scan the sections for the dynamic symbol table
3848 and dynamic string table and debug sections. */
3849 dynamic_symbols
= NULL
;
3850 dynamic_strings
= NULL
;
3851 dynamic_syminfo
= NULL
;
3852 symtab_shndx_hdr
= NULL
;
3854 eh_addr_size
= is_32bit_elf
? 4 : 8;
3855 switch (elf_header
.e_machine
)
3858 case EM_MIPS_RS3_LE
:
3859 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3860 FDE addresses. However, the ABI also has a semi-official ILP32
3861 variant for which the normal FDE address size rules apply.
3863 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3864 section, where XX is the size of longs in bits. Unfortunately,
3865 earlier compilers provided no way of distinguishing ILP32 objects
3866 from LP64 objects, so if there's any doubt, we should assume that
3867 the official LP64 form is being used. */
3868 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3869 && find_section (".gcc_compiled_long32") == NULL
)
3874 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3877 size_t expected_entsize \
3878 = is_32bit_elf ? size32 : size64; \
3879 if (section->sh_entsize != expected_entsize) \
3880 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3881 i, (unsigned long int) section->sh_entsize, \
3882 (unsigned long int) expected_entsize); \
3883 section->sh_entsize = expected_entsize; \
3886 #define CHECK_ENTSIZE(section, i, type) \
3887 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3888 sizeof (Elf64_External_##type))
3890 for (i
= 0, section
= section_headers
;
3891 i
< elf_header
.e_shnum
;
3894 char *name
= SECTION_NAME (section
);
3896 if (section
->sh_type
== SHT_DYNSYM
)
3898 if (dynamic_symbols
!= NULL
)
3900 error (_("File contains multiple dynamic symbol tables\n"));
3904 CHECK_ENTSIZE (section
, i
, Sym
);
3905 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3906 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3908 else if (section
->sh_type
== SHT_STRTAB
3909 && streq (name
, ".dynstr"))
3911 if (dynamic_strings
!= NULL
)
3913 error (_("File contains multiple dynamic string tables\n"));
3917 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3918 1, section
->sh_size
, _("dynamic strings"));
3919 dynamic_strings_length
= section
->sh_size
;
3921 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3923 if (symtab_shndx_hdr
!= NULL
)
3925 error (_("File contains multiple symtab shndx tables\n"));
3928 symtab_shndx_hdr
= section
;
3930 else if (section
->sh_type
== SHT_SYMTAB
)
3931 CHECK_ENTSIZE (section
, i
, Sym
);
3932 else if (section
->sh_type
== SHT_GROUP
)
3933 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
3934 else if (section
->sh_type
== SHT_REL
)
3935 CHECK_ENTSIZE (section
, i
, Rel
);
3936 else if (section
->sh_type
== SHT_RELA
)
3937 CHECK_ENTSIZE (section
, i
, Rela
);
3938 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3939 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3940 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3941 || do_debug_loc
|| do_debug_ranges
)
3942 && strneq (name
, ".debug_", 7))
3947 || (do_debug_info
&& streq (name
, "info"))
3948 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3949 || (do_debug_lines
&& streq (name
, "line"))
3950 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3951 || (do_debug_aranges
&& streq (name
, "aranges"))
3952 || (do_debug_ranges
&& streq (name
, "ranges"))
3953 || (do_debug_frames
&& streq (name
, "frame"))
3954 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3955 || (do_debug_str
&& streq (name
, "str"))
3956 || (do_debug_loc
&& streq (name
, "loc"))
3958 request_dump (i
, DEBUG_DUMP
);
3960 /* linkonce section to be combined with .debug_info at link time. */
3961 else if ((do_debugging
|| do_debug_info
)
3962 && strneq (name
, ".gnu.linkonce.wi.", 17))
3963 request_dump (i
, DEBUG_DUMP
);
3964 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
3965 request_dump (i
, DEBUG_DUMP
);
3971 if (elf_header
.e_shnum
> 1)
3972 printf (_("\nSection Headers:\n"));
3974 printf (_("\nSection Header:\n"));
3978 if (do_full_section_name
)
3980 printf (_(" [Nr] Name\n"));
3981 printf (_(" Type Addr Off Size ES Flg Lk Inf Al\n"));
3985 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3989 if (do_full_section_name
)
3991 printf (_(" [Nr] Name\n"));
3992 printf (_(" Type Address Off Size ES Flg Lk Inf Al\n"));
3996 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4000 if (do_full_section_name
)
4002 printf (_(" [Nr] Name\n"));
4003 printf (_(" Flags Type Address Offset\n"));
4004 printf (_(" Size EntSize Link Info Align\n"));
4008 printf (_(" [Nr] Name Type Address Offset\n"));
4009 printf (_(" Size EntSize Flags Link Info Align\n"));
4013 for (i
= 0, section
= section_headers
;
4014 i
< elf_header
.e_shnum
;
4017 if (do_full_section_name
)
4019 printf (" [%2u] %s\n",
4020 SECTION_HEADER_NUM (i
),
4021 SECTION_NAME (section
));
4022 if (is_32bit_elf
|| do_wide
)
4023 printf (" %-15.15s ",
4024 get_section_type_name (section
->sh_type
));
4027 printf (" [%2u] %-17.17s %-15.15s ",
4028 SECTION_HEADER_NUM (i
),
4029 SECTION_NAME (section
),
4030 get_section_type_name (section
->sh_type
));
4034 print_vma (section
->sh_addr
, LONG_HEX
);
4036 printf ( " %6.6lx %6.6lx %2.2lx",
4037 (unsigned long) section
->sh_offset
,
4038 (unsigned long) section
->sh_size
,
4039 (unsigned long) section
->sh_entsize
);
4041 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4043 printf ("%2ld %3lu %2ld\n",
4044 (unsigned long) section
->sh_link
,
4045 (unsigned long) section
->sh_info
,
4046 (unsigned long) section
->sh_addralign
);
4050 print_vma (section
->sh_addr
, LONG_HEX
);
4052 if ((long) section
->sh_offset
== section
->sh_offset
)
4053 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4057 print_vma (section
->sh_offset
, LONG_HEX
);
4060 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4061 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4065 print_vma (section
->sh_size
, LONG_HEX
);
4068 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4069 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4073 print_vma (section
->sh_entsize
, LONG_HEX
);
4076 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4078 printf ("%2ld %3lu ",
4079 (unsigned long) section
->sh_link
,
4080 (unsigned long) section
->sh_info
);
4082 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4083 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4086 print_vma (section
->sh_addralign
, DEC
);
4090 else if (do_full_section_name
)
4092 printf (" %-15.15s %-15.15s ",
4093 get_elf_section_flags (section
->sh_flags
),
4094 get_section_type_name (section
->sh_type
));
4096 print_vma (section
->sh_addr
, LONG_HEX
);
4097 if ((long) section
->sh_offset
== section
->sh_offset
)
4098 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4102 print_vma (section
->sh_offset
, LONG_HEX
);
4105 print_vma (section
->sh_size
, LONG_HEX
);
4107 print_vma (section
->sh_entsize
, LONG_HEX
);
4109 printf (" %2ld %3lu %ld\n",
4110 (unsigned long) section
->sh_link
,
4111 (unsigned long) section
->sh_info
,
4112 (unsigned long) section
->sh_addralign
);
4117 print_vma (section
->sh_addr
, LONG_HEX
);
4118 if ((long) section
->sh_offset
== section
->sh_offset
)
4119 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4123 print_vma (section
->sh_offset
, LONG_HEX
);
4126 print_vma (section
->sh_size
, LONG_HEX
);
4128 print_vma (section
->sh_entsize
, LONG_HEX
);
4130 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4132 printf (" %2ld %3lu %ld\n",
4133 (unsigned long) section
->sh_link
,
4134 (unsigned long) section
->sh_info
,
4135 (unsigned long) section
->sh_addralign
);
4139 printf (_("Key to Flags:\n\
4140 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4141 I (info), L (link order), G (group), x (unknown)\n\
4142 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4148 get_group_flags (unsigned int flags
)
4150 static char buff
[32];
4157 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4164 process_section_groups (FILE *file
)
4166 Elf_Internal_Shdr
*section
;
4168 struct group
*group
;
4169 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4170 Elf_Internal_Sym
*symtab
;
4174 /* Don't process section groups unless needed. */
4175 if (!do_unwind
&& !do_section_groups
)
4178 if (elf_header
.e_shnum
== 0)
4180 if (do_section_groups
)
4181 printf (_("\nThere are no sections in this file.\n"));
4186 if (section_headers
== NULL
)
4188 error (_("Section headers are not available!\n"));
4192 section_headers_groups
= calloc (elf_header
.e_shnum
,
4193 sizeof (struct group
*));
4195 if (section_headers_groups
== NULL
)
4197 error (_("Out of memory\n"));
4201 /* Scan the sections for the group section. */
4203 for (i
= 0, section
= section_headers
;
4204 i
< elf_header
.e_shnum
;
4206 if (section
->sh_type
== SHT_GROUP
)
4209 if (group_count
== 0)
4211 if (do_section_groups
)
4212 printf (_("\nThere are no section groups in this file.\n"));
4217 section_groups
= calloc (group_count
, sizeof (struct group
));
4219 if (section_groups
== NULL
)
4221 error (_("Out of memory\n"));
4230 for (i
= 0, section
= section_headers
, group
= section_groups
;
4231 i
< elf_header
.e_shnum
;
4234 if (section
->sh_type
== SHT_GROUP
)
4236 char *name
= SECTION_NAME (section
);
4238 unsigned char *start
, *indices
;
4239 unsigned int entry
, j
, size
;
4240 Elf_Internal_Shdr
*sec
;
4241 Elf_Internal_Sym
*sym
;
4243 /* Get the symbol table. */
4244 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4245 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4248 error (_("Bad sh_link in group section `%s'\n"), name
);
4252 if (symtab_sec
!= sec
)
4257 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4260 sym
= symtab
+ section
->sh_info
;
4262 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4264 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4267 error (_("Bad sh_info in group section `%s'\n"), name
);
4271 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4280 /* Get the string table. */
4281 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4282 >= elf_header
.e_shnum
)
4291 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4296 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4297 1, strtab_sec
->sh_size
,
4299 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4301 group_name
= sym
->st_name
< strtab_size
4302 ? strtab
+ sym
->st_name
: "<corrupt>";
4305 start
= get_data (NULL
, file
, section
->sh_offset
,
4306 1, section
->sh_size
, _("section data"));
4309 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4310 entry
= byte_get (indices
, 4);
4313 if (do_section_groups
)
4315 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4316 get_group_flags (entry
), i
, name
, group_name
, size
);
4318 printf (_(" [Index] Name\n"));
4321 group
->group_index
= i
;
4323 for (j
= 0; j
< size
; j
++)
4325 struct group_list
*g
;
4327 entry
= byte_get (indices
, 4);
4330 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4332 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4333 entry
, i
, elf_header
.e_shnum
- 1);
4336 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4338 error (_("invalid section [%5u] in group section [%5u]\n"),
4343 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4348 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4350 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4355 /* Intel C/C++ compiler may put section 0 in a
4356 section group. We just warn it the first time
4357 and ignore it afterwards. */
4358 static int warned
= 0;
4361 error (_("section 0 in group section [%5u]\n"),
4362 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4368 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4371 if (do_section_groups
)
4373 sec
= SECTION_HEADER (entry
);
4374 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4377 g
= xmalloc (sizeof (struct group_list
));
4378 g
->section_index
= entry
;
4379 g
->next
= group
->root
;
4403 } dynamic_relocations
[] =
4405 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4406 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4407 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4410 /* Process the reloc section. */
4413 process_relocs (FILE *file
)
4415 unsigned long rel_size
;
4416 unsigned long rel_offset
;
4422 if (do_using_dynamic
)
4426 int has_dynamic_reloc
;
4429 has_dynamic_reloc
= 0;
4431 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4433 is_rela
= dynamic_relocations
[i
].rela
;
4434 name
= dynamic_relocations
[i
].name
;
4435 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4436 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4438 has_dynamic_reloc
|= rel_size
;
4440 if (is_rela
== UNKNOWN
)
4442 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4443 switch (dynamic_info
[DT_PLTREL
])
4457 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4458 name
, rel_offset
, rel_size
);
4460 dump_relocations (file
,
4461 offset_from_vma (file
, rel_offset
, rel_size
),
4463 dynamic_symbols
, num_dynamic_syms
,
4464 dynamic_strings
, dynamic_strings_length
, is_rela
);
4468 if (! has_dynamic_reloc
)
4469 printf (_("\nThere are no dynamic relocations in this file.\n"));
4473 Elf_Internal_Shdr
*section
;
4477 for (i
= 0, section
= section_headers
;
4478 i
< elf_header
.e_shnum
;
4481 if ( section
->sh_type
!= SHT_RELA
4482 && section
->sh_type
!= SHT_REL
)
4485 rel_offset
= section
->sh_offset
;
4486 rel_size
= section
->sh_size
;
4490 Elf_Internal_Shdr
*strsec
;
4493 printf (_("\nRelocation section "));
4495 if (string_table
== NULL
)
4496 printf ("%d", section
->sh_name
);
4498 printf (_("'%s'"), SECTION_NAME (section
));
4500 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4501 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4503 is_rela
= section
->sh_type
== SHT_RELA
;
4505 if (section
->sh_link
4506 && SECTION_HEADER_INDEX (section
->sh_link
)
4507 < elf_header
.e_shnum
)
4509 Elf_Internal_Shdr
*symsec
;
4510 Elf_Internal_Sym
*symtab
;
4511 unsigned long nsyms
;
4512 unsigned long strtablen
= 0;
4513 char *strtab
= NULL
;
4515 symsec
= SECTION_HEADER (section
->sh_link
);
4516 if (symsec
->sh_type
!= SHT_SYMTAB
4517 && symsec
->sh_type
!= SHT_DYNSYM
)
4520 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4521 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4526 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4527 < elf_header
.e_shnum
)
4529 strsec
= SECTION_HEADER (symsec
->sh_link
);
4531 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4534 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4537 dump_relocations (file
, rel_offset
, rel_size
,
4538 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4544 dump_relocations (file
, rel_offset
, rel_size
,
4545 NULL
, 0, NULL
, 0, is_rela
);
4552 printf (_("\nThere are no relocations in this file.\n"));
4558 /* Process the unwind section. */
4560 #include "unwind-ia64.h"
4562 /* An absolute address consists of a section and an offset. If the
4563 section is NULL, the offset itself is the address, otherwise, the
4564 address equals to LOAD_ADDRESS(section) + offset. */
4568 unsigned short section
;
4572 struct ia64_unw_aux_info
4574 struct ia64_unw_table_entry
4576 struct absaddr start
;
4578 struct absaddr info
;
4580 *table
; /* Unwind table. */
4581 unsigned long table_len
; /* Length of unwind table. */
4582 unsigned char *info
; /* Unwind info. */
4583 unsigned long info_size
; /* Size of unwind info. */
4584 bfd_vma info_addr
; /* starting address of unwind info. */
4585 bfd_vma seg_base
; /* Starting address of segment. */
4586 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4587 unsigned long nsyms
; /* Number of symbols. */
4588 char *strtab
; /* The string table. */
4589 unsigned long strtab_size
; /* Size of string table. */
4593 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4594 unsigned long nsyms
,
4596 unsigned long strtab_size
,
4597 struct absaddr addr
,
4598 const char **symname
,
4601 bfd_vma dist
= 0x100000;
4602 Elf_Internal_Sym
*sym
, *best
= NULL
;
4605 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4607 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4608 && sym
->st_name
!= 0
4609 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4610 && addr
.offset
>= sym
->st_value
4611 && addr
.offset
- sym
->st_value
< dist
)
4614 dist
= addr
.offset
- sym
->st_value
;
4621 *symname
= (best
->st_name
>= strtab_size
4622 ? "<corrupt>" : strtab
+ best
->st_name
);
4627 *offset
= addr
.offset
;
4631 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4633 struct ia64_unw_table_entry
*tp
;
4636 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4640 const unsigned char *dp
;
4641 const unsigned char *head
;
4642 const char *procname
;
4644 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4645 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4647 fputs ("\n<", stdout
);
4651 fputs (procname
, stdout
);
4654 printf ("+%lx", (unsigned long) offset
);
4657 fputs (">: [", stdout
);
4658 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4659 fputc ('-', stdout
);
4660 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4661 printf ("], info at +0x%lx\n",
4662 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4664 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4665 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4667 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4668 (unsigned) UNW_VER (stamp
),
4669 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4670 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4671 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4672 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4674 if (UNW_VER (stamp
) != 1)
4676 printf ("\tUnknown version.\n");
4681 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4682 dp
= unw_decode (dp
, in_body
, & in_body
);
4687 slurp_ia64_unwind_table (FILE *file
,
4688 struct ia64_unw_aux_info
*aux
,
4689 Elf_Internal_Shdr
*sec
)
4691 unsigned long size
, nrelas
, i
;
4692 Elf_Internal_Phdr
*seg
;
4693 struct ia64_unw_table_entry
*tep
;
4694 Elf_Internal_Shdr
*relsec
;
4695 Elf_Internal_Rela
*rela
, *rp
;
4696 unsigned char *table
, *tp
;
4697 Elf_Internal_Sym
*sym
;
4698 const char *relname
;
4700 /* First, find the starting address of the segment that includes
4703 if (elf_header
.e_phnum
)
4705 if (! get_program_headers (file
))
4708 for (seg
= program_headers
;
4709 seg
< program_headers
+ elf_header
.e_phnum
;
4712 if (seg
->p_type
!= PT_LOAD
)
4715 if (sec
->sh_addr
>= seg
->p_vaddr
4716 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4718 aux
->seg_base
= seg
->p_vaddr
;
4724 /* Second, build the unwind table from the contents of the unwind section: */
4725 size
= sec
->sh_size
;
4726 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4730 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4732 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4734 tep
->start
.section
= SHN_UNDEF
;
4735 tep
->end
.section
= SHN_UNDEF
;
4736 tep
->info
.section
= SHN_UNDEF
;
4739 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4740 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4741 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4745 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4746 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4747 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4749 tep
->start
.offset
+= aux
->seg_base
;
4750 tep
->end
.offset
+= aux
->seg_base
;
4751 tep
->info
.offset
+= aux
->seg_base
;
4755 /* Third, apply any relocations to the unwind table: */
4757 for (relsec
= section_headers
;
4758 relsec
< section_headers
+ elf_header
.e_shnum
;
4761 if (relsec
->sh_type
!= SHT_RELA
4762 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4763 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4766 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4770 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4774 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4775 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4779 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4780 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4783 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4785 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4789 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4791 switch (rp
->r_offset
/eh_addr_size
% 3)
4794 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4795 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4798 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4799 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4802 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4803 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4813 aux
->table_len
= size
/ (3 * eh_addr_size
);
4818 ia64_process_unwind (FILE *file
)
4820 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4821 unsigned long i
, unwcount
= 0, unwstart
= 0;
4822 struct ia64_unw_aux_info aux
;
4824 memset (& aux
, 0, sizeof (aux
));
4826 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4828 if (sec
->sh_type
== SHT_SYMTAB
4829 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4831 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4832 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4834 strsec
= SECTION_HEADER (sec
->sh_link
);
4835 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4836 1, strsec
->sh_size
, _("string table"));
4837 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4839 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4844 printf (_("\nThere are no unwind sections in this file.\n"));
4846 while (unwcount
-- > 0)
4851 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4852 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4853 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4860 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4862 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4864 /* We need to find which section group it is in. */
4865 struct group_list
*g
= section_headers_groups
[i
]->root
;
4867 for (; g
!= NULL
; g
= g
->next
)
4869 sec
= SECTION_HEADER (g
->section_index
);
4871 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4876 i
= elf_header
.e_shnum
;
4878 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4880 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4881 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4882 suffix
= SECTION_NAME (unwsec
) + len
;
4883 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4885 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4886 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4891 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4892 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4893 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4894 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4896 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4897 suffix
= SECTION_NAME (unwsec
) + len
;
4898 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4900 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4901 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4905 if (i
== elf_header
.e_shnum
)
4907 printf (_("\nCould not find unwind info section for "));
4909 if (string_table
== NULL
)
4910 printf ("%d", unwsec
->sh_name
);
4912 printf (_("'%s'"), SECTION_NAME (unwsec
));
4916 aux
.info_size
= sec
->sh_size
;
4917 aux
.info_addr
= sec
->sh_addr
;
4918 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
4921 printf (_("\nUnwind section "));
4923 if (string_table
== NULL
)
4924 printf ("%d", unwsec
->sh_name
);
4926 printf (_("'%s'"), SECTION_NAME (unwsec
));
4928 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4929 (unsigned long) unwsec
->sh_offset
,
4930 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4932 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4934 if (aux
.table_len
> 0)
4935 dump_ia64_unwind (& aux
);
4938 free ((char *) aux
.table
);
4940 free ((char *) aux
.info
);
4949 free ((char *) aux
.strtab
);
4954 struct hppa_unw_aux_info
4956 struct hppa_unw_table_entry
4958 struct absaddr start
;
4960 unsigned int Cannot_unwind
:1; /* 0 */
4961 unsigned int Millicode
:1; /* 1 */
4962 unsigned int Millicode_save_sr0
:1; /* 2 */
4963 unsigned int Region_description
:2; /* 3..4 */
4964 unsigned int reserved1
:1; /* 5 */
4965 unsigned int Entry_SR
:1; /* 6 */
4966 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
4967 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
4968 unsigned int Args_stored
:1; /* 16 */
4969 unsigned int Variable_Frame
:1; /* 17 */
4970 unsigned int Separate_Package_Body
:1; /* 18 */
4971 unsigned int Frame_Extension_Millicode
:1; /* 19 */
4972 unsigned int Stack_Overflow_Check
:1; /* 20 */
4973 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
4974 unsigned int Ada_Region
:1; /* 22 */
4975 unsigned int cxx_info
:1; /* 23 */
4976 unsigned int cxx_try_catch
:1; /* 24 */
4977 unsigned int sched_entry_seq
:1; /* 25 */
4978 unsigned int reserved2
:1; /* 26 */
4979 unsigned int Save_SP
:1; /* 27 */
4980 unsigned int Save_RP
:1; /* 28 */
4981 unsigned int Save_MRP_in_frame
:1; /* 29 */
4982 unsigned int extn_ptr_defined
:1; /* 30 */
4983 unsigned int Cleanup_defined
:1; /* 31 */
4985 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
4986 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
4987 unsigned int Large_frame
:1; /* 2 */
4988 unsigned int Pseudo_SP_Set
:1; /* 3 */
4989 unsigned int reserved4
:1; /* 4 */
4990 unsigned int Total_frame_size
:27; /* 5..31 */
4992 *table
; /* Unwind table. */
4993 unsigned long table_len
; /* Length of unwind table. */
4994 bfd_vma seg_base
; /* Starting address of segment. */
4995 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4996 unsigned long nsyms
; /* Number of symbols. */
4997 char *strtab
; /* The string table. */
4998 unsigned long strtab_size
; /* Size of string table. */
5002 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5004 struct hppa_unw_table_entry
*tp
;
5006 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5009 const char *procname
;
5011 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5012 aux
->strtab_size
, tp
->start
, &procname
,
5015 fputs ("\n<", stdout
);
5019 fputs (procname
, stdout
);
5022 printf ("+%lx", (unsigned long) offset
);
5025 fputs (">: [", stdout
);
5026 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5027 fputc ('-', stdout
);
5028 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5031 #define PF(_m) if (tp->_m) printf (#_m " ");
5032 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5035 PF(Millicode_save_sr0
);
5036 /* PV(Region_description); */
5042 PF(Separate_Package_Body
);
5043 PF(Frame_Extension_Millicode
);
5044 PF(Stack_Overflow_Check
);
5045 PF(Two_Instruction_SP_Increment
);
5049 PF(sched_entry_seq
);
5052 PF(Save_MRP_in_frame
);
5053 PF(extn_ptr_defined
);
5054 PF(Cleanup_defined
);
5055 PF(MPE_XL_interrupt_marker
);
5056 PF(HP_UX_interrupt_marker
);
5059 PV(Total_frame_size
);
5068 slurp_hppa_unwind_table (FILE *file
,
5069 struct hppa_unw_aux_info
*aux
,
5070 Elf_Internal_Shdr
*sec
)
5072 unsigned long size
, unw_ent_size
, nrelas
, i
;
5073 Elf_Internal_Phdr
*seg
;
5074 struct hppa_unw_table_entry
*tep
;
5075 Elf_Internal_Shdr
*relsec
;
5076 Elf_Internal_Rela
*rela
, *rp
;
5077 unsigned char *table
, *tp
;
5078 Elf_Internal_Sym
*sym
;
5079 const char *relname
;
5081 /* First, find the starting address of the segment that includes
5084 if (elf_header
.e_phnum
)
5086 if (! get_program_headers (file
))
5089 for (seg
= program_headers
;
5090 seg
< program_headers
+ elf_header
.e_phnum
;
5093 if (seg
->p_type
!= PT_LOAD
)
5096 if (sec
->sh_addr
>= seg
->p_vaddr
5097 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5099 aux
->seg_base
= seg
->p_vaddr
;
5105 /* Second, build the unwind table from the contents of the unwind
5107 size
= sec
->sh_size
;
5108 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5112 unw_ent_size
= 2 * eh_addr_size
+ 8;
5114 tep
= aux
->table
= xcmalloc (size
/ unw_ent_size
, sizeof (aux
->table
[0]));
5116 for (tp
= table
; tp
< table
+ size
; tp
+= (2 * eh_addr_size
+ 8), ++tep
)
5118 unsigned int tmp1
, tmp2
;
5120 tep
->start
.section
= SHN_UNDEF
;
5121 tep
->end
.section
= SHN_UNDEF
;
5125 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5126 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5127 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5128 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5132 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5133 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5134 tmp1
= byte_get ((unsigned char *) tp
+ 16, 4);
5135 tmp2
= byte_get ((unsigned char *) tp
+ 20, 4);
5138 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5139 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5140 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5141 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5142 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5143 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5144 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5145 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5146 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5147 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5148 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5149 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5150 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5151 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5152 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5153 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5154 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5155 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5156 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5157 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5158 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5159 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5160 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5161 tep
->Cleanup_defined
= tmp1
& 0x1;
5163 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5164 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5165 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5166 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5167 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5168 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5170 tep
->start
.offset
+= aux
->seg_base
;
5171 tep
->end
.offset
+= aux
->seg_base
;
5175 /* Third, apply any relocations to the unwind table. */
5177 for (relsec
= section_headers
;
5178 relsec
< section_headers
+ elf_header
.e_shnum
;
5181 if (relsec
->sh_type
!= SHT_RELA
5182 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5183 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5186 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5190 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5194 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5195 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5199 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5200 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5203 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5204 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5206 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5210 i
= rp
->r_offset
/ unw_ent_size
;
5212 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5215 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5216 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5219 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5220 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5230 aux
->table_len
= size
/ unw_ent_size
;
5236 hppa_process_unwind (FILE *file
)
5238 struct hppa_unw_aux_info aux
;
5239 Elf_Internal_Shdr
*unwsec
= NULL
;
5240 Elf_Internal_Shdr
*strsec
;
5241 Elf_Internal_Shdr
*sec
;
5244 memset (& aux
, 0, sizeof (aux
));
5246 if (string_table
== NULL
)
5249 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5251 if (sec
->sh_type
== SHT_SYMTAB
5252 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5254 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5255 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5257 strsec
= SECTION_HEADER (sec
->sh_link
);
5258 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5259 1, strsec
->sh_size
, _("string table"));
5260 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5262 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5267 printf (_("\nThere are no unwind sections in this file.\n"));
5269 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5271 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5273 printf (_("\nUnwind section "));
5274 printf (_("'%s'"), SECTION_NAME (sec
));
5276 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5277 (unsigned long) sec
->sh_offset
,
5278 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5280 slurp_hppa_unwind_table (file
, &aux
, sec
);
5281 if (aux
.table_len
> 0)
5282 dump_hppa_unwind (&aux
);
5285 free ((char *) aux
.table
);
5293 free ((char *) aux
.strtab
);
5299 process_unwind (FILE *file
)
5301 struct unwind_handler
{
5303 int (*handler
)(FILE *file
);
5305 { EM_IA_64
, ia64_process_unwind
},
5306 { EM_PARISC
, hppa_process_unwind
},
5314 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5315 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5316 return handlers
[i
].handler (file
);
5318 printf (_("\nThere are no unwind sections in this file.\n"));
5323 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5325 switch (entry
->d_tag
)
5328 if (entry
->d_un
.d_val
== 0)
5332 static const char * opts
[] =
5334 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5335 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5336 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5337 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5342 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5343 if (entry
->d_un
.d_val
& (1 << cnt
))
5345 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5352 case DT_MIPS_IVERSION
:
5353 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5354 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5356 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5359 case DT_MIPS_TIME_STAMP
:
5364 time_t time
= entry
->d_un
.d_val
;
5365 tmp
= gmtime (&time
);
5366 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5367 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5368 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5369 printf ("Time Stamp: %s\n", timebuf
);
5373 case DT_MIPS_RLD_VERSION
:
5374 case DT_MIPS_LOCAL_GOTNO
:
5375 case DT_MIPS_CONFLICTNO
:
5376 case DT_MIPS_LIBLISTNO
:
5377 case DT_MIPS_SYMTABNO
:
5378 case DT_MIPS_UNREFEXTNO
:
5379 case DT_MIPS_HIPAGENO
:
5380 case DT_MIPS_DELTA_CLASS_NO
:
5381 case DT_MIPS_DELTA_INSTANCE_NO
:
5382 case DT_MIPS_DELTA_RELOC_NO
:
5383 case DT_MIPS_DELTA_SYM_NO
:
5384 case DT_MIPS_DELTA_CLASSSYM_NO
:
5385 case DT_MIPS_COMPACT_SIZE
:
5386 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5390 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5396 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5398 switch (entry
->d_tag
)
5400 case DT_HP_DLD_FLAGS
:
5409 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5410 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5411 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5412 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5413 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5414 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5415 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5416 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5417 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5418 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5419 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
5423 bfd_vma val
= entry
->d_un
.d_val
;
5425 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5426 if (val
& flags
[cnt
].bit
)
5430 fputs (flags
[cnt
].str
, stdout
);
5432 val
^= flags
[cnt
].bit
;
5435 if (val
!= 0 || first
)
5439 print_vma (val
, HEX
);
5445 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5452 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5454 switch (entry
->d_tag
)
5456 case DT_IA_64_PLT_RESERVE
:
5457 /* First 3 slots reserved. */
5458 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5460 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5464 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5471 get_32bit_dynamic_section (FILE *file
)
5473 Elf32_External_Dyn
*edyn
, *ext
;
5474 Elf_Internal_Dyn
*entry
;
5476 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5477 _("dynamic section"));
5481 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5482 might not have the luxury of section headers. Look for the DT_NULL
5483 terminator to determine the number of entries. */
5484 for (ext
= edyn
, dynamic_nent
= 0;
5485 (char *) ext
< (char *) edyn
+ dynamic_size
;
5489 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5493 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5494 if (dynamic_section
== NULL
)
5496 error (_("Out of memory\n"));
5501 for (ext
= edyn
, entry
= dynamic_section
;
5502 entry
< dynamic_section
+ dynamic_nent
;
5505 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5506 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5515 get_64bit_dynamic_section (FILE *file
)
5517 Elf64_External_Dyn
*edyn
, *ext
;
5518 Elf_Internal_Dyn
*entry
;
5520 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5521 _("dynamic section"));
5525 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5526 might not have the luxury of section headers. Look for the DT_NULL
5527 terminator to determine the number of entries. */
5528 for (ext
= edyn
, dynamic_nent
= 0;
5529 (char *) ext
< (char *) edyn
+ dynamic_size
;
5533 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5537 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5538 if (dynamic_section
== NULL
)
5540 error (_("Out of memory\n"));
5545 for (ext
= edyn
, entry
= dynamic_section
;
5546 entry
< dynamic_section
+ dynamic_nent
;
5549 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5550 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5559 print_dynamic_flags (bfd_vma flags
)
5567 flag
= flags
& - flags
;
5577 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5578 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5579 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5580 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5581 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5582 default: fputs ("unknown", stdout
); break;
5588 /* Parse and display the contents of the dynamic section. */
5591 process_dynamic_section (FILE *file
)
5593 Elf_Internal_Dyn
*entry
;
5595 if (dynamic_size
== 0)
5598 printf (_("\nThere is no dynamic section in this file.\n"));
5605 if (! get_32bit_dynamic_section (file
))
5608 else if (! get_64bit_dynamic_section (file
))
5611 /* Find the appropriate symbol table. */
5612 if (dynamic_symbols
== NULL
)
5614 for (entry
= dynamic_section
;
5615 entry
< dynamic_section
+ dynamic_nent
;
5618 Elf_Internal_Shdr section
;
5620 if (entry
->d_tag
!= DT_SYMTAB
)
5623 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5625 /* Since we do not know how big the symbol table is,
5626 we default to reading in the entire file (!) and
5627 processing that. This is overkill, I know, but it
5629 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5631 if (archive_file_offset
!= 0)
5632 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5635 if (fseek (file
, 0, SEEK_END
))
5636 error (_("Unable to seek to end of file!"));
5638 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5642 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5644 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5646 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5647 if (num_dynamic_syms
< 1)
5649 error (_("Unable to determine the number of symbols to load\n"));
5653 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5657 /* Similarly find a string table. */
5658 if (dynamic_strings
== NULL
)
5660 for (entry
= dynamic_section
;
5661 entry
< dynamic_section
+ dynamic_nent
;
5664 unsigned long offset
;
5667 if (entry
->d_tag
!= DT_STRTAB
)
5670 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5672 /* Since we do not know how big the string table is,
5673 we default to reading in the entire file (!) and
5674 processing that. This is overkill, I know, but it
5677 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5679 if (archive_file_offset
!= 0)
5680 str_tab_len
= archive_file_size
- offset
;
5683 if (fseek (file
, 0, SEEK_END
))
5684 error (_("Unable to seek to end of file\n"));
5685 str_tab_len
= ftell (file
) - offset
;
5688 if (str_tab_len
< 1)
5691 (_("Unable to determine the length of the dynamic string table\n"));
5695 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5696 _("dynamic string table"));
5697 dynamic_strings_length
= str_tab_len
;
5702 /* And find the syminfo section if available. */
5703 if (dynamic_syminfo
== NULL
)
5705 unsigned long syminsz
= 0;
5707 for (entry
= dynamic_section
;
5708 entry
< dynamic_section
+ dynamic_nent
;
5711 if (entry
->d_tag
== DT_SYMINENT
)
5713 /* Note: these braces are necessary to avoid a syntax
5714 error from the SunOS4 C compiler. */
5715 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5717 else if (entry
->d_tag
== DT_SYMINSZ
)
5718 syminsz
= entry
->d_un
.d_val
;
5719 else if (entry
->d_tag
== DT_SYMINFO
)
5720 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5724 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5726 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5727 Elf_Internal_Syminfo
*syminfo
;
5729 /* There is a syminfo section. Read the data. */
5730 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5731 syminsz
, _("symbol information"));
5735 dynamic_syminfo
= malloc (syminsz
);
5736 if (dynamic_syminfo
== NULL
)
5738 error (_("Out of memory\n"));
5742 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5743 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5744 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5745 ++syminfo
, ++extsym
)
5747 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5748 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5755 if (do_dynamic
&& dynamic_addr
)
5756 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5757 dynamic_addr
, dynamic_nent
);
5759 printf (_(" Tag Type Name/Value\n"));
5761 for (entry
= dynamic_section
;
5762 entry
< dynamic_section
+ dynamic_nent
;
5770 print_vma (entry
->d_tag
, FULL_HEX
);
5771 dtype
= get_dynamic_type (entry
->d_tag
);
5772 printf (" (%s)%*s", dtype
,
5773 ((is_32bit_elf
? 27 : 19)
5774 - (int) strlen (dtype
)),
5778 switch (entry
->d_tag
)
5782 print_dynamic_flags (entry
->d_un
.d_val
);
5792 switch (entry
->d_tag
)
5795 printf (_("Auxiliary library"));
5799 printf (_("Filter library"));
5803 printf (_("Configuration file"));
5807 printf (_("Dependency audit library"));
5811 printf (_("Audit library"));
5815 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5816 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5820 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5829 printf (_("Flags:"));
5831 if (entry
->d_un
.d_val
== 0)
5832 printf (_(" None\n"));
5835 unsigned long int val
= entry
->d_un
.d_val
;
5837 if (val
& DTF_1_PARINIT
)
5839 printf (" PARINIT");
5840 val
^= DTF_1_PARINIT
;
5842 if (val
& DTF_1_CONFEXP
)
5844 printf (" CONFEXP");
5845 val
^= DTF_1_CONFEXP
;
5848 printf (" %lx", val
);
5857 printf (_("Flags:"));
5859 if (entry
->d_un
.d_val
== 0)
5860 printf (_(" None\n"));
5863 unsigned long int val
= entry
->d_un
.d_val
;
5865 if (val
& DF_P1_LAZYLOAD
)
5867 printf (" LAZYLOAD");
5868 val
^= DF_P1_LAZYLOAD
;
5870 if (val
& DF_P1_GROUPPERM
)
5872 printf (" GROUPPERM");
5873 val
^= DF_P1_GROUPPERM
;
5876 printf (" %lx", val
);
5885 printf (_("Flags:"));
5886 if (entry
->d_un
.d_val
== 0)
5887 printf (_(" None\n"));
5890 unsigned long int val
= entry
->d_un
.d_val
;
5897 if (val
& DF_1_GLOBAL
)
5902 if (val
& DF_1_GROUP
)
5907 if (val
& DF_1_NODELETE
)
5909 printf (" NODELETE");
5910 val
^= DF_1_NODELETE
;
5912 if (val
& DF_1_LOADFLTR
)
5914 printf (" LOADFLTR");
5915 val
^= DF_1_LOADFLTR
;
5917 if (val
& DF_1_INITFIRST
)
5919 printf (" INITFIRST");
5920 val
^= DF_1_INITFIRST
;
5922 if (val
& DF_1_NOOPEN
)
5927 if (val
& DF_1_ORIGIN
)
5932 if (val
& DF_1_DIRECT
)
5937 if (val
& DF_1_TRANS
)
5942 if (val
& DF_1_INTERPOSE
)
5944 printf (" INTERPOSE");
5945 val
^= DF_1_INTERPOSE
;
5947 if (val
& DF_1_NODEFLIB
)
5949 printf (" NODEFLIB");
5950 val
^= DF_1_NODEFLIB
;
5952 if (val
& DF_1_NODUMP
)
5957 if (val
& DF_1_CONLFAT
)
5959 printf (" CONLFAT");
5960 val
^= DF_1_CONLFAT
;
5963 printf (" %lx", val
);
5970 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5972 puts (get_dynamic_type (entry
->d_un
.d_val
));
5992 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5998 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5999 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6005 switch (entry
->d_tag
)
6008 printf (_("Shared library: [%s]"), name
);
6010 if (streq (name
, program_interpreter
))
6011 printf (_(" program interpreter"));
6015 printf (_("Library soname: [%s]"), name
);
6019 printf (_("Library rpath: [%s]"), name
);
6023 printf (_("Library runpath: [%s]"), name
);
6027 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6032 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6045 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6049 case DT_INIT_ARRAYSZ
:
6050 case DT_FINI_ARRAYSZ
:
6051 case DT_GNU_CONFLICTSZ
:
6052 case DT_GNU_LIBLISTSZ
:
6055 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6056 printf (" (bytes)\n");
6066 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6079 if (entry
->d_tag
== DT_USED
6080 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6082 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6086 printf (_("Not needed object: [%s]\n"), name
);
6091 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6097 /* The value of this entry is ignored. */
6102 case DT_GNU_PRELINKED
:
6106 time_t time
= entry
->d_un
.d_val
;
6108 tmp
= gmtime (&time
);
6109 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6110 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6111 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6117 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6118 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6123 switch (elf_header
.e_machine
)
6126 case EM_MIPS_RS3_LE
:
6127 dynamic_section_mips_val (entry
);
6130 dynamic_section_parisc_val (entry
);
6133 dynamic_section_ia64_val (entry
);
6136 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6148 get_ver_flags (unsigned int flags
)
6150 static char buff
[32];
6157 if (flags
& VER_FLG_BASE
)
6158 strcat (buff
, "BASE ");
6160 if (flags
& VER_FLG_WEAK
)
6162 if (flags
& VER_FLG_BASE
)
6163 strcat (buff
, "| ");
6165 strcat (buff
, "WEAK ");
6168 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6169 strcat (buff
, "| <unknown>");
6174 /* Display the contents of the version sections. */
6176 process_version_sections (FILE *file
)
6178 Elf_Internal_Shdr
*section
;
6185 for (i
= 0, section
= section_headers
;
6186 i
< elf_header
.e_shnum
;
6189 switch (section
->sh_type
)
6191 case SHT_GNU_verdef
:
6193 Elf_External_Verdef
*edefs
;
6200 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6201 SECTION_NAME (section
), section
->sh_info
);
6203 printf (_(" Addr: 0x"));
6204 printf_vma (section
->sh_addr
);
6205 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6206 (unsigned long) section
->sh_offset
, section
->sh_link
,
6207 SECTION_HEADER_INDEX (section
->sh_link
)
6208 < elf_header
.e_shnum
6209 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6212 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6214 _("version definition section"));
6218 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6221 Elf_External_Verdef
*edef
;
6222 Elf_Internal_Verdef ent
;
6223 Elf_External_Verdaux
*eaux
;
6224 Elf_Internal_Verdaux aux
;
6228 vstart
= ((char *) edefs
) + idx
;
6230 edef
= (Elf_External_Verdef
*) vstart
;
6232 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6233 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6234 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6235 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6236 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6237 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6238 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6240 printf (_(" %#06x: Rev: %d Flags: %s"),
6241 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6243 printf (_(" Index: %d Cnt: %d "),
6244 ent
.vd_ndx
, ent
.vd_cnt
);
6246 vstart
+= ent
.vd_aux
;
6248 eaux
= (Elf_External_Verdaux
*) vstart
;
6250 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6251 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6253 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6254 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6256 printf (_("Name index: %ld\n"), aux
.vda_name
);
6258 isum
= idx
+ ent
.vd_aux
;
6260 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6262 isum
+= aux
.vda_next
;
6263 vstart
+= aux
.vda_next
;
6265 eaux
= (Elf_External_Verdaux
*) vstart
;
6267 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6268 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6270 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6271 printf (_(" %#06x: Parent %d: %s\n"),
6272 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6274 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6275 isum
, j
, aux
.vda_name
);
6285 case SHT_GNU_verneed
:
6287 Elf_External_Verneed
*eneed
;
6293 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6294 SECTION_NAME (section
), section
->sh_info
);
6296 printf (_(" Addr: 0x"));
6297 printf_vma (section
->sh_addr
);
6298 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6299 (unsigned long) section
->sh_offset
, section
->sh_link
,
6300 SECTION_HEADER_INDEX (section
->sh_link
)
6301 < elf_header
.e_shnum
6302 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6305 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6307 _("version need section"));
6311 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6313 Elf_External_Verneed
*entry
;
6314 Elf_Internal_Verneed ent
;
6319 vstart
= ((char *) eneed
) + idx
;
6321 entry
= (Elf_External_Verneed
*) vstart
;
6323 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6324 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6325 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6326 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6327 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6329 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6331 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6332 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6334 printf (_(" File: %lx"), ent
.vn_file
);
6336 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6338 vstart
+= ent
.vn_aux
;
6340 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6342 Elf_External_Vernaux
*eaux
;
6343 Elf_Internal_Vernaux aux
;
6345 eaux
= (Elf_External_Vernaux
*) vstart
;
6347 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6348 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6349 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6350 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6351 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6353 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6354 printf (_(" %#06x: Name: %s"),
6355 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6357 printf (_(" %#06x: Name index: %lx"),
6358 isum
, aux
.vna_name
);
6360 printf (_(" Flags: %s Version: %d\n"),
6361 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6363 isum
+= aux
.vna_next
;
6364 vstart
+= aux
.vna_next
;
6374 case SHT_GNU_versym
:
6376 Elf_Internal_Shdr
*link_section
;
6379 unsigned char *edata
;
6380 unsigned short *data
;
6382 Elf_Internal_Sym
*symbols
;
6383 Elf_Internal_Shdr
*string_sec
;
6386 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6389 link_section
= SECTION_HEADER (section
->sh_link
);
6390 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6392 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6393 >= elf_header
.e_shnum
)
6398 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6400 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6402 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6403 string_sec
->sh_size
, _("version string table"));
6407 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6408 SECTION_NAME (section
), total
);
6410 printf (_(" Addr: "));
6411 printf_vma (section
->sh_addr
);
6412 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6413 (unsigned long) section
->sh_offset
, section
->sh_link
,
6414 SECTION_NAME (link_section
));
6416 off
= offset_from_vma (file
,
6417 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6418 total
* sizeof (short));
6419 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6420 _("version symbol data"));
6427 data
= cmalloc (total
, sizeof (short));
6429 for (cnt
= total
; cnt
--;)
6430 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6435 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6438 int check_def
, check_need
;
6441 printf (" %03x:", cnt
);
6443 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6444 switch (data
[cnt
+ j
])
6447 fputs (_(" 0 (*local*) "), stdout
);
6451 fputs (_(" 1 (*global*) "), stdout
);
6455 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6456 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6460 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6461 >= elf_header
.e_shnum
6462 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6465 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6472 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6474 Elf_Internal_Verneed ivn
;
6475 unsigned long offset
;
6477 offset
= offset_from_vma
6478 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6479 sizeof (Elf_External_Verneed
));
6483 Elf_Internal_Vernaux ivna
;
6484 Elf_External_Verneed evn
;
6485 Elf_External_Vernaux evna
;
6486 unsigned long a_off
;
6488 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6491 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6492 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6494 a_off
= offset
+ ivn
.vn_aux
;
6498 get_data (&evna
, file
, a_off
, sizeof (evna
),
6499 1, _("version need aux (2)"));
6501 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6502 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6504 a_off
+= ivna
.vna_next
;
6506 while (ivna
.vna_other
!= data
[cnt
+ j
]
6507 && ivna
.vna_next
!= 0);
6509 if (ivna
.vna_other
== data
[cnt
+ j
])
6511 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6513 name
= strtab
+ ivna
.vna_name
;
6514 nn
+= printf ("(%s%-*s",
6516 12 - (int) strlen (name
),
6522 offset
+= ivn
.vn_next
;
6524 while (ivn
.vn_next
);
6527 if (check_def
&& data
[cnt
+ j
] != 0x8001
6528 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6530 Elf_Internal_Verdef ivd
;
6531 Elf_External_Verdef evd
;
6532 unsigned long offset
;
6534 offset
= offset_from_vma
6535 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6540 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6543 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6544 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6546 offset
+= ivd
.vd_next
;
6548 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6549 && ivd
.vd_next
!= 0);
6551 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6553 Elf_External_Verdaux evda
;
6554 Elf_Internal_Verdaux ivda
;
6556 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6558 get_data (&evda
, file
,
6559 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6561 _("version def aux"));
6563 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6565 name
= strtab
+ ivda
.vda_name
;
6566 nn
+= printf ("(%s%-*s",
6568 12 - (int) strlen (name
),
6574 printf ("%*c", 18 - nn
, ' ');
6592 printf (_("\nNo version information found in this file.\n"));
6598 get_symbol_binding (unsigned int binding
)
6600 static char buff
[32];
6604 case STB_LOCAL
: return "LOCAL";
6605 case STB_GLOBAL
: return "GLOBAL";
6606 case STB_WEAK
: return "WEAK";
6608 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6609 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6611 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6612 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6614 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6620 get_symbol_type (unsigned int type
)
6622 static char buff
[32];
6626 case STT_NOTYPE
: return "NOTYPE";
6627 case STT_OBJECT
: return "OBJECT";
6628 case STT_FUNC
: return "FUNC";
6629 case STT_SECTION
: return "SECTION";
6630 case STT_FILE
: return "FILE";
6631 case STT_COMMON
: return "COMMON";
6632 case STT_TLS
: return "TLS";
6634 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6636 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6637 return "THUMB_FUNC";
6639 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6642 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6643 return "PARISC_MILLI";
6645 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6647 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6649 if (elf_header
.e_machine
== EM_PARISC
)
6651 if (type
== STT_HP_OPAQUE
)
6653 if (type
== STT_HP_STUB
)
6657 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6660 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6666 get_symbol_visibility (unsigned int visibility
)
6670 case STV_DEFAULT
: return "DEFAULT";
6671 case STV_INTERNAL
: return "INTERNAL";
6672 case STV_HIDDEN
: return "HIDDEN";
6673 case STV_PROTECTED
: return "PROTECTED";
6679 get_symbol_index_type (unsigned int type
)
6681 static char buff
[32];
6685 case SHN_UNDEF
: return "UND";
6686 case SHN_ABS
: return "ABS";
6687 case SHN_COMMON
: return "COM";
6689 if (type
== SHN_IA_64_ANSI_COMMON
6690 && elf_header
.e_machine
== EM_IA_64
6691 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6693 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6694 sprintf (buff
, "PRC[0x%04x]", type
);
6695 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6696 sprintf (buff
, "OS [0x%04x]", type
);
6697 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6698 sprintf (buff
, "RSV[0x%04x]", type
);
6700 sprintf (buff
, "%3d", type
);
6708 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6710 unsigned char *e_data
;
6713 e_data
= cmalloc (number
, ent_size
);
6717 error (_("Out of memory\n"));
6721 if (fread (e_data
, ent_size
, number
, file
) != number
)
6723 error (_("Unable to read in dynamic data\n"));
6727 i_data
= cmalloc (number
, sizeof (*i_data
));
6731 error (_("Out of memory\n"));
6737 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6744 /* Dump the symbol table. */
6746 process_symbol_table (FILE *file
)
6748 Elf_Internal_Shdr
*section
;
6749 bfd_vma nbuckets
= 0;
6750 bfd_vma nchains
= 0;
6751 bfd_vma
*buckets
= NULL
;
6752 bfd_vma
*chains
= NULL
;
6754 if (! do_syms
&& !do_histogram
)
6757 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6760 unsigned char nb
[8];
6761 unsigned char nc
[8];
6762 int hash_ent_size
= 4;
6764 if ((elf_header
.e_machine
== EM_ALPHA
6765 || elf_header
.e_machine
== EM_S390
6766 || elf_header
.e_machine
== EM_S390_OLD
)
6767 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6771 (archive_file_offset
6772 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6773 sizeof nb
+ sizeof nc
)),
6776 error (_("Unable to seek to start of dynamic information"));
6780 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6782 error (_("Failed to read in number of buckets\n"));
6786 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6788 error (_("Failed to read in number of chains\n"));
6792 nbuckets
= byte_get (nb
, hash_ent_size
);
6793 nchains
= byte_get (nc
, hash_ent_size
);
6795 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6796 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6798 if (buckets
== NULL
|| chains
== NULL
)
6803 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6808 printf (_("\nSymbol table for image:\n"));
6810 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6812 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6814 for (hn
= 0; hn
< nbuckets
; hn
++)
6819 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6821 Elf_Internal_Sym
*psym
;
6824 psym
= dynamic_symbols
+ si
;
6826 n
= print_vma (si
, DEC_5
);
6828 fputs (" " + n
, stdout
);
6829 printf (" %3lu: ", hn
);
6830 print_vma (psym
->st_value
, LONG_HEX
);
6832 print_vma (psym
->st_size
, DEC_5
);
6834 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6835 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6836 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6837 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6838 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6839 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6841 printf (" <corrupt: %14ld>", psym
->st_name
);
6846 else if (do_syms
&& !do_using_dynamic
)
6850 for (i
= 0, section
= section_headers
;
6851 i
< elf_header
.e_shnum
;
6855 char *strtab
= NULL
;
6856 unsigned long int strtab_size
= 0;
6857 Elf_Internal_Sym
*symtab
;
6858 Elf_Internal_Sym
*psym
;
6861 if ( section
->sh_type
!= SHT_SYMTAB
6862 && section
->sh_type
!= SHT_DYNSYM
)
6865 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6866 SECTION_NAME (section
),
6867 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6869 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6871 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6873 symtab
= GET_ELF_SYMBOLS (file
, section
);
6877 if (section
->sh_link
== elf_header
.e_shstrndx
)
6879 strtab
= string_table
;
6880 strtab_size
= string_table_length
;
6882 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
6884 Elf_Internal_Shdr
*string_sec
;
6886 string_sec
= SECTION_HEADER (section
->sh_link
);
6888 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6889 1, string_sec
->sh_size
, _("string table"));
6890 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
6893 for (si
= 0, psym
= symtab
;
6894 si
< section
->sh_size
/ section
->sh_entsize
;
6897 printf ("%6d: ", si
);
6898 print_vma (psym
->st_value
, LONG_HEX
);
6900 print_vma (psym
->st_size
, DEC_5
);
6901 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6902 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6903 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6904 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6905 print_symbol (25, psym
->st_name
< strtab_size
6906 ? strtab
+ psym
->st_name
: "<corrupt>");
6908 if (section
->sh_type
== SHT_DYNSYM
&&
6909 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6911 unsigned char data
[2];
6912 unsigned short vers_data
;
6913 unsigned long offset
;
6917 offset
= offset_from_vma
6918 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6919 sizeof data
+ si
* sizeof (vers_data
));
6921 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6922 sizeof (data
), 1, _("version data"));
6924 vers_data
= byte_get (data
, 2);
6926 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
6927 < elf_header
.e_shnum
6928 && SECTION_HEADER (psym
->st_shndx
)->sh_type
6931 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6933 if ((vers_data
& 0x8000) || vers_data
> 1)
6935 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6936 && (is_nobits
|| ! check_def
))
6938 Elf_External_Verneed evn
;
6939 Elf_Internal_Verneed ivn
;
6940 Elf_Internal_Vernaux ivna
;
6942 /* We must test both. */
6943 offset
= offset_from_vma
6944 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6949 unsigned long vna_off
;
6951 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6954 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6955 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6957 vna_off
= offset
+ ivn
.vn_aux
;
6961 Elf_External_Vernaux evna
;
6963 get_data (&evna
, file
, vna_off
,
6965 _("version need aux (3)"));
6967 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6968 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6969 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6971 vna_off
+= ivna
.vna_next
;
6973 while (ivna
.vna_other
!= vers_data
6974 && ivna
.vna_next
!= 0);
6976 if (ivna
.vna_other
== vers_data
)
6979 offset
+= ivn
.vn_next
;
6981 while (ivn
.vn_next
!= 0);
6983 if (ivna
.vna_other
== vers_data
)
6986 ivna
.vna_name
< strtab_size
6987 ? strtab
+ ivna
.vna_name
: "<corrupt>",
6991 else if (! is_nobits
)
6992 error (_("bad dynamic symbol"));
6999 if (vers_data
!= 0x8001
7000 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7002 Elf_Internal_Verdef ivd
;
7003 Elf_Internal_Verdaux ivda
;
7004 Elf_External_Verdaux evda
;
7005 unsigned long offset
;
7007 offset
= offset_from_vma
7009 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7010 sizeof (Elf_External_Verdef
));
7014 Elf_External_Verdef evd
;
7016 get_data (&evd
, file
, offset
, sizeof (evd
),
7017 1, _("version def"));
7019 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7020 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7021 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7023 offset
+= ivd
.vd_next
;
7025 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7026 && ivd
.vd_next
!= 0);
7028 offset
-= ivd
.vd_next
;
7029 offset
+= ivd
.vd_aux
;
7031 get_data (&evda
, file
, offset
, sizeof (evda
),
7032 1, _("version def aux"));
7034 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7036 if (psym
->st_name
!= ivda
.vda_name
)
7037 printf ((vers_data
& 0x8000)
7039 ivda
.vda_name
< strtab_size
7040 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7050 if (strtab
!= string_table
)
7056 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7058 if (do_histogram
&& buckets
!= NULL
)
7060 unsigned long *lengths
;
7061 unsigned long *counts
;
7064 unsigned long maxlength
= 0;
7065 unsigned long nzero_counts
= 0;
7066 unsigned long nsyms
= 0;
7068 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7069 (unsigned long) nbuckets
);
7070 printf (_(" Length Number %% of total Coverage\n"));
7072 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7073 if (lengths
== NULL
)
7075 error (_("Out of memory"));
7078 for (hn
= 0; hn
< nbuckets
; ++hn
)
7080 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7083 if (maxlength
< ++lengths
[hn
])
7088 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7091 error (_("Out of memory"));
7095 for (hn
= 0; hn
< nbuckets
; ++hn
)
7096 ++counts
[lengths
[hn
]];
7101 printf (" 0 %-10lu (%5.1f%%)\n",
7102 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7103 for (i
= 1; i
<= maxlength
; ++i
)
7105 nzero_counts
+= counts
[i
] * i
;
7106 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7107 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7108 (nzero_counts
* 100.0) / nsyms
);
7116 if (buckets
!= NULL
)
7126 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7130 if (dynamic_syminfo
== NULL
7132 /* No syminfo, this is ok. */
7135 /* There better should be a dynamic symbol section. */
7136 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7140 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7141 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7143 printf (_(" Num: Name BoundTo Flags\n"));
7144 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7146 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7148 printf ("%4d: ", i
);
7149 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7150 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7152 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7155 switch (dynamic_syminfo
[i
].si_boundto
)
7157 case SYMINFO_BT_SELF
:
7158 fputs ("SELF ", stdout
);
7160 case SYMINFO_BT_PARENT
:
7161 fputs ("PARENT ", stdout
);
7164 if (dynamic_syminfo
[i
].si_boundto
> 0
7165 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7166 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7168 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7172 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7176 if (flags
& SYMINFO_FLG_DIRECT
)
7178 if (flags
& SYMINFO_FLG_PASSTHRU
)
7179 printf (" PASSTHRU");
7180 if (flags
& SYMINFO_FLG_COPY
)
7182 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7183 printf (" LAZYLOAD");
7191 #ifdef SUPPORT_DISASSEMBLY
7193 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7195 printf (_("\nAssembly dump of section %s\n"),
7196 SECTION_NAME (section
));
7198 /* XXX -- to be done --- XXX */
7205 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7207 bfd_size_type bytes
;
7209 unsigned char *data
;
7210 unsigned char *start
;
7212 bytes
= section
->sh_size
;
7214 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7216 printf (_("\nSection '%s' has no data to dump.\n"),
7217 SECTION_NAME (section
));
7221 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7223 addr
= section
->sh_addr
;
7225 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7238 lbytes
= (bytes
> 16 ? 16 : bytes
);
7240 printf (" 0x%8.8lx ", (unsigned long) addr
);
7242 switch (elf_header
.e_ident
[EI_DATA
])
7246 for (j
= 15; j
>= 0; j
--)
7249 printf ("%2.2x", data
[j
]);
7259 for (j
= 0; j
< 16; j
++)
7262 printf ("%2.2x", data
[j
]);
7272 for (j
= 0; j
< lbytes
; j
++)
7275 if (k
>= ' ' && k
< 0x7f)
7294 static unsigned long int
7295 read_leb128 (unsigned char *data
, unsigned int *length_return
, int sign
)
7297 unsigned long int result
= 0;
7298 unsigned int num_read
= 0;
7299 unsigned int shift
= 0;
7307 result
|= ((unsigned long int) (byte
& 0x7f)) << shift
;
7312 while (byte
& 0x80);
7314 if (length_return
!= NULL
)
7315 *length_return
= num_read
;
7317 if (sign
&& (shift
< 8 * sizeof (result
)) && (byte
& 0x40))
7318 result
|= -1L << shift
;
7323 typedef struct State_Machine_Registers
7325 unsigned long address
;
7328 unsigned int column
;
7332 /* This variable hold the number of the last entry seen
7333 in the File Table. */
7334 unsigned int last_file_entry
;
7337 static SMR state_machine_regs
;
7340 reset_state_machine (int is_stmt
)
7342 state_machine_regs
.address
= 0;
7343 state_machine_regs
.file
= 1;
7344 state_machine_regs
.line
= 1;
7345 state_machine_regs
.column
= 0;
7346 state_machine_regs
.is_stmt
= is_stmt
;
7347 state_machine_regs
.basic_block
= 0;
7348 state_machine_regs
.end_sequence
= 0;
7349 state_machine_regs
.last_file_entry
= 0;
7352 /* Handled an extend line op.
7353 Returns the number of bytes read. */
7356 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
7358 unsigned char op_code
;
7359 unsigned int bytes_read
;
7361 unsigned char *name
;
7364 len
= read_leb128 (data
, & bytes_read
, 0);
7369 warn (_("badly formed extended line op encountered!\n"));
7376 printf (_(" Extended opcode %d: "), op_code
);
7380 case DW_LNE_end_sequence
:
7381 printf (_("End of Sequence\n\n"));
7382 reset_state_machine (is_stmt
);
7385 case DW_LNE_set_address
:
7386 adr
= byte_get (data
, pointer_size
);
7387 printf (_("set Address to 0x%lx\n"), adr
);
7388 state_machine_regs
.address
= adr
;
7391 case DW_LNE_define_file
:
7392 printf (_(" define new File Table entry\n"));
7393 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7395 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7397 data
+= strlen ((char *) data
) + 1;
7398 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7400 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7402 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7403 printf (_("%s\n\n"), name
);
7407 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
7414 static const char *debug_str_contents
;
7415 static bfd_vma debug_str_size
;
7418 load_debug_str (FILE *file
)
7420 Elf_Internal_Shdr
*sec
;
7422 /* If it is already loaded, do nothing. */
7423 if (debug_str_contents
!= NULL
)
7426 /* Locate the .debug_str section. */
7427 sec
= find_section (".debug_str");
7431 debug_str_size
= sec
->sh_size
;
7433 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7434 _("debug_str section data"));
7438 free_debug_str (void)
7440 if (debug_str_contents
== NULL
)
7443 free ((char *) debug_str_contents
);
7444 debug_str_contents
= NULL
;
7449 fetch_indirect_string (unsigned long offset
)
7451 if (debug_str_contents
== NULL
)
7452 return _("<no .debug_str section>");
7454 if (offset
> debug_str_size
)
7456 warn (_("DW_FORM_strp offset too big: %x\n"), offset
);
7457 return _("<offset is too big>");
7460 return debug_str_contents
+ offset
;
7463 static const char *debug_loc_contents
;
7464 static bfd_vma debug_loc_size
;
7467 load_debug_loc (FILE *file
)
7469 Elf_Internal_Shdr
*sec
;
7471 /* If it is already loaded, do nothing. */
7472 if (debug_loc_contents
!= NULL
)
7475 /* Locate the .debug_loc section. */
7476 sec
= find_section (".debug_loc");
7480 debug_loc_size
= sec
->sh_size
;
7482 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7483 _("debug_loc section data"));
7487 free_debug_loc (void)
7489 if (debug_loc_contents
== NULL
)
7492 free ((char *) debug_loc_contents
);
7493 debug_loc_contents
= NULL
;
7497 static const char * debug_range_contents
;
7498 static unsigned long debug_range_size
;
7501 load_debug_range (FILE *file
)
7503 Elf_Internal_Shdr
*sec
;
7505 /* If it is already loaded, do nothing. */
7506 if (debug_range_contents
!= NULL
)
7509 /* Locate the .debug_ranges section. */
7510 sec
= find_section (".debug_ranges");
7514 debug_range_size
= sec
->sh_size
;
7516 debug_range_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7517 _("debug_range section data"));
7521 free_debug_range (void)
7523 if (debug_range_contents
== NULL
)
7526 free ((char *) debug_range_contents
);
7527 debug_range_contents
= NULL
;
7528 debug_range_size
= 0;
7531 /* Apply addends of RELA relocations. */
7534 debug_apply_rela_addends (FILE *file
,
7535 Elf_Internal_Shdr
*section
,
7537 unsigned char *sec_data
,
7538 unsigned char *start
,
7541 Elf_Internal_Shdr
*relsec
;
7543 if (end
- start
< reloc_size
)
7546 for (relsec
= section_headers
;
7547 relsec
< section_headers
+ elf_header
.e_shnum
;
7550 unsigned long nrelas
;
7551 Elf_Internal_Rela
*rela
, *rp
;
7552 Elf_Internal_Shdr
*symsec
;
7553 Elf_Internal_Sym
*symtab
;
7554 Elf_Internal_Sym
*sym
;
7556 if (relsec
->sh_type
!= SHT_RELA
7557 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7558 || SECTION_HEADER (relsec
->sh_info
) != section
7559 || relsec
->sh_size
== 0
7560 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7563 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7567 symsec
= SECTION_HEADER (relsec
->sh_link
);
7568 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7570 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7574 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
7575 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
7576 loc
= sec_data
+ rp
->r_offset
;
7582 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7584 if (ELF32_R_SYM (rp
->r_info
) != 0
7585 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7586 /* Relocations against object symbols can happen,
7587 eg when referencing a global array. For an
7588 example of this see the _clz.o binary in libgcc.a. */
7589 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7591 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7592 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7593 SECTION_NAME (section
));
7599 /* In MIPS little-endian objects, r_info isn't really a
7600 64-bit little-endian value: it has a 32-bit little-endian
7601 symbol index followed by four individual byte fields.
7602 Reorder INFO accordingly. */
7603 if (elf_header
.e_machine
== EM_MIPS
7604 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7605 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7606 | ((rp
->r_info
>> 56) & 0xff)
7607 | ((rp
->r_info
>> 40) & 0xff00)
7608 | ((rp
->r_info
>> 24) & 0xff0000)
7609 | ((rp
->r_info
>> 8) & 0xff000000));
7611 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7613 if (ELF64_R_SYM (rp
->r_info
) != 0
7614 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7615 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7617 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7618 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7619 SECTION_NAME (section
));
7624 byte_put (loc
, rp
->r_addend
, reloc_size
);
7634 /* FIXME: There are better and more efficient ways to handle
7635 these structures. For now though, I just want something that
7636 is simple to implement. */
7637 typedef struct abbrev_attr
7639 unsigned long attribute
;
7641 struct abbrev_attr
*next
;
7645 typedef struct abbrev_entry
7647 unsigned long entry
;
7650 struct abbrev_attr
*first_attr
;
7651 struct abbrev_attr
*last_attr
;
7652 struct abbrev_entry
*next
;
7656 static abbrev_entry
*first_abbrev
= NULL
;
7657 static abbrev_entry
*last_abbrev
= NULL
;
7662 abbrev_entry
*abbrev
;
7664 for (abbrev
= first_abbrev
; abbrev
;)
7666 abbrev_entry
*next
= abbrev
->next
;
7669 for (attr
= abbrev
->first_attr
; attr
;)
7671 abbrev_attr
*next
= attr
->next
;
7681 last_abbrev
= first_abbrev
= NULL
;
7685 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7687 abbrev_entry
*entry
;
7689 entry
= malloc (sizeof (*entry
));
7695 entry
->entry
= number
;
7697 entry
->children
= children
;
7698 entry
->first_attr
= NULL
;
7699 entry
->last_attr
= NULL
;
7702 if (first_abbrev
== NULL
)
7703 first_abbrev
= entry
;
7705 last_abbrev
->next
= entry
;
7707 last_abbrev
= entry
;
7711 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7715 attr
= malloc (sizeof (*attr
));
7721 attr
->attribute
= attribute
;
7725 if (last_abbrev
->first_attr
== NULL
)
7726 last_abbrev
->first_attr
= attr
;
7728 last_abbrev
->last_attr
->next
= attr
;
7730 last_abbrev
->last_attr
= attr
;
7733 /* Processes the (partial) contents of a .debug_abbrev section.
7734 Returns NULL if the end of the section was encountered.
7735 Returns the address after the last byte read if the end of
7736 an abbreviation set was found. */
7738 static unsigned char *
7739 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7741 if (first_abbrev
!= NULL
)
7746 unsigned int bytes_read
;
7747 unsigned long entry
;
7749 unsigned long attribute
;
7752 entry
= read_leb128 (start
, & bytes_read
, 0);
7753 start
+= bytes_read
;
7755 /* A single zero is supposed to end the section according
7756 to the standard. If there's more, then signal that to
7759 return start
== end
? NULL
: start
;
7761 tag
= read_leb128 (start
, & bytes_read
, 0);
7762 start
+= bytes_read
;
7764 children
= *start
++;
7766 add_abbrev (entry
, tag
, children
);
7772 attribute
= read_leb128 (start
, & bytes_read
, 0);
7773 start
+= bytes_read
;
7775 form
= read_leb128 (start
, & bytes_read
, 0);
7776 start
+= bytes_read
;
7779 add_abbrev_attr (attribute
, form
);
7781 while (attribute
!= 0);
7788 get_TAG_name (unsigned long tag
)
7792 case DW_TAG_padding
: return "DW_TAG_padding";
7793 case DW_TAG_array_type
: return "DW_TAG_array_type";
7794 case DW_TAG_class_type
: return "DW_TAG_class_type";
7795 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7796 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7797 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7798 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7799 case DW_TAG_label
: return "DW_TAG_label";
7800 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7801 case DW_TAG_member
: return "DW_TAG_member";
7802 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7803 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7804 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7805 case DW_TAG_string_type
: return "DW_TAG_string_type";
7806 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7807 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7808 case DW_TAG_typedef
: return "DW_TAG_typedef";
7809 case DW_TAG_union_type
: return "DW_TAG_union_type";
7810 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7811 case DW_TAG_variant
: return "DW_TAG_variant";
7812 case DW_TAG_common_block
: return "DW_TAG_common_block";
7813 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7814 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7815 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7816 case DW_TAG_module
: return "DW_TAG_module";
7817 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7818 case DW_TAG_set_type
: return "DW_TAG_set_type";
7819 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7820 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7821 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7822 case DW_TAG_base_type
: return "DW_TAG_base_type";
7823 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7824 case DW_TAG_const_type
: return "DW_TAG_const_type";
7825 case DW_TAG_constant
: return "DW_TAG_constant";
7826 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7827 case DW_TAG_file_type
: return "DW_TAG_file_type";
7828 case DW_TAG_friend
: return "DW_TAG_friend";
7829 case DW_TAG_namelist
: return "DW_TAG_namelist";
7830 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7831 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7832 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7833 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7834 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7835 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7836 case DW_TAG_try_block
: return "DW_TAG_try_block";
7837 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7838 case DW_TAG_variable
: return "DW_TAG_variable";
7839 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7840 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7841 case DW_TAG_format_label
: return "DW_TAG_format_label";
7842 case DW_TAG_function_template
: return "DW_TAG_function_template";
7843 case DW_TAG_class_template
: return "DW_TAG_class_template";
7844 /* DWARF 2.1 values. */
7845 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7846 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7847 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7848 case DW_TAG_namespace
: return "DW_TAG_namespace";
7849 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7850 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7851 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7852 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7854 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7855 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7856 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7859 static char buffer
[100];
7861 snprintf (buffer
, sizeof (buffer
), _("Unknown TAG value: %lx"), tag
);
7868 get_FORM_name (unsigned long form
)
7872 case DW_FORM_addr
: return "DW_FORM_addr";
7873 case DW_FORM_block2
: return "DW_FORM_block2";
7874 case DW_FORM_block4
: return "DW_FORM_block4";
7875 case DW_FORM_data2
: return "DW_FORM_data2";
7876 case DW_FORM_data4
: return "DW_FORM_data4";
7877 case DW_FORM_data8
: return "DW_FORM_data8";
7878 case DW_FORM_string
: return "DW_FORM_string";
7879 case DW_FORM_block
: return "DW_FORM_block";
7880 case DW_FORM_block1
: return "DW_FORM_block1";
7881 case DW_FORM_data1
: return "DW_FORM_data1";
7882 case DW_FORM_flag
: return "DW_FORM_flag";
7883 case DW_FORM_sdata
: return "DW_FORM_sdata";
7884 case DW_FORM_strp
: return "DW_FORM_strp";
7885 case DW_FORM_udata
: return "DW_FORM_udata";
7886 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7887 case DW_FORM_ref1
: return "DW_FORM_ref1";
7888 case DW_FORM_ref2
: return "DW_FORM_ref2";
7889 case DW_FORM_ref4
: return "DW_FORM_ref4";
7890 case DW_FORM_ref8
: return "DW_FORM_ref8";
7891 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7892 case DW_FORM_indirect
: return "DW_FORM_indirect";
7895 static char buffer
[100];
7897 snprintf (buffer
, sizeof (buffer
), _("Unknown FORM value: %lx"), form
);
7903 static unsigned char *
7904 display_block (unsigned char *data
, unsigned long length
)
7906 printf (_(" %lu byte block: "), length
);
7909 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7915 decode_location_expression (unsigned char * data
,
7916 unsigned int pointer_size
,
7917 unsigned long length
,
7918 unsigned long cu_offset
)
7921 unsigned int bytes_read
;
7922 unsigned long uvalue
;
7923 unsigned char *end
= data
+ length
;
7924 int need_frame_base
= 0;
7933 printf ("DW_OP_addr: %lx",
7934 (unsigned long) byte_get (data
, pointer_size
));
7935 data
+= pointer_size
;
7938 printf ("DW_OP_deref");
7941 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7944 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
7947 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7951 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
7955 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7959 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
7963 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7964 (unsigned long) byte_get (data
+ 4, 4));
7968 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7969 (long) byte_get (data
+ 4, 4));
7973 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7977 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7981 printf ("DW_OP_dup");
7984 printf ("DW_OP_drop");
7987 printf ("DW_OP_over");
7990 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7993 printf ("DW_OP_swap");
7996 printf ("DW_OP_rot");
7999 printf ("DW_OP_xderef");
8002 printf ("DW_OP_abs");
8005 printf ("DW_OP_and");
8008 printf ("DW_OP_div");
8011 printf ("DW_OP_minus");
8014 printf ("DW_OP_mod");
8017 printf ("DW_OP_mul");
8020 printf ("DW_OP_neg");
8023 printf ("DW_OP_not");
8026 printf ("DW_OP_or");
8029 printf ("DW_OP_plus");
8031 case DW_OP_plus_uconst
:
8032 printf ("DW_OP_plus_uconst: %lu",
8033 read_leb128 (data
, &bytes_read
, 0));
8037 printf ("DW_OP_shl");
8040 printf ("DW_OP_shr");
8043 printf ("DW_OP_shra");
8046 printf ("DW_OP_xor");
8049 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
8053 printf ("DW_OP_eq");
8056 printf ("DW_OP_ge");
8059 printf ("DW_OP_gt");
8062 printf ("DW_OP_le");
8065 printf ("DW_OP_lt");
8068 printf ("DW_OP_ne");
8071 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
8107 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
8142 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
8177 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
8178 read_leb128 (data
, &bytes_read
, 1));
8183 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
8187 need_frame_base
= 1;
8188 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
8192 uvalue
= read_leb128 (data
, &bytes_read
, 0);
8194 printf ("DW_OP_bregx: %lu %ld", uvalue
,
8195 read_leb128 (data
, &bytes_read
, 1));
8199 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
8202 case DW_OP_deref_size
:
8203 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
8205 case DW_OP_xderef_size
:
8206 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
8209 printf ("DW_OP_nop");
8212 /* DWARF 3 extensions. */
8213 case DW_OP_push_object_address
:
8214 printf ("DW_OP_push_object_address");
8217 /* XXX: Strictly speaking for 64-bit DWARF3 files
8218 this ought to be an 8-byte wide computation. */
8219 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2) + cu_offset
);
8223 /* XXX: Strictly speaking for 64-bit DWARF3 files
8224 this ought to be an 8-byte wide computation. */
8225 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4) + cu_offset
);
8228 case DW_OP_call_ref
:
8229 printf ("DW_OP_call_ref");
8232 /* GNU extensions. */
8233 case DW_OP_GNU_push_tls_address
:
8234 printf ("DW_OP_GNU_push_tls_address");
8238 if (op
>= DW_OP_lo_user
8239 && op
<= DW_OP_hi_user
)
8240 printf (_("(User defined location op)"));
8242 printf (_("(Unknown location op)"));
8243 /* No way to tell where the next op is, so just bail. */
8244 return need_frame_base
;
8247 /* Separate the ops. */
8252 return need_frame_base
;
8255 /* This structure records the information that
8256 we extract from the.debug_info section. */
8259 unsigned int pointer_size
;
8260 unsigned long cu_offset
;
8261 unsigned long base_address
;
8262 /* This is an array of offsets to the location list table. */
8263 unsigned long *loc_offsets
;
8264 int *have_frame_base
;
8265 unsigned int num_loc_offsets
;
8266 unsigned int max_loc_offsets
;
8267 unsigned long *range_lists
;
8268 unsigned int num_range_lists
;
8269 unsigned int max_range_lists
;
8273 static debug_info
* debug_information
= NULL
;
8274 static unsigned int num_debug_info_entries
= 0;
8275 static unsigned int last_pointer_size
= 0;
8276 static int warned_about_missing_comp_units
= FALSE
;
8278 static unsigned char *
8279 read_and_display_attr_value (unsigned long attribute
,
8281 unsigned char *data
,
8282 unsigned long cu_offset
,
8283 unsigned long pointer_size
,
8284 unsigned long offset_size
,
8286 debug_info
*debug_info_p
,
8289 unsigned long uvalue
= 0;
8290 unsigned char *block_start
= NULL
;
8291 unsigned int bytes_read
;
8298 case DW_FORM_ref_addr
:
8299 if (dwarf_version
== 2)
8301 uvalue
= byte_get (data
, pointer_size
);
8302 data
+= pointer_size
;
8304 else if (dwarf_version
== 3)
8306 uvalue
= byte_get (data
, offset_size
);
8307 data
+= offset_size
;
8311 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8316 uvalue
= byte_get (data
, pointer_size
);
8317 data
+= pointer_size
;
8321 uvalue
= byte_get (data
, offset_size
);
8322 data
+= offset_size
;
8328 uvalue
= byte_get (data
++, 1);
8333 uvalue
= byte_get (data
, 2);
8339 uvalue
= byte_get (data
, 4);
8344 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8348 case DW_FORM_ref_udata
:
8350 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8354 case DW_FORM_indirect
:
8355 form
= read_leb128 (data
, & bytes_read
, 0);
8358 printf (" %s", get_FORM_name (form
));
8359 return read_and_display_attr_value (attribute
, form
, data
,
8360 cu_offset
, pointer_size
,
8361 offset_size
, dwarf_version
,
8362 debug_info_p
, do_loc
);
8367 case DW_FORM_ref_addr
:
8369 printf (" <#%lx>", uvalue
);
8375 case DW_FORM_ref_udata
:
8377 printf (" <%lx>", uvalue
+ cu_offset
);
8383 printf (" %#lx", uvalue
);
8392 printf (" %ld", uvalue
);
8399 uvalue
= byte_get (data
, 4);
8400 printf (" %lx", uvalue
);
8401 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8403 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8404 && num_debug_info_entries
== 0)
8406 if (sizeof (uvalue
) == 8)
8407 uvalue
= byte_get (data
, 8);
8409 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8414 case DW_FORM_string
:
8416 printf (" %s", data
);
8417 data
+= strlen ((char *) data
) + 1;
8421 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8422 block_start
= data
+ bytes_read
;
8424 data
= block_start
+ uvalue
;
8426 data
= display_block (block_start
, uvalue
);
8429 case DW_FORM_block1
:
8430 uvalue
= byte_get (data
, 1);
8431 block_start
= data
+ 1;
8433 data
= block_start
+ uvalue
;
8435 data
= display_block (block_start
, uvalue
);
8438 case DW_FORM_block2
:
8439 uvalue
= byte_get (data
, 2);
8440 block_start
= data
+ 2;
8442 data
= block_start
+ uvalue
;
8444 data
= display_block (block_start
, uvalue
);
8447 case DW_FORM_block4
:
8448 uvalue
= byte_get (data
, 4);
8449 block_start
= data
+ 4;
8451 data
= block_start
+ uvalue
;
8453 data
= display_block (block_start
, uvalue
);
8458 printf (_(" (indirect string, offset: 0x%lx): %s"),
8459 uvalue
, fetch_indirect_string (uvalue
));
8462 case DW_FORM_indirect
:
8463 /* Handled above. */
8467 warn (_("Unrecognized form: %d\n"), form
);
8471 /* For some attributes we can display further information. */
8472 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8473 && num_debug_info_entries
== 0)
8477 case DW_AT_frame_base
:
8478 have_frame_base
= 1;
8479 case DW_AT_location
:
8480 case DW_AT_data_member_location
:
8481 case DW_AT_vtable_elem_location
:
8482 case DW_AT_allocated
:
8483 case DW_AT_associated
:
8484 case DW_AT_data_location
:
8486 case DW_AT_upper_bound
:
8487 case DW_AT_lower_bound
:
8488 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8490 /* Process location list. */
8491 unsigned int max
= debug_info_p
->max_loc_offsets
;
8492 unsigned int num
= debug_info_p
->num_loc_offsets
;
8494 if (max
== 0 || num
>= max
)
8497 debug_info_p
->loc_offsets
8498 = xcrealloc (debug_info_p
->loc_offsets
,
8499 max
, sizeof (*debug_info_p
->loc_offsets
));
8500 debug_info_p
->have_frame_base
8501 = xcrealloc (debug_info_p
->have_frame_base
,
8502 max
, sizeof (*debug_info_p
->have_frame_base
));
8503 debug_info_p
->max_loc_offsets
= max
;
8505 debug_info_p
->loc_offsets
[num
] = uvalue
;
8506 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
8507 debug_info_p
->num_loc_offsets
++;
8512 if (need_base_address
)
8513 debug_info_p
->base_address
= uvalue
;
8517 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8519 /* Process range list. */
8520 unsigned int max
= debug_info_p
->max_range_lists
;
8521 unsigned int num
= debug_info_p
->num_range_lists
;
8523 if (max
== 0 || num
>= max
)
8526 debug_info_p
->range_lists
8527 = xcrealloc (debug_info_p
->range_lists
,
8528 max
, sizeof (*debug_info_p
->range_lists
));
8529 debug_info_p
->max_range_lists
= max
;
8531 debug_info_p
->range_lists
[num
] = uvalue
;
8532 debug_info_p
->num_range_lists
++;
8551 case DW_INL_not_inlined
:
8552 printf (_("(not inlined)"));
8554 case DW_INL_inlined
:
8555 printf (_("(inlined)"));
8557 case DW_INL_declared_not_inlined
:
8558 printf (_("(declared as inline but ignored)"));
8560 case DW_INL_declared_inlined
:
8561 printf (_("(declared as inline and inlined)"));
8564 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8569 case DW_AT_language
:
8572 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8573 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8574 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8575 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8576 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8577 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8578 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8579 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8580 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8581 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8582 /* DWARF 2.1 values. */
8583 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8584 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8585 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8586 /* MIPS extension. */
8587 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8588 /* UPC extension. */
8589 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8591 printf ("(Unknown: %lx)", uvalue
);
8596 case DW_AT_encoding
:
8599 case DW_ATE_void
: printf ("(void)"); break;
8600 case DW_ATE_address
: printf ("(machine address)"); break;
8601 case DW_ATE_boolean
: printf ("(boolean)"); break;
8602 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8603 case DW_ATE_float
: printf ("(float)"); break;
8604 case DW_ATE_signed
: printf ("(signed)"); break;
8605 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8606 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8607 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8608 /* DWARF 2.1 value. */
8609 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8610 /* GNU extension. */
8611 case DW_ATE_GNU_decimal_float
: printf ("(decimal float)"); break;
8613 if (uvalue
>= DW_ATE_lo_user
8614 && uvalue
<= DW_ATE_hi_user
)
8615 printf ("(user defined type)");
8617 printf ("(unknown type)");
8622 case DW_AT_accessibility
:
8625 case DW_ACCESS_public
: printf ("(public)"); break;
8626 case DW_ACCESS_protected
: printf ("(protected)"); break;
8627 case DW_ACCESS_private
: printf ("(private)"); break;
8629 printf ("(unknown accessibility)");
8634 case DW_AT_visibility
:
8637 case DW_VIS_local
: printf ("(local)"); break;
8638 case DW_VIS_exported
: printf ("(exported)"); break;
8639 case DW_VIS_qualified
: printf ("(qualified)"); break;
8640 default: printf ("(unknown visibility)"); break;
8644 case DW_AT_virtuality
:
8647 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8648 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8649 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8650 default: printf ("(unknown virtuality)"); break;
8654 case DW_AT_identifier_case
:
8657 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8658 case DW_ID_up_case
: printf ("(up_case)"); break;
8659 case DW_ID_down_case
: printf ("(down_case)"); break;
8660 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8661 default: printf ("(unknown case)"); break;
8665 case DW_AT_calling_convention
:
8668 case DW_CC_normal
: printf ("(normal)"); break;
8669 case DW_CC_program
: printf ("(program)"); break;
8670 case DW_CC_nocall
: printf ("(nocall)"); break;
8672 if (uvalue
>= DW_CC_lo_user
8673 && uvalue
<= DW_CC_hi_user
)
8674 printf ("(user defined)");
8676 printf ("(unknown convention)");
8680 case DW_AT_ordering
:
8683 case -1: printf ("(undefined)"); break;
8684 case 0: printf ("(row major)"); break;
8685 case 1: printf ("(column major)"); break;
8689 case DW_AT_frame_base
:
8690 have_frame_base
= 1;
8691 case DW_AT_location
:
8692 case DW_AT_data_member_location
:
8693 case DW_AT_vtable_elem_location
:
8694 case DW_AT_allocated
:
8695 case DW_AT_associated
:
8696 case DW_AT_data_location
:
8698 case DW_AT_upper_bound
:
8699 case DW_AT_lower_bound
:
8702 int need_frame_base
;
8705 need_frame_base
= decode_location_expression (block_start
,
8710 if (need_frame_base
&& !have_frame_base
)
8711 printf (_(" [without DW_AT_frame_base]"));
8713 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8714 printf (_("(location list)"));
8726 get_AT_name (unsigned long attribute
)
8730 case DW_AT_sibling
: return "DW_AT_sibling";
8731 case DW_AT_location
: return "DW_AT_location";
8732 case DW_AT_name
: return "DW_AT_name";
8733 case DW_AT_ordering
: return "DW_AT_ordering";
8734 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
8735 case DW_AT_byte_size
: return "DW_AT_byte_size";
8736 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
8737 case DW_AT_bit_size
: return "DW_AT_bit_size";
8738 case DW_AT_element_list
: return "DW_AT_element_list";
8739 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
8740 case DW_AT_low_pc
: return "DW_AT_low_pc";
8741 case DW_AT_high_pc
: return "DW_AT_high_pc";
8742 case DW_AT_language
: return "DW_AT_language";
8743 case DW_AT_member
: return "DW_AT_member";
8744 case DW_AT_discr
: return "DW_AT_discr";
8745 case DW_AT_discr_value
: return "DW_AT_discr_value";
8746 case DW_AT_visibility
: return "DW_AT_visibility";
8747 case DW_AT_import
: return "DW_AT_import";
8748 case DW_AT_string_length
: return "DW_AT_string_length";
8749 case DW_AT_common_reference
: return "DW_AT_common_reference";
8750 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
8751 case DW_AT_const_value
: return "DW_AT_const_value";
8752 case DW_AT_containing_type
: return "DW_AT_containing_type";
8753 case DW_AT_default_value
: return "DW_AT_default_value";
8754 case DW_AT_inline
: return "DW_AT_inline";
8755 case DW_AT_is_optional
: return "DW_AT_is_optional";
8756 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
8757 case DW_AT_producer
: return "DW_AT_producer";
8758 case DW_AT_prototyped
: return "DW_AT_prototyped";
8759 case DW_AT_return_addr
: return "DW_AT_return_addr";
8760 case DW_AT_start_scope
: return "DW_AT_start_scope";
8761 case DW_AT_stride_size
: return "DW_AT_stride_size";
8762 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
8763 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
8764 case DW_AT_accessibility
: return "DW_AT_accessibility";
8765 case DW_AT_address_class
: return "DW_AT_address_class";
8766 case DW_AT_artificial
: return "DW_AT_artificial";
8767 case DW_AT_base_types
: return "DW_AT_base_types";
8768 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
8769 case DW_AT_count
: return "DW_AT_count";
8770 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
8771 case DW_AT_decl_column
: return "DW_AT_decl_column";
8772 case DW_AT_decl_file
: return "DW_AT_decl_file";
8773 case DW_AT_decl_line
: return "DW_AT_decl_line";
8774 case DW_AT_declaration
: return "DW_AT_declaration";
8775 case DW_AT_discr_list
: return "DW_AT_discr_list";
8776 case DW_AT_encoding
: return "DW_AT_encoding";
8777 case DW_AT_external
: return "DW_AT_external";
8778 case DW_AT_frame_base
: return "DW_AT_frame_base";
8779 case DW_AT_friend
: return "DW_AT_friend";
8780 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
8781 case DW_AT_macro_info
: return "DW_AT_macro_info";
8782 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
8783 case DW_AT_priority
: return "DW_AT_priority";
8784 case DW_AT_segment
: return "DW_AT_segment";
8785 case DW_AT_specification
: return "DW_AT_specification";
8786 case DW_AT_static_link
: return "DW_AT_static_link";
8787 case DW_AT_type
: return "DW_AT_type";
8788 case DW_AT_use_location
: return "DW_AT_use_location";
8789 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
8790 case DW_AT_virtuality
: return "DW_AT_virtuality";
8791 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
8792 /* DWARF 2.1 values. */
8793 case DW_AT_allocated
: return "DW_AT_allocated";
8794 case DW_AT_associated
: return "DW_AT_associated";
8795 case DW_AT_data_location
: return "DW_AT_data_location";
8796 case DW_AT_stride
: return "DW_AT_stride";
8797 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
8798 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
8799 case DW_AT_extension
: return "DW_AT_extension";
8800 case DW_AT_ranges
: return "DW_AT_ranges";
8801 case DW_AT_trampoline
: return "DW_AT_trampoline";
8802 case DW_AT_call_column
: return "DW_AT_call_column";
8803 case DW_AT_call_file
: return "DW_AT_call_file";
8804 case DW_AT_call_line
: return "DW_AT_call_line";
8805 /* SGI/MIPS extensions. */
8806 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
8807 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
8808 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
8809 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
8810 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
8811 case DW_AT_MIPS_software_pipeline_depth
:
8812 return "DW_AT_MIPS_software_pipeline_depth";
8813 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
8814 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
8815 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
8816 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
8817 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
8818 /* GNU extensions. */
8819 case DW_AT_sf_names
: return "DW_AT_sf_names";
8820 case DW_AT_src_info
: return "DW_AT_src_info";
8821 case DW_AT_mac_info
: return "DW_AT_mac_info";
8822 case DW_AT_src_coords
: return "DW_AT_src_coords";
8823 case DW_AT_body_begin
: return "DW_AT_body_begin";
8824 case DW_AT_body_end
: return "DW_AT_body_end";
8825 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
8826 /* UPC extension. */
8827 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
8830 static char buffer
[100];
8832 snprintf (buffer
, sizeof (buffer
), _("Unknown AT value: %lx"),
8839 static unsigned char *
8840 read_and_display_attr (unsigned long attribute
,
8842 unsigned char *data
,
8843 unsigned long cu_offset
,
8844 unsigned long pointer_size
,
8845 unsigned long offset_size
,
8847 debug_info
*debug_info_p
,
8851 printf (" %-18s:", get_AT_name (attribute
));
8852 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8853 pointer_size
, offset_size
,
8854 dwarf_version
, debug_info_p
,
8862 /* Process the contents of a .debug_info section. If do_loc is non-zero
8863 then we are scanning for location lists and we do not want to display
8864 anything to the user. */
8867 process_debug_info (Elf_Internal_Shdr
*section
, unsigned char *start
,
8868 FILE *file
, int do_loc
)
8870 unsigned char *end
= start
+ section
->sh_size
;
8871 unsigned char *section_begin
;
8873 unsigned int num_units
= 0;
8875 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8876 && num_debug_info_entries
== 0)
8878 unsigned long length
;
8880 /* First scan the section to get the number of comp units. */
8881 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
8884 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8885 will be the length. For a 64-bit DWARF section, it'll be
8886 the escape code 0xffffffff followed by an 8 byte length. */
8887 length
= byte_get (section_begin
, 4);
8889 if (length
== 0xffffffff)
8891 length
= byte_get (section_begin
+ 4, 8);
8892 section_begin
+= length
+ 12;
8895 section_begin
+= length
+ 4;
8900 error (_("No comp units in .debug_info section ?"));
8904 /* Then allocate an array to hold the information. */
8905 debug_information
= cmalloc (num_units
,
8906 sizeof (* debug_information
));
8907 if (debug_information
== NULL
)
8909 error (_("Not enough memory for a debug info array of %u entries"),
8917 printf (_("The section %s contains:\n\n"),
8918 SECTION_NAME (section
));
8920 load_debug_str (file
);
8921 load_debug_loc (file
);
8922 load_debug_range (file
);
8925 for (section_begin
= start
, unit
= 0; start
< end
; unit
++)
8927 DWARF2_Internal_CompUnit compunit
;
8928 unsigned char *hdrptr
;
8929 unsigned char *cu_abbrev_offset_ptr
;
8930 unsigned char *tags
;
8932 unsigned long cu_offset
;
8934 int initial_length_size
;
8938 compunit
.cu_length
= byte_get (hdrptr
, 4);
8941 if (compunit
.cu_length
== 0xffffffff)
8943 compunit
.cu_length
= byte_get (hdrptr
, 8);
8946 initial_length_size
= 12;
8951 initial_length_size
= 4;
8954 compunit
.cu_version
= byte_get (hdrptr
, 2);
8957 cu_offset
= start
- section_begin
;
8958 start
+= compunit
.cu_length
+ initial_length_size
;
8960 if (elf_header
.e_type
== ET_REL
8961 && !debug_apply_rela_addends (file
, section
, offset_size
,
8962 section_begin
, hdrptr
, start
))
8965 cu_abbrev_offset_ptr
= hdrptr
;
8966 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8967 hdrptr
+= offset_size
;
8969 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8971 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8972 && num_debug_info_entries
== 0)
8974 debug_information
[unit
].cu_offset
= cu_offset
;
8975 debug_information
[unit
].pointer_size
8976 = compunit
.cu_pointer_size
;
8977 debug_information
[unit
].base_address
= 0;
8978 debug_information
[unit
].loc_offsets
= NULL
;
8979 debug_information
[unit
].have_frame_base
= NULL
;
8980 debug_information
[unit
].max_loc_offsets
= 0;
8981 debug_information
[unit
].num_loc_offsets
= 0;
8982 debug_information
[unit
].range_lists
= NULL
;
8983 debug_information
[unit
].max_range_lists
= 0;
8984 debug_information
[unit
].num_range_lists
= 0;
8991 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset
);
8992 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8993 printf (_(" Version: %d\n"), compunit
.cu_version
);
8994 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8995 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8998 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
9000 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
9006 /* Read in the abbrevs used by this compilation unit. */
9008 Elf_Internal_Shdr
*sec
;
9009 unsigned char *begin
;
9011 /* Locate the .debug_abbrev section and process it. */
9012 sec
= find_section (".debug_abbrev");
9015 warn (_("Unable to locate .debug_abbrev section!\n"));
9019 begin
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
9020 _("debug_abbrev section data"));
9024 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
9025 begin
+ sec
->sh_size
);
9031 while (tags
< start
)
9033 unsigned int bytes_read
;
9034 unsigned long abbrev_number
;
9035 abbrev_entry
*entry
;
9038 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
9041 /* A null DIE marks the end of a list of children. */
9042 if (abbrev_number
== 0)
9048 /* Scan through the abbreviation list until we reach the
9050 for (entry
= first_abbrev
;
9051 entry
&& entry
->entry
!= abbrev_number
;
9052 entry
= entry
->next
)
9057 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
9063 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
9065 (unsigned long) (tags
- section_begin
9068 get_TAG_name (entry
->tag
));
9073 need_base_address
= 0;
9075 case DW_TAG_compile_unit
:
9076 need_base_address
= 1;
9078 case DW_TAG_entry_point
:
9079 case DW_TAG_inlined_subroutine
:
9080 case DW_TAG_subprogram
:
9081 need_base_address
= 0;
9082 /* Assuming that there is no DW_AT_frame_base. */
9083 have_frame_base
= 0;
9087 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9088 tags
= read_and_display_attr (attr
->attribute
,
9091 compunit
.cu_pointer_size
,
9093 compunit
.cu_version
,
9094 &debug_information
[unit
],
9097 if (entry
->children
)
9102 /* Set num_debug_info_entries here so that it can be used to check if
9103 we need to process .debug_loc and .debug_ranges sections. */
9104 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
9105 && num_debug_info_entries
== 0)
9106 num_debug_info_entries
= num_units
;
9110 free_debug_range ();
9120 /* Retrieve the pointer size associated with the given compilation unit.
9121 Optionally the offset of this unit into the .debug_info section is
9122 also retutned. If there is no .debug_info section then an error
9123 message is issued and 0 is returned. If the requested comp unit has
9124 not been defined in the .debug_info section then a warning message
9125 is issued and the last know pointer size is returned. This message
9126 is only issued once per section dumped per file dumped. */
9129 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit
,
9130 const char * section_name
,
9131 unsigned long * offset_return
)
9133 unsigned long offset
= 0;
9135 if (num_debug_info_entries
== 0)
9136 error (_("%s section needs a populated .debug_info section\n"),
9139 else if (comp_unit
>= num_debug_info_entries
)
9141 if (!warned_about_missing_comp_units
)
9143 warn (_("%s section has more comp units than .debug_info section\n"),
9145 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
9147 warned_about_missing_comp_units
= TRUE
;
9152 last_pointer_size
= debug_information
[comp_unit
].pointer_size
;
9153 offset
= debug_information
[comp_unit
].cu_offset
;
9156 if (offset_return
!= NULL
)
9157 * offset_return
= offset
;
9159 return last_pointer_size
;
9162 /* Locate and scan the .debug_info section in the file and record the pointer
9163 sizes and offsets for the compilation units in it. Usually an executable
9164 will have just one pointer size, but this is not guaranteed, and so we try
9165 not to make any assumptions. Returns zero upon failure, or the number of
9166 compilation units upon success. */
9169 get_debug_info (FILE * file
)
9171 Elf_Internal_Shdr
* section
;
9172 unsigned char * start
;
9175 /* Reset the last pointer size so that we can issue correct error
9176 messages if we are displaying the contents of more than one section. */
9177 last_pointer_size
= 0;
9178 warned_about_missing_comp_units
= FALSE
;
9180 /* If we already have the information there is nothing else to do. */
9181 if (num_debug_info_entries
> 0)
9182 return num_debug_info_entries
;
9184 section
= find_section (".debug_info");
9185 if (section
== NULL
)
9188 start
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9189 _("extracting information from .debug_info section"));
9193 ret
= process_debug_info (section
, start
, file
, 1);
9196 return ret
? num_debug_info_entries
: 0;
9200 display_debug_lines (Elf_Internal_Shdr
*section
,
9201 unsigned char *start
, FILE *file
)
9203 unsigned char *data
= start
;
9204 unsigned char *end
= start
+ section
->sh_size
;
9205 unsigned int comp_unit
= 0;
9207 printf (_("\nDump of debug contents of section %s:\n\n"),
9208 SECTION_NAME (section
));
9210 get_debug_info (file
);
9214 DWARF2_Internal_LineInfo info
;
9215 unsigned char *standard_opcodes
;
9216 unsigned char *end_of_sequence
;
9217 unsigned char *hdrptr
;
9218 unsigned int pointer_size
;
9219 int initial_length_size
;
9225 /* Check the length of the block. */
9226 info
.li_length
= byte_get (hdrptr
, 4);
9229 if (info
.li_length
== 0xffffffff)
9231 /* This section is 64-bit DWARF 3. */
9232 info
.li_length
= byte_get (hdrptr
, 8);
9235 initial_length_size
= 12;
9240 initial_length_size
= 4;
9243 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
9246 (_("The line info appears to be corrupt - the section is too small\n"));
9250 /* Check its version number. */
9251 info
.li_version
= byte_get (hdrptr
, 2);
9253 if (info
.li_version
!= 2 && info
.li_version
!= 3)
9255 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
9259 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
9260 hdrptr
+= offset_size
;
9261 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
9263 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
9265 info
.li_line_base
= byte_get (hdrptr
, 1);
9267 info
.li_line_range
= byte_get (hdrptr
, 1);
9269 info
.li_opcode_base
= byte_get (hdrptr
, 1);
9272 /* Sign extend the line base field. */
9273 info
.li_line_base
<<= 24;
9274 info
.li_line_base
>>= 24;
9276 /* Get the pointer size from the comp unit associated
9277 with this block of line number information. */
9278 pointer_size
= get_pointer_size_and_offset_of_comp_unit
9279 (comp_unit
, ".debug_line", NULL
);
9282 printf (_(" Length: %ld\n"), info
.li_length
);
9283 printf (_(" DWARF Version: %d\n"), info
.li_version
);
9284 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
9285 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
9286 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
9287 printf (_(" Line Base: %d\n"), info
.li_line_base
);
9288 printf (_(" Line Range: %d\n"), info
.li_line_range
);
9289 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
9290 printf (_(" (Pointer size: %u)%s\n"),
9292 warned_about_missing_comp_units
? " [assumed]" : "" );
9294 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
9296 reset_state_machine (info
.li_default_is_stmt
);
9298 /* Display the contents of the Opcodes table. */
9299 standard_opcodes
= hdrptr
;
9301 printf (_("\n Opcodes:\n"));
9303 for (i
= 1; i
< info
.li_opcode_base
; i
++)
9304 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
9306 /* Display the contents of the Directory table. */
9307 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
9310 printf (_("\n The Directory Table is empty.\n"));
9313 printf (_("\n The Directory Table:\n"));
9317 printf (_(" %s\n"), data
);
9319 data
+= strlen ((char *) data
) + 1;
9323 /* Skip the NUL at the end of the table. */
9326 /* Display the contents of the File Name table. */
9328 printf (_("\n The File Name Table is empty.\n"));
9331 printf (_("\n The File Name Table:\n"));
9332 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9336 unsigned char *name
;
9337 unsigned int bytes_read
;
9339 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
9342 data
+= strlen ((char *) data
) + 1;
9344 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9346 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9348 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9350 printf (_("%s\n"), name
);
9354 /* Skip the NUL at the end of the table. */
9357 /* Now display the statements. */
9358 printf (_("\n Line Number Statements:\n"));
9360 while (data
< end_of_sequence
)
9362 unsigned char op_code
;
9364 unsigned int bytes_read
;
9368 if (op_code
>= info
.li_opcode_base
)
9370 op_code
-= info
.li_opcode_base
;
9371 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
9372 state_machine_regs
.address
+= adv
;
9373 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9374 op_code
, adv
, state_machine_regs
.address
);
9375 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
9376 state_machine_regs
.line
+= adv
;
9377 printf (_(" and Line by %d to %d\n"),
9378 adv
, state_machine_regs
.line
);
9380 else switch (op_code
)
9382 case DW_LNS_extended_op
:
9383 if (pointer_size
== 0)
9385 warn (_("Extend line ops need a valid pointer size, guessing at 4\n"));
9389 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
9394 printf (_(" Copy\n"));
9397 case DW_LNS_advance_pc
:
9398 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
9400 state_machine_regs
.address
+= adv
;
9401 printf (_(" Advance PC by %d to %lx\n"), adv
,
9402 state_machine_regs
.address
);
9405 case DW_LNS_advance_line
:
9406 adv
= read_leb128 (data
, & bytes_read
, 1);
9408 state_machine_regs
.line
+= adv
;
9409 printf (_(" Advance Line by %d to %d\n"), adv
,
9410 state_machine_regs
.line
);
9413 case DW_LNS_set_file
:
9414 adv
= read_leb128 (data
, & bytes_read
, 0);
9416 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9418 state_machine_regs
.file
= adv
;
9421 case DW_LNS_set_column
:
9422 adv
= read_leb128 (data
, & bytes_read
, 0);
9424 printf (_(" Set column to %d\n"), adv
);
9425 state_machine_regs
.column
= adv
;
9428 case DW_LNS_negate_stmt
:
9429 adv
= state_machine_regs
.is_stmt
;
9431 printf (_(" Set is_stmt to %d\n"), adv
);
9432 state_machine_regs
.is_stmt
= adv
;
9435 case DW_LNS_set_basic_block
:
9436 printf (_(" Set basic block\n"));
9437 state_machine_regs
.basic_block
= 1;
9440 case DW_LNS_const_add_pc
:
9441 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
9442 * info
.li_min_insn_length
);
9443 state_machine_regs
.address
+= adv
;
9444 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
9445 state_machine_regs
.address
);
9448 case DW_LNS_fixed_advance_pc
:
9449 adv
= byte_get (data
, 2);
9451 state_machine_regs
.address
+= adv
;
9452 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9453 adv
, state_machine_regs
.address
);
9456 case DW_LNS_set_prologue_end
:
9457 printf (_(" Set prologue_end to true\n"));
9460 case DW_LNS_set_epilogue_begin
:
9461 printf (_(" Set epilogue_begin to true\n"));
9464 case DW_LNS_set_isa
:
9465 adv
= read_leb128 (data
, & bytes_read
, 0);
9467 printf (_(" Set ISA to %d\n"), adv
);
9471 printf (_(" Unknown opcode %d with operands: "), op_code
);
9473 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
9475 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
9476 i
== 1 ? "" : ", ");
9490 display_debug_pubnames (Elf_Internal_Shdr
*section
,
9491 unsigned char *start
,
9492 FILE *file ATTRIBUTE_UNUSED
)
9494 DWARF2_Internal_PubNames pubnames
;
9497 end
= start
+ section
->sh_size
;
9499 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9503 unsigned char *data
;
9504 unsigned long offset
;
9505 int offset_size
, initial_length_size
;
9509 pubnames
.pn_length
= byte_get (data
, 4);
9511 if (pubnames
.pn_length
== 0xffffffff)
9513 pubnames
.pn_length
= byte_get (data
, 8);
9516 initial_length_size
= 12;
9521 initial_length_size
= 4;
9524 pubnames
.pn_version
= byte_get (data
, 2);
9526 pubnames
.pn_offset
= byte_get (data
, offset_size
);
9527 data
+= offset_size
;
9528 pubnames
.pn_size
= byte_get (data
, offset_size
);
9529 data
+= offset_size
;
9531 start
+= pubnames
.pn_length
+ initial_length_size
;
9533 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
9535 static int warned
= 0;
9539 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9546 printf (_(" Length: %ld\n"),
9547 pubnames
.pn_length
);
9548 printf (_(" Version: %d\n"),
9549 pubnames
.pn_version
);
9550 printf (_(" Offset into .debug_info section: %ld\n"),
9551 pubnames
.pn_offset
);
9552 printf (_(" Size of area in .debug_info section: %ld\n"),
9555 printf (_("\n Offset\tName\n"));
9559 offset
= byte_get (data
, offset_size
);
9563 data
+= offset_size
;
9564 printf (" %-6ld\t\t%s\n", offset
, data
);
9565 data
+= strlen ((char *) data
) + 1;
9568 while (offset
!= 0);
9576 display_debug_macinfo (Elf_Internal_Shdr
*section
,
9577 unsigned char *start
,
9578 FILE *file ATTRIBUTE_UNUSED
)
9580 unsigned char *end
= start
+ section
->sh_size
;
9581 unsigned char *curr
= start
;
9582 unsigned int bytes_read
;
9583 enum dwarf_macinfo_record_type op
;
9585 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9589 unsigned int lineno
;
9597 case DW_MACINFO_start_file
:
9599 unsigned int filenum
;
9601 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9603 filenum
= read_leb128 (curr
, & bytes_read
, 0);
9606 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9611 case DW_MACINFO_end_file
:
9612 printf (_(" DW_MACINFO_end_file\n"));
9615 case DW_MACINFO_define
:
9616 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9618 string
= (char *) curr
;
9619 curr
+= strlen (string
) + 1;
9620 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9624 case DW_MACINFO_undef
:
9625 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9627 string
= (char *) curr
;
9628 curr
+= strlen (string
) + 1;
9629 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9633 case DW_MACINFO_vendor_ext
:
9635 unsigned int constant
;
9637 constant
= read_leb128 (curr
, & bytes_read
, 0);
9639 string
= (char *) curr
;
9640 curr
+= strlen (string
) + 1;
9641 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9653 display_debug_abbrev (Elf_Internal_Shdr
*section
,
9654 unsigned char *start
,
9655 FILE *file ATTRIBUTE_UNUSED
)
9657 abbrev_entry
*entry
;
9658 unsigned char *end
= start
+ section
->sh_size
;
9660 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9664 start
= process_abbrev_section (start
, end
);
9666 if (first_abbrev
== NULL
)
9669 printf (_(" Number TAG\n"));
9671 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
9675 printf (_(" %ld %s [%s]\n"),
9677 get_TAG_name (entry
->tag
),
9678 entry
->children
? _("has children") : _("no children"));
9680 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9681 printf (_(" %-18s %s\n"),
9682 get_AT_name (attr
->attribute
),
9683 get_FORM_name (attr
->form
));
9696 display_debug_loc (Elf_Internal_Shdr
*section
,
9697 unsigned char *start
, FILE *file
)
9699 unsigned char *section_end
;
9700 unsigned long bytes
;
9701 unsigned char *section_begin
= start
;
9702 unsigned int num_loc_list
= 0;
9703 unsigned long last_offset
= 0;
9704 unsigned int first
= 0;
9707 int seen_first_offset
= 0;
9708 int use_debug_info
= 1;
9709 unsigned char *next
;
9711 bytes
= section
->sh_size
;
9712 section_end
= start
+ bytes
;
9716 printf (_("\nThe .debug_loc section is empty.\n"));
9720 get_debug_info (file
);
9722 /* Check the order of location list in .debug_info section. If
9723 offsets of location lists are in the ascending order, we can
9724 use `debug_information' directly. */
9725 for (i
= 0; i
< num_debug_info_entries
; i
++)
9729 num
= debug_information
[i
].num_loc_offsets
;
9730 num_loc_list
+= num
;
9732 /* Check if we can use `debug_information' directly. */
9733 if (use_debug_info
&& num
!= 0)
9735 if (!seen_first_offset
)
9737 /* This is the first location list. */
9738 last_offset
= debug_information
[i
].loc_offsets
[0];
9740 seen_first_offset
= 1;
9746 for (; j
< num
; j
++)
9749 debug_information
[i
].loc_offsets
[j
])
9754 last_offset
= debug_information
[i
].loc_offsets
[j
];
9759 if (!use_debug_info
)
9760 /* FIXME: Should we handle this case? */
9761 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9763 if (!seen_first_offset
)
9764 error (_("No location lists in .debug_info section!\n"));
9766 if (debug_information
[first
].loc_offsets
[0] != 0)
9767 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9768 debug_information
[first
].loc_offsets
[0]);
9770 printf (_("Contents of the .debug_loc section:\n\n"));
9771 printf (_(" Offset Begin End Expression\n"));
9773 seen_first_offset
= 0;
9774 for (i
= first
; i
< num_debug_info_entries
; i
++)
9776 unsigned long begin
;
9778 unsigned short length
;
9779 unsigned long offset
;
9780 unsigned int pointer_size
;
9781 unsigned long cu_offset
;
9782 unsigned long base_address
;
9783 int need_frame_base
;
9786 pointer_size
= debug_information
[i
].pointer_size
;
9787 cu_offset
= debug_information
[i
].cu_offset
;
9789 for (j
= 0; j
< debug_information
[i
].num_loc_offsets
; j
++)
9791 has_frame_base
= debug_information
[i
].have_frame_base
[j
];
9792 offset
= debug_information
[i
].loc_offsets
[j
];
9793 next
= section_begin
+ offset
;
9794 base_address
= debug_information
[i
].base_address
;
9796 if (!seen_first_offset
)
9797 seen_first_offset
= 1;
9801 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9802 start
- section_begin
, next
- section_begin
);
9803 else if (start
> next
)
9804 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9805 start
- section_begin
, next
- section_begin
);
9809 if (offset
>= bytes
)
9811 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
9818 if (start
+ 2 * pointer_size
> section_end
)
9820 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9825 begin
= byte_get (start
, pointer_size
);
9826 start
+= pointer_size
;
9827 end
= byte_get (start
, pointer_size
);
9828 start
+= pointer_size
;
9830 if (begin
== 0 && end
== 0)
9832 printf (_(" %8.8lx <End of list>\n"), offset
);
9836 /* Check base address specifiers. */
9837 if (begin
== -1UL && end
!= -1UL)
9840 printf (_(" %8.8lx %8.8lx %8.8lx (base address)\n"),
9841 offset
, begin
, end
);
9845 if (start
+ 2 > section_end
)
9847 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9852 length
= byte_get (start
, 2);
9855 if (start
+ length
> section_end
)
9857 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9862 printf (" %8.8lx %8.8lx %8.8lx (",
9863 offset
, begin
+ base_address
, end
+ base_address
);
9864 need_frame_base
= decode_location_expression (start
,
9870 if (need_frame_base
&& !has_frame_base
)
9871 printf (_(" [without DW_AT_frame_base]"));
9874 fputs (_(" (start == end)"), stdout
);
9875 else if (begin
> end
)
9876 fputs (_(" (start > end)"), stdout
);
9888 display_debug_str (Elf_Internal_Shdr
*section
,
9889 unsigned char *start
,
9890 FILE *file ATTRIBUTE_UNUSED
)
9892 unsigned long bytes
;
9895 addr
= section
->sh_addr
;
9896 bytes
= section
->sh_size
;
9900 printf (_("\nThe .debug_str section is empty.\n"));
9904 printf (_("Contents of the .debug_str section:\n\n"));
9912 lbytes
= (bytes
> 16 ? 16 : bytes
);
9914 printf (" 0x%8.8lx ", (unsigned long) addr
);
9916 for (j
= 0; j
< 16; j
++)
9919 printf ("%2.2x", start
[j
]);
9927 for (j
= 0; j
< lbytes
; j
++)
9930 if (k
>= ' ' && k
< 0x80)
9950 display_debug_info (Elf_Internal_Shdr
* section
,
9951 unsigned char * start
, FILE * file
)
9953 return process_debug_info (section
, start
, file
, 0);
9958 display_debug_aranges (Elf_Internal_Shdr
*section
,
9959 unsigned char *start
,
9960 FILE *file ATTRIBUTE_UNUSED
)
9962 unsigned char *end
= start
+ section
->sh_size
;
9964 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
9968 unsigned char *hdrptr
;
9969 DWARF2_Internal_ARange arange
;
9970 unsigned char *ranges
;
9971 unsigned long length
;
9972 unsigned long address
;
9975 int initial_length_size
;
9979 arange
.ar_length
= byte_get (hdrptr
, 4);
9982 if (arange
.ar_length
== 0xffffffff)
9984 arange
.ar_length
= byte_get (hdrptr
, 8);
9987 initial_length_size
= 12;
9992 initial_length_size
= 4;
9995 arange
.ar_version
= byte_get (hdrptr
, 2);
9998 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
9999 hdrptr
+= offset_size
;
10001 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
10004 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
10007 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
10009 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
10013 printf (_(" Length: %ld\n"), arange
.ar_length
);
10014 printf (_(" Version: %d\n"), arange
.ar_version
);
10015 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
10016 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
10017 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
10019 printf (_("\n Address Length\n"));
10023 /* Must pad to an alignment boundary that is twice the pointer size. */
10024 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
10026 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
10030 address
= byte_get (ranges
, arange
.ar_pointer_size
);
10032 ranges
+= arange
.ar_pointer_size
;
10034 length
= byte_get (ranges
, arange
.ar_pointer_size
);
10036 ranges
+= arange
.ar_pointer_size
;
10038 /* A pair of zeros marks the end of the list. */
10039 if (address
== 0 && length
== 0)
10042 printf (" %8.8lx %lu\n", address
, length
);
10045 start
+= arange
.ar_length
+ initial_length_size
;
10054 display_debug_ranges (Elf_Internal_Shdr
*section
,
10055 unsigned char *start
,
10056 FILE *file ATTRIBUTE_UNUSED
)
10058 unsigned char *section_end
;
10059 unsigned long bytes
;
10060 unsigned char *section_begin
= start
;
10061 unsigned int num_range_list
= 0;
10062 unsigned long last_offset
= 0;
10063 unsigned int first
= 0;
10066 int seen_first_offset
= 0;
10067 int use_debug_info
= 1;
10068 unsigned char *next
;
10070 bytes
= section
->sh_size
;
10071 section_end
= start
+ bytes
;
10075 printf (_("\nThe .debug_ranges section is empty.\n"));
10079 get_debug_info (file
);
10081 /* Check the order of range list in .debug_info section. If
10082 offsets of range lists are in the ascending order, we can
10083 use `debug_information' directly. */
10084 for (i
= 0; i
< num_debug_info_entries
; i
++)
10088 num
= debug_information
[i
].num_range_lists
;
10089 num_range_list
+= num
;
10091 /* Check if we can use `debug_information' directly. */
10092 if (use_debug_info
&& num
!= 0)
10094 if (!seen_first_offset
)
10096 /* This is the first range list. */
10097 last_offset
= debug_information
[i
].range_lists
[0];
10099 seen_first_offset
= 1;
10105 for (; j
< num
; j
++)
10108 debug_information
[i
].range_lists
[j
])
10110 use_debug_info
= 0;
10113 last_offset
= debug_information
[i
].range_lists
[j
];
10118 if (!use_debug_info
)
10119 /* FIXME: Should we handle this case? */
10120 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
10122 if (!seen_first_offset
)
10123 error (_("No range lists in .debug_info section!\n"));
10125 if (debug_information
[first
].range_lists
[0] != 0)
10126 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
10127 debug_information
[first
].range_lists
[0]);
10129 printf (_("Contents of the .debug_ranges section:\n\n"));
10130 printf (_(" Offset Begin End\n"));
10132 seen_first_offset
= 0;
10133 for (i
= first
; i
< num_debug_info_entries
; i
++)
10135 unsigned long begin
;
10137 unsigned long offset
;
10138 unsigned int pointer_size
;
10139 unsigned long base_address
;
10141 pointer_size
= debug_information
[i
].pointer_size
;
10143 for (j
= 0; j
< debug_information
[i
].num_range_lists
; j
++)
10145 offset
= debug_information
[i
].range_lists
[j
];
10146 next
= section_begin
+ offset
;
10147 base_address
= debug_information
[i
].base_address
;
10149 if (!seen_first_offset
)
10150 seen_first_offset
= 1;
10154 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10155 start
- section_begin
, next
- section_begin
);
10156 else if (start
> next
)
10157 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10158 start
- section_begin
, next
- section_begin
);
10164 begin
= byte_get (start
, pointer_size
);
10165 start
+= pointer_size
;
10166 end
= byte_get (start
, pointer_size
);
10167 start
+= pointer_size
;
10169 if (begin
== 0 && end
== 0)
10171 printf (_(" %8.8lx <End of list>\n"), offset
);
10175 /* Check base address specifiers. */
10176 if (begin
== -1UL && end
!= -1UL)
10178 base_address
= end
;
10179 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
10180 offset
, begin
, end
);
10184 printf (" %8.8lx %8.8lx %8.8lx",
10185 offset
, begin
+ base_address
, end
+ base_address
);
10188 fputs (_(" (start == end)"), stdout
);
10189 else if (begin
> end
)
10190 fputs (_(" (start > end)"), stdout
);
10200 typedef struct Frame_Chunk
10202 struct Frame_Chunk
*next
;
10203 unsigned char *chunk_start
;
10205 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
10206 short int *col_type
;
10208 char *augmentation
;
10209 unsigned int code_factor
;
10211 unsigned long pc_begin
;
10212 unsigned long pc_range
;
10216 unsigned char fde_encoding
;
10217 unsigned char cfa_exp
;
10221 /* A marker for a col_type that means this column was never referenced
10222 in the frame info. */
10223 #define DW_CFA_unreferenced (-1)
10226 frame_need_space (Frame_Chunk
*fc
, int reg
)
10228 int prev
= fc
->ncols
;
10230 if (reg
< fc
->ncols
)
10233 fc
->ncols
= reg
+ 1;
10234 fc
->col_type
= xcrealloc (fc
->col_type
, fc
->ncols
, sizeof (short int));
10235 fc
->col_offset
= xcrealloc (fc
->col_offset
, fc
->ncols
, sizeof (int));
10237 while (prev
< fc
->ncols
)
10239 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
10240 fc
->col_offset
[prev
] = 0;
10246 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
10251 if (*max_regs
< fc
->ncols
)
10252 *max_regs
= fc
->ncols
;
10254 if (*need_col_headers
)
10256 *need_col_headers
= 0;
10258 printf (" LOC CFA ");
10260 for (r
= 0; r
< *max_regs
; r
++)
10261 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10266 printf ("r%-4d", r
);
10272 printf ("%08lx ", fc
->pc_begin
);
10274 strcpy (tmp
, "exp");
10276 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
10277 printf ("%-8s ", tmp
);
10279 for (r
= 0; r
< fc
->ncols
; r
++)
10281 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10283 switch (fc
->col_type
[r
])
10285 case DW_CFA_undefined
:
10288 case DW_CFA_same_value
:
10291 case DW_CFA_offset
:
10292 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
10294 case DW_CFA_register
:
10295 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
10297 case DW_CFA_expression
:
10298 strcpy (tmp
, "exp");
10301 strcpy (tmp
, "n/a");
10304 printf ("%-5s", tmp
);
10311 size_of_encoded_value (int encoding
)
10313 switch (encoding
& 0x7)
10316 case 0: return eh_addr_size
;
10324 get_encoded_value (unsigned char *data
, int encoding
)
10326 int size
= size_of_encoded_value (encoding
);
10327 if (encoding
& DW_EH_PE_signed
)
10328 return byte_get_signed (data
, size
);
10330 return byte_get (data
, size
);
10333 #define GET(N) byte_get (start, N); start += N
10334 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
10335 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10338 display_debug_frames (Elf_Internal_Shdr
*section
,
10339 unsigned char *start
,
10340 FILE *file ATTRIBUTE_UNUSED
)
10342 unsigned char *end
= start
+ section
->sh_size
;
10343 unsigned char *section_start
= start
;
10344 Frame_Chunk
*chunks
= 0;
10345 Frame_Chunk
*remembered_state
= 0;
10347 int is_eh
= streq (SECTION_NAME (section
), ".eh_frame");
10348 unsigned int length_return
;
10351 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
10353 while (start
< end
)
10355 unsigned char *saved_start
;
10356 unsigned char *block_end
;
10357 unsigned long length
;
10358 unsigned long cie_id
;
10361 int need_col_headers
= 1;
10362 unsigned char *augmentation_data
= NULL
;
10363 unsigned long augmentation_data_len
= 0;
10364 int encoded_ptr_size
= eh_addr_size
;
10366 int initial_length_size
;
10368 saved_start
= start
;
10369 length
= byte_get (start
, 4); start
+= 4;
10373 printf ("\n%08lx ZERO terminator\n\n",
10374 (unsigned long)(saved_start
- section_start
));
10378 if (length
== 0xffffffff)
10380 length
= byte_get (start
, 8);
10383 initial_length_size
= 12;
10388 initial_length_size
= 4;
10391 block_end
= saved_start
+ length
+ initial_length_size
;
10392 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
10394 if (elf_header
.e_type
== ET_REL
10395 && !debug_apply_rela_addends (file
, section
, offset_size
,
10396 section_start
, start
, block_end
))
10399 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
10403 fc
= xmalloc (sizeof (Frame_Chunk
));
10404 memset (fc
, 0, sizeof (Frame_Chunk
));
10408 fc
->chunk_start
= saved_start
;
10410 fc
->col_type
= xmalloc (sizeof (short int));
10411 fc
->col_offset
= xmalloc (sizeof (int));
10412 frame_need_space (fc
, max_regs
-1);
10414 version
= *start
++;
10416 fc
->augmentation
= (char *) start
;
10417 start
= (unsigned char *) strchr ((char *) start
, '\0') + 1;
10419 if (fc
->augmentation
[0] == 'z')
10421 fc
->code_factor
= LEB ();
10422 fc
->data_factor
= SLEB ();
10431 augmentation_data_len
= LEB ();
10432 augmentation_data
= start
;
10433 start
+= augmentation_data_len
;
10435 else if (streq (fc
->augmentation
, "eh"))
10437 start
+= eh_addr_size
;
10438 fc
->code_factor
= LEB ();
10439 fc
->data_factor
= SLEB ();
10451 fc
->code_factor
= LEB ();
10452 fc
->data_factor
= SLEB ();
10464 if (do_debug_frames_interp
)
10465 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10466 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10467 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
10471 printf ("\n%08lx %08lx %08lx CIE\n",
10472 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
10473 printf (" Version: %d\n", version
);
10474 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
10475 printf (" Code alignment factor: %u\n", fc
->code_factor
);
10476 printf (" Data alignment factor: %d\n", fc
->data_factor
);
10477 printf (" Return address column: %d\n", fc
->ra
);
10479 if (augmentation_data_len
)
10482 printf (" Augmentation data: ");
10483 for (i
= 0; i
< augmentation_data_len
; ++i
)
10484 printf (" %02x", augmentation_data
[i
]);
10490 if (augmentation_data_len
)
10492 unsigned char *p
, *q
;
10493 p
= (unsigned char *) fc
->augmentation
+ 1;
10494 q
= augmentation_data
;
10500 else if (*p
== 'P')
10501 q
+= 1 + size_of_encoded_value (*q
);
10502 else if (*p
== 'R')
10503 fc
->fde_encoding
= *q
++;
10509 if (fc
->fde_encoding
)
10510 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10513 frame_need_space (fc
, fc
->ra
);
10517 unsigned char *look_for
;
10518 static Frame_Chunk fde_fc
;
10521 memset (fc
, 0, sizeof (Frame_Chunk
));
10523 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
10525 for (cie
= chunks
; cie
; cie
= cie
->next
)
10526 if (cie
->chunk_start
== look_for
)
10531 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10532 cie_id
, saved_start
);
10535 fc
->col_type
= xmalloc (sizeof (short int));
10536 fc
->col_offset
= xmalloc (sizeof (int));
10537 frame_need_space (fc
, max_regs
- 1);
10539 fc
->augmentation
= "";
10540 fc
->fde_encoding
= 0;
10544 fc
->ncols
= cie
->ncols
;
10545 fc
->col_type
= xcmalloc (fc
->ncols
, sizeof (short int));
10546 fc
->col_offset
= xcmalloc (fc
->ncols
, sizeof (int));
10547 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
10548 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
10549 fc
->augmentation
= cie
->augmentation
;
10550 fc
->code_factor
= cie
->code_factor
;
10551 fc
->data_factor
= cie
->data_factor
;
10552 fc
->cfa_reg
= cie
->cfa_reg
;
10553 fc
->cfa_offset
= cie
->cfa_offset
;
10555 frame_need_space (fc
, max_regs
-1);
10556 fc
->fde_encoding
= cie
->fde_encoding
;
10559 if (fc
->fde_encoding
)
10560 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10562 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
10563 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10564 /* Don't adjust for ET_REL since there's invariably a pcrel
10565 reloc here, which we haven't applied. */
10566 && elf_header
.e_type
!= ET_REL
)
10567 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
10568 start
+= encoded_ptr_size
;
10569 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
10570 start
+= encoded_ptr_size
;
10572 if (cie
->augmentation
[0] == 'z')
10574 augmentation_data_len
= LEB ();
10575 augmentation_data
= start
;
10576 start
+= augmentation_data_len
;
10579 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10580 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10581 (unsigned long)(cie
->chunk_start
- section_start
),
10582 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
10583 if (! do_debug_frames_interp
&& augmentation_data_len
)
10587 printf (" Augmentation data: ");
10588 for (i
= 0; i
< augmentation_data_len
; ++i
)
10589 printf (" %02x", augmentation_data
[i
]);
10595 /* At this point, fc is the current chunk, cie (if any) is set, and
10596 we're about to interpret instructions for the chunk. */
10597 /* ??? At present we need to do this always, since this sizes the
10598 fc->col_type and fc->col_offset arrays, which we write into always.
10599 We should probably split the interpreted and non-interpreted bits
10600 into two different routines, since there's so much that doesn't
10601 really overlap between them. */
10602 if (1 || do_debug_frames_interp
)
10604 /* Start by making a pass over the chunk, allocating storage
10605 and taking note of what registers are used. */
10606 unsigned char *tmp
= start
;
10608 while (start
< block_end
)
10611 unsigned long reg
, tmp
;
10618 /* Warning: if you add any more cases to this switch, be
10619 sure to add them to the corresponding switch below. */
10622 case DW_CFA_advance_loc
:
10624 case DW_CFA_offset
:
10626 frame_need_space (fc
, opa
);
10627 fc
->col_type
[opa
] = DW_CFA_undefined
;
10629 case DW_CFA_restore
:
10630 frame_need_space (fc
, opa
);
10631 fc
->col_type
[opa
] = DW_CFA_undefined
;
10633 case DW_CFA_set_loc
:
10634 start
+= encoded_ptr_size
;
10636 case DW_CFA_advance_loc1
:
10639 case DW_CFA_advance_loc2
:
10642 case DW_CFA_advance_loc4
:
10645 case DW_CFA_offset_extended
:
10646 reg
= LEB (); LEB ();
10647 frame_need_space (fc
, reg
);
10648 fc
->col_type
[reg
] = DW_CFA_undefined
;
10650 case DW_CFA_restore_extended
:
10652 frame_need_space (fc
, reg
);
10653 fc
->col_type
[reg
] = DW_CFA_undefined
;
10655 case DW_CFA_undefined
:
10657 frame_need_space (fc
, reg
);
10658 fc
->col_type
[reg
] = DW_CFA_undefined
;
10660 case DW_CFA_same_value
:
10662 frame_need_space (fc
, reg
);
10663 fc
->col_type
[reg
] = DW_CFA_undefined
;
10665 case DW_CFA_register
:
10666 reg
= LEB (); LEB ();
10667 frame_need_space (fc
, reg
);
10668 fc
->col_type
[reg
] = DW_CFA_undefined
;
10670 case DW_CFA_def_cfa
:
10673 case DW_CFA_def_cfa_register
:
10676 case DW_CFA_def_cfa_offset
:
10679 case DW_CFA_def_cfa_expression
:
10683 case DW_CFA_expression
:
10687 frame_need_space (fc
, reg
);
10688 fc
->col_type
[reg
] = DW_CFA_undefined
;
10690 case DW_CFA_offset_extended_sf
:
10691 reg
= LEB (); SLEB ();
10692 frame_need_space (fc
, reg
);
10693 fc
->col_type
[reg
] = DW_CFA_undefined
;
10695 case DW_CFA_def_cfa_sf
:
10698 case DW_CFA_def_cfa_offset_sf
:
10701 case DW_CFA_MIPS_advance_loc8
:
10704 case DW_CFA_GNU_args_size
:
10707 case DW_CFA_GNU_negative_offset_extended
:
10708 reg
= LEB (); LEB ();
10709 frame_need_space (fc
, reg
);
10710 fc
->col_type
[reg
] = DW_CFA_undefined
;
10719 /* Now we know what registers are used, make a second pass over
10720 the chunk, this time actually printing out the info. */
10722 while (start
< block_end
)
10725 unsigned long ul
, reg
, roffs
;
10734 /* Warning: if you add any more cases to this switch, be
10735 sure to add them to the corresponding switch above. */
10738 case DW_CFA_advance_loc
:
10739 if (do_debug_frames_interp
)
10740 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10742 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10743 opa
* fc
->code_factor
,
10744 fc
->pc_begin
+ opa
* fc
->code_factor
);
10745 fc
->pc_begin
+= opa
* fc
->code_factor
;
10748 case DW_CFA_offset
:
10750 if (! do_debug_frames_interp
)
10751 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10752 opa
, roffs
* fc
->data_factor
);
10753 fc
->col_type
[opa
] = DW_CFA_offset
;
10754 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
10757 case DW_CFA_restore
:
10758 if (! do_debug_frames_interp
)
10759 printf (" DW_CFA_restore: r%d\n", opa
);
10760 fc
->col_type
[opa
] = cie
->col_type
[opa
];
10761 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
10764 case DW_CFA_set_loc
:
10765 vma
= get_encoded_value (start
, fc
->fde_encoding
);
10766 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10767 && elf_header
.e_type
!= ET_REL
)
10768 vma
+= section
->sh_addr
+ (start
- section_start
);
10769 start
+= encoded_ptr_size
;
10770 if (do_debug_frames_interp
)
10771 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10773 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
10774 fc
->pc_begin
= vma
;
10777 case DW_CFA_advance_loc1
:
10778 ofs
= byte_get (start
, 1); start
+= 1;
10779 if (do_debug_frames_interp
)
10780 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10782 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10783 ofs
* fc
->code_factor
,
10784 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10785 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10788 case DW_CFA_advance_loc2
:
10789 ofs
= byte_get (start
, 2); start
+= 2;
10790 if (do_debug_frames_interp
)
10791 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10793 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10794 ofs
* fc
->code_factor
,
10795 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10796 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10799 case DW_CFA_advance_loc4
:
10800 ofs
= byte_get (start
, 4); start
+= 4;
10801 if (do_debug_frames_interp
)
10802 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10804 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10805 ofs
* fc
->code_factor
,
10806 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10807 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10810 case DW_CFA_offset_extended
:
10813 if (! do_debug_frames_interp
)
10814 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10815 reg
, roffs
* fc
->data_factor
);
10816 fc
->col_type
[reg
] = DW_CFA_offset
;
10817 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
10820 case DW_CFA_restore_extended
:
10822 if (! do_debug_frames_interp
)
10823 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
10824 fc
->col_type
[reg
] = cie
->col_type
[reg
];
10825 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
10828 case DW_CFA_undefined
:
10830 if (! do_debug_frames_interp
)
10831 printf (" DW_CFA_undefined: r%ld\n", reg
);
10832 fc
->col_type
[reg
] = DW_CFA_undefined
;
10833 fc
->col_offset
[reg
] = 0;
10836 case DW_CFA_same_value
:
10838 if (! do_debug_frames_interp
)
10839 printf (" DW_CFA_same_value: r%ld\n", reg
);
10840 fc
->col_type
[reg
] = DW_CFA_same_value
;
10841 fc
->col_offset
[reg
] = 0;
10844 case DW_CFA_register
:
10847 if (! do_debug_frames_interp
)
10848 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
10849 fc
->col_type
[reg
] = DW_CFA_register
;
10850 fc
->col_offset
[reg
] = roffs
;
10853 case DW_CFA_remember_state
:
10854 if (! do_debug_frames_interp
)
10855 printf (" DW_CFA_remember_state\n");
10856 rs
= xmalloc (sizeof (Frame_Chunk
));
10857 rs
->ncols
= fc
->ncols
;
10858 rs
->col_type
= xcmalloc (rs
->ncols
, sizeof (short int));
10859 rs
->col_offset
= xcmalloc (rs
->ncols
, sizeof (int));
10860 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
10861 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
10862 rs
->next
= remembered_state
;
10863 remembered_state
= rs
;
10866 case DW_CFA_restore_state
:
10867 if (! do_debug_frames_interp
)
10868 printf (" DW_CFA_restore_state\n");
10869 rs
= remembered_state
;
10872 remembered_state
= rs
->next
;
10873 frame_need_space (fc
, rs
->ncols
-1);
10874 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
10875 memcpy (fc
->col_offset
, rs
->col_offset
,
10876 rs
->ncols
* sizeof (int));
10877 free (rs
->col_type
);
10878 free (rs
->col_offset
);
10881 else if (do_debug_frames_interp
)
10882 printf ("Mismatched DW_CFA_restore_state\n");
10885 case DW_CFA_def_cfa
:
10886 fc
->cfa_reg
= LEB ();
10887 fc
->cfa_offset
= LEB ();
10889 if (! do_debug_frames_interp
)
10890 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10891 fc
->cfa_reg
, fc
->cfa_offset
);
10894 case DW_CFA_def_cfa_register
:
10895 fc
->cfa_reg
= LEB ();
10897 if (! do_debug_frames_interp
)
10898 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
10901 case DW_CFA_def_cfa_offset
:
10902 fc
->cfa_offset
= LEB ();
10903 if (! do_debug_frames_interp
)
10904 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
10908 if (! do_debug_frames_interp
)
10909 printf (" DW_CFA_nop\n");
10912 case DW_CFA_def_cfa_expression
:
10914 if (! do_debug_frames_interp
)
10916 printf (" DW_CFA_def_cfa_expression (");
10917 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10924 case DW_CFA_expression
:
10927 if (! do_debug_frames_interp
)
10929 printf (" DW_CFA_expression: r%ld (", reg
);
10930 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10933 fc
->col_type
[reg
] = DW_CFA_expression
;
10937 case DW_CFA_offset_extended_sf
:
10940 frame_need_space (fc
, reg
);
10941 if (! do_debug_frames_interp
)
10942 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10943 reg
, l
* fc
->data_factor
);
10944 fc
->col_type
[reg
] = DW_CFA_offset
;
10945 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10948 case DW_CFA_def_cfa_sf
:
10949 fc
->cfa_reg
= LEB ();
10950 fc
->cfa_offset
= SLEB ();
10951 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
10953 if (! do_debug_frames_interp
)
10954 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10955 fc
->cfa_reg
, fc
->cfa_offset
);
10958 case DW_CFA_def_cfa_offset_sf
:
10959 fc
->cfa_offset
= SLEB ();
10960 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
10961 if (! do_debug_frames_interp
)
10962 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
10965 case DW_CFA_MIPS_advance_loc8
:
10966 ofs
= byte_get (start
, 8); start
+= 8;
10967 if (do_debug_frames_interp
)
10968 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10970 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10971 ofs
* fc
->code_factor
,
10972 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10973 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10976 case DW_CFA_GNU_window_save
:
10977 if (! do_debug_frames_interp
)
10978 printf (" DW_CFA_GNU_window_save\n");
10981 case DW_CFA_GNU_args_size
:
10983 if (! do_debug_frames_interp
)
10984 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
10987 case DW_CFA_GNU_negative_offset_extended
:
10990 frame_need_space (fc
, reg
);
10991 if (! do_debug_frames_interp
)
10992 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10993 reg
, l
* fc
->data_factor
);
10994 fc
->col_type
[reg
] = DW_CFA_offset
;
10995 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10999 warn (_("unsupported or unknown DW_CFA_%d\n"), op
);
11004 if (do_debug_frames_interp
)
11005 frame_display_row (fc
, &need_col_headers
, &max_regs
);
11020 display_debug_not_supported (Elf_Internal_Shdr
*section
,
11021 unsigned char *start ATTRIBUTE_UNUSED
,
11022 FILE *file ATTRIBUTE_UNUSED
)
11024 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
11025 SECTION_NAME (section
));
11030 /* A structure containing the name of a debug section
11031 and a pointer to a function that can decode it. */
11034 const char *const name
;
11035 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
11039 { ".debug_abbrev", display_debug_abbrev
},
11040 { ".debug_aranges", display_debug_aranges
},
11041 { ".debug_frame", display_debug_frames
},
11042 { ".debug_info", display_debug_info
},
11043 { ".debug_line", display_debug_lines
},
11044 { ".debug_pubnames", display_debug_pubnames
},
11045 { ".eh_frame", display_debug_frames
},
11046 { ".debug_macinfo", display_debug_macinfo
},
11047 { ".debug_str", display_debug_str
},
11048 { ".debug_loc", display_debug_loc
},
11049 { ".debug_pubtypes", display_debug_pubnames
},
11050 { ".debug_ranges", display_debug_ranges
},
11051 { ".debug_static_func", display_debug_not_supported
},
11052 { ".debug_static_vars", display_debug_not_supported
},
11053 { ".debug_types", display_debug_not_supported
},
11054 { ".debug_weaknames", display_debug_not_supported
}
11058 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
11060 char *name
= SECTION_NAME (section
);
11061 bfd_size_type length
;
11065 length
= section
->sh_size
;
11068 printf (_("\nSection '%s' has no debugging data.\n"), name
);
11072 if (strneq (name
, ".gnu.linkonce.wi.", 17))
11073 name
= ".debug_info";
11075 /* See if we know how to display the contents of this section. */
11076 for (i
= NUM_ELEM (debug_displays
); i
--;)
11077 if (streq (debug_displays
[i
].name
, name
))
11079 unsigned char *start
;
11081 start
= get_data (NULL
, file
, section
->sh_offset
, 1, length
,
11082 _("debug section data"));
11089 result
&= debug_displays
[i
].display (section
, start
, file
);
11092 /* If we loaded in the abbrev section
11093 at some point, we must release it here. */
11101 printf (_("Unrecognized debug section: %s\n"), name
);
11109 process_section_contents (FILE *file
)
11111 Elf_Internal_Shdr
*section
;
11117 for (i
= 0, section
= section_headers
;
11118 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
11121 #ifdef SUPPORT_DISASSEMBLY
11122 if (dump_sects
[i
] & DISASS_DUMP
)
11123 disassemble_section (section
, file
);
11125 if (dump_sects
[i
] & HEX_DUMP
)
11126 dump_section (section
, file
);
11128 if (dump_sects
[i
] & DEBUG_DUMP
)
11129 display_debug_section (section
, file
);
11132 /* Check to see if the user requested a
11133 dump of a section that does not exist. */
11134 while (i
++ < num_dump_sects
)
11136 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
11140 process_mips_fpe_exception (int mask
)
11145 if (mask
& OEX_FPU_INEX
)
11146 fputs ("INEX", stdout
), first
= 0;
11147 if (mask
& OEX_FPU_UFLO
)
11148 printf ("%sUFLO", first
? "" : "|"), first
= 0;
11149 if (mask
& OEX_FPU_OFLO
)
11150 printf ("%sOFLO", first
? "" : "|"), first
= 0;
11151 if (mask
& OEX_FPU_DIV0
)
11152 printf ("%sDIV0", first
? "" : "|"), first
= 0;
11153 if (mask
& OEX_FPU_INVAL
)
11154 printf ("%sINVAL", first
? "" : "|");
11157 fputs ("0", stdout
);
11161 process_mips_specific (FILE *file
)
11163 Elf_Internal_Dyn
*entry
;
11164 size_t liblist_offset
= 0;
11165 size_t liblistno
= 0;
11166 size_t conflictsno
= 0;
11167 size_t options_offset
= 0;
11168 size_t conflicts_offset
= 0;
11170 /* We have a lot of special sections. Thanks SGI! */
11171 if (dynamic_section
== NULL
)
11172 /* No information available. */
11175 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
11176 switch (entry
->d_tag
)
11178 case DT_MIPS_LIBLIST
:
11180 = offset_from_vma (file
, entry
->d_un
.d_val
,
11181 liblistno
* sizeof (Elf32_External_Lib
));
11183 case DT_MIPS_LIBLISTNO
:
11184 liblistno
= entry
->d_un
.d_val
;
11186 case DT_MIPS_OPTIONS
:
11187 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
11189 case DT_MIPS_CONFLICT
:
11191 = offset_from_vma (file
, entry
->d_un
.d_val
,
11192 conflictsno
* sizeof (Elf32_External_Conflict
));
11194 case DT_MIPS_CONFLICTNO
:
11195 conflictsno
= entry
->d_un
.d_val
;
11201 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
11203 Elf32_External_Lib
*elib
;
11206 elib
= get_data (NULL
, file
, liblist_offset
,
11207 liblistno
, sizeof (Elf32_External_Lib
),
11211 printf ("\nSection '.liblist' contains %lu entries:\n",
11212 (unsigned long) liblistno
);
11213 fputs (" Library Time Stamp Checksum Version Flags\n",
11216 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
11223 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11224 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11225 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11226 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11227 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11229 tmp
= gmtime (&time
);
11230 snprintf (timebuf
, sizeof (timebuf
),
11231 "%04u-%02u-%02uT%02u:%02u:%02u",
11232 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11233 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11235 printf ("%3lu: ", (unsigned long) cnt
);
11236 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
11237 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
11239 printf ("<corrupt: %9ld>", liblist
.l_name
);
11240 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
11241 liblist
.l_version
);
11243 if (liblist
.l_flags
== 0)
11247 static const struct
11254 { " EXACT_MATCH", LL_EXACT_MATCH
},
11255 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
11256 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
11257 { " EXPORTS", LL_EXPORTS
},
11258 { " DELAY_LOAD", LL_DELAY_LOAD
},
11259 { " DELTA", LL_DELTA
}
11261 int flags
= liblist
.l_flags
;
11265 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
11267 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
11269 fputs (l_flags_vals
[fcnt
].name
, stdout
);
11270 flags
^= l_flags_vals
[fcnt
].bit
;
11273 printf (" %#x", (unsigned int) flags
);
11283 if (options_offset
!= 0)
11285 Elf_External_Options
*eopt
;
11286 Elf_Internal_Shdr
*sect
= section_headers
;
11287 Elf_Internal_Options
*iopt
;
11288 Elf_Internal_Options
*option
;
11292 /* Find the section header so that we get the size. */
11293 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
11296 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
11300 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
11303 error (_("Out of memory"));
11310 while (offset
< sect
->sh_size
)
11312 Elf_External_Options
*eoption
;
11314 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
11316 option
->kind
= BYTE_GET (eoption
->kind
);
11317 option
->size
= BYTE_GET (eoption
->size
);
11318 option
->section
= BYTE_GET (eoption
->section
);
11319 option
->info
= BYTE_GET (eoption
->info
);
11321 offset
+= option
->size
;
11327 printf (_("\nSection '%s' contains %d entries:\n"),
11328 SECTION_NAME (sect
), cnt
);
11336 switch (option
->kind
)
11339 /* This shouldn't happen. */
11340 printf (" NULL %d %lx", option
->section
, option
->info
);
11343 printf (" REGINFO ");
11344 if (elf_header
.e_machine
== EM_MIPS
)
11347 Elf32_External_RegInfo
*ereg
;
11348 Elf32_RegInfo reginfo
;
11350 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
11351 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11352 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11353 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11354 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11355 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11356 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11358 printf ("GPR %08lx GP 0x%lx\n",
11359 reginfo
.ri_gprmask
,
11360 (unsigned long) reginfo
.ri_gp_value
);
11361 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11362 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11363 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11368 Elf64_External_RegInfo
*ereg
;
11369 Elf64_Internal_RegInfo reginfo
;
11371 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
11372 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11373 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11374 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11375 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11376 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11377 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11379 printf ("GPR %08lx GP 0x",
11380 reginfo
.ri_gprmask
);
11381 printf_vma (reginfo
.ri_gp_value
);
11384 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11385 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11386 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11390 case ODK_EXCEPTIONS
:
11391 fputs (" EXCEPTIONS fpe_min(", stdout
);
11392 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
11393 fputs (") fpe_max(", stdout
);
11394 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
11395 fputs (")", stdout
);
11397 if (option
->info
& OEX_PAGE0
)
11398 fputs (" PAGE0", stdout
);
11399 if (option
->info
& OEX_SMM
)
11400 fputs (" SMM", stdout
);
11401 if (option
->info
& OEX_FPDBUG
)
11402 fputs (" FPDBUG", stdout
);
11403 if (option
->info
& OEX_DISMISS
)
11404 fputs (" DISMISS", stdout
);
11407 fputs (" PAD ", stdout
);
11408 if (option
->info
& OPAD_PREFIX
)
11409 fputs (" PREFIX", stdout
);
11410 if (option
->info
& OPAD_POSTFIX
)
11411 fputs (" POSTFIX", stdout
);
11412 if (option
->info
& OPAD_SYMBOL
)
11413 fputs (" SYMBOL", stdout
);
11416 fputs (" HWPATCH ", stdout
);
11417 if (option
->info
& OHW_R4KEOP
)
11418 fputs (" R4KEOP", stdout
);
11419 if (option
->info
& OHW_R8KPFETCH
)
11420 fputs (" R8KPFETCH", stdout
);
11421 if (option
->info
& OHW_R5KEOP
)
11422 fputs (" R5KEOP", stdout
);
11423 if (option
->info
& OHW_R5KCVTL
)
11424 fputs (" R5KCVTL", stdout
);
11427 fputs (" FILL ", stdout
);
11428 /* XXX Print content of info word? */
11431 fputs (" TAGS ", stdout
);
11432 /* XXX Print content of info word? */
11435 fputs (" HWAND ", stdout
);
11436 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11437 fputs (" R4KEOP_CHECKED", stdout
);
11438 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11439 fputs (" R4KEOP_CLEAN", stdout
);
11442 fputs (" HWOR ", stdout
);
11443 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11444 fputs (" R4KEOP_CHECKED", stdout
);
11445 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11446 fputs (" R4KEOP_CLEAN", stdout
);
11449 printf (" GP_GROUP %#06lx self-contained %#06lx",
11450 option
->info
& OGP_GROUP
,
11451 (option
->info
& OGP_SELF
) >> 16);
11454 printf (" IDENT %#06lx self-contained %#06lx",
11455 option
->info
& OGP_GROUP
,
11456 (option
->info
& OGP_SELF
) >> 16);
11459 /* This shouldn't happen. */
11460 printf (" %3d ??? %d %lx",
11461 option
->kind
, option
->section
, option
->info
);
11465 len
= sizeof (*eopt
);
11466 while (len
< option
->size
)
11467 if (((char *) option
)[len
] >= ' '
11468 && ((char *) option
)[len
] < 0x7f)
11469 printf ("%c", ((char *) option
)[len
++]);
11471 printf ("\\%03o", ((char *) option
)[len
++]);
11473 fputs ("\n", stdout
);
11481 if (conflicts_offset
!= 0 && conflictsno
!= 0)
11483 Elf32_Conflict
*iconf
;
11486 if (dynamic_symbols
== NULL
)
11488 error (_("conflict list found without a dynamic symbol table"));
11492 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
11495 error (_("Out of memory"));
11501 Elf32_External_Conflict
*econf32
;
11503 econf32
= get_data (NULL
, file
, conflicts_offset
,
11504 conflictsno
, sizeof (*econf32
), _("conflict"));
11508 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11509 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
11515 Elf64_External_Conflict
*econf64
;
11517 econf64
= get_data (NULL
, file
, conflicts_offset
,
11518 conflictsno
, sizeof (*econf64
), _("conflict"));
11522 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11523 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
11528 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11529 (unsigned long) conflictsno
);
11530 puts (_(" Num: Index Value Name"));
11532 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11534 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
11536 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
11537 print_vma (psym
->st_value
, FULL_HEX
);
11539 if (VALID_DYNAMIC_NAME (psym
->st_name
))
11540 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
11542 printf ("<corrupt: %14ld>", psym
->st_name
);
11553 process_gnu_liblist (FILE *file
)
11555 Elf_Internal_Shdr
*section
, *string_sec
;
11556 Elf32_External_Lib
*elib
;
11558 size_t strtab_size
;
11565 for (i
= 0, section
= section_headers
;
11566 i
< elf_header
.e_shnum
;
11569 switch (section
->sh_type
)
11571 case SHT_GNU_LIBLIST
:
11572 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
11575 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
11580 string_sec
= SECTION_HEADER (section
->sh_link
);
11582 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
11583 string_sec
->sh_size
, _("liblist string table"));
11584 strtab_size
= string_sec
->sh_size
;
11587 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
11593 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11594 SECTION_NAME (section
),
11595 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
11597 puts (" Library Time Stamp Checksum Version Flags");
11599 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
11607 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11608 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11609 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11610 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11611 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11613 tmp
= gmtime (&time
);
11614 snprintf (timebuf
, sizeof (timebuf
),
11615 "%04u-%02u-%02uT%02u:%02u:%02u",
11616 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11617 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11619 printf ("%3lu: ", (unsigned long) cnt
);
11621 printf ("%-20s", liblist
.l_name
< strtab_size
11622 ? strtab
+ liblist
.l_name
: "<corrupt>");
11624 printf ("%-20.20s", liblist
.l_name
< strtab_size
11625 ? strtab
+ liblist
.l_name
: "<corrupt>");
11626 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
11627 liblist
.l_version
, liblist
.l_flags
);
11637 static const char *
11638 get_note_type (unsigned e_type
)
11640 static char buff
[64];
11642 if (elf_header
.e_type
== ET_CORE
)
11646 return _("NT_AUXV (auxiliary vector)");
11648 return _("NT_PRSTATUS (prstatus structure)");
11650 return _("NT_FPREGSET (floating point registers)");
11652 return _("NT_PRPSINFO (prpsinfo structure)");
11653 case NT_TASKSTRUCT
:
11654 return _("NT_TASKSTRUCT (task structure)");
11656 return _("NT_PRXFPREG (user_xfpregs structure)");
11658 return _("NT_PSTATUS (pstatus structure)");
11660 return _("NT_FPREGS (floating point registers)");
11662 return _("NT_PSINFO (psinfo structure)");
11664 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11666 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11667 case NT_WIN32PSTATUS
:
11668 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11676 return _("NT_VERSION (version)");
11678 return _("NT_ARCH (architecture)");
11683 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11687 static const char *
11688 get_netbsd_elfcore_note_type (unsigned e_type
)
11690 static char buff
[64];
11692 if (e_type
== NT_NETBSDCORE_PROCINFO
)
11694 /* NetBSD core "procinfo" structure. */
11695 return _("NetBSD procinfo structure");
11698 /* As of Jan 2002 there are no other machine-independent notes
11699 defined for NetBSD core files. If the note type is less
11700 than the start of the machine-dependent note types, we don't
11703 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
11705 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11709 switch (elf_header
.e_machine
)
11711 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11712 and PT_GETFPREGS == mach+2. */
11717 case EM_SPARC32PLUS
:
11721 case NT_NETBSDCORE_FIRSTMACH
+0:
11722 return _("PT_GETREGS (reg structure)");
11723 case NT_NETBSDCORE_FIRSTMACH
+2:
11724 return _("PT_GETFPREGS (fpreg structure)");
11730 /* On all other arch's, PT_GETREGS == mach+1 and
11731 PT_GETFPREGS == mach+3. */
11735 case NT_NETBSDCORE_FIRSTMACH
+1:
11736 return _("PT_GETREGS (reg structure)");
11737 case NT_NETBSDCORE_FIRSTMACH
+3:
11738 return _("PT_GETFPREGS (fpreg structure)");
11744 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
11745 e_type
- NT_NETBSDCORE_FIRSTMACH
);
11749 /* Note that by the ELF standard, the name field is already null byte
11750 terminated, and namesz includes the terminating null byte.
11751 I.E. the value of namesz for the name "FSF" is 4.
11753 If the value of namesz is zero, there is no name present. */
11755 process_note (Elf_Internal_Note
*pnote
)
11759 if (pnote
->namesz
== 0)
11760 /* If there is no note name, then use the default set of
11761 note type strings. */
11762 nt
= get_note_type (pnote
->type
);
11764 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
11765 /* NetBSD-specific core file notes. */
11766 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
11769 /* Don't recognize this note name; just use the default set of
11770 note type strings. */
11771 nt
= get_note_type (pnote
->type
);
11773 printf (" %s\t\t0x%08lx\t%s\n",
11774 pnote
->namesz
? pnote
->namedata
: "(NONE)",
11775 pnote
->descsz
, nt
);
11781 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
11783 Elf_External_Note
*pnotes
;
11784 Elf_External_Note
*external
;
11790 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
11796 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11797 (unsigned long) offset
, (unsigned long) length
);
11798 printf (_(" Owner\t\tData size\tDescription\n"));
11800 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
11802 Elf_External_Note
*next
;
11803 Elf_Internal_Note inote
;
11806 inote
.type
= BYTE_GET (external
->type
);
11807 inote
.namesz
= BYTE_GET (external
->namesz
);
11808 inote
.namedata
= external
->name
;
11809 inote
.descsz
= BYTE_GET (external
->descsz
);
11810 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
11811 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
11813 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
11815 if (((char *) next
) > (((char *) pnotes
) + length
))
11817 warn (_("corrupt note found at offset %x into core notes\n"),
11818 ((char *) external
) - ((char *) pnotes
));
11819 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11820 inote
.type
, inote
.namesz
, inote
.descsz
);
11826 /* Verify that name is null terminated. It appears that at least
11827 one version of Linux (RedHat 6.0) generates corefiles that don't
11828 comply with the ELF spec by failing to include the null byte in
11830 if (inote
.namedata
[inote
.namesz
] != '\0')
11832 temp
= malloc (inote
.namesz
+ 1);
11836 error (_("Out of memory\n"));
11841 strncpy (temp
, inote
.namedata
, inote
.namesz
);
11842 temp
[inote
.namesz
] = 0;
11844 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11845 inote
.namedata
= temp
;
11848 res
&= process_note (& inote
);
11863 process_corefile_note_segments (FILE *file
)
11865 Elf_Internal_Phdr
*segment
;
11869 if (! get_program_headers (file
))
11872 for (i
= 0, segment
= program_headers
;
11873 i
< elf_header
.e_phnum
;
11876 if (segment
->p_type
== PT_NOTE
)
11877 res
&= process_corefile_note_segment (file
,
11878 (bfd_vma
) segment
->p_offset
,
11879 (bfd_vma
) segment
->p_filesz
);
11886 process_note_sections (FILE *file
)
11888 Elf_Internal_Shdr
*section
;
11892 for (i
= 0, section
= section_headers
;
11893 i
< elf_header
.e_shnum
;
11895 if (section
->sh_type
== SHT_NOTE
)
11896 res
&= process_corefile_note_segment (file
,
11897 (bfd_vma
) section
->sh_offset
,
11898 (bfd_vma
) section
->sh_size
);
11904 process_notes (FILE *file
)
11906 /* If we have not been asked to display the notes then do nothing. */
11910 if (elf_header
.e_type
!= ET_CORE
)
11911 return process_note_sections (file
);
11913 /* No program headers means no NOTE segment. */
11914 if (elf_header
.e_phnum
> 0)
11915 return process_corefile_note_segments (file
);
11917 printf (_("No note segments present in the core file.\n"));
11922 process_arch_specific (FILE *file
)
11927 switch (elf_header
.e_machine
)
11930 case EM_MIPS_RS3_LE
:
11931 return process_mips_specific (file
);
11940 get_file_header (FILE *file
)
11942 /* Read in the identity array. */
11943 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
11946 /* Determine how to read the rest of the header. */
11947 switch (elf_header
.e_ident
[EI_DATA
])
11949 default: /* fall through */
11950 case ELFDATANONE
: /* fall through */
11952 byte_get
= byte_get_little_endian
;
11953 byte_put
= byte_put_little_endian
;
11956 byte_get
= byte_get_big_endian
;
11957 byte_put
= byte_put_big_endian
;
11961 /* For now we only support 32 bit and 64 bit ELF files. */
11962 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
11964 /* Read in the rest of the header. */
11967 Elf32_External_Ehdr ehdr32
;
11969 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
11972 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
11973 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
11974 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
11975 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
11976 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
11977 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
11978 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
11979 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
11980 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
11981 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
11982 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
11983 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
11984 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
11988 Elf64_External_Ehdr ehdr64
;
11990 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11991 we will not be able to cope with the 64bit data found in
11992 64 ELF files. Detect this now and abort before we start
11993 overwriting things. */
11994 if (sizeof (bfd_vma
) < 8)
11996 error (_("This instance of readelf has been built without support for a\n\
11997 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12001 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
12004 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
12005 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
12006 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
12007 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
12008 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
12009 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
12010 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
12011 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
12012 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
12013 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
12014 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
12015 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
12016 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
12019 if (elf_header
.e_shoff
)
12021 /* There may be some extensions in the first section header. Don't
12022 bomb if we can't read it. */
12024 get_32bit_section_headers (file
, 1);
12026 get_64bit_section_headers (file
, 1);
12032 /* Process one ELF object file according to the command line options.
12033 This file may actually be stored in an archive. The file is
12034 positioned at the start of the ELF object. */
12037 process_object (char *file_name
, FILE *file
)
12041 if (! get_file_header (file
))
12043 error (_("%s: Failed to read file header\n"), file_name
);
12047 /* Initialise per file variables. */
12048 for (i
= NUM_ELEM (version_info
); i
--;)
12049 version_info
[i
] = 0;
12051 for (i
= NUM_ELEM (dynamic_info
); i
--;)
12052 dynamic_info
[i
] = 0;
12054 /* Process the file. */
12056 printf (_("\nFile: %s\n"), file_name
);
12058 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12059 Note we do this even if cmdline_dump_sects is empty because we
12060 must make sure that the dump_sets array is zeroed out before each
12061 object file is processed. */
12062 if (num_dump_sects
> num_cmdline_dump_sects
)
12063 memset (dump_sects
, 0, num_dump_sects
);
12065 if (num_cmdline_dump_sects
> 0)
12067 if (num_dump_sects
== 0)
12068 /* A sneaky way of allocating the dump_sects array. */
12069 request_dump (num_cmdline_dump_sects
, 0);
12071 assert (num_dump_sects
>= num_cmdline_dump_sects
);
12072 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
12075 if (! process_file_header ())
12078 if (! process_section_headers (file
))
12080 /* Without loaded section headers we cannot process lots of
12082 do_unwind
= do_version
= do_dump
= do_arch
= 0;
12084 if (! do_using_dynamic
)
12085 do_syms
= do_reloc
= 0;
12088 if (! process_section_groups (file
))
12090 /* Without loaded section groups we cannot process unwind. */
12094 if (process_program_headers (file
))
12095 process_dynamic_section (file
);
12097 process_relocs (file
);
12099 process_unwind (file
);
12101 process_symbol_table (file
);
12103 process_syminfo (file
);
12105 process_version_sections (file
);
12107 process_section_contents (file
);
12109 process_notes (file
);
12111 process_gnu_liblist (file
);
12113 process_arch_specific (file
);
12115 if (program_headers
)
12117 free (program_headers
);
12118 program_headers
= NULL
;
12121 if (section_headers
)
12123 free (section_headers
);
12124 section_headers
= NULL
;
12129 free (string_table
);
12130 string_table
= NULL
;
12131 string_table_length
= 0;
12134 if (dynamic_strings
)
12136 free (dynamic_strings
);
12137 dynamic_strings
= NULL
;
12138 dynamic_strings_length
= 0;
12141 if (dynamic_symbols
)
12143 free (dynamic_symbols
);
12144 dynamic_symbols
= NULL
;
12145 num_dynamic_syms
= 0;
12148 if (dynamic_syminfo
)
12150 free (dynamic_syminfo
);
12151 dynamic_syminfo
= NULL
;
12154 if (section_headers_groups
)
12156 free (section_headers_groups
);
12157 section_headers_groups
= NULL
;
12160 if (section_groups
)
12162 struct group_list
*g
, *next
;
12164 for (i
= 0; i
< group_count
; i
++)
12166 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
12173 free (section_groups
);
12174 section_groups
= NULL
;
12177 if (debug_information
)
12179 for (i
= 0; i
< num_debug_info_entries
; i
++)
12181 if (!debug_information
[i
].max_loc_offsets
)
12183 free (debug_information
[i
].loc_offsets
);
12184 free (debug_information
[i
].have_frame_base
);
12186 if (!debug_information
[i
].max_range_lists
)
12187 free (debug_information
[i
].range_lists
);
12189 free (debug_information
);
12190 debug_information
= NULL
;
12191 num_debug_info_entries
= 0;
12197 /* Process an ELF archive. The file is positioned just after the
12201 process_archive (char *file_name
, FILE *file
)
12203 struct ar_hdr arhdr
;
12205 unsigned long size
;
12206 char *longnames
= NULL
;
12207 unsigned long longnames_size
= 0;
12208 size_t file_name_size
;
12213 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12214 if (got
!= sizeof arhdr
)
12219 error (_("%s: failed to read archive header\n"), file_name
);
12223 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
12225 /* This is the archive symbol table. Skip it.
12226 FIXME: We should have an option to dump it. */
12227 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12228 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
12230 error (_("%s: failed to skip archive symbol table\n"), file_name
);
12234 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12235 if (got
!= sizeof arhdr
)
12240 error (_("%s: failed to read archive header\n"), file_name
);
12245 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
12247 /* This is the archive string table holding long member
12250 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12252 longnames
= malloc (longnames_size
);
12253 if (longnames
== NULL
)
12255 error (_("Out of memory\n"));
12259 if (fread (longnames
, longnames_size
, 1, file
) != 1)
12262 error (_("%s: failed to read string table\n"), file_name
);
12266 if ((longnames_size
& 1) != 0)
12269 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12270 if (got
!= sizeof arhdr
)
12277 error (_("%s: failed to read archive header\n"), file_name
);
12282 file_name_size
= strlen (file_name
);
12291 if (arhdr
.ar_name
[0] == '/')
12295 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
12296 if (off
>= longnames_size
)
12298 error (_("%s: invalid archive string table offset %lu\n"), off
);
12303 name
= longnames
+ off
;
12304 nameend
= memchr (name
, '/', longnames_size
- off
);
12308 name
= arhdr
.ar_name
;
12309 nameend
= memchr (name
, '/', 16);
12312 if (nameend
== NULL
)
12314 error (_("%s: bad archive file name\n"));
12319 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
12320 if (namealc
== NULL
)
12322 error (_("Out of memory\n"));
12327 memcpy (namealc
, file_name
, file_name_size
);
12328 namealc
[file_name_size
] = '(';
12329 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
12330 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
12331 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
12333 archive_file_offset
= ftell (file
);
12334 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12336 ret
|= process_object (namealc
, file
);
12341 (archive_file_offset
12342 + archive_file_size
12343 + (archive_file_size
& 1)),
12346 error (_("%s: failed to seek to next archive header\n"), file_name
);
12351 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12352 if (got
!= sizeof arhdr
)
12357 error (_("%s: failed to read archive header\n"), file_name
);
12363 if (longnames
!= 0)
12370 process_file (char *file_name
)
12373 struct stat statbuf
;
12374 char armag
[SARMAG
];
12377 if (stat (file_name
, &statbuf
) < 0)
12379 if (errno
== ENOENT
)
12380 error (_("'%s': No such file\n"), file_name
);
12382 error (_("Could not locate '%s'. System error message: %s\n"),
12383 file_name
, strerror (errno
));
12387 if (! S_ISREG (statbuf
.st_mode
))
12389 error (_("'%s' is not an ordinary file\n"), file_name
);
12393 file
= fopen (file_name
, "rb");
12396 error (_("Input file '%s' is not readable.\n"), file_name
);
12400 if (fread (armag
, SARMAG
, 1, file
) != 1)
12402 error (_("%s: Failed to read file header\n"), file_name
);
12407 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
12408 ret
= process_archive (file_name
, file
);
12412 archive_file_size
= archive_file_offset
= 0;
12413 ret
= process_object (file_name
, file
);
12421 #ifdef SUPPORT_DISASSEMBLY
12422 /* Needed by the i386 disassembler. For extra credit, someone could
12423 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12427 print_address (unsigned int addr
, FILE *outfile
)
12429 fprintf (outfile
,"0x%8.8x", addr
);
12432 /* Needed by the i386 disassembler. */
12434 db_task_printsym (unsigned int addr
)
12436 print_address (addr
, stderr
);
12441 main (int argc
, char **argv
)
12445 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12446 setlocale (LC_MESSAGES
, "");
12448 #if defined (HAVE_SETLOCALE)
12449 setlocale (LC_CTYPE
, "");
12451 bindtextdomain (PACKAGE
, LOCALEDIR
);
12452 textdomain (PACKAGE
);
12454 parse_args (argc
, argv
);
12456 if (num_dump_sects
> 0)
12458 /* Make a copy of the dump_sects array. */
12459 cmdline_dump_sects
= malloc (num_dump_sects
);
12460 if (cmdline_dump_sects
== NULL
)
12461 error (_("Out of memory allocating dump request table."));
12464 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
12465 num_cmdline_dump_sects
= num_dump_sects
;
12469 if (optind
< (argc
- 1))
12473 while (optind
< argc
)
12474 err
|= process_file (argv
[optind
++]);
12476 if (dump_sects
!= NULL
)
12478 if (cmdline_dump_sects
!= NULL
)
12479 free (cmdline_dump_sects
);