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"
92 #include "elf/m68hc11.h"
93 #include "elf/mcore.h"
96 #include "elf/mn10200.h"
97 #include "elf/mn10300.h"
99 #include "elf/msp430.h"
100 #include "elf/or32.h"
103 #include "elf/ppc64.h"
104 #include "elf/s390.h"
106 #include "elf/sparc.h"
107 #include "elf/v850.h"
109 #include "elf/x86-64.h"
110 #include "elf/xstormy16.h"
112 #include "elf/iq2000.h"
113 #include "elf/xtensa.h"
119 #include "libiberty.h"
121 char *program_name
= "readelf";
122 static long archive_file_offset
;
123 static unsigned long archive_file_size
;
124 static unsigned long dynamic_addr
;
125 static bfd_size_type dynamic_size
;
126 static unsigned int dynamic_nent
;
127 static char *dynamic_strings
;
128 static unsigned long dynamic_strings_length
;
129 static char *string_table
;
130 static unsigned long string_table_length
;
131 static unsigned long num_dynamic_syms
;
132 static Elf_Internal_Sym
*dynamic_symbols
;
133 static Elf_Internal_Syminfo
*dynamic_syminfo
;
134 static unsigned long dynamic_syminfo_offset
;
135 static unsigned int dynamic_syminfo_nent
;
136 static char program_interpreter
[64];
137 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
138 static bfd_vma version_info
[16];
139 static Elf_Internal_Ehdr elf_header
;
140 static Elf_Internal_Shdr
*section_headers
;
141 static Elf_Internal_Phdr
*program_headers
;
142 static Elf_Internal_Dyn
*dynamic_section
;
143 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
144 static int show_name
;
145 static int do_dynamic
;
148 static int do_sections
;
149 static int do_section_groups
;
150 static int do_full_section_name
;
151 static int do_segments
;
152 static int do_unwind
;
153 static int do_using_dynamic
;
154 static int do_header
;
156 static int do_version
;
158 static int do_histogram
;
159 static int do_debugging
;
160 static int do_debug_info
;
161 static int do_debug_abbrevs
;
162 static int do_debug_lines
;
163 static int do_debug_pubnames
;
164 static int do_debug_aranges
;
165 static int do_debug_ranges
;
166 static int do_debug_frames
;
167 static int do_debug_frames_interp
;
168 static int do_debug_macinfo
;
169 static int do_debug_str
;
170 static int do_debug_loc
;
173 static int is_32bit_elf
;
174 static int have_frame_base
;
175 static int need_base_address
;
176 static bfd_vma eh_addr_size
;
180 struct group_list
*next
;
181 unsigned int section_index
;
186 struct group_list
*root
;
187 unsigned int group_index
;
190 static size_t group_count
;
191 static struct group
*section_groups
;
192 static struct group
**section_headers_groups
;
194 /* A dynamic array of flags indicating for which sections a hex dump
195 has been requested (via the -x switch) and/or a disassembly dump
196 (via the -i switch). */
197 char *cmdline_dump_sects
= NULL
;
198 unsigned num_cmdline_dump_sects
= 0;
200 /* A dynamic array of flags indicating for which sections a dump of
201 some kind has been requested. It is reset on a per-object file
202 basis and then initialised from the cmdline_dump_sects array and
203 the results of interpreting the -w switch. */
204 char *dump_sects
= NULL
;
205 unsigned int num_dump_sects
= 0;
207 #define HEX_DUMP (1 << 0)
208 #define DISASS_DUMP (1 << 1)
209 #define DEBUG_DUMP (1 << 2)
211 /* How to print a vma value. */
212 typedef enum print_mode
224 static bfd_vma (*byte_get
) (unsigned char *, int);
225 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
229 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
230 ((X)->sh_name >= string_table_length \
231 ? "<corrupt>" : string_table + (X)->sh_name))
233 /* Given st_shndx I, map to section_headers index. */
234 #define SECTION_HEADER_INDEX(I) \
235 ((I) < SHN_LORESERVE \
237 : ((I) <= SHN_HIRESERVE \
239 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
241 /* Reverse of the above. */
242 #define SECTION_HEADER_NUM(N) \
243 ((N) < SHN_LORESERVE \
245 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
247 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
249 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
251 #define BYTE_GET(field) byte_get (field, sizeof (field))
253 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
255 #define GET_ELF_SYMBOLS(file, section) \
256 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
257 : get_64bit_elf_symbols (file, section))
259 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
260 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
261 already been called and verified that the string exists. */
262 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
264 /* This is just a bit of syntatic sugar. */
265 #define streq(a,b) (strcmp ((a), (b)) == 0)
266 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
268 static void ATTRIBUTE_PRINTF_1
269 error (const char *message
, ...)
273 va_start (args
, message
);
274 fprintf (stderr
, _("%s: Error: "), program_name
);
275 vfprintf (stderr
, message
, args
);
279 static void ATTRIBUTE_PRINTF_1
280 warn (const char *message
, ...)
284 va_start (args
, message
);
285 fprintf (stderr
, _("%s: Warning: "), program_name
);
286 vfprintf (stderr
, message
, args
);
291 cmalloc (size_t nmemb
, size_t size
)
293 /* Check for overflow. */
294 if (nmemb
>= ~(size_t) 0 / size
)
297 return malloc (nmemb
* size
);
301 xcmalloc (size_t nmemb
, size_t size
)
303 /* Check for overflow. */
304 if (nmemb
>= ~(size_t) 0 / size
)
307 return xmalloc (nmemb
* size
);
311 xcrealloc (void *ptr
, size_t nmemb
, size_t size
)
313 /* Check for overflow. */
314 if (nmemb
>= ~(size_t) 0 / size
)
317 return xrealloc (ptr
, nmemb
* size
);
321 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
326 if (size
== 0 || nmemb
== 0)
329 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
331 error (_("Unable to seek to 0x%lx for %s\n"),
332 archive_file_offset
+ offset
, reason
);
339 /* Check for overflow. */
340 if (nmemb
< (~(size_t) 0 - 1) / size
)
341 /* + 1 so that we can '\0' terminate invalid string table sections. */
342 mvar
= malloc (size
* nmemb
+ 1);
346 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
347 (unsigned long)(size
* nmemb
), reason
);
351 ((char *) mvar
)[size
* nmemb
] = '\0';
354 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
356 error (_("Unable to read in 0x%lx bytes of %s\n"),
357 (unsigned long)(size
* nmemb
), reason
);
367 byte_get_little_endian (unsigned char *field
, int size
)
375 return ((unsigned int) (field
[0]))
376 | (((unsigned int) (field
[1])) << 8);
380 /* We want to extract data from an 8 byte wide field and
381 place it into a 4 byte wide field. Since this is a little
382 endian source we can just use the 4 byte extraction code. */
386 return ((unsigned long) (field
[0]))
387 | (((unsigned long) (field
[1])) << 8)
388 | (((unsigned long) (field
[2])) << 16)
389 | (((unsigned long) (field
[3])) << 24);
393 return ((bfd_vma
) (field
[0]))
394 | (((bfd_vma
) (field
[1])) << 8)
395 | (((bfd_vma
) (field
[2])) << 16)
396 | (((bfd_vma
) (field
[3])) << 24)
397 | (((bfd_vma
) (field
[4])) << 32)
398 | (((bfd_vma
) (field
[5])) << 40)
399 | (((bfd_vma
) (field
[6])) << 48)
400 | (((bfd_vma
) (field
[7])) << 56);
403 error (_("Unhandled data length: %d\n"), size
);
409 byte_get_signed (unsigned char *field
, int size
)
411 bfd_vma x
= byte_get (field
, size
);
416 return (x
^ 0x80) - 0x80;
418 return (x
^ 0x8000) - 0x8000;
420 return (x
^ 0x80000000) - 0x80000000;
429 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
434 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
435 field
[6] = ((value
>> 24) >> 24) & 0xff;
436 field
[5] = ((value
>> 24) >> 16) & 0xff;
437 field
[4] = ((value
>> 24) >> 8) & 0xff;
440 field
[3] = (value
>> 24) & 0xff;
441 field
[2] = (value
>> 16) & 0xff;
444 field
[1] = (value
>> 8) & 0xff;
447 field
[0] = value
& 0xff;
451 error (_("Unhandled data length: %d\n"), size
);
456 #if defined BFD64 && !BFD_HOST_64BIT_LONG
458 print_dec_vma (bfd_vma vma
, int is_signed
)
464 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
473 *bufp
++ = '0' + vma
% 10;
485 print_hex_vma (bfd_vma vma
)
493 char digit
= '0' + (vma
& 0x0f);
495 digit
+= 'a' - '0' - 10;
508 /* Print a VMA value. */
510 print_vma (bfd_vma vma
, print_mode mode
)
519 return printf ("0x%8.8lx", (unsigned long) vma
);
522 return printf ("%8.8lx", (unsigned long) vma
);
526 return printf ("%5ld", (long) vma
);
530 return printf ("0x%lx", (unsigned long) vma
);
533 return printf ("%lx", (unsigned long) vma
);
536 return printf ("%ld", (unsigned long) vma
);
539 return printf ("%lu", (unsigned long) vma
);
562 #if BFD_HOST_64BIT_LONG
563 return nc
+ printf ("%lx", vma
);
565 return nc
+ print_hex_vma (vma
);
569 #if BFD_HOST_64BIT_LONG
570 return printf ("%ld", vma
);
572 return print_dec_vma (vma
, 1);
576 #if BFD_HOST_64BIT_LONG
578 return printf ("%5ld", vma
);
580 return printf ("%#lx", vma
);
583 return printf ("%5ld", _bfd_int64_low (vma
));
585 return print_hex_vma (vma
);
589 #if BFD_HOST_64BIT_LONG
590 return printf ("%lu", vma
);
592 return print_dec_vma (vma
, 0);
600 /* Display a symbol on stdout. If do_wide is not true then
601 format the symbol to be at most WIDTH characters,
602 truncating as necessary. If WIDTH is negative then
603 format the string to be exactly - WIDTH characters,
604 truncating or padding as necessary. */
607 print_symbol (int width
, const char *symbol
)
610 printf ("%s", symbol
);
612 printf ("%-*.*s", width
, width
, symbol
);
614 printf ("%-.*s", width
, symbol
);
618 byte_get_big_endian (unsigned char *field
, int size
)
626 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
630 /* Although we are extracing data from an 8 byte wide field,
631 we are returning only 4 bytes of data. */
636 return ((unsigned long) (field
[3]))
637 | (((unsigned long) (field
[2])) << 8)
638 | (((unsigned long) (field
[1])) << 16)
639 | (((unsigned long) (field
[0])) << 24);
643 return ((bfd_vma
) (field
[7]))
644 | (((bfd_vma
) (field
[6])) << 8)
645 | (((bfd_vma
) (field
[5])) << 16)
646 | (((bfd_vma
) (field
[4])) << 24)
647 | (((bfd_vma
) (field
[3])) << 32)
648 | (((bfd_vma
) (field
[2])) << 40)
649 | (((bfd_vma
) (field
[1])) << 48)
650 | (((bfd_vma
) (field
[0])) << 56);
654 error (_("Unhandled data length: %d\n"), size
);
660 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
665 field
[7] = value
& 0xff;
666 field
[6] = (value
>> 8) & 0xff;
667 field
[5] = (value
>> 16) & 0xff;
668 field
[4] = (value
>> 24) & 0xff;
673 field
[3] = value
& 0xff;
674 field
[2] = (value
>> 8) & 0xff;
678 field
[1] = value
& 0xff;
682 field
[0] = value
& 0xff;
686 error (_("Unhandled data length: %d\n"), size
);
691 /* Return a pointer to section NAME, or NULL if no such section exists. */
693 static Elf_Internal_Shdr
*
694 find_section (const char *name
)
698 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
699 if (streq (SECTION_NAME (section_headers
+ i
), name
))
700 return section_headers
+ i
;
705 /* Guess the relocation size commonly used by the specific machines. */
708 guess_is_rela (unsigned long e_machine
)
712 /* Targets that use REL relocations. */
727 /* Targets that use RELA relocations. */
742 case EM_CYGNUS_MN10200
:
744 case EM_CYGNUS_MN10300
:
793 warn (_("Don't know about relocations on this machine architecture\n"));
799 slurp_rela_relocs (FILE *file
,
800 unsigned long rel_offset
,
801 unsigned long rel_size
,
802 Elf_Internal_Rela
**relasp
,
803 unsigned long *nrelasp
)
805 Elf_Internal_Rela
*relas
;
806 unsigned long nrelas
;
811 Elf32_External_Rela
*erelas
;
813 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
817 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
819 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
824 error (_("out of memory parsing relocs"));
828 for (i
= 0; i
< nrelas
; i
++)
830 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
831 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
832 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
839 Elf64_External_Rela
*erelas
;
841 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
845 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
847 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
852 error (_("out of memory parsing relocs"));
856 for (i
= 0; i
< nrelas
; i
++)
858 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
859 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
860 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
871 slurp_rel_relocs (FILE *file
,
872 unsigned long rel_offset
,
873 unsigned long rel_size
,
874 Elf_Internal_Rela
**relsp
,
875 unsigned long *nrelsp
)
877 Elf_Internal_Rela
*rels
;
883 Elf32_External_Rel
*erels
;
885 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
889 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
891 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
896 error (_("out of memory parsing relocs"));
900 for (i
= 0; i
< nrels
; i
++)
902 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
903 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
904 rels
[i
].r_addend
= 0;
911 Elf64_External_Rel
*erels
;
913 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
917 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
919 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
924 error (_("out of memory parsing relocs"));
928 for (i
= 0; i
< nrels
; i
++)
930 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
931 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
932 rels
[i
].r_addend
= 0;
942 /* Display the contents of the relocation data found at the specified
946 dump_relocations (FILE *file
,
947 unsigned long rel_offset
,
948 unsigned long rel_size
,
949 Elf_Internal_Sym
*symtab
,
952 unsigned long strtablen
,
956 Elf_Internal_Rela
*rels
;
959 if (is_rela
== UNKNOWN
)
960 is_rela
= guess_is_rela (elf_header
.e_machine
);
964 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
969 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
978 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
980 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
985 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
987 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
995 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
997 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1002 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1004 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1008 for (i
= 0; i
< rel_size
; i
++)
1011 const char *rtype2
= NULL
;
1012 const char *rtype3
= NULL
;
1015 bfd_vma symtab_index
;
1020 offset
= rels
[i
].r_offset
;
1021 info
= rels
[i
].r_info
;
1025 type
= ELF32_R_TYPE (info
);
1026 symtab_index
= ELF32_R_SYM (info
);
1030 /* The #ifdef BFD64 below is to prevent a compile time warning.
1031 We know that if we do not have a 64 bit data type that we
1032 will never execute this code anyway. */
1034 if (elf_header
.e_machine
== EM_MIPS
)
1036 /* In little-endian objects, r_info isn't really a 64-bit
1037 little-endian value: it has a 32-bit little-endian
1038 symbol index followed by four individual byte fields.
1039 Reorder INFO accordingly. */
1040 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1041 info
= (((info
& 0xffffffff) << 32)
1042 | ((info
>> 56) & 0xff)
1043 | ((info
>> 40) & 0xff00)
1044 | ((info
>> 24) & 0xff0000)
1045 | ((info
>> 8) & 0xff000000));
1046 type
= ELF64_MIPS_R_TYPE (info
);
1047 type2
= ELF64_MIPS_R_TYPE2 (info
);
1048 type3
= ELF64_MIPS_R_TYPE3 (info
);
1050 else if (elf_header
.e_machine
== EM_SPARCV9
)
1051 type
= ELF64_R_TYPE_ID (info
);
1053 type
= ELF64_R_TYPE (info
);
1055 symtab_index
= ELF64_R_SYM (info
);
1061 #ifdef _bfd_int64_low
1062 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1064 printf ("%8.8lx %8.8lx ", offset
, info
);
1069 #ifdef _bfd_int64_low
1071 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1072 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1073 _bfd_int64_high (offset
),
1074 _bfd_int64_low (offset
),
1075 _bfd_int64_high (info
),
1076 _bfd_int64_low (info
));
1079 ? "%16.16lx %16.16lx "
1080 : "%12.12lx %12.12lx ",
1085 switch (elf_header
.e_machine
)
1092 case EM_CYGNUS_M32R
:
1093 rtype
= elf_m32r_reloc_type (type
);
1098 rtype
= elf_i386_reloc_type (type
);
1103 rtype
= elf_m68hc11_reloc_type (type
);
1107 rtype
= elf_m68k_reloc_type (type
);
1111 rtype
= elf_i960_reloc_type (type
);
1116 rtype
= elf_avr_reloc_type (type
);
1119 case EM_OLD_SPARCV9
:
1120 case EM_SPARC32PLUS
:
1123 rtype
= elf_sparc_reloc_type (type
);
1127 case EM_CYGNUS_V850
:
1128 rtype
= v850_reloc_type (type
);
1132 case EM_CYGNUS_D10V
:
1133 rtype
= elf_d10v_reloc_type (type
);
1137 case EM_CYGNUS_D30V
:
1138 rtype
= elf_d30v_reloc_type (type
);
1142 rtype
= elf_dlx_reloc_type (type
);
1146 rtype
= elf_sh_reloc_type (type
);
1150 case EM_CYGNUS_MN10300
:
1151 rtype
= elf_mn10300_reloc_type (type
);
1155 case EM_CYGNUS_MN10200
:
1156 rtype
= elf_mn10200_reloc_type (type
);
1160 case EM_CYGNUS_FR30
:
1161 rtype
= elf_fr30_reloc_type (type
);
1165 rtype
= elf_frv_reloc_type (type
);
1169 rtype
= elf_mcore_reloc_type (type
);
1173 rtype
= elf_mmix_reloc_type (type
);
1178 rtype
= elf_msp430_reloc_type (type
);
1182 rtype
= elf_ppc_reloc_type (type
);
1186 rtype
= elf_ppc64_reloc_type (type
);
1190 case EM_MIPS_RS3_LE
:
1191 rtype
= elf_mips_reloc_type (type
);
1194 rtype2
= elf_mips_reloc_type (type2
);
1195 rtype3
= elf_mips_reloc_type (type3
);
1200 rtype
= elf_alpha_reloc_type (type
);
1204 rtype
= elf_arm_reloc_type (type
);
1208 rtype
= elf_arc_reloc_type (type
);
1212 rtype
= elf_hppa_reloc_type (type
);
1218 rtype
= elf_h8_reloc_type (type
);
1223 rtype
= elf_or32_reloc_type (type
);
1228 rtype
= elf_pj_reloc_type (type
);
1231 rtype
= elf_ia64_reloc_type (type
);
1235 rtype
= elf_cris_reloc_type (type
);
1239 rtype
= elf_i860_reloc_type (type
);
1243 rtype
= elf_x86_64_reloc_type (type
);
1247 rtype
= i370_reloc_type (type
);
1252 rtype
= elf_s390_reloc_type (type
);
1256 rtype
= elf_xstormy16_reloc_type (type
);
1260 rtype
= elf_crx_reloc_type (type
);
1264 rtype
= elf_vax_reloc_type (type
);
1269 rtype
= elf_ip2k_reloc_type (type
);
1273 rtype
= elf_iq2000_reloc_type (type
);
1278 rtype
= elf_xtensa_reloc_type (type
);
1282 rtype
= elf_m32c_reloc_type (type
);
1286 rtype
= elf_ms1_reloc_type (type
);
1291 #ifdef _bfd_int64_low
1292 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1294 printf (_("unrecognized: %-7lx"), type
);
1297 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1299 if (elf_header
.e_machine
== EM_ALPHA
1300 && streq (rtype
, "R_ALPHA_LITUSE")
1303 switch (rels
[i
].r_addend
)
1305 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1306 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1307 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1308 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1309 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1310 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1311 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1312 default: rtype
= NULL
;
1315 printf (" (%s)", rtype
);
1319 printf (_("<unknown addend: %lx>"),
1320 (unsigned long) rels
[i
].r_addend
);
1323 else if (symtab_index
)
1325 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1326 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1329 Elf_Internal_Sym
*psym
;
1331 psym
= symtab
+ symtab_index
;
1334 print_vma (psym
->st_value
, LONG_HEX
);
1335 printf (is_32bit_elf
? " " : " ");
1337 if (psym
->st_name
== 0)
1339 const char *sec_name
= "<null>";
1342 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1344 bfd_vma sec_index
= (bfd_vma
) -1;
1346 if (psym
->st_shndx
< SHN_LORESERVE
)
1347 sec_index
= psym
->st_shndx
;
1348 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1349 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1352 if (sec_index
!= (bfd_vma
) -1)
1353 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1354 else if (psym
->st_shndx
== SHN_ABS
)
1356 else if (psym
->st_shndx
== SHN_COMMON
)
1357 sec_name
= "COMMON";
1358 else if (elf_header
.e_machine
== EM_X86_64
1359 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1360 sec_name
= "LARGE_COMMON";
1361 else if (elf_header
.e_machine
== EM_IA_64
1362 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1363 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1364 sec_name
= "ANSI_COM";
1367 sprintf (name_buf
, "<section 0x%x>",
1368 (unsigned int) psym
->st_shndx
);
1369 sec_name
= name_buf
;
1372 print_symbol (22, sec_name
);
1374 else if (strtab
== NULL
)
1375 printf (_("<string table index: %3ld>"), psym
->st_name
);
1376 else if (psym
->st_name
>= strtablen
)
1377 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1379 print_symbol (22, strtab
+ psym
->st_name
);
1382 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1387 printf ("%*c", is_32bit_elf
?
1388 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1389 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1392 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1393 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1397 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1399 printf (" Type2: ");
1402 #ifdef _bfd_int64_low
1403 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1405 printf (_("unrecognized: %-7lx"), type2
);
1408 printf ("%-17.17s", rtype2
);
1410 printf ("\n Type3: ");
1413 #ifdef _bfd_int64_low
1414 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1416 printf (_("unrecognized: %-7lx"), type3
);
1419 printf ("%-17.17s", rtype3
);
1431 get_mips_dynamic_type (unsigned long type
)
1435 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1436 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1437 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1438 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1439 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1440 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1441 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1442 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1443 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1444 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1445 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1446 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1447 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1448 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1449 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1450 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1451 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1452 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1453 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1454 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1455 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1456 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1457 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1458 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1459 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1460 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1461 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1462 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1463 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1464 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1465 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1466 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1467 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1468 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1469 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1470 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1471 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1472 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1473 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1474 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1475 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1476 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1477 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1484 get_sparc64_dynamic_type (unsigned long type
)
1488 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1495 get_ppc_dynamic_type (unsigned long type
)
1499 case DT_PPC_GOT
: return "PPC_GOT";
1506 get_ppc64_dynamic_type (unsigned long type
)
1510 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1511 case DT_PPC64_OPD
: return "PPC64_OPD";
1512 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1519 get_parisc_dynamic_type (unsigned long type
)
1523 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1524 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1525 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1526 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1527 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1528 case DT_HP_PREINIT
: return "HP_PREINIT";
1529 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1530 case DT_HP_NEEDED
: return "HP_NEEDED";
1531 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1532 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1533 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1534 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1535 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1536 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1537 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1538 case DT_HP_FILTERED
: return "HP_FILTERED";
1539 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1540 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1541 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1542 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1543 case DT_PLT
: return "PLT";
1544 case DT_PLT_SIZE
: return "PLT_SIZE";
1545 case DT_DLT
: return "DLT";
1546 case DT_DLT_SIZE
: return "DLT_SIZE";
1553 get_ia64_dynamic_type (unsigned long type
)
1557 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1564 get_alpha_dynamic_type (unsigned long type
)
1568 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1575 get_dynamic_type (unsigned long type
)
1577 static char buff
[64];
1581 case DT_NULL
: return "NULL";
1582 case DT_NEEDED
: return "NEEDED";
1583 case DT_PLTRELSZ
: return "PLTRELSZ";
1584 case DT_PLTGOT
: return "PLTGOT";
1585 case DT_HASH
: return "HASH";
1586 case DT_STRTAB
: return "STRTAB";
1587 case DT_SYMTAB
: return "SYMTAB";
1588 case DT_RELA
: return "RELA";
1589 case DT_RELASZ
: return "RELASZ";
1590 case DT_RELAENT
: return "RELAENT";
1591 case DT_STRSZ
: return "STRSZ";
1592 case DT_SYMENT
: return "SYMENT";
1593 case DT_INIT
: return "INIT";
1594 case DT_FINI
: return "FINI";
1595 case DT_SONAME
: return "SONAME";
1596 case DT_RPATH
: return "RPATH";
1597 case DT_SYMBOLIC
: return "SYMBOLIC";
1598 case DT_REL
: return "REL";
1599 case DT_RELSZ
: return "RELSZ";
1600 case DT_RELENT
: return "RELENT";
1601 case DT_PLTREL
: return "PLTREL";
1602 case DT_DEBUG
: return "DEBUG";
1603 case DT_TEXTREL
: return "TEXTREL";
1604 case DT_JMPREL
: return "JMPREL";
1605 case DT_BIND_NOW
: return "BIND_NOW";
1606 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1607 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1608 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1609 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1610 case DT_RUNPATH
: return "RUNPATH";
1611 case DT_FLAGS
: return "FLAGS";
1613 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1614 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1616 case DT_CHECKSUM
: return "CHECKSUM";
1617 case DT_PLTPADSZ
: return "PLTPADSZ";
1618 case DT_MOVEENT
: return "MOVEENT";
1619 case DT_MOVESZ
: return "MOVESZ";
1620 case DT_FEATURE
: return "FEATURE";
1621 case DT_POSFLAG_1
: return "POSFLAG_1";
1622 case DT_SYMINSZ
: return "SYMINSZ";
1623 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1625 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1626 case DT_CONFIG
: return "CONFIG";
1627 case DT_DEPAUDIT
: return "DEPAUDIT";
1628 case DT_AUDIT
: return "AUDIT";
1629 case DT_PLTPAD
: return "PLTPAD";
1630 case DT_MOVETAB
: return "MOVETAB";
1631 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1633 case DT_VERSYM
: return "VERSYM";
1635 case DT_RELACOUNT
: return "RELACOUNT";
1636 case DT_RELCOUNT
: return "RELCOUNT";
1637 case DT_FLAGS_1
: return "FLAGS_1";
1638 case DT_VERDEF
: return "VERDEF";
1639 case DT_VERDEFNUM
: return "VERDEFNUM";
1640 case DT_VERNEED
: return "VERNEED";
1641 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1643 case DT_AUXILIARY
: return "AUXILIARY";
1644 case DT_USED
: return "USED";
1645 case DT_FILTER
: return "FILTER";
1647 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1648 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1649 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1650 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1651 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1654 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1658 switch (elf_header
.e_machine
)
1661 case EM_MIPS_RS3_LE
:
1662 result
= get_mips_dynamic_type (type
);
1665 result
= get_sparc64_dynamic_type (type
);
1668 result
= get_ppc_dynamic_type (type
);
1671 result
= get_ppc64_dynamic_type (type
);
1674 result
= get_ia64_dynamic_type (type
);
1677 result
= get_alpha_dynamic_type (type
);
1687 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1689 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1690 || (elf_header
.e_machine
== EM_PARISC
1691 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1695 switch (elf_header
.e_machine
)
1698 result
= get_parisc_dynamic_type (type
);
1708 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1712 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1719 get_file_type (unsigned e_type
)
1721 static char buff
[32];
1725 case ET_NONE
: return _("NONE (None)");
1726 case ET_REL
: return _("REL (Relocatable file)");
1727 case ET_EXEC
: return _("EXEC (Executable file)");
1728 case ET_DYN
: return _("DYN (Shared object file)");
1729 case ET_CORE
: return _("CORE (Core file)");
1732 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1733 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1734 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1735 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1737 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1743 get_machine_name (unsigned e_machine
)
1745 static char buff
[64]; /* XXX */
1749 case EM_NONE
: return _("None");
1750 case EM_M32
: return "WE32100";
1751 case EM_SPARC
: return "Sparc";
1752 case EM_386
: return "Intel 80386";
1753 case EM_68K
: return "MC68000";
1754 case EM_88K
: return "MC88000";
1755 case EM_486
: return "Intel 80486";
1756 case EM_860
: return "Intel 80860";
1757 case EM_MIPS
: return "MIPS R3000";
1758 case EM_S370
: return "IBM System/370";
1759 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1760 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1761 case EM_PARISC
: return "HPPA";
1762 case EM_PPC_OLD
: return "Power PC (old)";
1763 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1764 case EM_960
: return "Intel 90860";
1765 case EM_PPC
: return "PowerPC";
1766 case EM_PPC64
: return "PowerPC64";
1767 case EM_V800
: return "NEC V800";
1768 case EM_FR20
: return "Fujitsu FR20";
1769 case EM_RH32
: return "TRW RH32";
1770 case EM_MCORE
: return "MCORE";
1771 case EM_ARM
: return "ARM";
1772 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1773 case EM_SH
: return "Renesas / SuperH SH";
1774 case EM_SPARCV9
: return "Sparc v9";
1775 case EM_TRICORE
: return "Siemens Tricore";
1776 case EM_ARC
: return "ARC";
1777 case EM_H8_300
: return "Renesas H8/300";
1778 case EM_H8_300H
: return "Renesas H8/300H";
1779 case EM_H8S
: return "Renesas H8S";
1780 case EM_H8_500
: return "Renesas H8/500";
1781 case EM_IA_64
: return "Intel IA-64";
1782 case EM_MIPS_X
: return "Stanford MIPS-X";
1783 case EM_COLDFIRE
: return "Motorola Coldfire";
1784 case EM_68HC12
: return "Motorola M68HC12";
1785 case EM_ALPHA
: return "Alpha";
1786 case EM_CYGNUS_D10V
:
1787 case EM_D10V
: return "d10v";
1788 case EM_CYGNUS_D30V
:
1789 case EM_D30V
: return "d30v";
1790 case EM_CYGNUS_M32R
:
1791 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1792 case EM_CYGNUS_V850
:
1793 case EM_V850
: return "NEC v850";
1794 case EM_CYGNUS_MN10300
:
1795 case EM_MN10300
: return "mn10300";
1796 case EM_CYGNUS_MN10200
:
1797 case EM_MN10200
: return "mn10200";
1798 case EM_CYGNUS_FR30
:
1799 case EM_FR30
: return "Fujitsu FR30";
1800 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1802 case EM_PJ
: return "picoJava";
1803 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1804 case EM_PCP
: return "Siemens PCP";
1805 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1806 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1807 case EM_STARCORE
: return "Motorola Star*Core processor";
1808 case EM_ME16
: return "Toyota ME16 processor";
1809 case EM_ST100
: return "STMicroelectronics ST100 processor";
1810 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1811 case EM_FX66
: return "Siemens FX66 microcontroller";
1812 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1813 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1814 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1815 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1816 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1817 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1818 case EM_SVX
: return "Silicon Graphics SVx";
1819 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1820 case EM_VAX
: return "Digital VAX";
1822 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1823 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1824 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1825 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1826 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1827 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1828 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1829 case EM_PRISM
: return "Vitesse Prism";
1830 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1832 case EM_S390
: return "IBM S/390";
1833 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1835 case EM_OR32
: return "OpenRISC";
1836 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1837 case EM_DLX
: return "OpenDLX";
1839 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1840 case EM_IQ2000
: return "Vitesse IQ2000";
1842 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1843 case EM_M32C
: return "Renesas M32c";
1844 case EM_MS1
: return "Morpho Techologies MS1 processor";
1846 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1852 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1857 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1858 e_flags
&= ~ EF_ARM_EABIMASK
;
1860 /* Handle "generic" ARM flags. */
1861 if (e_flags
& EF_ARM_RELEXEC
)
1863 strcat (buf
, ", relocatable executable");
1864 e_flags
&= ~ EF_ARM_RELEXEC
;
1867 if (e_flags
& EF_ARM_HASENTRY
)
1869 strcat (buf
, ", has entry point");
1870 e_flags
&= ~ EF_ARM_HASENTRY
;
1873 /* Now handle EABI specific flags. */
1877 strcat (buf
, ", <unrecognized EABI>");
1882 case EF_ARM_EABI_VER1
:
1883 strcat (buf
, ", Version1 EABI");
1888 /* Process flags one bit at a time. */
1889 flag
= e_flags
& - e_flags
;
1894 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1895 strcat (buf
, ", sorted symbol tables");
1905 case EF_ARM_EABI_VER2
:
1906 strcat (buf
, ", Version2 EABI");
1911 /* Process flags one bit at a time. */
1912 flag
= e_flags
& - e_flags
;
1917 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1918 strcat (buf
, ", sorted symbol tables");
1921 case EF_ARM_DYNSYMSUSESEGIDX
:
1922 strcat (buf
, ", dynamic symbols use segment index");
1925 case EF_ARM_MAPSYMSFIRST
:
1926 strcat (buf
, ", mapping symbols precede others");
1936 case EF_ARM_EABI_VER3
:
1937 strcat (buf
, ", Version3 EABI");
1940 case EF_ARM_EABI_VER4
:
1941 strcat (buf
, ", Version4 EABI");
1946 /* Process flags one bit at a time. */
1947 flag
= e_flags
& - e_flags
;
1953 strcat (buf
, ", BE8");
1957 strcat (buf
, ", LE8");
1967 case EF_ARM_EABI_UNKNOWN
:
1968 strcat (buf
, ", GNU EABI");
1973 /* Process flags one bit at a time. */
1974 flag
= e_flags
& - e_flags
;
1979 case EF_ARM_INTERWORK
:
1980 strcat (buf
, ", interworking enabled");
1983 case EF_ARM_APCS_26
:
1984 strcat (buf
, ", uses APCS/26");
1987 case EF_ARM_APCS_FLOAT
:
1988 strcat (buf
, ", uses APCS/float");
1992 strcat (buf
, ", position independent");
1996 strcat (buf
, ", 8 bit structure alignment");
1999 case EF_ARM_NEW_ABI
:
2000 strcat (buf
, ", uses new ABI");
2003 case EF_ARM_OLD_ABI
:
2004 strcat (buf
, ", uses old ABI");
2007 case EF_ARM_SOFT_FLOAT
:
2008 strcat (buf
, ", software FP");
2011 case EF_ARM_VFP_FLOAT
:
2012 strcat (buf
, ", VFP");
2015 case EF_ARM_MAVERICK_FLOAT
:
2016 strcat (buf
, ", Maverick FP");
2027 strcat (buf
,", <unknown>");
2031 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2033 static char buf
[1024];
2045 decode_ARM_machine_flags (e_flags
, buf
);
2049 switch (e_flags
& EF_FRV_CPU_MASK
)
2051 case EF_FRV_CPU_GENERIC
:
2055 strcat (buf
, ", fr???");
2058 case EF_FRV_CPU_FR300
:
2059 strcat (buf
, ", fr300");
2062 case EF_FRV_CPU_FR400
:
2063 strcat (buf
, ", fr400");
2065 case EF_FRV_CPU_FR405
:
2066 strcat (buf
, ", fr405");
2069 case EF_FRV_CPU_FR450
:
2070 strcat (buf
, ", fr450");
2073 case EF_FRV_CPU_FR500
:
2074 strcat (buf
, ", fr500");
2076 case EF_FRV_CPU_FR550
:
2077 strcat (buf
, ", fr550");
2080 case EF_FRV_CPU_SIMPLE
:
2081 strcat (buf
, ", simple");
2083 case EF_FRV_CPU_TOMCAT
:
2084 strcat (buf
, ", tomcat");
2090 if (e_flags
& EF_CPU32
)
2091 strcat (buf
, ", cpu32");
2092 if (e_flags
& EF_M68000
)
2093 strcat (buf
, ", m68000");
2097 if (e_flags
& EF_PPC_EMB
)
2098 strcat (buf
, ", emb");
2100 if (e_flags
& EF_PPC_RELOCATABLE
)
2101 strcat (buf
, ", relocatable");
2103 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2104 strcat (buf
, ", relocatable-lib");
2108 case EM_CYGNUS_V850
:
2109 switch (e_flags
& EF_V850_ARCH
)
2112 strcat (buf
, ", v850e1");
2115 strcat (buf
, ", v850e");
2118 strcat (buf
, ", v850");
2121 strcat (buf
, ", unknown v850 architecture variant");
2127 case EM_CYGNUS_M32R
:
2128 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2129 strcat (buf
, ", m32r");
2134 case EM_MIPS_RS3_LE
:
2135 if (e_flags
& EF_MIPS_NOREORDER
)
2136 strcat (buf
, ", noreorder");
2138 if (e_flags
& EF_MIPS_PIC
)
2139 strcat (buf
, ", pic");
2141 if (e_flags
& EF_MIPS_CPIC
)
2142 strcat (buf
, ", cpic");
2144 if (e_flags
& EF_MIPS_UCODE
)
2145 strcat (buf
, ", ugen_reserved");
2147 if (e_flags
& EF_MIPS_ABI2
)
2148 strcat (buf
, ", abi2");
2150 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2151 strcat (buf
, ", odk first");
2153 if (e_flags
& EF_MIPS_32BITMODE
)
2154 strcat (buf
, ", 32bitmode");
2156 switch ((e_flags
& EF_MIPS_MACH
))
2158 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2159 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2160 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2161 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2162 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2163 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2164 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2165 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2166 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2167 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2169 /* We simply ignore the field in this case to avoid confusion:
2170 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2173 default: strcat (buf
, ", unknown CPU"); break;
2176 switch ((e_flags
& EF_MIPS_ABI
))
2178 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2179 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2180 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2181 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2183 /* We simply ignore the field in this case to avoid confusion:
2184 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2185 This means it is likely to be an o32 file, but not for
2188 default: strcat (buf
, ", unknown ABI"); break;
2191 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2192 strcat (buf
, ", mdmx");
2194 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2195 strcat (buf
, ", mips16");
2197 switch ((e_flags
& EF_MIPS_ARCH
))
2199 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2200 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2201 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2202 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2203 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2204 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2205 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2206 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2207 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2208 default: strcat (buf
, ", unknown ISA"); break;
2214 switch ((e_flags
& EF_SH_MACH_MASK
))
2216 case EF_SH1
: strcat (buf
, ", sh1"); break;
2217 case EF_SH2
: strcat (buf
, ", sh2"); break;
2218 case EF_SH3
: strcat (buf
, ", sh3"); break;
2219 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2220 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2221 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2222 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2223 case EF_SH4
: strcat (buf
, ", sh4"); break;
2224 case EF_SH5
: strcat (buf
, ", sh5"); break;
2225 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2226 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2227 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2228 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2229 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2230 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2231 default: strcat (buf
, ", unknown ISA"); break;
2237 if (e_flags
& EF_SPARC_32PLUS
)
2238 strcat (buf
, ", v8+");
2240 if (e_flags
& EF_SPARC_SUN_US1
)
2241 strcat (buf
, ", ultrasparcI");
2243 if (e_flags
& EF_SPARC_SUN_US3
)
2244 strcat (buf
, ", ultrasparcIII");
2246 if (e_flags
& EF_SPARC_HAL_R1
)
2247 strcat (buf
, ", halr1");
2249 if (e_flags
& EF_SPARC_LEDATA
)
2250 strcat (buf
, ", ledata");
2252 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2253 strcat (buf
, ", tso");
2255 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2256 strcat (buf
, ", pso");
2258 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2259 strcat (buf
, ", rmo");
2263 switch (e_flags
& EF_PARISC_ARCH
)
2265 case EFA_PARISC_1_0
:
2266 strcpy (buf
, ", PA-RISC 1.0");
2268 case EFA_PARISC_1_1
:
2269 strcpy (buf
, ", PA-RISC 1.1");
2271 case EFA_PARISC_2_0
:
2272 strcpy (buf
, ", PA-RISC 2.0");
2277 if (e_flags
& EF_PARISC_TRAPNIL
)
2278 strcat (buf
, ", trapnil");
2279 if (e_flags
& EF_PARISC_EXT
)
2280 strcat (buf
, ", ext");
2281 if (e_flags
& EF_PARISC_LSB
)
2282 strcat (buf
, ", lsb");
2283 if (e_flags
& EF_PARISC_WIDE
)
2284 strcat (buf
, ", wide");
2285 if (e_flags
& EF_PARISC_NO_KABP
)
2286 strcat (buf
, ", no kabp");
2287 if (e_flags
& EF_PARISC_LAZYSWAP
)
2288 strcat (buf
, ", lazyswap");
2293 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2294 strcat (buf
, ", new calling convention");
2296 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2297 strcat (buf
, ", gnu calling convention");
2301 if ((e_flags
& EF_IA_64_ABI64
))
2302 strcat (buf
, ", 64-bit");
2304 strcat (buf
, ", 32-bit");
2305 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2306 strcat (buf
, ", reduced fp model");
2307 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2308 strcat (buf
, ", no function descriptors, constant gp");
2309 else if ((e_flags
& EF_IA_64_CONS_GP
))
2310 strcat (buf
, ", constant gp");
2311 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2312 strcat (buf
, ", absolute");
2316 if ((e_flags
& EF_VAX_NONPIC
))
2317 strcat (buf
, ", non-PIC");
2318 if ((e_flags
& EF_VAX_DFLOAT
))
2319 strcat (buf
, ", D-Float");
2320 if ((e_flags
& EF_VAX_GFLOAT
))
2321 strcat (buf
, ", G-Float");
2330 get_osabi_name (unsigned int osabi
)
2332 static char buff
[32];
2336 case ELFOSABI_NONE
: return "UNIX - System V";
2337 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2338 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2339 case ELFOSABI_LINUX
: return "UNIX - Linux";
2340 case ELFOSABI_HURD
: return "GNU/Hurd";
2341 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2342 case ELFOSABI_AIX
: return "UNIX - AIX";
2343 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2344 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2345 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2346 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2347 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2348 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2349 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2350 case ELFOSABI_AROS
: return "Amiga Research OS";
2351 case ELFOSABI_STANDALONE
: return _("Standalone App");
2352 case ELFOSABI_ARM
: return "ARM";
2354 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2360 get_arm_segment_type (unsigned long type
)
2374 get_mips_segment_type (unsigned long type
)
2378 case PT_MIPS_REGINFO
:
2380 case PT_MIPS_RTPROC
:
2382 case PT_MIPS_OPTIONS
:
2392 get_parisc_segment_type (unsigned long type
)
2396 case PT_HP_TLS
: return "HP_TLS";
2397 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2398 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2399 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2400 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2401 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2402 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2403 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2404 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2405 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2406 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2407 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2408 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2409 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2410 case PT_HP_STACK
: return "HP_STACK";
2411 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2412 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2413 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2422 get_ia64_segment_type (unsigned long type
)
2426 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2427 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2428 case PT_HP_TLS
: return "HP_TLS";
2429 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2430 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2431 case PT_IA_64_HP_STACK
: return "HP_STACK";
2440 get_segment_type (unsigned long p_type
)
2442 static char buff
[32];
2446 case PT_NULL
: return "NULL";
2447 case PT_LOAD
: return "LOAD";
2448 case PT_DYNAMIC
: return "DYNAMIC";
2449 case PT_INTERP
: return "INTERP";
2450 case PT_NOTE
: return "NOTE";
2451 case PT_SHLIB
: return "SHLIB";
2452 case PT_PHDR
: return "PHDR";
2453 case PT_TLS
: return "TLS";
2455 case PT_GNU_EH_FRAME
:
2456 return "GNU_EH_FRAME";
2457 case PT_GNU_STACK
: return "GNU_STACK";
2458 case PT_GNU_RELRO
: return "GNU_RELRO";
2461 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2465 switch (elf_header
.e_machine
)
2468 result
= get_arm_segment_type (p_type
);
2471 case EM_MIPS_RS3_LE
:
2472 result
= get_mips_segment_type (p_type
);
2475 result
= get_parisc_segment_type (p_type
);
2478 result
= get_ia64_segment_type (p_type
);
2488 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2490 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2494 switch (elf_header
.e_machine
)
2497 result
= get_parisc_segment_type (p_type
);
2500 result
= get_ia64_segment_type (p_type
);
2510 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2513 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2520 get_mips_section_type_name (unsigned int sh_type
)
2524 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2525 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2526 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2527 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2528 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2529 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2530 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2531 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2532 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2533 case SHT_MIPS_RELD
: return "MIPS_RELD";
2534 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2535 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2536 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2537 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2538 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2539 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2540 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2541 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2542 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2543 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2544 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2545 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2546 case SHT_MIPS_LINE
: return "MIPS_LINE";
2547 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2548 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2549 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2550 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2551 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2552 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2553 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2554 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2555 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2556 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2557 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2558 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2559 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2560 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2561 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2562 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2570 get_parisc_section_type_name (unsigned int sh_type
)
2574 case SHT_PARISC_EXT
: return "PARISC_EXT";
2575 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2576 case SHT_PARISC_DOC
: return "PARISC_DOC";
2577 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2578 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2579 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2587 get_ia64_section_type_name (unsigned int sh_type
)
2589 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2590 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2591 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2595 case SHT_IA_64_EXT
: return "IA_64_EXT";
2596 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2597 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2605 get_x86_64_section_type_name (unsigned int sh_type
)
2609 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2617 get_arm_section_type_name (unsigned int sh_type
)
2630 get_section_type_name (unsigned int sh_type
)
2632 static char buff
[32];
2636 case SHT_NULL
: return "NULL";
2637 case SHT_PROGBITS
: return "PROGBITS";
2638 case SHT_SYMTAB
: return "SYMTAB";
2639 case SHT_STRTAB
: return "STRTAB";
2640 case SHT_RELA
: return "RELA";
2641 case SHT_HASH
: return "HASH";
2642 case SHT_DYNAMIC
: return "DYNAMIC";
2643 case SHT_NOTE
: return "NOTE";
2644 case SHT_NOBITS
: return "NOBITS";
2645 case SHT_REL
: return "REL";
2646 case SHT_SHLIB
: return "SHLIB";
2647 case SHT_DYNSYM
: return "DYNSYM";
2648 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2649 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2650 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2651 case SHT_GROUP
: return "GROUP";
2652 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2653 case SHT_GNU_verdef
: return "VERDEF";
2654 case SHT_GNU_verneed
: return "VERNEED";
2655 case SHT_GNU_versym
: return "VERSYM";
2656 case 0x6ffffff0: return "VERSYM";
2657 case 0x6ffffffc: return "VERDEF";
2658 case 0x7ffffffd: return "AUXILIARY";
2659 case 0x7fffffff: return "FILTER";
2660 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2663 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2667 switch (elf_header
.e_machine
)
2670 case EM_MIPS_RS3_LE
:
2671 result
= get_mips_section_type_name (sh_type
);
2674 result
= get_parisc_section_type_name (sh_type
);
2677 result
= get_ia64_section_type_name (sh_type
);
2680 result
= get_x86_64_section_type_name (sh_type
);
2683 result
= get_arm_section_type_name (sh_type
);
2693 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2695 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2696 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2697 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2698 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2700 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2706 #define OPTION_DEBUG_DUMP 512
2708 static struct option options
[] =
2710 {"all", no_argument
, 0, 'a'},
2711 {"file-header", no_argument
, 0, 'h'},
2712 {"program-headers", no_argument
, 0, 'l'},
2713 {"headers", no_argument
, 0, 'e'},
2714 {"histogram", no_argument
, 0, 'I'},
2715 {"segments", no_argument
, 0, 'l'},
2716 {"sections", no_argument
, 0, 'S'},
2717 {"section-headers", no_argument
, 0, 'S'},
2718 {"section-groups", no_argument
, 0, 'g'},
2719 {"full-section-name",no_argument
, 0, 'N'},
2720 {"symbols", no_argument
, 0, 's'},
2721 {"syms", no_argument
, 0, 's'},
2722 {"relocs", no_argument
, 0, 'r'},
2723 {"notes", no_argument
, 0, 'n'},
2724 {"dynamic", no_argument
, 0, 'd'},
2725 {"arch-specific", no_argument
, 0, 'A'},
2726 {"version-info", no_argument
, 0, 'V'},
2727 {"use-dynamic", no_argument
, 0, 'D'},
2728 {"hex-dump", required_argument
, 0, 'x'},
2729 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2730 {"unwind", no_argument
, 0, 'u'},
2731 #ifdef SUPPORT_DISASSEMBLY
2732 {"instruction-dump", required_argument
, 0, 'i'},
2735 {"version", no_argument
, 0, 'v'},
2736 {"wide", no_argument
, 0, 'W'},
2737 {"help", no_argument
, 0, 'H'},
2738 {0, no_argument
, 0, 0}
2744 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2745 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2746 fprintf (stdout
, _(" Options are:\n\
2747 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2748 -h --file-header Display the ELF file header\n\
2749 -l --program-headers Display the program headers\n\
2750 --segments An alias for --program-headers\n\
2751 -S --section-headers Display the sections' header\n\
2752 --sections An alias for --section-headers\n\
2753 -g --section-groups Display the section groups\n\
2754 -N --full-section-name\n\
2755 Display the full section name\n\
2756 -e --headers Equivalent to: -h -l -S\n\
2757 -s --syms Display the symbol table\n\
2758 --symbols An alias for --syms\n\
2759 -n --notes Display the core notes (if present)\n\
2760 -r --relocs Display the relocations (if present)\n\
2761 -u --unwind Display the unwind info (if present)\n\
2762 -d --dynamic Display the dynamic section (if present)\n\
2763 -V --version-info Display the version sections (if present)\n\
2764 -A --arch-specific Display architecture specific information (if any).\n\
2765 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2766 -x --hex-dump=<number> Dump the contents of section <number>\n\
2767 -w[liaprmfFsoR] or\n\
2768 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2769 Display the contents of DWARF2 debug sections\n"));
2770 #ifdef SUPPORT_DISASSEMBLY
2771 fprintf (stdout
, _("\
2772 -i --instruction-dump=<number>\n\
2773 Disassemble the contents of section <number>\n"));
2775 fprintf (stdout
, _("\
2776 -I --histogram Display histogram of bucket list lengths\n\
2777 -W --wide Allow output width to exceed 80 characters\n\
2778 -H --help Display this information\n\
2779 -v --version Display the version number of readelf\n"));
2780 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2785 /* Record the fact that the user wants the contents of section number
2786 SECTION to be displayed using the method(s) encoded as flags bits
2787 in TYPE. Note, TYPE can be zero if we are creating the array for
2791 request_dump (unsigned int section
, int type
)
2793 if (section
>= num_dump_sects
)
2795 char *new_dump_sects
;
2797 new_dump_sects
= calloc (section
+ 1, 1);
2799 if (new_dump_sects
== NULL
)
2800 error (_("Out of memory allocating dump request table."));
2803 /* Copy current flag settings. */
2804 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2808 dump_sects
= new_dump_sects
;
2809 num_dump_sects
= section
+ 1;
2814 dump_sects
[section
] |= type
;
2820 parse_args (int argc
, char **argv
)
2827 while ((c
= getopt_long
2828 (argc
, argv
, "ersuahnldSDAINgw::x:i:vVWH", options
, NULL
)) != EOF
)
2849 do_section_groups
++;
2857 do_section_groups
++;
2860 do_full_section_name
++;
2902 section
= strtoul (optarg
, & cp
, 0);
2903 if (! *cp
&& section
>= 0)
2905 request_dump (section
, HEX_DUMP
);
2915 unsigned int index
= 0;
2919 while (optarg
[index
])
2920 switch (optarg
[index
++])
2929 do_debug_abbrevs
= 1;
2939 do_debug_pubnames
= 1;
2943 do_debug_aranges
= 1;
2947 do_debug_ranges
= 1;
2951 do_debug_frames_interp
= 1;
2953 do_debug_frames
= 1;
2958 do_debug_macinfo
= 1;
2972 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2977 case OPTION_DEBUG_DUMP
:
2985 const char * option
;
2988 debug_dump_long_opts
;
2990 debug_dump_long_opts opts_table
[] =
2992 /* Please keep this table alpha- sorted. */
2993 { "Ranges", & do_debug_ranges
},
2994 { "abbrev", & do_debug_abbrevs
},
2995 { "aranges", & do_debug_aranges
},
2996 { "frames", & do_debug_frames
},
2997 { "frames-interp", & do_debug_frames_interp
},
2998 { "info", & do_debug_info
},
2999 { "line", & do_debug_lines
},
3000 { "loc", & do_debug_loc
},
3001 { "macro", & do_debug_macinfo
},
3002 { "pubnames", & do_debug_pubnames
},
3003 /* This entry is for compatability
3004 with earlier versions of readelf. */
3005 { "ranges", & do_debug_aranges
},
3006 { "str", & do_debug_str
},
3017 debug_dump_long_opts
* entry
;
3019 for (entry
= opts_table
; entry
->option
; entry
++)
3021 size_t len
= strlen (entry
->option
);
3023 if (strneq (p
, entry
->option
, len
)
3024 && (p
[len
] == ',' || p
[len
] == '\0'))
3026 * entry
->variable
= 1;
3028 /* The --debug-dump=frames-interp option also
3029 enables the --debug-dump=frames option. */
3030 if (do_debug_frames_interp
)
3031 do_debug_frames
= 1;
3038 if (entry
->option
== NULL
)
3040 warn (_("Unrecognized debug option '%s'\n"), p
);
3041 p
= strchr (p
, ',');
3051 #ifdef SUPPORT_DISASSEMBLY
3054 section
= strtoul (optarg
, & cp
, 0);
3055 if (! *cp
&& section
>= 0)
3057 request_dump (section
, DISASS_DUMP
);
3063 print_version (program_name
);
3073 /* xgettext:c-format */
3074 error (_("Invalid option '-%c'\n"), c
);
3081 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3082 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3083 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3084 && !do_section_groups
)
3088 warn (_("Nothing to do.\n"));
3094 get_elf_class (unsigned int elf_class
)
3096 static char buff
[32];
3100 case ELFCLASSNONE
: return _("none");
3101 case ELFCLASS32
: return "ELF32";
3102 case ELFCLASS64
: return "ELF64";
3104 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3110 get_data_encoding (unsigned int encoding
)
3112 static char buff
[32];
3116 case ELFDATANONE
: return _("none");
3117 case ELFDATA2LSB
: return _("2's complement, little endian");
3118 case ELFDATA2MSB
: return _("2's complement, big endian");
3120 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3125 /* Decode the data held in 'elf_header'. */
3128 process_file_header (void)
3130 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3131 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3132 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3133 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3136 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3144 printf (_("ELF Header:\n"));
3145 printf (_(" Magic: "));
3146 for (i
= 0; i
< EI_NIDENT
; i
++)
3147 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3149 printf (_(" Class: %s\n"),
3150 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3151 printf (_(" Data: %s\n"),
3152 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3153 printf (_(" Version: %d %s\n"),
3154 elf_header
.e_ident
[EI_VERSION
],
3155 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3157 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3160 printf (_(" OS/ABI: %s\n"),
3161 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3162 printf (_(" ABI Version: %d\n"),
3163 elf_header
.e_ident
[EI_ABIVERSION
]);
3164 printf (_(" Type: %s\n"),
3165 get_file_type (elf_header
.e_type
));
3166 printf (_(" Machine: %s\n"),
3167 get_machine_name (elf_header
.e_machine
));
3168 printf (_(" Version: 0x%lx\n"),
3169 (unsigned long) elf_header
.e_version
);
3171 printf (_(" Entry point address: "));
3172 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3173 printf (_("\n Start of program headers: "));
3174 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3175 printf (_(" (bytes into file)\n Start of section headers: "));
3176 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3177 printf (_(" (bytes into file)\n"));
3179 printf (_(" Flags: 0x%lx%s\n"),
3180 (unsigned long) elf_header
.e_flags
,
3181 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3182 printf (_(" Size of this header: %ld (bytes)\n"),
3183 (long) elf_header
.e_ehsize
);
3184 printf (_(" Size of program headers: %ld (bytes)\n"),
3185 (long) elf_header
.e_phentsize
);
3186 printf (_(" Number of program headers: %ld\n"),
3187 (long) elf_header
.e_phnum
);
3188 printf (_(" Size of section headers: %ld (bytes)\n"),
3189 (long) elf_header
.e_shentsize
);
3190 printf (_(" Number of section headers: %ld"),
3191 (long) elf_header
.e_shnum
);
3192 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3193 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3194 putc ('\n', stdout
);
3195 printf (_(" Section header string table index: %ld"),
3196 (long) elf_header
.e_shstrndx
);
3197 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3198 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3199 putc ('\n', stdout
);
3202 if (section_headers
!= NULL
)
3204 if (elf_header
.e_shnum
== 0)
3205 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3206 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3207 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3208 free (section_headers
);
3209 section_headers
= NULL
;
3217 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3219 Elf32_External_Phdr
*phdrs
;
3220 Elf32_External_Phdr
*external
;
3221 Elf_Internal_Phdr
*internal
;
3224 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3225 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3226 _("program headers"));
3230 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3231 i
< elf_header
.e_phnum
;
3232 i
++, internal
++, external
++)
3234 internal
->p_type
= BYTE_GET (external
->p_type
);
3235 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3236 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3237 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3238 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3239 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3240 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3241 internal
->p_align
= BYTE_GET (external
->p_align
);
3250 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3252 Elf64_External_Phdr
*phdrs
;
3253 Elf64_External_Phdr
*external
;
3254 Elf_Internal_Phdr
*internal
;
3257 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3258 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3259 _("program headers"));
3263 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3264 i
< elf_header
.e_phnum
;
3265 i
++, internal
++, external
++)
3267 internal
->p_type
= BYTE_GET (external
->p_type
);
3268 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3269 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3270 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3271 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3272 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3273 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3274 internal
->p_align
= BYTE_GET (external
->p_align
);
3282 /* Returns 1 if the program headers were read into `program_headers'. */
3285 get_program_headers (FILE *file
)
3287 Elf_Internal_Phdr
*phdrs
;
3289 /* Check cache of prior read. */
3290 if (program_headers
!= NULL
)
3293 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3297 error (_("Out of memory\n"));
3302 ? get_32bit_program_headers (file
, phdrs
)
3303 : get_64bit_program_headers (file
, phdrs
))
3305 program_headers
= phdrs
;
3313 /* Returns 1 if the program headers were loaded. */
3316 process_program_headers (FILE *file
)
3318 Elf_Internal_Phdr
*segment
;
3321 if (elf_header
.e_phnum
== 0)
3324 printf (_("\nThere are no program headers in this file.\n"));
3328 if (do_segments
&& !do_header
)
3330 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3331 printf (_("Entry point "));
3332 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3333 printf (_("\nThere are %d program headers, starting at offset "),
3334 elf_header
.e_phnum
);
3335 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3339 if (! get_program_headers (file
))
3344 if (elf_header
.e_phnum
> 1)
3345 printf (_("\nProgram Headers:\n"));
3347 printf (_("\nProgram Headers:\n"));
3351 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3354 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3358 (_(" Type Offset VirtAddr PhysAddr\n"));
3360 (_(" FileSiz MemSiz Flags Align\n"));
3367 for (i
= 0, segment
= program_headers
;
3368 i
< elf_header
.e_phnum
;
3373 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3377 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3378 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3379 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3380 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3381 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3383 (segment
->p_flags
& PF_R
? 'R' : ' '),
3384 (segment
->p_flags
& PF_W
? 'W' : ' '),
3385 (segment
->p_flags
& PF_X
? 'E' : ' '));
3386 printf ("%#lx", (unsigned long) segment
->p_align
);
3390 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3391 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3394 print_vma (segment
->p_offset
, FULL_HEX
);
3398 print_vma (segment
->p_vaddr
, FULL_HEX
);
3400 print_vma (segment
->p_paddr
, FULL_HEX
);
3403 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3404 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3407 print_vma (segment
->p_filesz
, FULL_HEX
);
3411 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3412 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3415 print_vma (segment
->p_offset
, FULL_HEX
);
3419 (segment
->p_flags
& PF_R
? 'R' : ' '),
3420 (segment
->p_flags
& PF_W
? 'W' : ' '),
3421 (segment
->p_flags
& PF_X
? 'E' : ' '));
3423 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3424 printf ("%#lx", (unsigned long) segment
->p_align
);
3427 print_vma (segment
->p_align
, PREFIX_HEX
);
3432 print_vma (segment
->p_offset
, FULL_HEX
);
3434 print_vma (segment
->p_vaddr
, FULL_HEX
);
3436 print_vma (segment
->p_paddr
, FULL_HEX
);
3438 print_vma (segment
->p_filesz
, FULL_HEX
);
3440 print_vma (segment
->p_memsz
, FULL_HEX
);
3442 (segment
->p_flags
& PF_R
? 'R' : ' '),
3443 (segment
->p_flags
& PF_W
? 'W' : ' '),
3444 (segment
->p_flags
& PF_X
? 'E' : ' '));
3445 print_vma (segment
->p_align
, HEX
);
3449 switch (segment
->p_type
)
3453 error (_("more than one dynamic segment\n"));
3455 /* Try to locate the .dynamic section. If there is
3456 a section header table, we can easily locate it. */
3457 if (section_headers
!= NULL
)
3459 Elf_Internal_Shdr
*sec
;
3461 sec
= find_section (".dynamic");
3462 if (sec
== NULL
|| sec
->sh_size
== 0)
3464 error (_("no .dynamic section in the dynamic segment"));
3468 dynamic_addr
= sec
->sh_offset
;
3469 dynamic_size
= sec
->sh_size
;
3471 if (dynamic_addr
< segment
->p_offset
3472 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3473 warn (_("the .dynamic section is not contained within the dynamic segment"));
3474 else if (dynamic_addr
> segment
->p_offset
)
3475 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3479 /* Otherwise, we can only assume that the .dynamic
3480 section is the first section in the DYNAMIC segment. */
3481 dynamic_addr
= segment
->p_offset
;
3482 dynamic_size
= segment
->p_filesz
;
3487 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3489 error (_("Unable to find program interpreter name\n"));
3492 program_interpreter
[0] = 0;
3493 fscanf (file
, "%63s", program_interpreter
);
3496 printf (_("\n [Requesting program interpreter: %s]"),
3497 program_interpreter
);
3503 putc ('\n', stdout
);
3506 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3508 printf (_("\n Section to Segment mapping:\n"));
3509 printf (_(" Segment Sections...\n"));
3511 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3514 Elf_Internal_Shdr
*section
;
3516 segment
= program_headers
+ i
;
3517 section
= section_headers
;
3519 printf (" %2.2d ", i
);
3521 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3523 if (section
->sh_size
> 0
3524 /* Compare allocated sections by VMA, unallocated
3525 sections by file offset. */
3526 && (section
->sh_flags
& SHF_ALLOC
3527 ? (section
->sh_addr
>= segment
->p_vaddr
3528 && section
->sh_addr
+ section
->sh_size
3529 <= segment
->p_vaddr
+ segment
->p_memsz
)
3530 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3531 && (section
->sh_offset
+ section
->sh_size
3532 <= segment
->p_offset
+ segment
->p_filesz
)))
3533 /* .tbss is special. It doesn't contribute memory space
3534 to normal segments. */
3535 && (!((section
->sh_flags
& SHF_TLS
) != 0
3536 && section
->sh_type
== SHT_NOBITS
)
3537 || segment
->p_type
== PT_TLS
))
3538 printf ("%s ", SECTION_NAME (section
));
3549 /* Find the file offset corresponding to VMA by using the program headers. */
3552 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3554 Elf_Internal_Phdr
*seg
;
3556 if (! get_program_headers (file
))
3558 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3562 for (seg
= program_headers
;
3563 seg
< program_headers
+ elf_header
.e_phnum
;
3566 if (seg
->p_type
!= PT_LOAD
)
3569 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3570 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3571 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3574 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3581 get_32bit_section_headers (FILE *file
, unsigned int num
)
3583 Elf32_External_Shdr
*shdrs
;
3584 Elf_Internal_Shdr
*internal
;
3587 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3588 elf_header
.e_shentsize
, num
, _("section headers"));
3592 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3594 if (section_headers
== NULL
)
3596 error (_("Out of memory\n"));
3600 for (i
= 0, internal
= section_headers
;
3604 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3605 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3606 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3607 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3608 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3609 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3610 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3611 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3612 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3613 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3622 get_64bit_section_headers (FILE *file
, unsigned int num
)
3624 Elf64_External_Shdr
*shdrs
;
3625 Elf_Internal_Shdr
*internal
;
3628 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3629 elf_header
.e_shentsize
, num
, _("section headers"));
3633 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3635 if (section_headers
== NULL
)
3637 error (_("Out of memory\n"));
3641 for (i
= 0, internal
= section_headers
;
3645 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3646 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3647 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3648 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3649 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3650 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3651 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3652 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3653 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3654 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3662 static Elf_Internal_Sym
*
3663 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3665 unsigned long number
;
3666 Elf32_External_Sym
*esyms
;
3667 Elf_External_Sym_Shndx
*shndx
;
3668 Elf_Internal_Sym
*isyms
;
3669 Elf_Internal_Sym
*psym
;
3672 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3678 if (symtab_shndx_hdr
!= NULL
3679 && (symtab_shndx_hdr
->sh_link
3680 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3682 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3683 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3691 number
= section
->sh_size
/ section
->sh_entsize
;
3692 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3696 error (_("Out of memory\n"));
3703 for (j
= 0, psym
= isyms
;
3707 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3708 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3709 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3710 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3711 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3713 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3714 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3715 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3725 static Elf_Internal_Sym
*
3726 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3728 unsigned long number
;
3729 Elf64_External_Sym
*esyms
;
3730 Elf_External_Sym_Shndx
*shndx
;
3731 Elf_Internal_Sym
*isyms
;
3732 Elf_Internal_Sym
*psym
;
3735 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3741 if (symtab_shndx_hdr
!= NULL
3742 && (symtab_shndx_hdr
->sh_link
3743 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3745 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3746 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3754 number
= section
->sh_size
/ section
->sh_entsize
;
3755 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3759 error (_("Out of memory\n"));
3766 for (j
= 0, psym
= isyms
;
3770 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3771 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3772 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3773 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3774 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3776 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3777 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3778 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3789 get_elf_section_flags (bfd_vma sh_flags
)
3791 static char buff
[33];
3798 flag
= sh_flags
& - sh_flags
;
3803 case SHF_WRITE
: *p
= 'W'; break;
3804 case SHF_ALLOC
: *p
= 'A'; break;
3805 case SHF_EXECINSTR
: *p
= 'X'; break;
3806 case SHF_MERGE
: *p
= 'M'; break;
3807 case SHF_STRINGS
: *p
= 'S'; break;
3808 case SHF_INFO_LINK
: *p
= 'I'; break;
3809 case SHF_LINK_ORDER
: *p
= 'L'; break;
3810 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3811 case SHF_GROUP
: *p
= 'G'; break;
3812 case SHF_TLS
: *p
= 'T'; break;
3815 if (elf_header
.e_machine
== EM_X86_64
3816 && flag
== SHF_X86_64_LARGE
)
3818 else if (flag
& SHF_MASKOS
)
3821 sh_flags
&= ~ SHF_MASKOS
;
3823 else if (flag
& SHF_MASKPROC
)
3826 sh_flags
&= ~ SHF_MASKPROC
;
3840 process_section_headers (FILE *file
)
3842 Elf_Internal_Shdr
*section
;
3845 section_headers
= NULL
;
3847 if (elf_header
.e_shnum
== 0)
3850 printf (_("\nThere are no sections in this file.\n"));
3855 if (do_sections
&& !do_header
)
3856 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3857 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3861 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3864 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3867 /* Read in the string table, so that we have names to display. */
3868 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3870 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3872 if (section
->sh_size
!= 0)
3874 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3875 1, section
->sh_size
, _("string table"));
3877 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3881 /* Scan the sections for the dynamic symbol table
3882 and dynamic string table and debug sections. */
3883 dynamic_symbols
= NULL
;
3884 dynamic_strings
= NULL
;
3885 dynamic_syminfo
= NULL
;
3886 symtab_shndx_hdr
= NULL
;
3888 eh_addr_size
= is_32bit_elf
? 4 : 8;
3889 switch (elf_header
.e_machine
)
3892 case EM_MIPS_RS3_LE
:
3893 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3894 FDE addresses. However, the ABI also has a semi-official ILP32
3895 variant for which the normal FDE address size rules apply.
3897 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3898 section, where XX is the size of longs in bits. Unfortunately,
3899 earlier compilers provided no way of distinguishing ILP32 objects
3900 from LP64 objects, so if there's any doubt, we should assume that
3901 the official LP64 form is being used. */
3902 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3903 && find_section (".gcc_compiled_long32") == NULL
)
3908 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
3911 size_t expected_entsize \
3912 = is_32bit_elf ? size32 : size64; \
3913 if (section->sh_entsize != expected_entsize) \
3914 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
3915 i, (unsigned long int) section->sh_entsize, \
3916 (unsigned long int) expected_entsize); \
3917 section->sh_entsize = expected_entsize; \
3920 #define CHECK_ENTSIZE(section, i, type) \
3921 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
3922 sizeof (Elf64_External_##type))
3924 for (i
= 0, section
= section_headers
;
3925 i
< elf_header
.e_shnum
;
3928 char *name
= SECTION_NAME (section
);
3930 if (section
->sh_type
== SHT_DYNSYM
)
3932 if (dynamic_symbols
!= NULL
)
3934 error (_("File contains multiple dynamic symbol tables\n"));
3938 CHECK_ENTSIZE (section
, i
, Sym
);
3939 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3940 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3942 else if (section
->sh_type
== SHT_STRTAB
3943 && streq (name
, ".dynstr"))
3945 if (dynamic_strings
!= NULL
)
3947 error (_("File contains multiple dynamic string tables\n"));
3951 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3952 1, section
->sh_size
, _("dynamic strings"));
3953 dynamic_strings_length
= section
->sh_size
;
3955 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3957 if (symtab_shndx_hdr
!= NULL
)
3959 error (_("File contains multiple symtab shndx tables\n"));
3962 symtab_shndx_hdr
= section
;
3964 else if (section
->sh_type
== SHT_SYMTAB
)
3965 CHECK_ENTSIZE (section
, i
, Sym
);
3966 else if (section
->sh_type
== SHT_GROUP
)
3967 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
3968 else if (section
->sh_type
== SHT_REL
)
3969 CHECK_ENTSIZE (section
, i
, Rel
);
3970 else if (section
->sh_type
== SHT_RELA
)
3971 CHECK_ENTSIZE (section
, i
, Rela
);
3972 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3973 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3974 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3975 || do_debug_loc
|| do_debug_ranges
)
3976 && strneq (name
, ".debug_", 7))
3981 || (do_debug_info
&& streq (name
, "info"))
3982 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3983 || (do_debug_lines
&& streq (name
, "line"))
3984 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3985 || (do_debug_aranges
&& streq (name
, "aranges"))
3986 || (do_debug_ranges
&& streq (name
, "ranges"))
3987 || (do_debug_frames
&& streq (name
, "frame"))
3988 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3989 || (do_debug_str
&& streq (name
, "str"))
3990 || (do_debug_loc
&& streq (name
, "loc"))
3992 request_dump (i
, DEBUG_DUMP
);
3994 /* linkonce section to be combined with .debug_info at link time. */
3995 else if ((do_debugging
|| do_debug_info
)
3996 && strneq (name
, ".gnu.linkonce.wi.", 17))
3997 request_dump (i
, DEBUG_DUMP
);
3998 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
3999 request_dump (i
, DEBUG_DUMP
);
4005 if (elf_header
.e_shnum
> 1)
4006 printf (_("\nSection Headers:\n"));
4008 printf (_("\nSection Header:\n"));
4012 if (do_full_section_name
)
4014 printf (_(" [Nr] Name\n"));
4015 printf (_(" Type Addr Off Size ES Flg Lk Inf Al\n"));
4019 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4023 if (do_full_section_name
)
4025 printf (_(" [Nr] Name\n"));
4026 printf (_(" Type Address Off Size ES Flg Lk Inf Al\n"));
4030 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4034 if (do_full_section_name
)
4036 printf (_(" [Nr] Name\n"));
4037 printf (_(" Flags Type Address Offset\n"));
4038 printf (_(" Size EntSize Link Info Align\n"));
4042 printf (_(" [Nr] Name Type Address Offset\n"));
4043 printf (_(" Size EntSize Flags Link Info Align\n"));
4047 for (i
= 0, section
= section_headers
;
4048 i
< elf_header
.e_shnum
;
4051 if (do_full_section_name
)
4053 printf (" [%2u] %s\n",
4054 SECTION_HEADER_NUM (i
),
4055 SECTION_NAME (section
));
4056 if (is_32bit_elf
|| do_wide
)
4057 printf (" %-15.15s ",
4058 get_section_type_name (section
->sh_type
));
4061 printf (" [%2u] %-17.17s %-15.15s ",
4062 SECTION_HEADER_NUM (i
),
4063 SECTION_NAME (section
),
4064 get_section_type_name (section
->sh_type
));
4068 print_vma (section
->sh_addr
, LONG_HEX
);
4070 printf ( " %6.6lx %6.6lx %2.2lx",
4071 (unsigned long) section
->sh_offset
,
4072 (unsigned long) section
->sh_size
,
4073 (unsigned long) section
->sh_entsize
);
4075 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4077 printf ("%2ld %3lu %2ld\n",
4078 (unsigned long) section
->sh_link
,
4079 (unsigned long) section
->sh_info
,
4080 (unsigned long) section
->sh_addralign
);
4084 print_vma (section
->sh_addr
, LONG_HEX
);
4086 if ((long) section
->sh_offset
== section
->sh_offset
)
4087 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4091 print_vma (section
->sh_offset
, LONG_HEX
);
4094 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4095 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4099 print_vma (section
->sh_size
, LONG_HEX
);
4102 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4103 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4107 print_vma (section
->sh_entsize
, LONG_HEX
);
4110 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4112 printf ("%2ld %3lu ",
4113 (unsigned long) section
->sh_link
,
4114 (unsigned long) section
->sh_info
);
4116 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4117 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4120 print_vma (section
->sh_addralign
, DEC
);
4124 else if (do_full_section_name
)
4126 printf (" %-15.15s %-15.15s ",
4127 get_elf_section_flags (section
->sh_flags
),
4128 get_section_type_name (section
->sh_type
));
4130 print_vma (section
->sh_addr
, LONG_HEX
);
4131 if ((long) section
->sh_offset
== section
->sh_offset
)
4132 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4136 print_vma (section
->sh_offset
, LONG_HEX
);
4139 print_vma (section
->sh_size
, LONG_HEX
);
4141 print_vma (section
->sh_entsize
, LONG_HEX
);
4143 printf (" %2ld %3lu %ld\n",
4144 (unsigned long) section
->sh_link
,
4145 (unsigned long) section
->sh_info
,
4146 (unsigned long) section
->sh_addralign
);
4151 print_vma (section
->sh_addr
, LONG_HEX
);
4152 if ((long) section
->sh_offset
== section
->sh_offset
)
4153 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4157 print_vma (section
->sh_offset
, LONG_HEX
);
4160 print_vma (section
->sh_size
, LONG_HEX
);
4162 print_vma (section
->sh_entsize
, LONG_HEX
);
4164 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4166 printf (" %2ld %3lu %ld\n",
4167 (unsigned long) section
->sh_link
,
4168 (unsigned long) section
->sh_info
,
4169 (unsigned long) section
->sh_addralign
);
4173 printf (_("Key to Flags:\n\
4174 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4175 I (info), L (link order), G (group), x (unknown)\n\
4176 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4182 get_group_flags (unsigned int flags
)
4184 static char buff
[32];
4191 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4198 process_section_groups (FILE *file
)
4200 Elf_Internal_Shdr
*section
;
4202 struct group
*group
;
4203 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4204 Elf_Internal_Sym
*symtab
;
4208 /* Don't process section groups unless needed. */
4209 if (!do_unwind
&& !do_section_groups
)
4212 if (elf_header
.e_shnum
== 0)
4214 if (do_section_groups
)
4215 printf (_("\nThere are no sections in this file.\n"));
4220 if (section_headers
== NULL
)
4222 error (_("Section headers are not available!\n"));
4226 section_headers_groups
= calloc (elf_header
.e_shnum
,
4227 sizeof (struct group
*));
4229 if (section_headers_groups
== NULL
)
4231 error (_("Out of memory\n"));
4235 /* Scan the sections for the group section. */
4237 for (i
= 0, section
= section_headers
;
4238 i
< elf_header
.e_shnum
;
4240 if (section
->sh_type
== SHT_GROUP
)
4243 if (group_count
== 0)
4245 if (do_section_groups
)
4246 printf (_("\nThere are no section groups in this file.\n"));
4251 section_groups
= calloc (group_count
, sizeof (struct group
));
4253 if (section_groups
== NULL
)
4255 error (_("Out of memory\n"));
4264 for (i
= 0, section
= section_headers
, group
= section_groups
;
4265 i
< elf_header
.e_shnum
;
4268 if (section
->sh_type
== SHT_GROUP
)
4270 char *name
= SECTION_NAME (section
);
4272 unsigned char *start
, *indices
;
4273 unsigned int entry
, j
, size
;
4274 Elf_Internal_Shdr
*sec
;
4275 Elf_Internal_Sym
*sym
;
4277 /* Get the symbol table. */
4278 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4279 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4282 error (_("Bad sh_link in group section `%s'\n"), name
);
4286 if (symtab_sec
!= sec
)
4291 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4294 sym
= symtab
+ section
->sh_info
;
4296 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4298 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4301 error (_("Bad sh_info in group section `%s'\n"), name
);
4305 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4314 /* Get the string table. */
4315 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4316 >= elf_header
.e_shnum
)
4325 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4330 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4331 1, strtab_sec
->sh_size
,
4333 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4335 group_name
= sym
->st_name
< strtab_size
4336 ? strtab
+ sym
->st_name
: "<corrupt>";
4339 start
= get_data (NULL
, file
, section
->sh_offset
,
4340 1, section
->sh_size
, _("section data"));
4343 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4344 entry
= byte_get (indices
, 4);
4347 if (do_section_groups
)
4349 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4350 get_group_flags (entry
), i
, name
, group_name
, size
);
4352 printf (_(" [Index] Name\n"));
4355 group
->group_index
= i
;
4357 for (j
= 0; j
< size
; j
++)
4359 struct group_list
*g
;
4361 entry
= byte_get (indices
, 4);
4364 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4366 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4367 entry
, i
, elf_header
.e_shnum
- 1);
4370 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4372 error (_("invalid section [%5u] in group section [%5u]\n"),
4377 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4382 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4384 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4389 /* Intel C/C++ compiler may put section 0 in a
4390 section group. We just warn it the first time
4391 and ignore it afterwards. */
4392 static int warned
= 0;
4395 error (_("section 0 in group section [%5u]\n"),
4396 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4402 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4405 if (do_section_groups
)
4407 sec
= SECTION_HEADER (entry
);
4408 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4411 g
= xmalloc (sizeof (struct group_list
));
4412 g
->section_index
= entry
;
4413 g
->next
= group
->root
;
4437 } dynamic_relocations
[] =
4439 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4440 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4441 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4444 /* Process the reloc section. */
4447 process_relocs (FILE *file
)
4449 unsigned long rel_size
;
4450 unsigned long rel_offset
;
4456 if (do_using_dynamic
)
4460 int has_dynamic_reloc
;
4463 has_dynamic_reloc
= 0;
4465 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4467 is_rela
= dynamic_relocations
[i
].rela
;
4468 name
= dynamic_relocations
[i
].name
;
4469 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4470 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4472 has_dynamic_reloc
|= rel_size
;
4474 if (is_rela
== UNKNOWN
)
4476 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4477 switch (dynamic_info
[DT_PLTREL
])
4491 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4492 name
, rel_offset
, rel_size
);
4494 dump_relocations (file
,
4495 offset_from_vma (file
, rel_offset
, rel_size
),
4497 dynamic_symbols
, num_dynamic_syms
,
4498 dynamic_strings
, dynamic_strings_length
, is_rela
);
4502 if (! has_dynamic_reloc
)
4503 printf (_("\nThere are no dynamic relocations in this file.\n"));
4507 Elf_Internal_Shdr
*section
;
4511 for (i
= 0, section
= section_headers
;
4512 i
< elf_header
.e_shnum
;
4515 if ( section
->sh_type
!= SHT_RELA
4516 && section
->sh_type
!= SHT_REL
)
4519 rel_offset
= section
->sh_offset
;
4520 rel_size
= section
->sh_size
;
4524 Elf_Internal_Shdr
*strsec
;
4527 printf (_("\nRelocation section "));
4529 if (string_table
== NULL
)
4530 printf ("%d", section
->sh_name
);
4532 printf (_("'%s'"), SECTION_NAME (section
));
4534 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4535 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4537 is_rela
= section
->sh_type
== SHT_RELA
;
4539 if (section
->sh_link
4540 && SECTION_HEADER_INDEX (section
->sh_link
)
4541 < elf_header
.e_shnum
)
4543 Elf_Internal_Shdr
*symsec
;
4544 Elf_Internal_Sym
*symtab
;
4545 unsigned long nsyms
;
4546 unsigned long strtablen
= 0;
4547 char *strtab
= NULL
;
4549 symsec
= SECTION_HEADER (section
->sh_link
);
4550 if (symsec
->sh_type
!= SHT_SYMTAB
4551 && symsec
->sh_type
!= SHT_DYNSYM
)
4554 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4555 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4560 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4561 < elf_header
.e_shnum
)
4563 strsec
= SECTION_HEADER (symsec
->sh_link
);
4565 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4568 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4571 dump_relocations (file
, rel_offset
, rel_size
,
4572 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4578 dump_relocations (file
, rel_offset
, rel_size
,
4579 NULL
, 0, NULL
, 0, is_rela
);
4586 printf (_("\nThere are no relocations in this file.\n"));
4592 /* Process the unwind section. */
4594 #include "unwind-ia64.h"
4596 /* An absolute address consists of a section and an offset. If the
4597 section is NULL, the offset itself is the address, otherwise, the
4598 address equals to LOAD_ADDRESS(section) + offset. */
4602 unsigned short section
;
4606 struct ia64_unw_aux_info
4608 struct ia64_unw_table_entry
4610 struct absaddr start
;
4612 struct absaddr info
;
4614 *table
; /* Unwind table. */
4615 unsigned long table_len
; /* Length of unwind table. */
4616 unsigned char *info
; /* Unwind info. */
4617 unsigned long info_size
; /* Size of unwind info. */
4618 bfd_vma info_addr
; /* starting address of unwind info. */
4619 bfd_vma seg_base
; /* Starting address of segment. */
4620 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4621 unsigned long nsyms
; /* Number of symbols. */
4622 char *strtab
; /* The string table. */
4623 unsigned long strtab_size
; /* Size of string table. */
4627 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4628 unsigned long nsyms
,
4630 unsigned long strtab_size
,
4631 struct absaddr addr
,
4632 const char **symname
,
4635 bfd_vma dist
= 0x100000;
4636 Elf_Internal_Sym
*sym
, *best
= NULL
;
4639 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4641 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4642 && sym
->st_name
!= 0
4643 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4644 && addr
.offset
>= sym
->st_value
4645 && addr
.offset
- sym
->st_value
< dist
)
4648 dist
= addr
.offset
- sym
->st_value
;
4655 *symname
= (best
->st_name
>= strtab_size
4656 ? "<corrupt>" : strtab
+ best
->st_name
);
4661 *offset
= addr
.offset
;
4665 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4667 struct ia64_unw_table_entry
*tp
;
4670 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4674 const unsigned char *dp
;
4675 const unsigned char *head
;
4676 const char *procname
;
4678 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4679 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4681 fputs ("\n<", stdout
);
4685 fputs (procname
, stdout
);
4688 printf ("+%lx", (unsigned long) offset
);
4691 fputs (">: [", stdout
);
4692 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4693 fputc ('-', stdout
);
4694 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4695 printf ("], info at +0x%lx\n",
4696 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4698 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4699 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4701 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4702 (unsigned) UNW_VER (stamp
),
4703 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4704 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4705 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4706 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4708 if (UNW_VER (stamp
) != 1)
4710 printf ("\tUnknown version.\n");
4715 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4716 dp
= unw_decode (dp
, in_body
, & in_body
);
4721 slurp_ia64_unwind_table (FILE *file
,
4722 struct ia64_unw_aux_info
*aux
,
4723 Elf_Internal_Shdr
*sec
)
4725 unsigned long size
, nrelas
, i
;
4726 Elf_Internal_Phdr
*seg
;
4727 struct ia64_unw_table_entry
*tep
;
4728 Elf_Internal_Shdr
*relsec
;
4729 Elf_Internal_Rela
*rela
, *rp
;
4730 unsigned char *table
, *tp
;
4731 Elf_Internal_Sym
*sym
;
4732 const char *relname
;
4734 /* First, find the starting address of the segment that includes
4737 if (elf_header
.e_phnum
)
4739 if (! get_program_headers (file
))
4742 for (seg
= program_headers
;
4743 seg
< program_headers
+ elf_header
.e_phnum
;
4746 if (seg
->p_type
!= PT_LOAD
)
4749 if (sec
->sh_addr
>= seg
->p_vaddr
4750 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4752 aux
->seg_base
= seg
->p_vaddr
;
4758 /* Second, build the unwind table from the contents of the unwind section: */
4759 size
= sec
->sh_size
;
4760 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4764 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4766 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4768 tep
->start
.section
= SHN_UNDEF
;
4769 tep
->end
.section
= SHN_UNDEF
;
4770 tep
->info
.section
= SHN_UNDEF
;
4773 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4774 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4775 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4779 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4780 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4781 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4783 tep
->start
.offset
+= aux
->seg_base
;
4784 tep
->end
.offset
+= aux
->seg_base
;
4785 tep
->info
.offset
+= aux
->seg_base
;
4789 /* Third, apply any relocations to the unwind table: */
4791 for (relsec
= section_headers
;
4792 relsec
< section_headers
+ elf_header
.e_shnum
;
4795 if (relsec
->sh_type
!= SHT_RELA
4796 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4797 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4800 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4804 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4808 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4809 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4813 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4814 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4817 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4819 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4823 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4825 switch (rp
->r_offset
/eh_addr_size
% 3)
4828 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4829 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4832 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4833 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4836 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4837 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4847 aux
->table_len
= size
/ (3 * eh_addr_size
);
4852 ia64_process_unwind (FILE *file
)
4854 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4855 unsigned long i
, unwcount
= 0, unwstart
= 0;
4856 struct ia64_unw_aux_info aux
;
4858 memset (& aux
, 0, sizeof (aux
));
4860 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4862 if (sec
->sh_type
== SHT_SYMTAB
4863 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4865 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4866 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4868 strsec
= SECTION_HEADER (sec
->sh_link
);
4869 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4870 1, strsec
->sh_size
, _("string table"));
4871 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4873 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4878 printf (_("\nThere are no unwind sections in this file.\n"));
4880 while (unwcount
-- > 0)
4885 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4886 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4887 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4894 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4896 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4898 /* We need to find which section group it is in. */
4899 struct group_list
*g
= section_headers_groups
[i
]->root
;
4901 for (; g
!= NULL
; g
= g
->next
)
4903 sec
= SECTION_HEADER (g
->section_index
);
4905 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4910 i
= elf_header
.e_shnum
;
4912 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4914 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4915 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4916 suffix
= SECTION_NAME (unwsec
) + len
;
4917 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4919 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4920 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4925 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4926 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4927 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4928 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4930 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4931 suffix
= SECTION_NAME (unwsec
) + len
;
4932 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4934 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4935 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4939 if (i
== elf_header
.e_shnum
)
4941 printf (_("\nCould not find unwind info section for "));
4943 if (string_table
== NULL
)
4944 printf ("%d", unwsec
->sh_name
);
4946 printf (_("'%s'"), SECTION_NAME (unwsec
));
4950 aux
.info_size
= sec
->sh_size
;
4951 aux
.info_addr
= sec
->sh_addr
;
4952 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
4955 printf (_("\nUnwind section "));
4957 if (string_table
== NULL
)
4958 printf ("%d", unwsec
->sh_name
);
4960 printf (_("'%s'"), SECTION_NAME (unwsec
));
4962 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4963 (unsigned long) unwsec
->sh_offset
,
4964 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4966 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4968 if (aux
.table_len
> 0)
4969 dump_ia64_unwind (& aux
);
4972 free ((char *) aux
.table
);
4974 free ((char *) aux
.info
);
4983 free ((char *) aux
.strtab
);
4988 struct hppa_unw_aux_info
4990 struct hppa_unw_table_entry
4992 struct absaddr start
;
4994 unsigned int Cannot_unwind
:1; /* 0 */
4995 unsigned int Millicode
:1; /* 1 */
4996 unsigned int Millicode_save_sr0
:1; /* 2 */
4997 unsigned int Region_description
:2; /* 3..4 */
4998 unsigned int reserved1
:1; /* 5 */
4999 unsigned int Entry_SR
:1; /* 6 */
5000 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5001 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5002 unsigned int Args_stored
:1; /* 16 */
5003 unsigned int Variable_Frame
:1; /* 17 */
5004 unsigned int Separate_Package_Body
:1; /* 18 */
5005 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5006 unsigned int Stack_Overflow_Check
:1; /* 20 */
5007 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5008 unsigned int Ada_Region
:1; /* 22 */
5009 unsigned int cxx_info
:1; /* 23 */
5010 unsigned int cxx_try_catch
:1; /* 24 */
5011 unsigned int sched_entry_seq
:1; /* 25 */
5012 unsigned int reserved2
:1; /* 26 */
5013 unsigned int Save_SP
:1; /* 27 */
5014 unsigned int Save_RP
:1; /* 28 */
5015 unsigned int Save_MRP_in_frame
:1; /* 29 */
5016 unsigned int extn_ptr_defined
:1; /* 30 */
5017 unsigned int Cleanup_defined
:1; /* 31 */
5019 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5020 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5021 unsigned int Large_frame
:1; /* 2 */
5022 unsigned int Pseudo_SP_Set
:1; /* 3 */
5023 unsigned int reserved4
:1; /* 4 */
5024 unsigned int Total_frame_size
:27; /* 5..31 */
5026 *table
; /* Unwind table. */
5027 unsigned long table_len
; /* Length of unwind table. */
5028 bfd_vma seg_base
; /* Starting address of segment. */
5029 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5030 unsigned long nsyms
; /* Number of symbols. */
5031 char *strtab
; /* The string table. */
5032 unsigned long strtab_size
; /* Size of string table. */
5036 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5038 struct hppa_unw_table_entry
*tp
;
5040 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5043 const char *procname
;
5045 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5046 aux
->strtab_size
, tp
->start
, &procname
,
5049 fputs ("\n<", stdout
);
5053 fputs (procname
, stdout
);
5056 printf ("+%lx", (unsigned long) offset
);
5059 fputs (">: [", stdout
);
5060 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5061 fputc ('-', stdout
);
5062 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5065 #define PF(_m) if (tp->_m) printf (#_m " ");
5066 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5069 PF(Millicode_save_sr0
);
5070 /* PV(Region_description); */
5076 PF(Separate_Package_Body
);
5077 PF(Frame_Extension_Millicode
);
5078 PF(Stack_Overflow_Check
);
5079 PF(Two_Instruction_SP_Increment
);
5083 PF(sched_entry_seq
);
5086 PF(Save_MRP_in_frame
);
5087 PF(extn_ptr_defined
);
5088 PF(Cleanup_defined
);
5089 PF(MPE_XL_interrupt_marker
);
5090 PF(HP_UX_interrupt_marker
);
5093 PV(Total_frame_size
);
5102 slurp_hppa_unwind_table (FILE *file
,
5103 struct hppa_unw_aux_info
*aux
,
5104 Elf_Internal_Shdr
*sec
)
5106 unsigned long size
, unw_ent_size
, nrelas
, i
;
5107 Elf_Internal_Phdr
*seg
;
5108 struct hppa_unw_table_entry
*tep
;
5109 Elf_Internal_Shdr
*relsec
;
5110 Elf_Internal_Rela
*rela
, *rp
;
5111 unsigned char *table
, *tp
;
5112 Elf_Internal_Sym
*sym
;
5113 const char *relname
;
5115 /* First, find the starting address of the segment that includes
5118 if (elf_header
.e_phnum
)
5120 if (! get_program_headers (file
))
5123 for (seg
= program_headers
;
5124 seg
< program_headers
+ elf_header
.e_phnum
;
5127 if (seg
->p_type
!= PT_LOAD
)
5130 if (sec
->sh_addr
>= seg
->p_vaddr
5131 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5133 aux
->seg_base
= seg
->p_vaddr
;
5139 /* Second, build the unwind table from the contents of the unwind
5141 size
= sec
->sh_size
;
5142 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5146 unw_ent_size
= 2 * eh_addr_size
+ 8;
5148 tep
= aux
->table
= xcmalloc (size
/ unw_ent_size
, sizeof (aux
->table
[0]));
5150 for (tp
= table
; tp
< table
+ size
; tp
+= (2 * eh_addr_size
+ 8), ++tep
)
5152 unsigned int tmp1
, tmp2
;
5154 tep
->start
.section
= SHN_UNDEF
;
5155 tep
->end
.section
= SHN_UNDEF
;
5159 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5160 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5161 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5162 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5166 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5167 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5168 tmp1
= byte_get ((unsigned char *) tp
+ 16, 4);
5169 tmp2
= byte_get ((unsigned char *) tp
+ 20, 4);
5172 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5173 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5174 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5175 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5176 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5177 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5178 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5179 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5180 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5181 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5182 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5183 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5184 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5185 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5186 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5187 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5188 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5189 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5190 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5191 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5192 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5193 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5194 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5195 tep
->Cleanup_defined
= tmp1
& 0x1;
5197 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5198 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5199 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5200 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5201 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5202 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5204 tep
->start
.offset
+= aux
->seg_base
;
5205 tep
->end
.offset
+= aux
->seg_base
;
5209 /* Third, apply any relocations to the unwind table. */
5211 for (relsec
= section_headers
;
5212 relsec
< section_headers
+ elf_header
.e_shnum
;
5215 if (relsec
->sh_type
!= SHT_RELA
5216 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5217 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5220 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5224 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5228 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5229 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5233 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5234 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5237 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5238 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5240 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5244 i
= rp
->r_offset
/ unw_ent_size
;
5246 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5249 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5250 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5253 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5254 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5264 aux
->table_len
= size
/ unw_ent_size
;
5270 hppa_process_unwind (FILE *file
)
5272 struct hppa_unw_aux_info aux
;
5273 Elf_Internal_Shdr
*unwsec
= NULL
;
5274 Elf_Internal_Shdr
*strsec
;
5275 Elf_Internal_Shdr
*sec
;
5278 memset (& aux
, 0, sizeof (aux
));
5280 if (string_table
== NULL
)
5283 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5285 if (sec
->sh_type
== SHT_SYMTAB
5286 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5288 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5289 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5291 strsec
= SECTION_HEADER (sec
->sh_link
);
5292 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5293 1, strsec
->sh_size
, _("string table"));
5294 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5296 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5301 printf (_("\nThere are no unwind sections in this file.\n"));
5303 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5305 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5307 printf (_("\nUnwind section "));
5308 printf (_("'%s'"), SECTION_NAME (sec
));
5310 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5311 (unsigned long) sec
->sh_offset
,
5312 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5314 slurp_hppa_unwind_table (file
, &aux
, sec
);
5315 if (aux
.table_len
> 0)
5316 dump_hppa_unwind (&aux
);
5319 free ((char *) aux
.table
);
5327 free ((char *) aux
.strtab
);
5333 process_unwind (FILE *file
)
5335 struct unwind_handler
{
5337 int (*handler
)(FILE *file
);
5339 { EM_IA_64
, ia64_process_unwind
},
5340 { EM_PARISC
, hppa_process_unwind
},
5348 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5349 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5350 return handlers
[i
].handler (file
);
5352 printf (_("\nThere are no unwind sections in this file.\n"));
5357 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5359 switch (entry
->d_tag
)
5362 if (entry
->d_un
.d_val
== 0)
5366 static const char * opts
[] =
5368 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5369 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5370 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5371 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5376 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5377 if (entry
->d_un
.d_val
& (1 << cnt
))
5379 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5386 case DT_MIPS_IVERSION
:
5387 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5388 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5390 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5393 case DT_MIPS_TIME_STAMP
:
5398 time_t time
= entry
->d_un
.d_val
;
5399 tmp
= gmtime (&time
);
5400 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5401 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5402 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5403 printf ("Time Stamp: %s\n", timebuf
);
5407 case DT_MIPS_RLD_VERSION
:
5408 case DT_MIPS_LOCAL_GOTNO
:
5409 case DT_MIPS_CONFLICTNO
:
5410 case DT_MIPS_LIBLISTNO
:
5411 case DT_MIPS_SYMTABNO
:
5412 case DT_MIPS_UNREFEXTNO
:
5413 case DT_MIPS_HIPAGENO
:
5414 case DT_MIPS_DELTA_CLASS_NO
:
5415 case DT_MIPS_DELTA_INSTANCE_NO
:
5416 case DT_MIPS_DELTA_RELOC_NO
:
5417 case DT_MIPS_DELTA_SYM_NO
:
5418 case DT_MIPS_DELTA_CLASSSYM_NO
:
5419 case DT_MIPS_COMPACT_SIZE
:
5420 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5424 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5430 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5432 switch (entry
->d_tag
)
5434 case DT_HP_DLD_FLAGS
:
5443 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5444 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5445 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5446 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5447 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5448 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5449 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5450 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5451 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5452 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5453 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5454 { DT_HP_GST
, "HP_GST" },
5455 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5456 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5457 { DT_HP_NODELETE
, "HP_NODELETE" },
5458 { DT_HP_GROUP
, "HP_GROUP" },
5459 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5463 bfd_vma val
= entry
->d_un
.d_val
;
5465 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5466 if (val
& flags
[cnt
].bit
)
5470 fputs (flags
[cnt
].str
, stdout
);
5472 val
^= flags
[cnt
].bit
;
5475 if (val
!= 0 || first
)
5479 print_vma (val
, HEX
);
5485 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5492 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5494 switch (entry
->d_tag
)
5496 case DT_IA_64_PLT_RESERVE
:
5497 /* First 3 slots reserved. */
5498 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5500 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5504 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5511 get_32bit_dynamic_section (FILE *file
)
5513 Elf32_External_Dyn
*edyn
, *ext
;
5514 Elf_Internal_Dyn
*entry
;
5516 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5517 _("dynamic section"));
5521 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5522 might not have the luxury of section headers. Look for the DT_NULL
5523 terminator to determine the number of entries. */
5524 for (ext
= edyn
, dynamic_nent
= 0;
5525 (char *) ext
< (char *) edyn
+ dynamic_size
;
5529 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5533 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5534 if (dynamic_section
== NULL
)
5536 error (_("Out of memory\n"));
5541 for (ext
= edyn
, entry
= dynamic_section
;
5542 entry
< dynamic_section
+ dynamic_nent
;
5545 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5546 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5555 get_64bit_dynamic_section (FILE *file
)
5557 Elf64_External_Dyn
*edyn
, *ext
;
5558 Elf_Internal_Dyn
*entry
;
5560 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5561 _("dynamic section"));
5565 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5566 might not have the luxury of section headers. Look for the DT_NULL
5567 terminator to determine the number of entries. */
5568 for (ext
= edyn
, dynamic_nent
= 0;
5569 (char *) ext
< (char *) edyn
+ dynamic_size
;
5573 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5577 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5578 if (dynamic_section
== NULL
)
5580 error (_("Out of memory\n"));
5585 for (ext
= edyn
, entry
= dynamic_section
;
5586 entry
< dynamic_section
+ dynamic_nent
;
5589 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5590 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5599 print_dynamic_flags (bfd_vma flags
)
5607 flag
= flags
& - flags
;
5617 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5618 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5619 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5620 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5621 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5622 default: fputs ("unknown", stdout
); break;
5628 /* Parse and display the contents of the dynamic section. */
5631 process_dynamic_section (FILE *file
)
5633 Elf_Internal_Dyn
*entry
;
5635 if (dynamic_size
== 0)
5638 printf (_("\nThere is no dynamic section in this file.\n"));
5645 if (! get_32bit_dynamic_section (file
))
5648 else if (! get_64bit_dynamic_section (file
))
5651 /* Find the appropriate symbol table. */
5652 if (dynamic_symbols
== NULL
)
5654 for (entry
= dynamic_section
;
5655 entry
< dynamic_section
+ dynamic_nent
;
5658 Elf_Internal_Shdr section
;
5660 if (entry
->d_tag
!= DT_SYMTAB
)
5663 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5665 /* Since we do not know how big the symbol table is,
5666 we default to reading in the entire file (!) and
5667 processing that. This is overkill, I know, but it
5669 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5671 if (archive_file_offset
!= 0)
5672 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5675 if (fseek (file
, 0, SEEK_END
))
5676 error (_("Unable to seek to end of file!"));
5678 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5682 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5684 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5686 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5687 if (num_dynamic_syms
< 1)
5689 error (_("Unable to determine the number of symbols to load\n"));
5693 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5697 /* Similarly find a string table. */
5698 if (dynamic_strings
== NULL
)
5700 for (entry
= dynamic_section
;
5701 entry
< dynamic_section
+ dynamic_nent
;
5704 unsigned long offset
;
5707 if (entry
->d_tag
!= DT_STRTAB
)
5710 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5712 /* Since we do not know how big the string table is,
5713 we default to reading in the entire file (!) and
5714 processing that. This is overkill, I know, but it
5717 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5719 if (archive_file_offset
!= 0)
5720 str_tab_len
= archive_file_size
- offset
;
5723 if (fseek (file
, 0, SEEK_END
))
5724 error (_("Unable to seek to end of file\n"));
5725 str_tab_len
= ftell (file
) - offset
;
5728 if (str_tab_len
< 1)
5731 (_("Unable to determine the length of the dynamic string table\n"));
5735 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5736 _("dynamic string table"));
5737 dynamic_strings_length
= str_tab_len
;
5742 /* And find the syminfo section if available. */
5743 if (dynamic_syminfo
== NULL
)
5745 unsigned long syminsz
= 0;
5747 for (entry
= dynamic_section
;
5748 entry
< dynamic_section
+ dynamic_nent
;
5751 if (entry
->d_tag
== DT_SYMINENT
)
5753 /* Note: these braces are necessary to avoid a syntax
5754 error from the SunOS4 C compiler. */
5755 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5757 else if (entry
->d_tag
== DT_SYMINSZ
)
5758 syminsz
= entry
->d_un
.d_val
;
5759 else if (entry
->d_tag
== DT_SYMINFO
)
5760 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5764 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5766 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5767 Elf_Internal_Syminfo
*syminfo
;
5769 /* There is a syminfo section. Read the data. */
5770 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5771 syminsz
, _("symbol information"));
5775 dynamic_syminfo
= malloc (syminsz
);
5776 if (dynamic_syminfo
== NULL
)
5778 error (_("Out of memory\n"));
5782 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5783 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5784 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5785 ++syminfo
, ++extsym
)
5787 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5788 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5795 if (do_dynamic
&& dynamic_addr
)
5796 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5797 dynamic_addr
, dynamic_nent
);
5799 printf (_(" Tag Type Name/Value\n"));
5801 for (entry
= dynamic_section
;
5802 entry
< dynamic_section
+ dynamic_nent
;
5810 print_vma (entry
->d_tag
, FULL_HEX
);
5811 dtype
= get_dynamic_type (entry
->d_tag
);
5812 printf (" (%s)%*s", dtype
,
5813 ((is_32bit_elf
? 27 : 19)
5814 - (int) strlen (dtype
)),
5818 switch (entry
->d_tag
)
5822 print_dynamic_flags (entry
->d_un
.d_val
);
5832 switch (entry
->d_tag
)
5835 printf (_("Auxiliary library"));
5839 printf (_("Filter library"));
5843 printf (_("Configuration file"));
5847 printf (_("Dependency audit library"));
5851 printf (_("Audit library"));
5855 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5856 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5860 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5869 printf (_("Flags:"));
5871 if (entry
->d_un
.d_val
== 0)
5872 printf (_(" None\n"));
5875 unsigned long int val
= entry
->d_un
.d_val
;
5877 if (val
& DTF_1_PARINIT
)
5879 printf (" PARINIT");
5880 val
^= DTF_1_PARINIT
;
5882 if (val
& DTF_1_CONFEXP
)
5884 printf (" CONFEXP");
5885 val
^= DTF_1_CONFEXP
;
5888 printf (" %lx", val
);
5897 printf (_("Flags:"));
5899 if (entry
->d_un
.d_val
== 0)
5900 printf (_(" None\n"));
5903 unsigned long int val
= entry
->d_un
.d_val
;
5905 if (val
& DF_P1_LAZYLOAD
)
5907 printf (" LAZYLOAD");
5908 val
^= DF_P1_LAZYLOAD
;
5910 if (val
& DF_P1_GROUPPERM
)
5912 printf (" GROUPPERM");
5913 val
^= DF_P1_GROUPPERM
;
5916 printf (" %lx", val
);
5925 printf (_("Flags:"));
5926 if (entry
->d_un
.d_val
== 0)
5927 printf (_(" None\n"));
5930 unsigned long int val
= entry
->d_un
.d_val
;
5937 if (val
& DF_1_GLOBAL
)
5942 if (val
& DF_1_GROUP
)
5947 if (val
& DF_1_NODELETE
)
5949 printf (" NODELETE");
5950 val
^= DF_1_NODELETE
;
5952 if (val
& DF_1_LOADFLTR
)
5954 printf (" LOADFLTR");
5955 val
^= DF_1_LOADFLTR
;
5957 if (val
& DF_1_INITFIRST
)
5959 printf (" INITFIRST");
5960 val
^= DF_1_INITFIRST
;
5962 if (val
& DF_1_NOOPEN
)
5967 if (val
& DF_1_ORIGIN
)
5972 if (val
& DF_1_DIRECT
)
5977 if (val
& DF_1_TRANS
)
5982 if (val
& DF_1_INTERPOSE
)
5984 printf (" INTERPOSE");
5985 val
^= DF_1_INTERPOSE
;
5987 if (val
& DF_1_NODEFLIB
)
5989 printf (" NODEFLIB");
5990 val
^= DF_1_NODEFLIB
;
5992 if (val
& DF_1_NODUMP
)
5997 if (val
& DF_1_CONLFAT
)
5999 printf (" CONLFAT");
6000 val
^= DF_1_CONLFAT
;
6003 printf (" %lx", val
);
6010 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6012 puts (get_dynamic_type (entry
->d_un
.d_val
));
6032 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6038 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6039 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6045 switch (entry
->d_tag
)
6048 printf (_("Shared library: [%s]"), name
);
6050 if (streq (name
, program_interpreter
))
6051 printf (_(" program interpreter"));
6055 printf (_("Library soname: [%s]"), name
);
6059 printf (_("Library rpath: [%s]"), name
);
6063 printf (_("Library runpath: [%s]"), name
);
6067 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6072 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6085 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6089 case DT_INIT_ARRAYSZ
:
6090 case DT_FINI_ARRAYSZ
:
6091 case DT_GNU_CONFLICTSZ
:
6092 case DT_GNU_LIBLISTSZ
:
6095 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6096 printf (" (bytes)\n");
6106 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6119 if (entry
->d_tag
== DT_USED
6120 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6122 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6126 printf (_("Not needed object: [%s]\n"), name
);
6131 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6137 /* The value of this entry is ignored. */
6142 case DT_GNU_PRELINKED
:
6146 time_t time
= entry
->d_un
.d_val
;
6148 tmp
= gmtime (&time
);
6149 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6150 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6151 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6157 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6158 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6163 switch (elf_header
.e_machine
)
6166 case EM_MIPS_RS3_LE
:
6167 dynamic_section_mips_val (entry
);
6170 dynamic_section_parisc_val (entry
);
6173 dynamic_section_ia64_val (entry
);
6176 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6188 get_ver_flags (unsigned int flags
)
6190 static char buff
[32];
6197 if (flags
& VER_FLG_BASE
)
6198 strcat (buff
, "BASE ");
6200 if (flags
& VER_FLG_WEAK
)
6202 if (flags
& VER_FLG_BASE
)
6203 strcat (buff
, "| ");
6205 strcat (buff
, "WEAK ");
6208 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6209 strcat (buff
, "| <unknown>");
6214 /* Display the contents of the version sections. */
6216 process_version_sections (FILE *file
)
6218 Elf_Internal_Shdr
*section
;
6225 for (i
= 0, section
= section_headers
;
6226 i
< elf_header
.e_shnum
;
6229 switch (section
->sh_type
)
6231 case SHT_GNU_verdef
:
6233 Elf_External_Verdef
*edefs
;
6240 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6241 SECTION_NAME (section
), section
->sh_info
);
6243 printf (_(" Addr: 0x"));
6244 printf_vma (section
->sh_addr
);
6245 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6246 (unsigned long) section
->sh_offset
, section
->sh_link
,
6247 SECTION_HEADER_INDEX (section
->sh_link
)
6248 < elf_header
.e_shnum
6249 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6252 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6254 _("version definition section"));
6258 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6261 Elf_External_Verdef
*edef
;
6262 Elf_Internal_Verdef ent
;
6263 Elf_External_Verdaux
*eaux
;
6264 Elf_Internal_Verdaux aux
;
6268 vstart
= ((char *) edefs
) + idx
;
6270 edef
= (Elf_External_Verdef
*) vstart
;
6272 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6273 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6274 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6275 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6276 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6277 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6278 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6280 printf (_(" %#06x: Rev: %d Flags: %s"),
6281 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6283 printf (_(" Index: %d Cnt: %d "),
6284 ent
.vd_ndx
, ent
.vd_cnt
);
6286 vstart
+= ent
.vd_aux
;
6288 eaux
= (Elf_External_Verdaux
*) vstart
;
6290 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6291 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6293 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6294 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6296 printf (_("Name index: %ld\n"), aux
.vda_name
);
6298 isum
= idx
+ ent
.vd_aux
;
6300 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6302 isum
+= aux
.vda_next
;
6303 vstart
+= aux
.vda_next
;
6305 eaux
= (Elf_External_Verdaux
*) vstart
;
6307 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6308 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6310 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6311 printf (_(" %#06x: Parent %d: %s\n"),
6312 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6314 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6315 isum
, j
, aux
.vda_name
);
6325 case SHT_GNU_verneed
:
6327 Elf_External_Verneed
*eneed
;
6333 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6334 SECTION_NAME (section
), section
->sh_info
);
6336 printf (_(" Addr: 0x"));
6337 printf_vma (section
->sh_addr
);
6338 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6339 (unsigned long) section
->sh_offset
, section
->sh_link
,
6340 SECTION_HEADER_INDEX (section
->sh_link
)
6341 < elf_header
.e_shnum
6342 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6345 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6347 _("version need section"));
6351 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6353 Elf_External_Verneed
*entry
;
6354 Elf_Internal_Verneed ent
;
6359 vstart
= ((char *) eneed
) + idx
;
6361 entry
= (Elf_External_Verneed
*) vstart
;
6363 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6364 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6365 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6366 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6367 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6369 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6371 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6372 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6374 printf (_(" File: %lx"), ent
.vn_file
);
6376 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6378 vstart
+= ent
.vn_aux
;
6380 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6382 Elf_External_Vernaux
*eaux
;
6383 Elf_Internal_Vernaux aux
;
6385 eaux
= (Elf_External_Vernaux
*) vstart
;
6387 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6388 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6389 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6390 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6391 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6393 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6394 printf (_(" %#06x: Name: %s"),
6395 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6397 printf (_(" %#06x: Name index: %lx"),
6398 isum
, aux
.vna_name
);
6400 printf (_(" Flags: %s Version: %d\n"),
6401 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6403 isum
+= aux
.vna_next
;
6404 vstart
+= aux
.vna_next
;
6414 case SHT_GNU_versym
:
6416 Elf_Internal_Shdr
*link_section
;
6419 unsigned char *edata
;
6420 unsigned short *data
;
6422 Elf_Internal_Sym
*symbols
;
6423 Elf_Internal_Shdr
*string_sec
;
6426 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6429 link_section
= SECTION_HEADER (section
->sh_link
);
6430 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6432 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6433 >= elf_header
.e_shnum
)
6438 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6440 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6442 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6443 string_sec
->sh_size
, _("version string table"));
6447 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6448 SECTION_NAME (section
), total
);
6450 printf (_(" Addr: "));
6451 printf_vma (section
->sh_addr
);
6452 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6453 (unsigned long) section
->sh_offset
, section
->sh_link
,
6454 SECTION_NAME (link_section
));
6456 off
= offset_from_vma (file
,
6457 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6458 total
* sizeof (short));
6459 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6460 _("version symbol data"));
6467 data
= cmalloc (total
, sizeof (short));
6469 for (cnt
= total
; cnt
--;)
6470 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6475 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6478 int check_def
, check_need
;
6481 printf (" %03x:", cnt
);
6483 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6484 switch (data
[cnt
+ j
])
6487 fputs (_(" 0 (*local*) "), stdout
);
6491 fputs (_(" 1 (*global*) "), stdout
);
6495 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6496 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6500 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6501 >= elf_header
.e_shnum
6502 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6505 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6512 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6514 Elf_Internal_Verneed ivn
;
6515 unsigned long offset
;
6517 offset
= offset_from_vma
6518 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6519 sizeof (Elf_External_Verneed
));
6523 Elf_Internal_Vernaux ivna
;
6524 Elf_External_Verneed evn
;
6525 Elf_External_Vernaux evna
;
6526 unsigned long a_off
;
6528 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6531 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6532 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6534 a_off
= offset
+ ivn
.vn_aux
;
6538 get_data (&evna
, file
, a_off
, sizeof (evna
),
6539 1, _("version need aux (2)"));
6541 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6542 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6544 a_off
+= ivna
.vna_next
;
6546 while (ivna
.vna_other
!= data
[cnt
+ j
]
6547 && ivna
.vna_next
!= 0);
6549 if (ivna
.vna_other
== data
[cnt
+ j
])
6551 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6553 name
= strtab
+ ivna
.vna_name
;
6554 nn
+= printf ("(%s%-*s",
6556 12 - (int) strlen (name
),
6562 offset
+= ivn
.vn_next
;
6564 while (ivn
.vn_next
);
6567 if (check_def
&& data
[cnt
+ j
] != 0x8001
6568 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6570 Elf_Internal_Verdef ivd
;
6571 Elf_External_Verdef evd
;
6572 unsigned long offset
;
6574 offset
= offset_from_vma
6575 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6580 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6583 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6584 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6586 offset
+= ivd
.vd_next
;
6588 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6589 && ivd
.vd_next
!= 0);
6591 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6593 Elf_External_Verdaux evda
;
6594 Elf_Internal_Verdaux ivda
;
6596 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6598 get_data (&evda
, file
,
6599 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6601 _("version def aux"));
6603 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6605 name
= strtab
+ ivda
.vda_name
;
6606 nn
+= printf ("(%s%-*s",
6608 12 - (int) strlen (name
),
6614 printf ("%*c", 18 - nn
, ' ');
6632 printf (_("\nNo version information found in this file.\n"));
6638 get_symbol_binding (unsigned int binding
)
6640 static char buff
[32];
6644 case STB_LOCAL
: return "LOCAL";
6645 case STB_GLOBAL
: return "GLOBAL";
6646 case STB_WEAK
: return "WEAK";
6648 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6649 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6651 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6652 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6654 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6660 get_symbol_type (unsigned int type
)
6662 static char buff
[32];
6666 case STT_NOTYPE
: return "NOTYPE";
6667 case STT_OBJECT
: return "OBJECT";
6668 case STT_FUNC
: return "FUNC";
6669 case STT_SECTION
: return "SECTION";
6670 case STT_FILE
: return "FILE";
6671 case STT_COMMON
: return "COMMON";
6672 case STT_TLS
: return "TLS";
6674 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6676 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6677 return "THUMB_FUNC";
6679 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6682 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6683 return "PARISC_MILLI";
6685 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6687 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6689 if (elf_header
.e_machine
== EM_PARISC
)
6691 if (type
== STT_HP_OPAQUE
)
6693 if (type
== STT_HP_STUB
)
6697 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6700 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6706 get_symbol_visibility (unsigned int visibility
)
6710 case STV_DEFAULT
: return "DEFAULT";
6711 case STV_INTERNAL
: return "INTERNAL";
6712 case STV_HIDDEN
: return "HIDDEN";
6713 case STV_PROTECTED
: return "PROTECTED";
6719 get_symbol_index_type (unsigned int type
)
6721 static char buff
[32];
6725 case SHN_UNDEF
: return "UND";
6726 case SHN_ABS
: return "ABS";
6727 case SHN_COMMON
: return "COM";
6729 if (type
== SHN_IA_64_ANSI_COMMON
6730 && elf_header
.e_machine
== EM_IA_64
6731 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6733 else if (elf_header
.e_machine
== EM_X86_64
6734 && type
== SHN_X86_64_LCOMMON
)
6736 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6737 sprintf (buff
, "PRC[0x%04x]", type
);
6738 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6739 sprintf (buff
, "OS [0x%04x]", type
);
6740 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6741 sprintf (buff
, "RSV[0x%04x]", type
);
6743 sprintf (buff
, "%3d", type
);
6751 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6753 unsigned char *e_data
;
6756 e_data
= cmalloc (number
, ent_size
);
6760 error (_("Out of memory\n"));
6764 if (fread (e_data
, ent_size
, number
, file
) != number
)
6766 error (_("Unable to read in dynamic data\n"));
6770 i_data
= cmalloc (number
, sizeof (*i_data
));
6774 error (_("Out of memory\n"));
6780 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6787 /* Dump the symbol table. */
6789 process_symbol_table (FILE *file
)
6791 Elf_Internal_Shdr
*section
;
6792 bfd_vma nbuckets
= 0;
6793 bfd_vma nchains
= 0;
6794 bfd_vma
*buckets
= NULL
;
6795 bfd_vma
*chains
= NULL
;
6797 if (! do_syms
&& !do_histogram
)
6800 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6803 unsigned char nb
[8];
6804 unsigned char nc
[8];
6805 int hash_ent_size
= 4;
6807 if ((elf_header
.e_machine
== EM_ALPHA
6808 || elf_header
.e_machine
== EM_S390
6809 || elf_header
.e_machine
== EM_S390_OLD
)
6810 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6814 (archive_file_offset
6815 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6816 sizeof nb
+ sizeof nc
)),
6819 error (_("Unable to seek to start of dynamic information"));
6823 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6825 error (_("Failed to read in number of buckets\n"));
6829 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6831 error (_("Failed to read in number of chains\n"));
6835 nbuckets
= byte_get (nb
, hash_ent_size
);
6836 nchains
= byte_get (nc
, hash_ent_size
);
6838 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6839 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6841 if (buckets
== NULL
|| chains
== NULL
)
6846 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6851 printf (_("\nSymbol table for image:\n"));
6853 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6855 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6857 for (hn
= 0; hn
< nbuckets
; hn
++)
6862 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6864 Elf_Internal_Sym
*psym
;
6867 psym
= dynamic_symbols
+ si
;
6869 n
= print_vma (si
, DEC_5
);
6871 fputs (" " + n
, stdout
);
6872 printf (" %3lu: ", hn
);
6873 print_vma (psym
->st_value
, LONG_HEX
);
6875 print_vma (psym
->st_size
, DEC_5
);
6877 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6878 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6879 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6880 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6881 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6882 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6884 printf (" <corrupt: %14ld>", psym
->st_name
);
6889 else if (do_syms
&& !do_using_dynamic
)
6893 for (i
= 0, section
= section_headers
;
6894 i
< elf_header
.e_shnum
;
6898 char *strtab
= NULL
;
6899 unsigned long int strtab_size
= 0;
6900 Elf_Internal_Sym
*symtab
;
6901 Elf_Internal_Sym
*psym
;
6904 if ( section
->sh_type
!= SHT_SYMTAB
6905 && section
->sh_type
!= SHT_DYNSYM
)
6908 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6909 SECTION_NAME (section
),
6910 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6912 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6914 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6916 symtab
= GET_ELF_SYMBOLS (file
, section
);
6920 if (section
->sh_link
== elf_header
.e_shstrndx
)
6922 strtab
= string_table
;
6923 strtab_size
= string_table_length
;
6925 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
6927 Elf_Internal_Shdr
*string_sec
;
6929 string_sec
= SECTION_HEADER (section
->sh_link
);
6931 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6932 1, string_sec
->sh_size
, _("string table"));
6933 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
6936 for (si
= 0, psym
= symtab
;
6937 si
< section
->sh_size
/ section
->sh_entsize
;
6940 printf ("%6d: ", si
);
6941 print_vma (psym
->st_value
, LONG_HEX
);
6943 print_vma (psym
->st_size
, DEC_5
);
6944 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6945 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6946 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6947 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6948 print_symbol (25, psym
->st_name
< strtab_size
6949 ? strtab
+ psym
->st_name
: "<corrupt>");
6951 if (section
->sh_type
== SHT_DYNSYM
&&
6952 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6954 unsigned char data
[2];
6955 unsigned short vers_data
;
6956 unsigned long offset
;
6960 offset
= offset_from_vma
6961 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6962 sizeof data
+ si
* sizeof (vers_data
));
6964 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6965 sizeof (data
), 1, _("version data"));
6967 vers_data
= byte_get (data
, 2);
6969 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
6970 < elf_header
.e_shnum
6971 && SECTION_HEADER (psym
->st_shndx
)->sh_type
6974 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6976 if ((vers_data
& 0x8000) || vers_data
> 1)
6978 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6979 && (is_nobits
|| ! check_def
))
6981 Elf_External_Verneed evn
;
6982 Elf_Internal_Verneed ivn
;
6983 Elf_Internal_Vernaux ivna
;
6985 /* We must test both. */
6986 offset
= offset_from_vma
6987 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6992 unsigned long vna_off
;
6994 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6997 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6998 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7000 vna_off
= offset
+ ivn
.vn_aux
;
7004 Elf_External_Vernaux evna
;
7006 get_data (&evna
, file
, vna_off
,
7008 _("version need aux (3)"));
7010 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7011 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7012 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7014 vna_off
+= ivna
.vna_next
;
7016 while (ivna
.vna_other
!= vers_data
7017 && ivna
.vna_next
!= 0);
7019 if (ivna
.vna_other
== vers_data
)
7022 offset
+= ivn
.vn_next
;
7024 while (ivn
.vn_next
!= 0);
7026 if (ivna
.vna_other
== vers_data
)
7029 ivna
.vna_name
< strtab_size
7030 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7034 else if (! is_nobits
)
7035 error (_("bad dynamic symbol"));
7042 if (vers_data
!= 0x8001
7043 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7045 Elf_Internal_Verdef ivd
;
7046 Elf_Internal_Verdaux ivda
;
7047 Elf_External_Verdaux evda
;
7048 unsigned long offset
;
7050 offset
= offset_from_vma
7052 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7053 sizeof (Elf_External_Verdef
));
7057 Elf_External_Verdef evd
;
7059 get_data (&evd
, file
, offset
, sizeof (evd
),
7060 1, _("version def"));
7062 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7063 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7064 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7066 offset
+= ivd
.vd_next
;
7068 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7069 && ivd
.vd_next
!= 0);
7071 offset
-= ivd
.vd_next
;
7072 offset
+= ivd
.vd_aux
;
7074 get_data (&evda
, file
, offset
, sizeof (evda
),
7075 1, _("version def aux"));
7077 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7079 if (psym
->st_name
!= ivda
.vda_name
)
7080 printf ((vers_data
& 0x8000)
7082 ivda
.vda_name
< strtab_size
7083 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7093 if (strtab
!= string_table
)
7099 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7101 if (do_histogram
&& buckets
!= NULL
)
7103 unsigned long *lengths
;
7104 unsigned long *counts
;
7107 unsigned long maxlength
= 0;
7108 unsigned long nzero_counts
= 0;
7109 unsigned long nsyms
= 0;
7111 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7112 (unsigned long) nbuckets
);
7113 printf (_(" Length Number %% of total Coverage\n"));
7115 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7116 if (lengths
== NULL
)
7118 error (_("Out of memory"));
7121 for (hn
= 0; hn
< nbuckets
; ++hn
)
7123 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7126 if (maxlength
< ++lengths
[hn
])
7131 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7134 error (_("Out of memory"));
7138 for (hn
= 0; hn
< nbuckets
; ++hn
)
7139 ++counts
[lengths
[hn
]];
7144 printf (" 0 %-10lu (%5.1f%%)\n",
7145 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7146 for (i
= 1; i
<= maxlength
; ++i
)
7148 nzero_counts
+= counts
[i
] * i
;
7149 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7150 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7151 (nzero_counts
* 100.0) / nsyms
);
7159 if (buckets
!= NULL
)
7169 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7173 if (dynamic_syminfo
== NULL
7175 /* No syminfo, this is ok. */
7178 /* There better should be a dynamic symbol section. */
7179 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7183 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7184 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7186 printf (_(" Num: Name BoundTo Flags\n"));
7187 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7189 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7191 printf ("%4d: ", i
);
7192 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7193 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7195 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7198 switch (dynamic_syminfo
[i
].si_boundto
)
7200 case SYMINFO_BT_SELF
:
7201 fputs ("SELF ", stdout
);
7203 case SYMINFO_BT_PARENT
:
7204 fputs ("PARENT ", stdout
);
7207 if (dynamic_syminfo
[i
].si_boundto
> 0
7208 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7209 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7211 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7215 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7219 if (flags
& SYMINFO_FLG_DIRECT
)
7221 if (flags
& SYMINFO_FLG_PASSTHRU
)
7222 printf (" PASSTHRU");
7223 if (flags
& SYMINFO_FLG_COPY
)
7225 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7226 printf (" LAZYLOAD");
7234 #ifdef SUPPORT_DISASSEMBLY
7236 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7238 printf (_("\nAssembly dump of section %s\n"),
7239 SECTION_NAME (section
));
7241 /* XXX -- to be done --- XXX */
7248 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7250 bfd_size_type bytes
;
7252 unsigned char *data
;
7253 unsigned char *start
;
7255 bytes
= section
->sh_size
;
7257 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7259 printf (_("\nSection '%s' has no data to dump.\n"),
7260 SECTION_NAME (section
));
7264 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7266 addr
= section
->sh_addr
;
7268 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7281 lbytes
= (bytes
> 16 ? 16 : bytes
);
7283 printf (" 0x%8.8lx ", (unsigned long) addr
);
7285 switch (elf_header
.e_ident
[EI_DATA
])
7289 for (j
= 15; j
>= 0; j
--)
7292 printf ("%2.2x", data
[j
]);
7302 for (j
= 0; j
< 16; j
++)
7305 printf ("%2.2x", data
[j
]);
7315 for (j
= 0; j
< lbytes
; j
++)
7318 if (k
>= ' ' && k
< 0x7f)
7337 static unsigned long int
7338 read_leb128 (unsigned char *data
, unsigned int *length_return
, int sign
)
7340 unsigned long int result
= 0;
7341 unsigned int num_read
= 0;
7342 unsigned int shift
= 0;
7350 result
|= ((unsigned long int) (byte
& 0x7f)) << shift
;
7355 while (byte
& 0x80);
7357 if (length_return
!= NULL
)
7358 *length_return
= num_read
;
7360 if (sign
&& (shift
< 8 * sizeof (result
)) && (byte
& 0x40))
7361 result
|= -1L << shift
;
7366 typedef struct State_Machine_Registers
7368 unsigned long address
;
7371 unsigned int column
;
7375 /* This variable hold the number of the last entry seen
7376 in the File Table. */
7377 unsigned int last_file_entry
;
7380 static SMR state_machine_regs
;
7383 reset_state_machine (int is_stmt
)
7385 state_machine_regs
.address
= 0;
7386 state_machine_regs
.file
= 1;
7387 state_machine_regs
.line
= 1;
7388 state_machine_regs
.column
= 0;
7389 state_machine_regs
.is_stmt
= is_stmt
;
7390 state_machine_regs
.basic_block
= 0;
7391 state_machine_regs
.end_sequence
= 0;
7392 state_machine_regs
.last_file_entry
= 0;
7395 /* Handled an extend line op.
7396 Returns the number of bytes read. */
7399 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
7401 unsigned char op_code
;
7402 unsigned int bytes_read
;
7404 unsigned char *name
;
7407 len
= read_leb128 (data
, & bytes_read
, 0);
7412 warn (_("badly formed extended line op encountered!\n"));
7419 printf (_(" Extended opcode %d: "), op_code
);
7423 case DW_LNE_end_sequence
:
7424 printf (_("End of Sequence\n\n"));
7425 reset_state_machine (is_stmt
);
7428 case DW_LNE_set_address
:
7429 adr
= byte_get (data
, pointer_size
);
7430 printf (_("set Address to 0x%lx\n"), adr
);
7431 state_machine_regs
.address
= adr
;
7434 case DW_LNE_define_file
:
7435 printf (_(" define new File Table entry\n"));
7436 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7438 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7440 data
+= strlen ((char *) data
) + 1;
7441 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7443 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7445 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7446 printf (_("%s\n\n"), name
);
7450 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
7457 static const char *debug_str_contents
;
7458 static bfd_vma debug_str_size
;
7461 load_debug_str (FILE *file
)
7463 Elf_Internal_Shdr
*sec
;
7465 /* If it is already loaded, do nothing. */
7466 if (debug_str_contents
!= NULL
)
7469 /* Locate the .debug_str section. */
7470 sec
= find_section (".debug_str");
7474 debug_str_size
= sec
->sh_size
;
7476 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7477 _("debug_str section data"));
7481 free_debug_str (void)
7483 if (debug_str_contents
== NULL
)
7486 free ((char *) debug_str_contents
);
7487 debug_str_contents
= NULL
;
7492 fetch_indirect_string (unsigned long offset
)
7494 if (debug_str_contents
== NULL
)
7495 return _("<no .debug_str section>");
7497 if (offset
> debug_str_size
)
7499 warn (_("DW_FORM_strp offset too big: %lx\n"), offset
);
7500 return _("<offset is too big>");
7503 return debug_str_contents
+ offset
;
7506 static const char *debug_loc_contents
;
7507 static bfd_vma debug_loc_size
;
7510 load_debug_loc (FILE *file
)
7512 Elf_Internal_Shdr
*sec
;
7514 /* If it is already loaded, do nothing. */
7515 if (debug_loc_contents
!= NULL
)
7518 /* Locate the .debug_loc section. */
7519 sec
= find_section (".debug_loc");
7523 debug_loc_size
= sec
->sh_size
;
7525 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7526 _("debug_loc section data"));
7530 free_debug_loc (void)
7532 if (debug_loc_contents
== NULL
)
7535 free ((char *) debug_loc_contents
);
7536 debug_loc_contents
= NULL
;
7540 static const char * debug_range_contents
;
7541 static unsigned long debug_range_size
;
7544 load_debug_range (FILE *file
)
7546 Elf_Internal_Shdr
*sec
;
7548 /* If it is already loaded, do nothing. */
7549 if (debug_range_contents
!= NULL
)
7552 /* Locate the .debug_ranges section. */
7553 sec
= find_section (".debug_ranges");
7557 debug_range_size
= sec
->sh_size
;
7559 debug_range_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7560 _("debug_range section data"));
7564 free_debug_range (void)
7566 if (debug_range_contents
== NULL
)
7569 free ((char *) debug_range_contents
);
7570 debug_range_contents
= NULL
;
7571 debug_range_size
= 0;
7574 /* Apply addends of RELA relocations. */
7577 debug_apply_rela_addends (FILE *file
,
7578 Elf_Internal_Shdr
*section
,
7580 unsigned char *sec_data
,
7581 unsigned char *start
,
7584 Elf_Internal_Shdr
*relsec
;
7586 if (end
- start
< reloc_size
)
7589 for (relsec
= section_headers
;
7590 relsec
< section_headers
+ elf_header
.e_shnum
;
7593 unsigned long nrelas
;
7594 Elf_Internal_Rela
*rela
, *rp
;
7595 Elf_Internal_Shdr
*symsec
;
7596 Elf_Internal_Sym
*symtab
;
7597 Elf_Internal_Sym
*sym
;
7599 if (relsec
->sh_type
!= SHT_RELA
7600 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7601 || SECTION_HEADER (relsec
->sh_info
) != section
7602 || relsec
->sh_size
== 0
7603 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7606 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7610 symsec
= SECTION_HEADER (relsec
->sh_link
);
7611 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7613 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7617 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
7618 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
7619 loc
= sec_data
+ rp
->r_offset
;
7625 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7627 if (ELF32_R_SYM (rp
->r_info
) != 0
7628 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7629 /* Relocations against object symbols can happen,
7630 eg when referencing a global array. For an
7631 example of this see the _clz.o binary in libgcc.a. */
7632 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7634 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7635 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7636 SECTION_NAME (section
));
7642 /* In MIPS little-endian objects, r_info isn't really a
7643 64-bit little-endian value: it has a 32-bit little-endian
7644 symbol index followed by four individual byte fields.
7645 Reorder INFO accordingly. */
7646 if (elf_header
.e_machine
== EM_MIPS
7647 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7648 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7649 | ((rp
->r_info
>> 56) & 0xff)
7650 | ((rp
->r_info
>> 40) & 0xff00)
7651 | ((rp
->r_info
>> 24) & 0xff0000)
7652 | ((rp
->r_info
>> 8) & 0xff000000));
7654 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7656 if (ELF64_R_SYM (rp
->r_info
) != 0
7657 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7658 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7660 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7661 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7662 SECTION_NAME (section
));
7667 byte_put (loc
, rp
->r_addend
, reloc_size
);
7677 /* FIXME: There are better and more efficient ways to handle
7678 these structures. For now though, I just want something that
7679 is simple to implement. */
7680 typedef struct abbrev_attr
7682 unsigned long attribute
;
7684 struct abbrev_attr
*next
;
7688 typedef struct abbrev_entry
7690 unsigned long entry
;
7693 struct abbrev_attr
*first_attr
;
7694 struct abbrev_attr
*last_attr
;
7695 struct abbrev_entry
*next
;
7699 static abbrev_entry
*first_abbrev
= NULL
;
7700 static abbrev_entry
*last_abbrev
= NULL
;
7705 abbrev_entry
*abbrev
;
7707 for (abbrev
= first_abbrev
; abbrev
;)
7709 abbrev_entry
*next
= abbrev
->next
;
7712 for (attr
= abbrev
->first_attr
; attr
;)
7714 abbrev_attr
*next
= attr
->next
;
7724 last_abbrev
= first_abbrev
= NULL
;
7728 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7730 abbrev_entry
*entry
;
7732 entry
= malloc (sizeof (*entry
));
7738 entry
->entry
= number
;
7740 entry
->children
= children
;
7741 entry
->first_attr
= NULL
;
7742 entry
->last_attr
= NULL
;
7745 if (first_abbrev
== NULL
)
7746 first_abbrev
= entry
;
7748 last_abbrev
->next
= entry
;
7750 last_abbrev
= entry
;
7754 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7758 attr
= malloc (sizeof (*attr
));
7764 attr
->attribute
= attribute
;
7768 if (last_abbrev
->first_attr
== NULL
)
7769 last_abbrev
->first_attr
= attr
;
7771 last_abbrev
->last_attr
->next
= attr
;
7773 last_abbrev
->last_attr
= attr
;
7776 /* Processes the (partial) contents of a .debug_abbrev section.
7777 Returns NULL if the end of the section was encountered.
7778 Returns the address after the last byte read if the end of
7779 an abbreviation set was found. */
7781 static unsigned char *
7782 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7784 if (first_abbrev
!= NULL
)
7789 unsigned int bytes_read
;
7790 unsigned long entry
;
7792 unsigned long attribute
;
7795 entry
= read_leb128 (start
, & bytes_read
, 0);
7796 start
+= bytes_read
;
7798 /* A single zero is supposed to end the section according
7799 to the standard. If there's more, then signal that to
7802 return start
== end
? NULL
: start
;
7804 tag
= read_leb128 (start
, & bytes_read
, 0);
7805 start
+= bytes_read
;
7807 children
= *start
++;
7809 add_abbrev (entry
, tag
, children
);
7815 attribute
= read_leb128 (start
, & bytes_read
, 0);
7816 start
+= bytes_read
;
7818 form
= read_leb128 (start
, & bytes_read
, 0);
7819 start
+= bytes_read
;
7822 add_abbrev_attr (attribute
, form
);
7824 while (attribute
!= 0);
7831 get_TAG_name (unsigned long tag
)
7835 case DW_TAG_padding
: return "DW_TAG_padding";
7836 case DW_TAG_array_type
: return "DW_TAG_array_type";
7837 case DW_TAG_class_type
: return "DW_TAG_class_type";
7838 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7839 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7840 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7841 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7842 case DW_TAG_label
: return "DW_TAG_label";
7843 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7844 case DW_TAG_member
: return "DW_TAG_member";
7845 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7846 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7847 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7848 case DW_TAG_string_type
: return "DW_TAG_string_type";
7849 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7850 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7851 case DW_TAG_typedef
: return "DW_TAG_typedef";
7852 case DW_TAG_union_type
: return "DW_TAG_union_type";
7853 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7854 case DW_TAG_variant
: return "DW_TAG_variant";
7855 case DW_TAG_common_block
: return "DW_TAG_common_block";
7856 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7857 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7858 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7859 case DW_TAG_module
: return "DW_TAG_module";
7860 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7861 case DW_TAG_set_type
: return "DW_TAG_set_type";
7862 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7863 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7864 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7865 case DW_TAG_base_type
: return "DW_TAG_base_type";
7866 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7867 case DW_TAG_const_type
: return "DW_TAG_const_type";
7868 case DW_TAG_constant
: return "DW_TAG_constant";
7869 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7870 case DW_TAG_file_type
: return "DW_TAG_file_type";
7871 case DW_TAG_friend
: return "DW_TAG_friend";
7872 case DW_TAG_namelist
: return "DW_TAG_namelist";
7873 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7874 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7875 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7876 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7877 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7878 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7879 case DW_TAG_try_block
: return "DW_TAG_try_block";
7880 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7881 case DW_TAG_variable
: return "DW_TAG_variable";
7882 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7883 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7884 case DW_TAG_format_label
: return "DW_TAG_format_label";
7885 case DW_TAG_function_template
: return "DW_TAG_function_template";
7886 case DW_TAG_class_template
: return "DW_TAG_class_template";
7887 /* DWARF 2.1 values. */
7888 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7889 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7890 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7891 case DW_TAG_namespace
: return "DW_TAG_namespace";
7892 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7893 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7894 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7895 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7897 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7898 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7899 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7902 static char buffer
[100];
7904 snprintf (buffer
, sizeof (buffer
), _("Unknown TAG value: %lx"), tag
);
7911 get_FORM_name (unsigned long form
)
7915 case DW_FORM_addr
: return "DW_FORM_addr";
7916 case DW_FORM_block2
: return "DW_FORM_block2";
7917 case DW_FORM_block4
: return "DW_FORM_block4";
7918 case DW_FORM_data2
: return "DW_FORM_data2";
7919 case DW_FORM_data4
: return "DW_FORM_data4";
7920 case DW_FORM_data8
: return "DW_FORM_data8";
7921 case DW_FORM_string
: return "DW_FORM_string";
7922 case DW_FORM_block
: return "DW_FORM_block";
7923 case DW_FORM_block1
: return "DW_FORM_block1";
7924 case DW_FORM_data1
: return "DW_FORM_data1";
7925 case DW_FORM_flag
: return "DW_FORM_flag";
7926 case DW_FORM_sdata
: return "DW_FORM_sdata";
7927 case DW_FORM_strp
: return "DW_FORM_strp";
7928 case DW_FORM_udata
: return "DW_FORM_udata";
7929 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7930 case DW_FORM_ref1
: return "DW_FORM_ref1";
7931 case DW_FORM_ref2
: return "DW_FORM_ref2";
7932 case DW_FORM_ref4
: return "DW_FORM_ref4";
7933 case DW_FORM_ref8
: return "DW_FORM_ref8";
7934 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7935 case DW_FORM_indirect
: return "DW_FORM_indirect";
7938 static char buffer
[100];
7940 snprintf (buffer
, sizeof (buffer
), _("Unknown FORM value: %lx"), form
);
7946 static unsigned char *
7947 display_block (unsigned char *data
, unsigned long length
)
7949 printf (_(" %lu byte block: "), length
);
7952 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7958 decode_location_expression (unsigned char * data
,
7959 unsigned int pointer_size
,
7960 unsigned long length
,
7961 unsigned long cu_offset
)
7964 unsigned int bytes_read
;
7965 unsigned long uvalue
;
7966 unsigned char *end
= data
+ length
;
7967 int need_frame_base
= 0;
7976 printf ("DW_OP_addr: %lx",
7977 (unsigned long) byte_get (data
, pointer_size
));
7978 data
+= pointer_size
;
7981 printf ("DW_OP_deref");
7984 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7987 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
7990 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7994 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
7998 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
8002 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
8006 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
8007 (unsigned long) byte_get (data
+ 4, 4));
8011 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
8012 (long) byte_get (data
+ 4, 4));
8016 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
8020 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
8024 printf ("DW_OP_dup");
8027 printf ("DW_OP_drop");
8030 printf ("DW_OP_over");
8033 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
8036 printf ("DW_OP_swap");
8039 printf ("DW_OP_rot");
8042 printf ("DW_OP_xderef");
8045 printf ("DW_OP_abs");
8048 printf ("DW_OP_and");
8051 printf ("DW_OP_div");
8054 printf ("DW_OP_minus");
8057 printf ("DW_OP_mod");
8060 printf ("DW_OP_mul");
8063 printf ("DW_OP_neg");
8066 printf ("DW_OP_not");
8069 printf ("DW_OP_or");
8072 printf ("DW_OP_plus");
8074 case DW_OP_plus_uconst
:
8075 printf ("DW_OP_plus_uconst: %lu",
8076 read_leb128 (data
, &bytes_read
, 0));
8080 printf ("DW_OP_shl");
8083 printf ("DW_OP_shr");
8086 printf ("DW_OP_shra");
8089 printf ("DW_OP_xor");
8092 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
8096 printf ("DW_OP_eq");
8099 printf ("DW_OP_ge");
8102 printf ("DW_OP_gt");
8105 printf ("DW_OP_le");
8108 printf ("DW_OP_lt");
8111 printf ("DW_OP_ne");
8114 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
8150 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
8185 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
8220 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
8221 read_leb128 (data
, &bytes_read
, 1));
8226 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
8230 need_frame_base
= 1;
8231 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
8235 uvalue
= read_leb128 (data
, &bytes_read
, 0);
8237 printf ("DW_OP_bregx: %lu %ld", uvalue
,
8238 read_leb128 (data
, &bytes_read
, 1));
8242 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
8245 case DW_OP_deref_size
:
8246 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
8248 case DW_OP_xderef_size
:
8249 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
8252 printf ("DW_OP_nop");
8255 /* DWARF 3 extensions. */
8256 case DW_OP_push_object_address
:
8257 printf ("DW_OP_push_object_address");
8260 /* XXX: Strictly speaking for 64-bit DWARF3 files
8261 this ought to be an 8-byte wide computation. */
8262 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2) + cu_offset
);
8266 /* XXX: Strictly speaking for 64-bit DWARF3 files
8267 this ought to be an 8-byte wide computation. */
8268 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4) + cu_offset
);
8271 case DW_OP_call_ref
:
8272 printf ("DW_OP_call_ref");
8275 /* GNU extensions. */
8276 case DW_OP_GNU_push_tls_address
:
8277 printf ("DW_OP_GNU_push_tls_address");
8281 if (op
>= DW_OP_lo_user
8282 && op
<= DW_OP_hi_user
)
8283 printf (_("(User defined location op)"));
8285 printf (_("(Unknown location op)"));
8286 /* No way to tell where the next op is, so just bail. */
8287 return need_frame_base
;
8290 /* Separate the ops. */
8295 return need_frame_base
;
8298 /* This structure records the information that
8299 we extract from the.debug_info section. */
8302 unsigned int pointer_size
;
8303 unsigned long cu_offset
;
8304 unsigned long base_address
;
8305 /* This is an array of offsets to the location list table. */
8306 unsigned long *loc_offsets
;
8307 int *have_frame_base
;
8308 unsigned int num_loc_offsets
;
8309 unsigned int max_loc_offsets
;
8310 unsigned long *range_lists
;
8311 unsigned int num_range_lists
;
8312 unsigned int max_range_lists
;
8316 static debug_info
* debug_information
= NULL
;
8317 static unsigned int num_debug_info_entries
= 0;
8318 static unsigned int last_pointer_size
= 0;
8319 static int warned_about_missing_comp_units
= FALSE
;
8321 static unsigned char *
8322 read_and_display_attr_value (unsigned long attribute
,
8324 unsigned char *data
,
8325 unsigned long cu_offset
,
8326 unsigned long pointer_size
,
8327 unsigned long offset_size
,
8329 debug_info
*debug_info_p
,
8332 unsigned long uvalue
= 0;
8333 unsigned char *block_start
= NULL
;
8334 unsigned int bytes_read
;
8341 case DW_FORM_ref_addr
:
8342 if (dwarf_version
== 2)
8344 uvalue
= byte_get (data
, pointer_size
);
8345 data
+= pointer_size
;
8347 else if (dwarf_version
== 3)
8349 uvalue
= byte_get (data
, offset_size
);
8350 data
+= offset_size
;
8354 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8359 uvalue
= byte_get (data
, pointer_size
);
8360 data
+= pointer_size
;
8364 uvalue
= byte_get (data
, offset_size
);
8365 data
+= offset_size
;
8371 uvalue
= byte_get (data
++, 1);
8376 uvalue
= byte_get (data
, 2);
8382 uvalue
= byte_get (data
, 4);
8387 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8391 case DW_FORM_ref_udata
:
8393 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8397 case DW_FORM_indirect
:
8398 form
= read_leb128 (data
, & bytes_read
, 0);
8401 printf (" %s", get_FORM_name (form
));
8402 return read_and_display_attr_value (attribute
, form
, data
,
8403 cu_offset
, pointer_size
,
8404 offset_size
, dwarf_version
,
8405 debug_info_p
, do_loc
);
8410 case DW_FORM_ref_addr
:
8412 printf (" <#%lx>", uvalue
);
8418 case DW_FORM_ref_udata
:
8420 printf (" <%lx>", uvalue
+ cu_offset
);
8426 printf (" %#lx", uvalue
);
8435 printf (" %ld", uvalue
);
8442 uvalue
= byte_get (data
, 4);
8443 printf (" %lx", uvalue
);
8444 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8446 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8447 && num_debug_info_entries
== 0)
8449 if (sizeof (uvalue
) == 8)
8450 uvalue
= byte_get (data
, 8);
8452 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8457 case DW_FORM_string
:
8459 printf (" %s", data
);
8460 data
+= strlen ((char *) data
) + 1;
8464 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8465 block_start
= data
+ bytes_read
;
8467 data
= block_start
+ uvalue
;
8469 data
= display_block (block_start
, uvalue
);
8472 case DW_FORM_block1
:
8473 uvalue
= byte_get (data
, 1);
8474 block_start
= data
+ 1;
8476 data
= block_start
+ uvalue
;
8478 data
= display_block (block_start
, uvalue
);
8481 case DW_FORM_block2
:
8482 uvalue
= byte_get (data
, 2);
8483 block_start
= data
+ 2;
8485 data
= block_start
+ uvalue
;
8487 data
= display_block (block_start
, uvalue
);
8490 case DW_FORM_block4
:
8491 uvalue
= byte_get (data
, 4);
8492 block_start
= data
+ 4;
8494 data
= block_start
+ uvalue
;
8496 data
= display_block (block_start
, uvalue
);
8501 printf (_(" (indirect string, offset: 0x%lx): %s"),
8502 uvalue
, fetch_indirect_string (uvalue
));
8505 case DW_FORM_indirect
:
8506 /* Handled above. */
8510 warn (_("Unrecognized form: %lu\n"), form
);
8514 /* For some attributes we can display further information. */
8515 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8516 && num_debug_info_entries
== 0)
8520 case DW_AT_frame_base
:
8521 have_frame_base
= 1;
8522 case DW_AT_location
:
8523 case DW_AT_data_member_location
:
8524 case DW_AT_vtable_elem_location
:
8525 case DW_AT_allocated
:
8526 case DW_AT_associated
:
8527 case DW_AT_data_location
:
8529 case DW_AT_upper_bound
:
8530 case DW_AT_lower_bound
:
8531 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8533 /* Process location list. */
8534 unsigned int max
= debug_info_p
->max_loc_offsets
;
8535 unsigned int num
= debug_info_p
->num_loc_offsets
;
8537 if (max
== 0 || num
>= max
)
8540 debug_info_p
->loc_offsets
8541 = xcrealloc (debug_info_p
->loc_offsets
,
8542 max
, sizeof (*debug_info_p
->loc_offsets
));
8543 debug_info_p
->have_frame_base
8544 = xcrealloc (debug_info_p
->have_frame_base
,
8545 max
, sizeof (*debug_info_p
->have_frame_base
));
8546 debug_info_p
->max_loc_offsets
= max
;
8548 debug_info_p
->loc_offsets
[num
] = uvalue
;
8549 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
8550 debug_info_p
->num_loc_offsets
++;
8555 if (need_base_address
)
8556 debug_info_p
->base_address
= uvalue
;
8560 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8562 /* Process range list. */
8563 unsigned int max
= debug_info_p
->max_range_lists
;
8564 unsigned int num
= debug_info_p
->num_range_lists
;
8566 if (max
== 0 || num
>= max
)
8569 debug_info_p
->range_lists
8570 = xcrealloc (debug_info_p
->range_lists
,
8571 max
, sizeof (*debug_info_p
->range_lists
));
8572 debug_info_p
->max_range_lists
= max
;
8574 debug_info_p
->range_lists
[num
] = uvalue
;
8575 debug_info_p
->num_range_lists
++;
8594 case DW_INL_not_inlined
:
8595 printf (_("(not inlined)"));
8597 case DW_INL_inlined
:
8598 printf (_("(inlined)"));
8600 case DW_INL_declared_not_inlined
:
8601 printf (_("(declared as inline but ignored)"));
8603 case DW_INL_declared_inlined
:
8604 printf (_("(declared as inline and inlined)"));
8607 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8612 case DW_AT_language
:
8615 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8616 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8617 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8618 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8619 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8620 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8621 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8622 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8623 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8624 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8625 /* DWARF 2.1 values. */
8626 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8627 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8628 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8629 /* MIPS extension. */
8630 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8631 /* UPC extension. */
8632 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8634 printf ("(Unknown: %lx)", uvalue
);
8639 case DW_AT_encoding
:
8642 case DW_ATE_void
: printf ("(void)"); break;
8643 case DW_ATE_address
: printf ("(machine address)"); break;
8644 case DW_ATE_boolean
: printf ("(boolean)"); break;
8645 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8646 case DW_ATE_float
: printf ("(float)"); break;
8647 case DW_ATE_signed
: printf ("(signed)"); break;
8648 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8649 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8650 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8651 /* DWARF 2.1 value. */
8652 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8653 case DW_ATE_decimal_float
: printf ("(decimal float)"); break;
8655 if (uvalue
>= DW_ATE_lo_user
8656 && uvalue
<= DW_ATE_hi_user
)
8657 printf ("(user defined type)");
8659 printf ("(unknown type)");
8664 case DW_AT_accessibility
:
8667 case DW_ACCESS_public
: printf ("(public)"); break;
8668 case DW_ACCESS_protected
: printf ("(protected)"); break;
8669 case DW_ACCESS_private
: printf ("(private)"); break;
8671 printf ("(unknown accessibility)");
8676 case DW_AT_visibility
:
8679 case DW_VIS_local
: printf ("(local)"); break;
8680 case DW_VIS_exported
: printf ("(exported)"); break;
8681 case DW_VIS_qualified
: printf ("(qualified)"); break;
8682 default: printf ("(unknown visibility)"); break;
8686 case DW_AT_virtuality
:
8689 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8690 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8691 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8692 default: printf ("(unknown virtuality)"); break;
8696 case DW_AT_identifier_case
:
8699 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8700 case DW_ID_up_case
: printf ("(up_case)"); break;
8701 case DW_ID_down_case
: printf ("(down_case)"); break;
8702 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8703 default: printf ("(unknown case)"); break;
8707 case DW_AT_calling_convention
:
8710 case DW_CC_normal
: printf ("(normal)"); break;
8711 case DW_CC_program
: printf ("(program)"); break;
8712 case DW_CC_nocall
: printf ("(nocall)"); break;
8714 if (uvalue
>= DW_CC_lo_user
8715 && uvalue
<= DW_CC_hi_user
)
8716 printf ("(user defined)");
8718 printf ("(unknown convention)");
8722 case DW_AT_ordering
:
8725 case -1: printf ("(undefined)"); break;
8726 case 0: printf ("(row major)"); break;
8727 case 1: printf ("(column major)"); break;
8731 case DW_AT_frame_base
:
8732 have_frame_base
= 1;
8733 case DW_AT_location
:
8734 case DW_AT_data_member_location
:
8735 case DW_AT_vtable_elem_location
:
8736 case DW_AT_allocated
:
8737 case DW_AT_associated
:
8738 case DW_AT_data_location
:
8740 case DW_AT_upper_bound
:
8741 case DW_AT_lower_bound
:
8744 int need_frame_base
;
8747 need_frame_base
= decode_location_expression (block_start
,
8752 if (need_frame_base
&& !have_frame_base
)
8753 printf (_(" [without DW_AT_frame_base]"));
8755 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8756 printf (_("(location list)"));
8768 get_AT_name (unsigned long attribute
)
8772 case DW_AT_sibling
: return "DW_AT_sibling";
8773 case DW_AT_location
: return "DW_AT_location";
8774 case DW_AT_name
: return "DW_AT_name";
8775 case DW_AT_ordering
: return "DW_AT_ordering";
8776 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
8777 case DW_AT_byte_size
: return "DW_AT_byte_size";
8778 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
8779 case DW_AT_bit_size
: return "DW_AT_bit_size";
8780 case DW_AT_element_list
: return "DW_AT_element_list";
8781 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
8782 case DW_AT_low_pc
: return "DW_AT_low_pc";
8783 case DW_AT_high_pc
: return "DW_AT_high_pc";
8784 case DW_AT_language
: return "DW_AT_language";
8785 case DW_AT_member
: return "DW_AT_member";
8786 case DW_AT_discr
: return "DW_AT_discr";
8787 case DW_AT_discr_value
: return "DW_AT_discr_value";
8788 case DW_AT_visibility
: return "DW_AT_visibility";
8789 case DW_AT_import
: return "DW_AT_import";
8790 case DW_AT_string_length
: return "DW_AT_string_length";
8791 case DW_AT_common_reference
: return "DW_AT_common_reference";
8792 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
8793 case DW_AT_const_value
: return "DW_AT_const_value";
8794 case DW_AT_containing_type
: return "DW_AT_containing_type";
8795 case DW_AT_default_value
: return "DW_AT_default_value";
8796 case DW_AT_inline
: return "DW_AT_inline";
8797 case DW_AT_is_optional
: return "DW_AT_is_optional";
8798 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
8799 case DW_AT_producer
: return "DW_AT_producer";
8800 case DW_AT_prototyped
: return "DW_AT_prototyped";
8801 case DW_AT_return_addr
: return "DW_AT_return_addr";
8802 case DW_AT_start_scope
: return "DW_AT_start_scope";
8803 case DW_AT_stride_size
: return "DW_AT_stride_size";
8804 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
8805 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
8806 case DW_AT_accessibility
: return "DW_AT_accessibility";
8807 case DW_AT_address_class
: return "DW_AT_address_class";
8808 case DW_AT_artificial
: return "DW_AT_artificial";
8809 case DW_AT_base_types
: return "DW_AT_base_types";
8810 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
8811 case DW_AT_count
: return "DW_AT_count";
8812 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
8813 case DW_AT_decl_column
: return "DW_AT_decl_column";
8814 case DW_AT_decl_file
: return "DW_AT_decl_file";
8815 case DW_AT_decl_line
: return "DW_AT_decl_line";
8816 case DW_AT_declaration
: return "DW_AT_declaration";
8817 case DW_AT_discr_list
: return "DW_AT_discr_list";
8818 case DW_AT_encoding
: return "DW_AT_encoding";
8819 case DW_AT_external
: return "DW_AT_external";
8820 case DW_AT_frame_base
: return "DW_AT_frame_base";
8821 case DW_AT_friend
: return "DW_AT_friend";
8822 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
8823 case DW_AT_macro_info
: return "DW_AT_macro_info";
8824 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
8825 case DW_AT_priority
: return "DW_AT_priority";
8826 case DW_AT_segment
: return "DW_AT_segment";
8827 case DW_AT_specification
: return "DW_AT_specification";
8828 case DW_AT_static_link
: return "DW_AT_static_link";
8829 case DW_AT_type
: return "DW_AT_type";
8830 case DW_AT_use_location
: return "DW_AT_use_location";
8831 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
8832 case DW_AT_virtuality
: return "DW_AT_virtuality";
8833 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
8834 /* DWARF 2.1 values. */
8835 case DW_AT_allocated
: return "DW_AT_allocated";
8836 case DW_AT_associated
: return "DW_AT_associated";
8837 case DW_AT_data_location
: return "DW_AT_data_location";
8838 case DW_AT_stride
: return "DW_AT_stride";
8839 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
8840 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
8841 case DW_AT_extension
: return "DW_AT_extension";
8842 case DW_AT_ranges
: return "DW_AT_ranges";
8843 case DW_AT_trampoline
: return "DW_AT_trampoline";
8844 case DW_AT_call_column
: return "DW_AT_call_column";
8845 case DW_AT_call_file
: return "DW_AT_call_file";
8846 case DW_AT_call_line
: return "DW_AT_call_line";
8847 /* SGI/MIPS extensions. */
8848 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
8849 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
8850 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
8851 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
8852 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
8853 case DW_AT_MIPS_software_pipeline_depth
:
8854 return "DW_AT_MIPS_software_pipeline_depth";
8855 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
8856 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
8857 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
8858 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
8859 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
8860 /* GNU extensions. */
8861 case DW_AT_sf_names
: return "DW_AT_sf_names";
8862 case DW_AT_src_info
: return "DW_AT_src_info";
8863 case DW_AT_mac_info
: return "DW_AT_mac_info";
8864 case DW_AT_src_coords
: return "DW_AT_src_coords";
8865 case DW_AT_body_begin
: return "DW_AT_body_begin";
8866 case DW_AT_body_end
: return "DW_AT_body_end";
8867 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
8868 /* UPC extension. */
8869 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
8872 static char buffer
[100];
8874 snprintf (buffer
, sizeof (buffer
), _("Unknown AT value: %lx"),
8881 static unsigned char *
8882 read_and_display_attr (unsigned long attribute
,
8884 unsigned char *data
,
8885 unsigned long cu_offset
,
8886 unsigned long pointer_size
,
8887 unsigned long offset_size
,
8889 debug_info
*debug_info_p
,
8893 printf (" %-18s:", get_AT_name (attribute
));
8894 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8895 pointer_size
, offset_size
,
8896 dwarf_version
, debug_info_p
,
8904 /* Process the contents of a .debug_info section. If do_loc is non-zero
8905 then we are scanning for location lists and we do not want to display
8906 anything to the user. */
8909 process_debug_info (Elf_Internal_Shdr
*section
, unsigned char *start
,
8910 FILE *file
, int do_loc
)
8912 unsigned char *end
= start
+ section
->sh_size
;
8913 unsigned char *section_begin
;
8915 unsigned int num_units
= 0;
8917 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8918 && num_debug_info_entries
== 0)
8920 unsigned long length
;
8922 /* First scan the section to get the number of comp units. */
8923 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
8926 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8927 will be the length. For a 64-bit DWARF section, it'll be
8928 the escape code 0xffffffff followed by an 8 byte length. */
8929 length
= byte_get (section_begin
, 4);
8931 if (length
== 0xffffffff)
8933 length
= byte_get (section_begin
+ 4, 8);
8934 section_begin
+= length
+ 12;
8937 section_begin
+= length
+ 4;
8942 error (_("No comp units in .debug_info section ?"));
8946 /* Then allocate an array to hold the information. */
8947 debug_information
= cmalloc (num_units
,
8948 sizeof (* debug_information
));
8949 if (debug_information
== NULL
)
8951 error (_("Not enough memory for a debug info array of %u entries"),
8959 printf (_("The section %s contains:\n\n"),
8960 SECTION_NAME (section
));
8962 load_debug_str (file
);
8963 load_debug_loc (file
);
8964 load_debug_range (file
);
8967 for (section_begin
= start
, unit
= 0; start
< end
; unit
++)
8969 DWARF2_Internal_CompUnit compunit
;
8970 unsigned char *hdrptr
;
8971 unsigned char *cu_abbrev_offset_ptr
;
8972 unsigned char *tags
;
8974 unsigned long cu_offset
;
8976 int initial_length_size
;
8980 compunit
.cu_length
= byte_get (hdrptr
, 4);
8983 if (compunit
.cu_length
== 0xffffffff)
8985 compunit
.cu_length
= byte_get (hdrptr
, 8);
8988 initial_length_size
= 12;
8993 initial_length_size
= 4;
8996 compunit
.cu_version
= byte_get (hdrptr
, 2);
8999 cu_offset
= start
- section_begin
;
9000 start
+= compunit
.cu_length
+ initial_length_size
;
9002 if (elf_header
.e_type
== ET_REL
9003 && !debug_apply_rela_addends (file
, section
, offset_size
,
9004 section_begin
, hdrptr
, start
))
9007 cu_abbrev_offset_ptr
= hdrptr
;
9008 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
9009 hdrptr
+= offset_size
;
9011 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
9013 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
9014 && num_debug_info_entries
== 0)
9016 debug_information
[unit
].cu_offset
= cu_offset
;
9017 debug_information
[unit
].pointer_size
9018 = compunit
.cu_pointer_size
;
9019 debug_information
[unit
].base_address
= 0;
9020 debug_information
[unit
].loc_offsets
= NULL
;
9021 debug_information
[unit
].have_frame_base
= NULL
;
9022 debug_information
[unit
].max_loc_offsets
= 0;
9023 debug_information
[unit
].num_loc_offsets
= 0;
9024 debug_information
[unit
].range_lists
= NULL
;
9025 debug_information
[unit
].max_range_lists
= 0;
9026 debug_information
[unit
].num_range_lists
= 0;
9033 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset
);
9034 printf (_(" Length: %ld\n"), compunit
.cu_length
);
9035 printf (_(" Version: %d\n"), compunit
.cu_version
);
9036 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
9037 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
9040 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
9042 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
9048 /* Read in the abbrevs used by this compilation unit. */
9050 Elf_Internal_Shdr
*sec
;
9051 unsigned char *begin
;
9053 /* Locate the .debug_abbrev section and process it. */
9054 sec
= find_section (".debug_abbrev");
9057 warn (_("Unable to locate .debug_abbrev section!\n"));
9061 begin
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
9062 _("debug_abbrev section data"));
9066 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
9067 begin
+ sec
->sh_size
);
9073 while (tags
< start
)
9075 unsigned int bytes_read
;
9076 unsigned long abbrev_number
;
9077 abbrev_entry
*entry
;
9080 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
9083 /* A null DIE marks the end of a list of children. */
9084 if (abbrev_number
== 0)
9090 /* Scan through the abbreviation list until we reach the
9092 for (entry
= first_abbrev
;
9093 entry
&& entry
->entry
!= abbrev_number
;
9094 entry
= entry
->next
)
9099 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
9105 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
9107 (unsigned long) (tags
- section_begin
9110 get_TAG_name (entry
->tag
));
9115 need_base_address
= 0;
9117 case DW_TAG_compile_unit
:
9118 need_base_address
= 1;
9120 case DW_TAG_entry_point
:
9121 case DW_TAG_inlined_subroutine
:
9122 case DW_TAG_subprogram
:
9123 need_base_address
= 0;
9124 /* Assuming that there is no DW_AT_frame_base. */
9125 have_frame_base
= 0;
9129 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9130 tags
= read_and_display_attr (attr
->attribute
,
9133 compunit
.cu_pointer_size
,
9135 compunit
.cu_version
,
9136 &debug_information
[unit
],
9139 if (entry
->children
)
9144 /* Set num_debug_info_entries here so that it can be used to check if
9145 we need to process .debug_loc and .debug_ranges sections. */
9146 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
9147 && num_debug_info_entries
== 0)
9148 num_debug_info_entries
= num_units
;
9152 free_debug_range ();
9162 /* Retrieve the pointer size associated with the given compilation unit.
9163 Optionally the offset of this unit into the .debug_info section is
9164 also retutned. If there is no .debug_info section then an error
9165 message is issued and 0 is returned. If the requested comp unit has
9166 not been defined in the .debug_info section then a warning message
9167 is issued and the last know pointer size is returned. This message
9168 is only issued once per section dumped per file dumped. */
9171 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit
,
9172 const char * section_name
,
9173 unsigned long * offset_return
)
9175 unsigned long offset
= 0;
9177 if (num_debug_info_entries
== 0)
9178 error (_("%s section needs a populated .debug_info section\n"),
9181 else if (comp_unit
>= num_debug_info_entries
)
9183 if (!warned_about_missing_comp_units
)
9185 warn (_("%s section has more comp units than .debug_info section\n"),
9187 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
9189 warned_about_missing_comp_units
= TRUE
;
9194 last_pointer_size
= debug_information
[comp_unit
].pointer_size
;
9195 offset
= debug_information
[comp_unit
].cu_offset
;
9198 if (offset_return
!= NULL
)
9199 * offset_return
= offset
;
9201 return last_pointer_size
;
9204 /* Locate and scan the .debug_info section in the file and record the pointer
9205 sizes and offsets for the compilation units in it. Usually an executable
9206 will have just one pointer size, but this is not guaranteed, and so we try
9207 not to make any assumptions. Returns zero upon failure, or the number of
9208 compilation units upon success. */
9211 get_debug_info (FILE * file
)
9213 Elf_Internal_Shdr
* section
;
9214 unsigned char * start
;
9217 /* Reset the last pointer size so that we can issue correct error
9218 messages if we are displaying the contents of more than one section. */
9219 last_pointer_size
= 0;
9220 warned_about_missing_comp_units
= FALSE
;
9222 /* If we already have the information there is nothing else to do. */
9223 if (num_debug_info_entries
> 0)
9224 return num_debug_info_entries
;
9226 section
= find_section (".debug_info");
9227 if (section
== NULL
)
9230 start
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9231 _("extracting information from .debug_info section"));
9235 ret
= process_debug_info (section
, start
, file
, 1);
9238 return ret
? num_debug_info_entries
: 0;
9242 display_debug_lines (Elf_Internal_Shdr
*section
,
9243 unsigned char *start
, FILE *file
)
9245 unsigned char *data
= start
;
9246 unsigned char *end
= start
+ section
->sh_size
;
9247 unsigned int comp_unit
= 0;
9249 printf (_("\nDump of debug contents of section %s:\n\n"),
9250 SECTION_NAME (section
));
9252 get_debug_info (file
);
9256 DWARF2_Internal_LineInfo info
;
9257 unsigned char *standard_opcodes
;
9258 unsigned char *end_of_sequence
;
9259 unsigned char *hdrptr
;
9260 unsigned int pointer_size
;
9261 int initial_length_size
;
9267 /* Check the length of the block. */
9268 info
.li_length
= byte_get (hdrptr
, 4);
9271 if (info
.li_length
== 0xffffffff)
9273 /* This section is 64-bit DWARF 3. */
9274 info
.li_length
= byte_get (hdrptr
, 8);
9277 initial_length_size
= 12;
9282 initial_length_size
= 4;
9285 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
9288 (_("The line info appears to be corrupt - the section is too small\n"));
9292 /* Check its version number. */
9293 info
.li_version
= byte_get (hdrptr
, 2);
9295 if (info
.li_version
!= 2 && info
.li_version
!= 3)
9297 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
9301 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
9302 hdrptr
+= offset_size
;
9303 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
9305 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
9307 info
.li_line_base
= byte_get (hdrptr
, 1);
9309 info
.li_line_range
= byte_get (hdrptr
, 1);
9311 info
.li_opcode_base
= byte_get (hdrptr
, 1);
9314 /* Sign extend the line base field. */
9315 info
.li_line_base
<<= 24;
9316 info
.li_line_base
>>= 24;
9318 /* Get the pointer size from the comp unit associated
9319 with this block of line number information. */
9320 pointer_size
= get_pointer_size_and_offset_of_comp_unit
9321 (comp_unit
, ".debug_line", NULL
);
9324 printf (_(" Length: %ld\n"), info
.li_length
);
9325 printf (_(" DWARF Version: %d\n"), info
.li_version
);
9326 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
9327 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
9328 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
9329 printf (_(" Line Base: %d\n"), info
.li_line_base
);
9330 printf (_(" Line Range: %d\n"), info
.li_line_range
);
9331 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
9332 printf (_(" (Pointer size: %u)%s\n"),
9334 warned_about_missing_comp_units
? " [assumed]" : "" );
9336 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
9338 reset_state_machine (info
.li_default_is_stmt
);
9340 /* Display the contents of the Opcodes table. */
9341 standard_opcodes
= hdrptr
;
9343 printf (_("\n Opcodes:\n"));
9345 for (i
= 1; i
< info
.li_opcode_base
; i
++)
9346 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
9348 /* Display the contents of the Directory table. */
9349 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
9352 printf (_("\n The Directory Table is empty.\n"));
9355 printf (_("\n The Directory Table:\n"));
9359 printf (_(" %s\n"), data
);
9361 data
+= strlen ((char *) data
) + 1;
9365 /* Skip the NUL at the end of the table. */
9368 /* Display the contents of the File Name table. */
9370 printf (_("\n The File Name Table is empty.\n"));
9373 printf (_("\n The File Name Table:\n"));
9374 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9378 unsigned char *name
;
9379 unsigned int bytes_read
;
9381 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
9384 data
+= strlen ((char *) data
) + 1;
9386 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9388 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9390 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9392 printf (_("%s\n"), name
);
9396 /* Skip the NUL at the end of the table. */
9399 /* Now display the statements. */
9400 printf (_("\n Line Number Statements:\n"));
9402 while (data
< end_of_sequence
)
9404 unsigned char op_code
;
9406 unsigned int bytes_read
;
9410 if (op_code
>= info
.li_opcode_base
)
9412 op_code
-= info
.li_opcode_base
;
9413 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
9414 state_machine_regs
.address
+= adv
;
9415 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9416 op_code
, adv
, state_machine_regs
.address
);
9417 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
9418 state_machine_regs
.line
+= adv
;
9419 printf (_(" and Line by %d to %d\n"),
9420 adv
, state_machine_regs
.line
);
9422 else switch (op_code
)
9424 case DW_LNS_extended_op
:
9425 if (pointer_size
== 0)
9427 warn (_("Extend line ops need a valid pointer size, guessing at 4\n"));
9431 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
9436 printf (_(" Copy\n"));
9439 case DW_LNS_advance_pc
:
9440 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
9442 state_machine_regs
.address
+= adv
;
9443 printf (_(" Advance PC by %d to %lx\n"), adv
,
9444 state_machine_regs
.address
);
9447 case DW_LNS_advance_line
:
9448 adv
= read_leb128 (data
, & bytes_read
, 1);
9450 state_machine_regs
.line
+= adv
;
9451 printf (_(" Advance Line by %d to %d\n"), adv
,
9452 state_machine_regs
.line
);
9455 case DW_LNS_set_file
:
9456 adv
= read_leb128 (data
, & bytes_read
, 0);
9458 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9460 state_machine_regs
.file
= adv
;
9463 case DW_LNS_set_column
:
9464 adv
= read_leb128 (data
, & bytes_read
, 0);
9466 printf (_(" Set column to %d\n"), adv
);
9467 state_machine_regs
.column
= adv
;
9470 case DW_LNS_negate_stmt
:
9471 adv
= state_machine_regs
.is_stmt
;
9473 printf (_(" Set is_stmt to %d\n"), adv
);
9474 state_machine_regs
.is_stmt
= adv
;
9477 case DW_LNS_set_basic_block
:
9478 printf (_(" Set basic block\n"));
9479 state_machine_regs
.basic_block
= 1;
9482 case DW_LNS_const_add_pc
:
9483 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
9484 * info
.li_min_insn_length
);
9485 state_machine_regs
.address
+= adv
;
9486 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
9487 state_machine_regs
.address
);
9490 case DW_LNS_fixed_advance_pc
:
9491 adv
= byte_get (data
, 2);
9493 state_machine_regs
.address
+= adv
;
9494 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9495 adv
, state_machine_regs
.address
);
9498 case DW_LNS_set_prologue_end
:
9499 printf (_(" Set prologue_end to true\n"));
9502 case DW_LNS_set_epilogue_begin
:
9503 printf (_(" Set epilogue_begin to true\n"));
9506 case DW_LNS_set_isa
:
9507 adv
= read_leb128 (data
, & bytes_read
, 0);
9509 printf (_(" Set ISA to %d\n"), adv
);
9513 printf (_(" Unknown opcode %d with operands: "), op_code
);
9515 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
9517 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
9518 i
== 1 ? "" : ", ");
9532 display_debug_pubnames (Elf_Internal_Shdr
*section
,
9533 unsigned char *start
,
9534 FILE *file ATTRIBUTE_UNUSED
)
9536 DWARF2_Internal_PubNames pubnames
;
9539 end
= start
+ section
->sh_size
;
9541 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9545 unsigned char *data
;
9546 unsigned long offset
;
9547 int offset_size
, initial_length_size
;
9551 pubnames
.pn_length
= byte_get (data
, 4);
9553 if (pubnames
.pn_length
== 0xffffffff)
9555 pubnames
.pn_length
= byte_get (data
, 8);
9558 initial_length_size
= 12;
9563 initial_length_size
= 4;
9566 pubnames
.pn_version
= byte_get (data
, 2);
9568 pubnames
.pn_offset
= byte_get (data
, offset_size
);
9569 data
+= offset_size
;
9570 pubnames
.pn_size
= byte_get (data
, offset_size
);
9571 data
+= offset_size
;
9573 start
+= pubnames
.pn_length
+ initial_length_size
;
9575 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
9577 static int warned
= 0;
9581 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9588 printf (_(" Length: %ld\n"),
9589 pubnames
.pn_length
);
9590 printf (_(" Version: %d\n"),
9591 pubnames
.pn_version
);
9592 printf (_(" Offset into .debug_info section: %ld\n"),
9593 pubnames
.pn_offset
);
9594 printf (_(" Size of area in .debug_info section: %ld\n"),
9597 printf (_("\n Offset\tName\n"));
9601 offset
= byte_get (data
, offset_size
);
9605 data
+= offset_size
;
9606 printf (" %-6ld\t\t%s\n", offset
, data
);
9607 data
+= strlen ((char *) data
) + 1;
9610 while (offset
!= 0);
9618 display_debug_macinfo (Elf_Internal_Shdr
*section
,
9619 unsigned char *start
,
9620 FILE *file ATTRIBUTE_UNUSED
)
9622 unsigned char *end
= start
+ section
->sh_size
;
9623 unsigned char *curr
= start
;
9624 unsigned int bytes_read
;
9625 enum dwarf_macinfo_record_type op
;
9627 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9631 unsigned int lineno
;
9639 case DW_MACINFO_start_file
:
9641 unsigned int filenum
;
9643 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9645 filenum
= read_leb128 (curr
, & bytes_read
, 0);
9648 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9653 case DW_MACINFO_end_file
:
9654 printf (_(" DW_MACINFO_end_file\n"));
9657 case DW_MACINFO_define
:
9658 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9660 string
= (char *) curr
;
9661 curr
+= strlen (string
) + 1;
9662 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9666 case DW_MACINFO_undef
:
9667 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9669 string
= (char *) curr
;
9670 curr
+= strlen (string
) + 1;
9671 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9675 case DW_MACINFO_vendor_ext
:
9677 unsigned int constant
;
9679 constant
= read_leb128 (curr
, & bytes_read
, 0);
9681 string
= (char *) curr
;
9682 curr
+= strlen (string
) + 1;
9683 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9695 display_debug_abbrev (Elf_Internal_Shdr
*section
,
9696 unsigned char *start
,
9697 FILE *file ATTRIBUTE_UNUSED
)
9699 abbrev_entry
*entry
;
9700 unsigned char *end
= start
+ section
->sh_size
;
9702 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9706 start
= process_abbrev_section (start
, end
);
9708 if (first_abbrev
== NULL
)
9711 printf (_(" Number TAG\n"));
9713 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
9717 printf (_(" %ld %s [%s]\n"),
9719 get_TAG_name (entry
->tag
),
9720 entry
->children
? _("has children") : _("no children"));
9722 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9723 printf (_(" %-18s %s\n"),
9724 get_AT_name (attr
->attribute
),
9725 get_FORM_name (attr
->form
));
9738 display_debug_loc (Elf_Internal_Shdr
*section
,
9739 unsigned char *start
, FILE *file
)
9741 unsigned char *section_end
;
9742 unsigned long bytes
;
9743 unsigned char *section_begin
= start
;
9744 unsigned int num_loc_list
= 0;
9745 unsigned long last_offset
= 0;
9746 unsigned int first
= 0;
9749 int seen_first_offset
= 0;
9750 int use_debug_info
= 1;
9751 unsigned char *next
;
9753 bytes
= section
->sh_size
;
9754 section_end
= start
+ bytes
;
9758 printf (_("\nThe .debug_loc section is empty.\n"));
9762 get_debug_info (file
);
9764 /* Check the order of location list in .debug_info section. If
9765 offsets of location lists are in the ascending order, we can
9766 use `debug_information' directly. */
9767 for (i
= 0; i
< num_debug_info_entries
; i
++)
9771 num
= debug_information
[i
].num_loc_offsets
;
9772 num_loc_list
+= num
;
9774 /* Check if we can use `debug_information' directly. */
9775 if (use_debug_info
&& num
!= 0)
9777 if (!seen_first_offset
)
9779 /* This is the first location list. */
9780 last_offset
= debug_information
[i
].loc_offsets
[0];
9782 seen_first_offset
= 1;
9788 for (; j
< num
; j
++)
9791 debug_information
[i
].loc_offsets
[j
])
9796 last_offset
= debug_information
[i
].loc_offsets
[j
];
9801 if (!use_debug_info
)
9802 /* FIXME: Should we handle this case? */
9803 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9805 if (!seen_first_offset
)
9806 error (_("No location lists in .debug_info section!\n"));
9808 if (debug_information
[first
].loc_offsets
[0] != 0)
9809 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9810 debug_information
[first
].loc_offsets
[0]);
9812 printf (_("Contents of the .debug_loc section:\n\n"));
9813 printf (_(" Offset Begin End Expression\n"));
9815 seen_first_offset
= 0;
9816 for (i
= first
; i
< num_debug_info_entries
; i
++)
9818 unsigned long begin
;
9820 unsigned short length
;
9821 unsigned long offset
;
9822 unsigned int pointer_size
;
9823 unsigned long cu_offset
;
9824 unsigned long base_address
;
9825 int need_frame_base
;
9828 pointer_size
= debug_information
[i
].pointer_size
;
9829 cu_offset
= debug_information
[i
].cu_offset
;
9831 for (j
= 0; j
< debug_information
[i
].num_loc_offsets
; j
++)
9833 has_frame_base
= debug_information
[i
].have_frame_base
[j
];
9834 offset
= debug_information
[i
].loc_offsets
[j
];
9835 next
= section_begin
+ offset
;
9836 base_address
= debug_information
[i
].base_address
;
9838 if (!seen_first_offset
)
9839 seen_first_offset
= 1;
9843 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9844 (long)(start
- section_begin
), (long)(next
- section_begin
));
9845 else if (start
> next
)
9846 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9847 (long)(start
- section_begin
), (long)(next
- section_begin
));
9851 if (offset
>= bytes
)
9853 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
9860 if (start
+ 2 * pointer_size
> section_end
)
9862 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9867 begin
= byte_get (start
, pointer_size
);
9868 start
+= pointer_size
;
9869 end
= byte_get (start
, pointer_size
);
9870 start
+= pointer_size
;
9872 if (begin
== 0 && end
== 0)
9874 printf (_(" %8.8lx <End of list>\n"), offset
);
9878 /* Check base address specifiers. */
9879 if (begin
== -1UL && end
!= -1UL)
9882 printf (_(" %8.8lx %8.8lx %8.8lx (base address)\n"),
9883 offset
, begin
, end
);
9887 if (start
+ 2 > section_end
)
9889 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9894 length
= byte_get (start
, 2);
9897 if (start
+ length
> section_end
)
9899 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9904 printf (" %8.8lx %8.8lx %8.8lx (",
9905 offset
, begin
+ base_address
, end
+ base_address
);
9906 need_frame_base
= decode_location_expression (start
,
9912 if (need_frame_base
&& !has_frame_base
)
9913 printf (_(" [without DW_AT_frame_base]"));
9916 fputs (_(" (start == end)"), stdout
);
9917 else if (begin
> end
)
9918 fputs (_(" (start > end)"), stdout
);
9930 display_debug_str (Elf_Internal_Shdr
*section
,
9931 unsigned char *start
,
9932 FILE *file ATTRIBUTE_UNUSED
)
9934 unsigned long bytes
;
9937 addr
= section
->sh_addr
;
9938 bytes
= section
->sh_size
;
9942 printf (_("\nThe .debug_str section is empty.\n"));
9946 printf (_("Contents of the .debug_str section:\n\n"));
9954 lbytes
= (bytes
> 16 ? 16 : bytes
);
9956 printf (" 0x%8.8lx ", (unsigned long) addr
);
9958 for (j
= 0; j
< 16; j
++)
9961 printf ("%2.2x", start
[j
]);
9969 for (j
= 0; j
< lbytes
; j
++)
9972 if (k
>= ' ' && k
< 0x80)
9992 display_debug_info (Elf_Internal_Shdr
* section
,
9993 unsigned char * start
, FILE * file
)
9995 return process_debug_info (section
, start
, file
, 0);
10000 display_debug_aranges (Elf_Internal_Shdr
*section
,
10001 unsigned char *start
,
10002 FILE *file ATTRIBUTE_UNUSED
)
10004 unsigned char *end
= start
+ section
->sh_size
;
10006 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
10008 while (start
< end
)
10010 unsigned char *hdrptr
;
10011 DWARF2_Internal_ARange arange
;
10012 unsigned char *ranges
;
10013 unsigned long length
;
10014 unsigned long address
;
10017 int initial_length_size
;
10021 arange
.ar_length
= byte_get (hdrptr
, 4);
10024 if (arange
.ar_length
== 0xffffffff)
10026 arange
.ar_length
= byte_get (hdrptr
, 8);
10029 initial_length_size
= 12;
10034 initial_length_size
= 4;
10037 arange
.ar_version
= byte_get (hdrptr
, 2);
10040 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
10041 hdrptr
+= offset_size
;
10043 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
10046 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
10049 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
10051 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
10055 printf (_(" Length: %ld\n"), arange
.ar_length
);
10056 printf (_(" Version: %d\n"), arange
.ar_version
);
10057 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
10058 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
10059 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
10061 printf (_("\n Address Length\n"));
10065 /* Must pad to an alignment boundary that is twice the pointer size. */
10066 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
10068 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
10072 address
= byte_get (ranges
, arange
.ar_pointer_size
);
10074 ranges
+= arange
.ar_pointer_size
;
10076 length
= byte_get (ranges
, arange
.ar_pointer_size
);
10078 ranges
+= arange
.ar_pointer_size
;
10080 /* A pair of zeros marks the end of the list. */
10081 if (address
== 0 && length
== 0)
10084 printf (" %8.8lx %lu\n", address
, length
);
10087 start
+= arange
.ar_length
+ initial_length_size
;
10096 display_debug_ranges (Elf_Internal_Shdr
*section
,
10097 unsigned char *start
,
10098 FILE *file ATTRIBUTE_UNUSED
)
10100 unsigned char *section_end
;
10101 unsigned long bytes
;
10102 unsigned char *section_begin
= start
;
10103 unsigned int num_range_list
= 0;
10104 unsigned long last_offset
= 0;
10105 unsigned int first
= 0;
10108 int seen_first_offset
= 0;
10109 int use_debug_info
= 1;
10110 unsigned char *next
;
10112 bytes
= section
->sh_size
;
10113 section_end
= start
+ bytes
;
10117 printf (_("\nThe .debug_ranges section is empty.\n"));
10121 get_debug_info (file
);
10123 /* Check the order of range list in .debug_info section. If
10124 offsets of range lists are in the ascending order, we can
10125 use `debug_information' directly. */
10126 for (i
= 0; i
< num_debug_info_entries
; i
++)
10130 num
= debug_information
[i
].num_range_lists
;
10131 num_range_list
+= num
;
10133 /* Check if we can use `debug_information' directly. */
10134 if (use_debug_info
&& num
!= 0)
10136 if (!seen_first_offset
)
10138 /* This is the first range list. */
10139 last_offset
= debug_information
[i
].range_lists
[0];
10141 seen_first_offset
= 1;
10147 for (; j
< num
; j
++)
10150 debug_information
[i
].range_lists
[j
])
10152 use_debug_info
= 0;
10155 last_offset
= debug_information
[i
].range_lists
[j
];
10160 if (!use_debug_info
)
10161 /* FIXME: Should we handle this case? */
10162 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
10164 if (!seen_first_offset
)
10165 error (_("No range lists in .debug_info section!\n"));
10167 if (debug_information
[first
].range_lists
[0] != 0)
10168 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
10169 debug_information
[first
].range_lists
[0]);
10171 printf (_("Contents of the .debug_ranges section:\n\n"));
10172 printf (_(" Offset Begin End\n"));
10174 seen_first_offset
= 0;
10175 for (i
= first
; i
< num_debug_info_entries
; i
++)
10177 unsigned long begin
;
10179 unsigned long offset
;
10180 unsigned int pointer_size
;
10181 unsigned long base_address
;
10183 pointer_size
= debug_information
[i
].pointer_size
;
10185 for (j
= 0; j
< debug_information
[i
].num_range_lists
; j
++)
10187 offset
= debug_information
[i
].range_lists
[j
];
10188 next
= section_begin
+ offset
;
10189 base_address
= debug_information
[i
].base_address
;
10191 if (!seen_first_offset
)
10192 seen_first_offset
= 1;
10196 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10197 (long)(start
- section_begin
), (long)(next
- section_begin
));
10198 else if (start
> next
)
10199 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10200 (long)(start
- section_begin
), (long)(next
- section_begin
));
10206 begin
= byte_get (start
, pointer_size
);
10207 start
+= pointer_size
;
10208 end
= byte_get (start
, pointer_size
);
10209 start
+= pointer_size
;
10211 if (begin
== 0 && end
== 0)
10213 printf (_(" %8.8lx <End of list>\n"), offset
);
10217 /* Check base address specifiers. */
10218 if (begin
== -1UL && end
!= -1UL)
10220 base_address
= end
;
10221 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
10222 offset
, begin
, end
);
10226 printf (" %8.8lx %8.8lx %8.8lx",
10227 offset
, begin
+ base_address
, end
+ base_address
);
10230 fputs (_(" (start == end)"), stdout
);
10231 else if (begin
> end
)
10232 fputs (_(" (start > end)"), stdout
);
10242 typedef struct Frame_Chunk
10244 struct Frame_Chunk
*next
;
10245 unsigned char *chunk_start
;
10247 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
10248 short int *col_type
;
10250 char *augmentation
;
10251 unsigned int code_factor
;
10253 unsigned long pc_begin
;
10254 unsigned long pc_range
;
10258 unsigned char fde_encoding
;
10259 unsigned char cfa_exp
;
10263 /* A marker for a col_type that means this column was never referenced
10264 in the frame info. */
10265 #define DW_CFA_unreferenced (-1)
10268 frame_need_space (Frame_Chunk
*fc
, int reg
)
10270 int prev
= fc
->ncols
;
10272 if (reg
< fc
->ncols
)
10275 fc
->ncols
= reg
+ 1;
10276 fc
->col_type
= xcrealloc (fc
->col_type
, fc
->ncols
, sizeof (short int));
10277 fc
->col_offset
= xcrealloc (fc
->col_offset
, fc
->ncols
, sizeof (int));
10279 while (prev
< fc
->ncols
)
10281 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
10282 fc
->col_offset
[prev
] = 0;
10288 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
10293 if (*max_regs
< fc
->ncols
)
10294 *max_regs
= fc
->ncols
;
10296 if (*need_col_headers
)
10298 *need_col_headers
= 0;
10300 printf (" LOC CFA ");
10302 for (r
= 0; r
< *max_regs
; r
++)
10303 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10308 printf ("r%-4d", r
);
10314 printf ("%08lx ", fc
->pc_begin
);
10316 strcpy (tmp
, "exp");
10318 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
10319 printf ("%-8s ", tmp
);
10321 for (r
= 0; r
< fc
->ncols
; r
++)
10323 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10325 switch (fc
->col_type
[r
])
10327 case DW_CFA_undefined
:
10330 case DW_CFA_same_value
:
10333 case DW_CFA_offset
:
10334 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
10336 case DW_CFA_register
:
10337 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
10339 case DW_CFA_expression
:
10340 strcpy (tmp
, "exp");
10343 strcpy (tmp
, "n/a");
10346 printf ("%-5s", tmp
);
10353 size_of_encoded_value (int encoding
)
10355 switch (encoding
& 0x7)
10358 case 0: return eh_addr_size
;
10366 get_encoded_value (unsigned char *data
, int encoding
)
10368 int size
= size_of_encoded_value (encoding
);
10369 if (encoding
& DW_EH_PE_signed
)
10370 return byte_get_signed (data
, size
);
10372 return byte_get (data
, size
);
10375 #define GET(N) byte_get (start, N); start += N
10376 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
10377 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10380 display_debug_frames (Elf_Internal_Shdr
*section
,
10381 unsigned char *start
,
10382 FILE *file ATTRIBUTE_UNUSED
)
10384 unsigned char *end
= start
+ section
->sh_size
;
10385 unsigned char *section_start
= start
;
10386 Frame_Chunk
*chunks
= 0;
10387 Frame_Chunk
*remembered_state
= 0;
10389 int is_eh
= streq (SECTION_NAME (section
), ".eh_frame");
10390 unsigned int length_return
;
10393 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
10395 while (start
< end
)
10397 unsigned char *saved_start
;
10398 unsigned char *block_end
;
10399 unsigned long length
;
10400 unsigned long cie_id
;
10403 int need_col_headers
= 1;
10404 unsigned char *augmentation_data
= NULL
;
10405 unsigned long augmentation_data_len
= 0;
10406 int encoded_ptr_size
= eh_addr_size
;
10408 int initial_length_size
;
10410 saved_start
= start
;
10411 length
= byte_get (start
, 4); start
+= 4;
10415 printf ("\n%08lx ZERO terminator\n\n",
10416 (unsigned long)(saved_start
- section_start
));
10420 if (length
== 0xffffffff)
10422 length
= byte_get (start
, 8);
10425 initial_length_size
= 12;
10430 initial_length_size
= 4;
10433 block_end
= saved_start
+ length
+ initial_length_size
;
10434 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
10436 if (elf_header
.e_type
== ET_REL
10437 && !debug_apply_rela_addends (file
, section
, offset_size
,
10438 section_start
, start
, block_end
))
10441 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
10445 fc
= xmalloc (sizeof (Frame_Chunk
));
10446 memset (fc
, 0, sizeof (Frame_Chunk
));
10450 fc
->chunk_start
= saved_start
;
10452 fc
->col_type
= xmalloc (sizeof (short int));
10453 fc
->col_offset
= xmalloc (sizeof (int));
10454 frame_need_space (fc
, max_regs
-1);
10456 version
= *start
++;
10458 fc
->augmentation
= (char *) start
;
10459 start
= (unsigned char *) strchr ((char *) start
, '\0') + 1;
10461 if (fc
->augmentation
[0] == 'z')
10463 fc
->code_factor
= LEB ();
10464 fc
->data_factor
= SLEB ();
10473 augmentation_data_len
= LEB ();
10474 augmentation_data
= start
;
10475 start
+= augmentation_data_len
;
10477 else if (streq (fc
->augmentation
, "eh"))
10479 start
+= eh_addr_size
;
10480 fc
->code_factor
= LEB ();
10481 fc
->data_factor
= SLEB ();
10493 fc
->code_factor
= LEB ();
10494 fc
->data_factor
= SLEB ();
10506 if (do_debug_frames_interp
)
10507 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10508 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10509 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
10513 printf ("\n%08lx %08lx %08lx CIE\n",
10514 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
10515 printf (" Version: %d\n", version
);
10516 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
10517 printf (" Code alignment factor: %u\n", fc
->code_factor
);
10518 printf (" Data alignment factor: %d\n", fc
->data_factor
);
10519 printf (" Return address column: %d\n", fc
->ra
);
10521 if (augmentation_data_len
)
10524 printf (" Augmentation data: ");
10525 for (i
= 0; i
< augmentation_data_len
; ++i
)
10526 printf (" %02x", augmentation_data
[i
]);
10532 if (augmentation_data_len
)
10534 unsigned char *p
, *q
;
10535 p
= (unsigned char *) fc
->augmentation
+ 1;
10536 q
= augmentation_data
;
10542 else if (*p
== 'P')
10543 q
+= 1 + size_of_encoded_value (*q
);
10544 else if (*p
== 'R')
10545 fc
->fde_encoding
= *q
++;
10551 if (fc
->fde_encoding
)
10552 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10555 frame_need_space (fc
, fc
->ra
);
10559 unsigned char *look_for
;
10560 static Frame_Chunk fde_fc
;
10563 memset (fc
, 0, sizeof (Frame_Chunk
));
10565 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
10567 for (cie
= chunks
; cie
; cie
= cie
->next
)
10568 if (cie
->chunk_start
== look_for
)
10573 warn ("Invalid CIE pointer %08lx in FDE at %p\n",
10574 cie_id
, saved_start
);
10577 fc
->col_type
= xmalloc (sizeof (short int));
10578 fc
->col_offset
= xmalloc (sizeof (int));
10579 frame_need_space (fc
, max_regs
- 1);
10581 fc
->augmentation
= "";
10582 fc
->fde_encoding
= 0;
10586 fc
->ncols
= cie
->ncols
;
10587 fc
->col_type
= xcmalloc (fc
->ncols
, sizeof (short int));
10588 fc
->col_offset
= xcmalloc (fc
->ncols
, sizeof (int));
10589 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
10590 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
10591 fc
->augmentation
= cie
->augmentation
;
10592 fc
->code_factor
= cie
->code_factor
;
10593 fc
->data_factor
= cie
->data_factor
;
10594 fc
->cfa_reg
= cie
->cfa_reg
;
10595 fc
->cfa_offset
= cie
->cfa_offset
;
10597 frame_need_space (fc
, max_regs
-1);
10598 fc
->fde_encoding
= cie
->fde_encoding
;
10601 if (fc
->fde_encoding
)
10602 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10604 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
10605 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10606 /* Don't adjust for ET_REL since there's invariably a pcrel
10607 reloc here, which we haven't applied. */
10608 && elf_header
.e_type
!= ET_REL
)
10609 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
10610 start
+= encoded_ptr_size
;
10611 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
10612 start
+= encoded_ptr_size
;
10614 if (cie
->augmentation
[0] == 'z')
10616 augmentation_data_len
= LEB ();
10617 augmentation_data
= start
;
10618 start
+= augmentation_data_len
;
10621 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10622 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10623 (unsigned long)(cie
->chunk_start
- section_start
),
10624 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
10625 if (! do_debug_frames_interp
&& augmentation_data_len
)
10629 printf (" Augmentation data: ");
10630 for (i
= 0; i
< augmentation_data_len
; ++i
)
10631 printf (" %02x", augmentation_data
[i
]);
10637 /* At this point, fc is the current chunk, cie (if any) is set, and
10638 we're about to interpret instructions for the chunk. */
10639 /* ??? At present we need to do this always, since this sizes the
10640 fc->col_type and fc->col_offset arrays, which we write into always.
10641 We should probably split the interpreted and non-interpreted bits
10642 into two different routines, since there's so much that doesn't
10643 really overlap between them. */
10644 if (1 || do_debug_frames_interp
)
10646 /* Start by making a pass over the chunk, allocating storage
10647 and taking note of what registers are used. */
10648 unsigned char *tmp
= start
;
10650 while (start
< block_end
)
10653 unsigned long reg
, tmp
;
10660 /* Warning: if you add any more cases to this switch, be
10661 sure to add them to the corresponding switch below. */
10664 case DW_CFA_advance_loc
:
10666 case DW_CFA_offset
:
10668 frame_need_space (fc
, opa
);
10669 fc
->col_type
[opa
] = DW_CFA_undefined
;
10671 case DW_CFA_restore
:
10672 frame_need_space (fc
, opa
);
10673 fc
->col_type
[opa
] = DW_CFA_undefined
;
10675 case DW_CFA_set_loc
:
10676 start
+= encoded_ptr_size
;
10678 case DW_CFA_advance_loc1
:
10681 case DW_CFA_advance_loc2
:
10684 case DW_CFA_advance_loc4
:
10687 case DW_CFA_offset_extended
:
10688 reg
= LEB (); LEB ();
10689 frame_need_space (fc
, reg
);
10690 fc
->col_type
[reg
] = DW_CFA_undefined
;
10692 case DW_CFA_restore_extended
:
10694 frame_need_space (fc
, reg
);
10695 fc
->col_type
[reg
] = DW_CFA_undefined
;
10697 case DW_CFA_undefined
:
10699 frame_need_space (fc
, reg
);
10700 fc
->col_type
[reg
] = DW_CFA_undefined
;
10702 case DW_CFA_same_value
:
10704 frame_need_space (fc
, reg
);
10705 fc
->col_type
[reg
] = DW_CFA_undefined
;
10707 case DW_CFA_register
:
10708 reg
= LEB (); LEB ();
10709 frame_need_space (fc
, reg
);
10710 fc
->col_type
[reg
] = DW_CFA_undefined
;
10712 case DW_CFA_def_cfa
:
10715 case DW_CFA_def_cfa_register
:
10718 case DW_CFA_def_cfa_offset
:
10721 case DW_CFA_def_cfa_expression
:
10725 case DW_CFA_expression
:
10729 frame_need_space (fc
, reg
);
10730 fc
->col_type
[reg
] = DW_CFA_undefined
;
10732 case DW_CFA_offset_extended_sf
:
10733 reg
= LEB (); SLEB ();
10734 frame_need_space (fc
, reg
);
10735 fc
->col_type
[reg
] = DW_CFA_undefined
;
10737 case DW_CFA_def_cfa_sf
:
10740 case DW_CFA_def_cfa_offset_sf
:
10743 case DW_CFA_MIPS_advance_loc8
:
10746 case DW_CFA_GNU_args_size
:
10749 case DW_CFA_GNU_negative_offset_extended
:
10750 reg
= LEB (); LEB ();
10751 frame_need_space (fc
, reg
);
10752 fc
->col_type
[reg
] = DW_CFA_undefined
;
10761 /* Now we know what registers are used, make a second pass over
10762 the chunk, this time actually printing out the info. */
10764 while (start
< block_end
)
10767 unsigned long ul
, reg
, roffs
;
10776 /* Warning: if you add any more cases to this switch, be
10777 sure to add them to the corresponding switch above. */
10780 case DW_CFA_advance_loc
:
10781 if (do_debug_frames_interp
)
10782 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10784 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10785 opa
* fc
->code_factor
,
10786 fc
->pc_begin
+ opa
* fc
->code_factor
);
10787 fc
->pc_begin
+= opa
* fc
->code_factor
;
10790 case DW_CFA_offset
:
10792 if (! do_debug_frames_interp
)
10793 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10794 opa
, roffs
* fc
->data_factor
);
10795 fc
->col_type
[opa
] = DW_CFA_offset
;
10796 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
10799 case DW_CFA_restore
:
10800 if (! do_debug_frames_interp
)
10801 printf (" DW_CFA_restore: r%d\n", opa
);
10802 fc
->col_type
[opa
] = cie
->col_type
[opa
];
10803 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
10806 case DW_CFA_set_loc
:
10807 vma
= get_encoded_value (start
, fc
->fde_encoding
);
10808 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10809 && elf_header
.e_type
!= ET_REL
)
10810 vma
+= section
->sh_addr
+ (start
- section_start
);
10811 start
+= encoded_ptr_size
;
10812 if (do_debug_frames_interp
)
10813 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10815 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
10816 fc
->pc_begin
= vma
;
10819 case DW_CFA_advance_loc1
:
10820 ofs
= byte_get (start
, 1); start
+= 1;
10821 if (do_debug_frames_interp
)
10822 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10824 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10825 ofs
* fc
->code_factor
,
10826 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10827 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10830 case DW_CFA_advance_loc2
:
10831 ofs
= byte_get (start
, 2); start
+= 2;
10832 if (do_debug_frames_interp
)
10833 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10835 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10836 ofs
* fc
->code_factor
,
10837 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10838 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10841 case DW_CFA_advance_loc4
:
10842 ofs
= byte_get (start
, 4); start
+= 4;
10843 if (do_debug_frames_interp
)
10844 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10846 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10847 ofs
* fc
->code_factor
,
10848 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10849 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10852 case DW_CFA_offset_extended
:
10855 if (! do_debug_frames_interp
)
10856 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10857 reg
, roffs
* fc
->data_factor
);
10858 fc
->col_type
[reg
] = DW_CFA_offset
;
10859 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
10862 case DW_CFA_restore_extended
:
10864 if (! do_debug_frames_interp
)
10865 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
10866 fc
->col_type
[reg
] = cie
->col_type
[reg
];
10867 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
10870 case DW_CFA_undefined
:
10872 if (! do_debug_frames_interp
)
10873 printf (" DW_CFA_undefined: r%ld\n", reg
);
10874 fc
->col_type
[reg
] = DW_CFA_undefined
;
10875 fc
->col_offset
[reg
] = 0;
10878 case DW_CFA_same_value
:
10880 if (! do_debug_frames_interp
)
10881 printf (" DW_CFA_same_value: r%ld\n", reg
);
10882 fc
->col_type
[reg
] = DW_CFA_same_value
;
10883 fc
->col_offset
[reg
] = 0;
10886 case DW_CFA_register
:
10889 if (! do_debug_frames_interp
)
10890 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
10891 fc
->col_type
[reg
] = DW_CFA_register
;
10892 fc
->col_offset
[reg
] = roffs
;
10895 case DW_CFA_remember_state
:
10896 if (! do_debug_frames_interp
)
10897 printf (" DW_CFA_remember_state\n");
10898 rs
= xmalloc (sizeof (Frame_Chunk
));
10899 rs
->ncols
= fc
->ncols
;
10900 rs
->col_type
= xcmalloc (rs
->ncols
, sizeof (short int));
10901 rs
->col_offset
= xcmalloc (rs
->ncols
, sizeof (int));
10902 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
10903 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
10904 rs
->next
= remembered_state
;
10905 remembered_state
= rs
;
10908 case DW_CFA_restore_state
:
10909 if (! do_debug_frames_interp
)
10910 printf (" DW_CFA_restore_state\n");
10911 rs
= remembered_state
;
10914 remembered_state
= rs
->next
;
10915 frame_need_space (fc
, rs
->ncols
-1);
10916 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
10917 memcpy (fc
->col_offset
, rs
->col_offset
,
10918 rs
->ncols
* sizeof (int));
10919 free (rs
->col_type
);
10920 free (rs
->col_offset
);
10923 else if (do_debug_frames_interp
)
10924 printf ("Mismatched DW_CFA_restore_state\n");
10927 case DW_CFA_def_cfa
:
10928 fc
->cfa_reg
= LEB ();
10929 fc
->cfa_offset
= LEB ();
10931 if (! do_debug_frames_interp
)
10932 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10933 fc
->cfa_reg
, fc
->cfa_offset
);
10936 case DW_CFA_def_cfa_register
:
10937 fc
->cfa_reg
= LEB ();
10939 if (! do_debug_frames_interp
)
10940 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
10943 case DW_CFA_def_cfa_offset
:
10944 fc
->cfa_offset
= LEB ();
10945 if (! do_debug_frames_interp
)
10946 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
10950 if (! do_debug_frames_interp
)
10951 printf (" DW_CFA_nop\n");
10954 case DW_CFA_def_cfa_expression
:
10956 if (! do_debug_frames_interp
)
10958 printf (" DW_CFA_def_cfa_expression (");
10959 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10966 case DW_CFA_expression
:
10969 if (! do_debug_frames_interp
)
10971 printf (" DW_CFA_expression: r%ld (", reg
);
10972 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10975 fc
->col_type
[reg
] = DW_CFA_expression
;
10979 case DW_CFA_offset_extended_sf
:
10982 frame_need_space (fc
, reg
);
10983 if (! do_debug_frames_interp
)
10984 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10985 reg
, l
* fc
->data_factor
);
10986 fc
->col_type
[reg
] = DW_CFA_offset
;
10987 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10990 case DW_CFA_def_cfa_sf
:
10991 fc
->cfa_reg
= LEB ();
10992 fc
->cfa_offset
= SLEB ();
10993 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
10995 if (! do_debug_frames_interp
)
10996 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10997 fc
->cfa_reg
, fc
->cfa_offset
);
11000 case DW_CFA_def_cfa_offset_sf
:
11001 fc
->cfa_offset
= SLEB ();
11002 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
11003 if (! do_debug_frames_interp
)
11004 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
11007 case DW_CFA_MIPS_advance_loc8
:
11008 ofs
= byte_get (start
, 8); start
+= 8;
11009 if (do_debug_frames_interp
)
11010 frame_display_row (fc
, &need_col_headers
, &max_regs
);
11012 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
11013 ofs
* fc
->code_factor
,
11014 fc
->pc_begin
+ ofs
* fc
->code_factor
);
11015 fc
->pc_begin
+= ofs
* fc
->code_factor
;
11018 case DW_CFA_GNU_window_save
:
11019 if (! do_debug_frames_interp
)
11020 printf (" DW_CFA_GNU_window_save\n");
11023 case DW_CFA_GNU_args_size
:
11025 if (! do_debug_frames_interp
)
11026 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
11029 case DW_CFA_GNU_negative_offset_extended
:
11032 frame_need_space (fc
, reg
);
11033 if (! do_debug_frames_interp
)
11034 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
11035 reg
, l
* fc
->data_factor
);
11036 fc
->col_type
[reg
] = DW_CFA_offset
;
11037 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
11041 warn (_("unsupported or unknown DW_CFA_%d\n"), op
);
11046 if (do_debug_frames_interp
)
11047 frame_display_row (fc
, &need_col_headers
, &max_regs
);
11062 display_debug_not_supported (Elf_Internal_Shdr
*section
,
11063 unsigned char *start ATTRIBUTE_UNUSED
,
11064 FILE *file ATTRIBUTE_UNUSED
)
11066 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
11067 SECTION_NAME (section
));
11072 /* A structure containing the name of a debug section
11073 and a pointer to a function that can decode it. */
11076 const char *const name
;
11077 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
11081 { ".debug_abbrev", display_debug_abbrev
},
11082 { ".debug_aranges", display_debug_aranges
},
11083 { ".debug_frame", display_debug_frames
},
11084 { ".debug_info", display_debug_info
},
11085 { ".debug_line", display_debug_lines
},
11086 { ".debug_pubnames", display_debug_pubnames
},
11087 { ".eh_frame", display_debug_frames
},
11088 { ".debug_macinfo", display_debug_macinfo
},
11089 { ".debug_str", display_debug_str
},
11090 { ".debug_loc", display_debug_loc
},
11091 { ".debug_pubtypes", display_debug_pubnames
},
11092 { ".debug_ranges", display_debug_ranges
},
11093 { ".debug_static_func", display_debug_not_supported
},
11094 { ".debug_static_vars", display_debug_not_supported
},
11095 { ".debug_types", display_debug_not_supported
},
11096 { ".debug_weaknames", display_debug_not_supported
}
11100 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
11102 char *name
= SECTION_NAME (section
);
11103 bfd_size_type length
;
11107 length
= section
->sh_size
;
11110 printf (_("\nSection '%s' has no debugging data.\n"), name
);
11114 if (strneq (name
, ".gnu.linkonce.wi.", 17))
11115 name
= ".debug_info";
11117 /* See if we know how to display the contents of this section. */
11118 for (i
= NUM_ELEM (debug_displays
); i
--;)
11119 if (streq (debug_displays
[i
].name
, name
))
11121 unsigned char *start
;
11123 start
= get_data (NULL
, file
, section
->sh_offset
, 1, length
,
11124 _("debug section data"));
11131 result
&= debug_displays
[i
].display (section
, start
, file
);
11134 /* If we loaded in the abbrev section
11135 at some point, we must release it here. */
11143 printf (_("Unrecognized debug section: %s\n"), name
);
11151 process_section_contents (FILE *file
)
11153 Elf_Internal_Shdr
*section
;
11159 for (i
= 0, section
= section_headers
;
11160 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
11163 #ifdef SUPPORT_DISASSEMBLY
11164 if (dump_sects
[i
] & DISASS_DUMP
)
11165 disassemble_section (section
, file
);
11167 if (dump_sects
[i
] & HEX_DUMP
)
11168 dump_section (section
, file
);
11170 if (dump_sects
[i
] & DEBUG_DUMP
)
11171 display_debug_section (section
, file
);
11174 /* Check to see if the user requested a
11175 dump of a section that does not exist. */
11176 while (i
++ < num_dump_sects
)
11178 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
11182 process_mips_fpe_exception (int mask
)
11187 if (mask
& OEX_FPU_INEX
)
11188 fputs ("INEX", stdout
), first
= 0;
11189 if (mask
& OEX_FPU_UFLO
)
11190 printf ("%sUFLO", first
? "" : "|"), first
= 0;
11191 if (mask
& OEX_FPU_OFLO
)
11192 printf ("%sOFLO", first
? "" : "|"), first
= 0;
11193 if (mask
& OEX_FPU_DIV0
)
11194 printf ("%sDIV0", first
? "" : "|"), first
= 0;
11195 if (mask
& OEX_FPU_INVAL
)
11196 printf ("%sINVAL", first
? "" : "|");
11199 fputs ("0", stdout
);
11203 process_mips_specific (FILE *file
)
11205 Elf_Internal_Dyn
*entry
;
11206 size_t liblist_offset
= 0;
11207 size_t liblistno
= 0;
11208 size_t conflictsno
= 0;
11209 size_t options_offset
= 0;
11210 size_t conflicts_offset
= 0;
11212 /* We have a lot of special sections. Thanks SGI! */
11213 if (dynamic_section
== NULL
)
11214 /* No information available. */
11217 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
11218 switch (entry
->d_tag
)
11220 case DT_MIPS_LIBLIST
:
11222 = offset_from_vma (file
, entry
->d_un
.d_val
,
11223 liblistno
* sizeof (Elf32_External_Lib
));
11225 case DT_MIPS_LIBLISTNO
:
11226 liblistno
= entry
->d_un
.d_val
;
11228 case DT_MIPS_OPTIONS
:
11229 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
11231 case DT_MIPS_CONFLICT
:
11233 = offset_from_vma (file
, entry
->d_un
.d_val
,
11234 conflictsno
* sizeof (Elf32_External_Conflict
));
11236 case DT_MIPS_CONFLICTNO
:
11237 conflictsno
= entry
->d_un
.d_val
;
11243 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
11245 Elf32_External_Lib
*elib
;
11248 elib
= get_data (NULL
, file
, liblist_offset
,
11249 liblistno
, sizeof (Elf32_External_Lib
),
11253 printf ("\nSection '.liblist' contains %lu entries:\n",
11254 (unsigned long) liblistno
);
11255 fputs (" Library Time Stamp Checksum Version Flags\n",
11258 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
11265 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11266 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11267 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11268 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11269 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11271 tmp
= gmtime (&time
);
11272 snprintf (timebuf
, sizeof (timebuf
),
11273 "%04u-%02u-%02uT%02u:%02u:%02u",
11274 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11275 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11277 printf ("%3lu: ", (unsigned long) cnt
);
11278 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
11279 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
11281 printf ("<corrupt: %9ld>", liblist
.l_name
);
11282 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
11283 liblist
.l_version
);
11285 if (liblist
.l_flags
== 0)
11289 static const struct
11296 { " EXACT_MATCH", LL_EXACT_MATCH
},
11297 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
11298 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
11299 { " EXPORTS", LL_EXPORTS
},
11300 { " DELAY_LOAD", LL_DELAY_LOAD
},
11301 { " DELTA", LL_DELTA
}
11303 int flags
= liblist
.l_flags
;
11307 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
11309 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
11311 fputs (l_flags_vals
[fcnt
].name
, stdout
);
11312 flags
^= l_flags_vals
[fcnt
].bit
;
11315 printf (" %#x", (unsigned int) flags
);
11325 if (options_offset
!= 0)
11327 Elf_External_Options
*eopt
;
11328 Elf_Internal_Shdr
*sect
= section_headers
;
11329 Elf_Internal_Options
*iopt
;
11330 Elf_Internal_Options
*option
;
11334 /* Find the section header so that we get the size. */
11335 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
11338 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
11342 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
11345 error (_("Out of memory"));
11352 while (offset
< sect
->sh_size
)
11354 Elf_External_Options
*eoption
;
11356 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
11358 option
->kind
= BYTE_GET (eoption
->kind
);
11359 option
->size
= BYTE_GET (eoption
->size
);
11360 option
->section
= BYTE_GET (eoption
->section
);
11361 option
->info
= BYTE_GET (eoption
->info
);
11363 offset
+= option
->size
;
11369 printf (_("\nSection '%s' contains %d entries:\n"),
11370 SECTION_NAME (sect
), cnt
);
11378 switch (option
->kind
)
11381 /* This shouldn't happen. */
11382 printf (" NULL %d %lx", option
->section
, option
->info
);
11385 printf (" REGINFO ");
11386 if (elf_header
.e_machine
== EM_MIPS
)
11389 Elf32_External_RegInfo
*ereg
;
11390 Elf32_RegInfo reginfo
;
11392 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
11393 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11394 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11395 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11396 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11397 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11398 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11400 printf ("GPR %08lx GP 0x%lx\n",
11401 reginfo
.ri_gprmask
,
11402 (unsigned long) reginfo
.ri_gp_value
);
11403 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11404 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11405 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11410 Elf64_External_RegInfo
*ereg
;
11411 Elf64_Internal_RegInfo reginfo
;
11413 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
11414 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11415 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11416 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11417 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11418 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11419 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11421 printf ("GPR %08lx GP 0x",
11422 reginfo
.ri_gprmask
);
11423 printf_vma (reginfo
.ri_gp_value
);
11426 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11427 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11428 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11432 case ODK_EXCEPTIONS
:
11433 fputs (" EXCEPTIONS fpe_min(", stdout
);
11434 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
11435 fputs (") fpe_max(", stdout
);
11436 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
11437 fputs (")", stdout
);
11439 if (option
->info
& OEX_PAGE0
)
11440 fputs (" PAGE0", stdout
);
11441 if (option
->info
& OEX_SMM
)
11442 fputs (" SMM", stdout
);
11443 if (option
->info
& OEX_FPDBUG
)
11444 fputs (" FPDBUG", stdout
);
11445 if (option
->info
& OEX_DISMISS
)
11446 fputs (" DISMISS", stdout
);
11449 fputs (" PAD ", stdout
);
11450 if (option
->info
& OPAD_PREFIX
)
11451 fputs (" PREFIX", stdout
);
11452 if (option
->info
& OPAD_POSTFIX
)
11453 fputs (" POSTFIX", stdout
);
11454 if (option
->info
& OPAD_SYMBOL
)
11455 fputs (" SYMBOL", stdout
);
11458 fputs (" HWPATCH ", stdout
);
11459 if (option
->info
& OHW_R4KEOP
)
11460 fputs (" R4KEOP", stdout
);
11461 if (option
->info
& OHW_R8KPFETCH
)
11462 fputs (" R8KPFETCH", stdout
);
11463 if (option
->info
& OHW_R5KEOP
)
11464 fputs (" R5KEOP", stdout
);
11465 if (option
->info
& OHW_R5KCVTL
)
11466 fputs (" R5KCVTL", stdout
);
11469 fputs (" FILL ", stdout
);
11470 /* XXX Print content of info word? */
11473 fputs (" TAGS ", stdout
);
11474 /* XXX Print content of info word? */
11477 fputs (" HWAND ", stdout
);
11478 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11479 fputs (" R4KEOP_CHECKED", stdout
);
11480 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11481 fputs (" R4KEOP_CLEAN", stdout
);
11484 fputs (" HWOR ", stdout
);
11485 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11486 fputs (" R4KEOP_CHECKED", stdout
);
11487 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11488 fputs (" R4KEOP_CLEAN", stdout
);
11491 printf (" GP_GROUP %#06lx self-contained %#06lx",
11492 option
->info
& OGP_GROUP
,
11493 (option
->info
& OGP_SELF
) >> 16);
11496 printf (" IDENT %#06lx self-contained %#06lx",
11497 option
->info
& OGP_GROUP
,
11498 (option
->info
& OGP_SELF
) >> 16);
11501 /* This shouldn't happen. */
11502 printf (" %3d ??? %d %lx",
11503 option
->kind
, option
->section
, option
->info
);
11507 len
= sizeof (*eopt
);
11508 while (len
< option
->size
)
11509 if (((char *) option
)[len
] >= ' '
11510 && ((char *) option
)[len
] < 0x7f)
11511 printf ("%c", ((char *) option
)[len
++]);
11513 printf ("\\%03o", ((char *) option
)[len
++]);
11515 fputs ("\n", stdout
);
11523 if (conflicts_offset
!= 0 && conflictsno
!= 0)
11525 Elf32_Conflict
*iconf
;
11528 if (dynamic_symbols
== NULL
)
11530 error (_("conflict list found without a dynamic symbol table"));
11534 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
11537 error (_("Out of memory"));
11543 Elf32_External_Conflict
*econf32
;
11545 econf32
= get_data (NULL
, file
, conflicts_offset
,
11546 conflictsno
, sizeof (*econf32
), _("conflict"));
11550 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11551 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
11557 Elf64_External_Conflict
*econf64
;
11559 econf64
= get_data (NULL
, file
, conflicts_offset
,
11560 conflictsno
, sizeof (*econf64
), _("conflict"));
11564 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11565 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
11570 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11571 (unsigned long) conflictsno
);
11572 puts (_(" Num: Index Value Name"));
11574 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11576 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
11578 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
11579 print_vma (psym
->st_value
, FULL_HEX
);
11581 if (VALID_DYNAMIC_NAME (psym
->st_name
))
11582 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
11584 printf ("<corrupt: %14ld>", psym
->st_name
);
11595 process_gnu_liblist (FILE *file
)
11597 Elf_Internal_Shdr
*section
, *string_sec
;
11598 Elf32_External_Lib
*elib
;
11600 size_t strtab_size
;
11607 for (i
= 0, section
= section_headers
;
11608 i
< elf_header
.e_shnum
;
11611 switch (section
->sh_type
)
11613 case SHT_GNU_LIBLIST
:
11614 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
11617 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
11622 string_sec
= SECTION_HEADER (section
->sh_link
);
11624 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
11625 string_sec
->sh_size
, _("liblist string table"));
11626 strtab_size
= string_sec
->sh_size
;
11629 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
11635 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11636 SECTION_NAME (section
),
11637 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
11639 puts (" Library Time Stamp Checksum Version Flags");
11641 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
11649 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11650 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11651 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11652 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11653 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11655 tmp
= gmtime (&time
);
11656 snprintf (timebuf
, sizeof (timebuf
),
11657 "%04u-%02u-%02uT%02u:%02u:%02u",
11658 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11659 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11661 printf ("%3lu: ", (unsigned long) cnt
);
11663 printf ("%-20s", liblist
.l_name
< strtab_size
11664 ? strtab
+ liblist
.l_name
: "<corrupt>");
11666 printf ("%-20.20s", liblist
.l_name
< strtab_size
11667 ? strtab
+ liblist
.l_name
: "<corrupt>");
11668 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
11669 liblist
.l_version
, liblist
.l_flags
);
11679 static const char *
11680 get_note_type (unsigned e_type
)
11682 static char buff
[64];
11684 if (elf_header
.e_type
== ET_CORE
)
11688 return _("NT_AUXV (auxiliary vector)");
11690 return _("NT_PRSTATUS (prstatus structure)");
11692 return _("NT_FPREGSET (floating point registers)");
11694 return _("NT_PRPSINFO (prpsinfo structure)");
11695 case NT_TASKSTRUCT
:
11696 return _("NT_TASKSTRUCT (task structure)");
11698 return _("NT_PRXFPREG (user_xfpregs structure)");
11700 return _("NT_PSTATUS (pstatus structure)");
11702 return _("NT_FPREGS (floating point registers)");
11704 return _("NT_PSINFO (psinfo structure)");
11706 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11708 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11709 case NT_WIN32PSTATUS
:
11710 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11718 return _("NT_VERSION (version)");
11720 return _("NT_ARCH (architecture)");
11725 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11729 static const char *
11730 get_netbsd_elfcore_note_type (unsigned e_type
)
11732 static char buff
[64];
11734 if (e_type
== NT_NETBSDCORE_PROCINFO
)
11736 /* NetBSD core "procinfo" structure. */
11737 return _("NetBSD procinfo structure");
11740 /* As of Jan 2002 there are no other machine-independent notes
11741 defined for NetBSD core files. If the note type is less
11742 than the start of the machine-dependent note types, we don't
11745 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
11747 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11751 switch (elf_header
.e_machine
)
11753 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11754 and PT_GETFPREGS == mach+2. */
11759 case EM_SPARC32PLUS
:
11763 case NT_NETBSDCORE_FIRSTMACH
+0:
11764 return _("PT_GETREGS (reg structure)");
11765 case NT_NETBSDCORE_FIRSTMACH
+2:
11766 return _("PT_GETFPREGS (fpreg structure)");
11772 /* On all other arch's, PT_GETREGS == mach+1 and
11773 PT_GETFPREGS == mach+3. */
11777 case NT_NETBSDCORE_FIRSTMACH
+1:
11778 return _("PT_GETREGS (reg structure)");
11779 case NT_NETBSDCORE_FIRSTMACH
+3:
11780 return _("PT_GETFPREGS (fpreg structure)");
11786 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
11787 e_type
- NT_NETBSDCORE_FIRSTMACH
);
11791 /* Note that by the ELF standard, the name field is already null byte
11792 terminated, and namesz includes the terminating null byte.
11793 I.E. the value of namesz for the name "FSF" is 4.
11795 If the value of namesz is zero, there is no name present. */
11797 process_note (Elf_Internal_Note
*pnote
)
11801 if (pnote
->namesz
== 0)
11802 /* If there is no note name, then use the default set of
11803 note type strings. */
11804 nt
= get_note_type (pnote
->type
);
11806 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
11807 /* NetBSD-specific core file notes. */
11808 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
11811 /* Don't recognize this note name; just use the default set of
11812 note type strings. */
11813 nt
= get_note_type (pnote
->type
);
11815 printf (" %s\t\t0x%08lx\t%s\n",
11816 pnote
->namesz
? pnote
->namedata
: "(NONE)",
11817 pnote
->descsz
, nt
);
11823 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
11825 Elf_External_Note
*pnotes
;
11826 Elf_External_Note
*external
;
11832 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
11838 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11839 (unsigned long) offset
, (unsigned long) length
);
11840 printf (_(" Owner\t\tData size\tDescription\n"));
11842 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
11844 Elf_External_Note
*next
;
11845 Elf_Internal_Note inote
;
11848 inote
.type
= BYTE_GET (external
->type
);
11849 inote
.namesz
= BYTE_GET (external
->namesz
);
11850 inote
.namedata
= external
->name
;
11851 inote
.descsz
= BYTE_GET (external
->descsz
);
11852 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
11853 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
11855 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
11857 if (((char *) next
) > (((char *) pnotes
) + length
))
11859 warn (_("corrupt note found at offset %lx into core notes\n"),
11860 (long)((char *)external
- (char *)pnotes
));
11861 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
11862 inote
.type
, inote
.namesz
, inote
.descsz
);
11868 /* Verify that name is null terminated. It appears that at least
11869 one version of Linux (RedHat 6.0) generates corefiles that don't
11870 comply with the ELF spec by failing to include the null byte in
11872 if (inote
.namedata
[inote
.namesz
] != '\0')
11874 temp
= malloc (inote
.namesz
+ 1);
11878 error (_("Out of memory\n"));
11883 strncpy (temp
, inote
.namedata
, inote
.namesz
);
11884 temp
[inote
.namesz
] = 0;
11886 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11887 inote
.namedata
= temp
;
11890 res
&= process_note (& inote
);
11905 process_corefile_note_segments (FILE *file
)
11907 Elf_Internal_Phdr
*segment
;
11911 if (! get_program_headers (file
))
11914 for (i
= 0, segment
= program_headers
;
11915 i
< elf_header
.e_phnum
;
11918 if (segment
->p_type
== PT_NOTE
)
11919 res
&= process_corefile_note_segment (file
,
11920 (bfd_vma
) segment
->p_offset
,
11921 (bfd_vma
) segment
->p_filesz
);
11928 process_note_sections (FILE *file
)
11930 Elf_Internal_Shdr
*section
;
11934 for (i
= 0, section
= section_headers
;
11935 i
< elf_header
.e_shnum
;
11937 if (section
->sh_type
== SHT_NOTE
)
11938 res
&= process_corefile_note_segment (file
,
11939 (bfd_vma
) section
->sh_offset
,
11940 (bfd_vma
) section
->sh_size
);
11946 process_notes (FILE *file
)
11948 /* If we have not been asked to display the notes then do nothing. */
11952 if (elf_header
.e_type
!= ET_CORE
)
11953 return process_note_sections (file
);
11955 /* No program headers means no NOTE segment. */
11956 if (elf_header
.e_phnum
> 0)
11957 return process_corefile_note_segments (file
);
11959 printf (_("No note segments present in the core file.\n"));
11964 process_arch_specific (FILE *file
)
11969 switch (elf_header
.e_machine
)
11972 case EM_MIPS_RS3_LE
:
11973 return process_mips_specific (file
);
11982 get_file_header (FILE *file
)
11984 /* Read in the identity array. */
11985 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
11988 /* Determine how to read the rest of the header. */
11989 switch (elf_header
.e_ident
[EI_DATA
])
11991 default: /* fall through */
11992 case ELFDATANONE
: /* fall through */
11994 byte_get
= byte_get_little_endian
;
11995 byte_put
= byte_put_little_endian
;
11998 byte_get
= byte_get_big_endian
;
11999 byte_put
= byte_put_big_endian
;
12003 /* For now we only support 32 bit and 64 bit ELF files. */
12004 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
12006 /* Read in the rest of the header. */
12009 Elf32_External_Ehdr ehdr32
;
12011 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
12014 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
12015 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
12016 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
12017 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
12018 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
12019 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
12020 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
12021 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
12022 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
12023 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
12024 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
12025 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
12026 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
12030 Elf64_External_Ehdr ehdr64
;
12032 /* If we have been compiled with sizeof (bfd_vma) == 4, then
12033 we will not be able to cope with the 64bit data found in
12034 64 ELF files. Detect this now and abort before we start
12035 overwriting things. */
12036 if (sizeof (bfd_vma
) < 8)
12038 error (_("This instance of readelf has been built without support for a\n\
12039 64 bit data type and so it cannot read 64 bit ELF files.\n"));
12043 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
12046 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
12047 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
12048 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
12049 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
12050 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
12051 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
12052 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
12053 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
12054 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
12055 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
12056 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
12057 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
12058 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
12061 if (elf_header
.e_shoff
)
12063 /* There may be some extensions in the first section header. Don't
12064 bomb if we can't read it. */
12066 get_32bit_section_headers (file
, 1);
12068 get_64bit_section_headers (file
, 1);
12074 /* Process one ELF object file according to the command line options.
12075 This file may actually be stored in an archive. The file is
12076 positioned at the start of the ELF object. */
12079 process_object (char *file_name
, FILE *file
)
12083 if (! get_file_header (file
))
12085 error (_("%s: Failed to read file header\n"), file_name
);
12089 /* Initialise per file variables. */
12090 for (i
= NUM_ELEM (version_info
); i
--;)
12091 version_info
[i
] = 0;
12093 for (i
= NUM_ELEM (dynamic_info
); i
--;)
12094 dynamic_info
[i
] = 0;
12096 /* Process the file. */
12098 printf (_("\nFile: %s\n"), file_name
);
12100 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12101 Note we do this even if cmdline_dump_sects is empty because we
12102 must make sure that the dump_sets array is zeroed out before each
12103 object file is processed. */
12104 if (num_dump_sects
> num_cmdline_dump_sects
)
12105 memset (dump_sects
, 0, num_dump_sects
);
12107 if (num_cmdline_dump_sects
> 0)
12109 if (num_dump_sects
== 0)
12110 /* A sneaky way of allocating the dump_sects array. */
12111 request_dump (num_cmdline_dump_sects
, 0);
12113 assert (num_dump_sects
>= num_cmdline_dump_sects
);
12114 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
12117 if (! process_file_header ())
12120 if (! process_section_headers (file
))
12122 /* Without loaded section headers we cannot process lots of
12124 do_unwind
= do_version
= do_dump
= do_arch
= 0;
12126 if (! do_using_dynamic
)
12127 do_syms
= do_reloc
= 0;
12130 if (! process_section_groups (file
))
12132 /* Without loaded section groups we cannot process unwind. */
12136 if (process_program_headers (file
))
12137 process_dynamic_section (file
);
12139 process_relocs (file
);
12141 process_unwind (file
);
12143 process_symbol_table (file
);
12145 process_syminfo (file
);
12147 process_version_sections (file
);
12149 process_section_contents (file
);
12151 process_notes (file
);
12153 process_gnu_liblist (file
);
12155 process_arch_specific (file
);
12157 if (program_headers
)
12159 free (program_headers
);
12160 program_headers
= NULL
;
12163 if (section_headers
)
12165 free (section_headers
);
12166 section_headers
= NULL
;
12171 free (string_table
);
12172 string_table
= NULL
;
12173 string_table_length
= 0;
12176 if (dynamic_strings
)
12178 free (dynamic_strings
);
12179 dynamic_strings
= NULL
;
12180 dynamic_strings_length
= 0;
12183 if (dynamic_symbols
)
12185 free (dynamic_symbols
);
12186 dynamic_symbols
= NULL
;
12187 num_dynamic_syms
= 0;
12190 if (dynamic_syminfo
)
12192 free (dynamic_syminfo
);
12193 dynamic_syminfo
= NULL
;
12196 if (section_headers_groups
)
12198 free (section_headers_groups
);
12199 section_headers_groups
= NULL
;
12202 if (section_groups
)
12204 struct group_list
*g
, *next
;
12206 for (i
= 0; i
< group_count
; i
++)
12208 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
12215 free (section_groups
);
12216 section_groups
= NULL
;
12219 if (debug_information
)
12221 for (i
= 0; i
< num_debug_info_entries
; i
++)
12223 if (!debug_information
[i
].max_loc_offsets
)
12225 free (debug_information
[i
].loc_offsets
);
12226 free (debug_information
[i
].have_frame_base
);
12228 if (!debug_information
[i
].max_range_lists
)
12229 free (debug_information
[i
].range_lists
);
12231 free (debug_information
);
12232 debug_information
= NULL
;
12233 num_debug_info_entries
= 0;
12239 /* Process an ELF archive. The file is positioned just after the
12243 process_archive (char *file_name
, FILE *file
)
12245 struct ar_hdr arhdr
;
12247 unsigned long size
;
12248 char *longnames
= NULL
;
12249 unsigned long longnames_size
= 0;
12250 size_t file_name_size
;
12255 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12256 if (got
!= sizeof arhdr
)
12261 error (_("%s: failed to read archive header\n"), file_name
);
12265 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
12267 /* This is the archive symbol table. Skip it.
12268 FIXME: We should have an option to dump it. */
12269 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12270 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
12272 error (_("%s: failed to skip archive symbol table\n"), file_name
);
12276 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12277 if (got
!= sizeof arhdr
)
12282 error (_("%s: failed to read archive header\n"), file_name
);
12287 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
12289 /* This is the archive string table holding long member
12292 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12294 longnames
= malloc (longnames_size
);
12295 if (longnames
== NULL
)
12297 error (_("Out of memory\n"));
12301 if (fread (longnames
, longnames_size
, 1, file
) != 1)
12304 error (_("%s: failed to read string table\n"), file_name
);
12308 if ((longnames_size
& 1) != 0)
12311 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12312 if (got
!= sizeof arhdr
)
12319 error (_("%s: failed to read archive header\n"), file_name
);
12324 file_name_size
= strlen (file_name
);
12333 if (arhdr
.ar_name
[0] == '/')
12337 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
12338 if (off
>= longnames_size
)
12340 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
12345 name
= longnames
+ off
;
12346 nameend
= memchr (name
, '/', longnames_size
- off
);
12350 name
= arhdr
.ar_name
;
12351 nameend
= memchr (name
, '/', 16);
12354 if (nameend
== NULL
)
12356 error (_("%s: bad archive file name\n"), file_name
);
12361 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
12362 if (namealc
== NULL
)
12364 error (_("Out of memory\n"));
12369 memcpy (namealc
, file_name
, file_name_size
);
12370 namealc
[file_name_size
] = '(';
12371 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
12372 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
12373 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
12375 archive_file_offset
= ftell (file
);
12376 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12378 ret
|= process_object (namealc
, file
);
12383 (archive_file_offset
12384 + archive_file_size
12385 + (archive_file_size
& 1)),
12388 error (_("%s: failed to seek to next archive header\n"), file_name
);
12393 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12394 if (got
!= sizeof arhdr
)
12399 error (_("%s: failed to read archive header\n"), file_name
);
12405 if (longnames
!= 0)
12412 process_file (char *file_name
)
12415 struct stat statbuf
;
12416 char armag
[SARMAG
];
12419 if (stat (file_name
, &statbuf
) < 0)
12421 if (errno
== ENOENT
)
12422 error (_("'%s': No such file\n"), file_name
);
12424 error (_("Could not locate '%s'. System error message: %s\n"),
12425 file_name
, strerror (errno
));
12429 if (! S_ISREG (statbuf
.st_mode
))
12431 error (_("'%s' is not an ordinary file\n"), file_name
);
12435 file
= fopen (file_name
, "rb");
12438 error (_("Input file '%s' is not readable.\n"), file_name
);
12442 if (fread (armag
, SARMAG
, 1, file
) != 1)
12444 error (_("%s: Failed to read file header\n"), file_name
);
12449 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
12450 ret
= process_archive (file_name
, file
);
12454 archive_file_size
= archive_file_offset
= 0;
12455 ret
= process_object (file_name
, file
);
12463 #ifdef SUPPORT_DISASSEMBLY
12464 /* Needed by the i386 disassembler. For extra credit, someone could
12465 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12469 print_address (unsigned int addr
, FILE *outfile
)
12471 fprintf (outfile
,"0x%8.8x", addr
);
12474 /* Needed by the i386 disassembler. */
12476 db_task_printsym (unsigned int addr
)
12478 print_address (addr
, stderr
);
12483 main (int argc
, char **argv
)
12487 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12488 setlocale (LC_MESSAGES
, "");
12490 #if defined (HAVE_SETLOCALE)
12491 setlocale (LC_CTYPE
, "");
12493 bindtextdomain (PACKAGE
, LOCALEDIR
);
12494 textdomain (PACKAGE
);
12496 parse_args (argc
, argv
);
12498 if (num_dump_sects
> 0)
12500 /* Make a copy of the dump_sects array. */
12501 cmdline_dump_sects
= malloc (num_dump_sects
);
12502 if (cmdline_dump_sects
== NULL
)
12503 error (_("Out of memory allocating dump request table."));
12506 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
12507 num_cmdline_dump_sects
= num_dump_sects
;
12511 if (optind
< (argc
- 1))
12515 while (optind
< argc
)
12516 err
|= process_file (argv
[optind
++]);
12518 if (dump_sects
!= NULL
)
12520 if (cmdline_dump_sects
!= NULL
)
12521 free (cmdline_dump_sects
);