1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
51 /* Define BFD64 here, even if our default architecture is 32 bit ELF
52 as this will allow us to read in and parse 64bit and 32bit ELF files.
53 Only do this if we believe that the compiler can support a 64 bit
54 data type. For now we only rely on GCC being able to do this. */
60 #include "elf/common.h"
61 #include "elf/external.h"
62 #include "elf/internal.h"
63 #include "elf/dwarf2.h"
65 /* The following headers use the elf/reloc-macros.h file to
66 automatically generate relocation recognition functions
67 such as elf_mips_reloc_type() */
69 #define RELOC_MACROS_GEN_FUNC
71 #include "elf/alpha.h"
91 #include "elf/m68hc11.h"
92 #include "elf/mcore.h"
95 #include "elf/mn10200.h"
96 #include "elf/mn10300.h"
98 #include "elf/msp430.h"
102 #include "elf/ppc64.h"
103 #include "elf/s390.h"
105 #include "elf/sparc.h"
106 #include "elf/v850.h"
108 #include "elf/x86-64.h"
109 #include "elf/xstormy16.h"
111 #include "elf/iq2000.h"
112 #include "elf/xtensa.h"
118 #include "libiberty.h"
120 char *program_name
= "readelf";
121 static long archive_file_offset
;
122 static unsigned long archive_file_size
;
123 static unsigned long dynamic_addr
;
124 static bfd_size_type dynamic_size
;
125 static unsigned int dynamic_nent
;
126 static char *dynamic_strings
;
127 static unsigned long dynamic_strings_length
;
128 static char *string_table
;
129 static unsigned long string_table_length
;
130 static unsigned long num_dynamic_syms
;
131 static Elf_Internal_Sym
*dynamic_symbols
;
132 static Elf_Internal_Syminfo
*dynamic_syminfo
;
133 static unsigned long dynamic_syminfo_offset
;
134 static unsigned int dynamic_syminfo_nent
;
135 static char program_interpreter
[64];
136 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
137 static bfd_vma version_info
[16];
138 static Elf_Internal_Ehdr elf_header
;
139 static Elf_Internal_Shdr
*section_headers
;
140 static Elf_Internal_Phdr
*program_headers
;
141 static Elf_Internal_Dyn
*dynamic_section
;
142 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
143 static int show_name
;
144 static int do_dynamic
;
147 static int do_sections
;
148 static int do_section_groups
;
149 static int do_full_section_name
;
150 static int do_segments
;
151 static int do_unwind
;
152 static int do_using_dynamic
;
153 static int do_header
;
155 static int do_version
;
157 static int do_histogram
;
158 static int do_debugging
;
159 static int do_debug_info
;
160 static int do_debug_abbrevs
;
161 static int do_debug_lines
;
162 static int do_debug_pubnames
;
163 static int do_debug_aranges
;
164 static int do_debug_ranges
;
165 static int do_debug_frames
;
166 static int do_debug_frames_interp
;
167 static int do_debug_macinfo
;
168 static int do_debug_str
;
169 static int do_debug_loc
;
172 static int is_32bit_elf
;
173 static int have_frame_base
;
174 static int need_base_address
;
175 static bfd_vma eh_addr_size
;
179 struct group_list
*next
;
180 unsigned int section_index
;
185 struct group_list
*root
;
186 unsigned int group_index
;
189 static size_t group_count
;
190 static struct group
*section_groups
;
191 static struct group
**section_headers_groups
;
193 /* A dynamic array of flags indicating for which sections a hex dump
194 has been requested (via the -x switch) and/or a disassembly dump
195 (via the -i switch). */
196 char *cmdline_dump_sects
= NULL
;
197 unsigned num_cmdline_dump_sects
= 0;
199 /* A dynamic array of flags indicating for which sections a dump of
200 some kind has been requested. It is reset on a per-object file
201 basis and then initialised from the cmdline_dump_sects array and
202 the results of interpreting the -w switch. */
203 char *dump_sects
= NULL
;
204 unsigned int num_dump_sects
= 0;
206 #define HEX_DUMP (1 << 0)
207 #define DISASS_DUMP (1 << 1)
208 #define DEBUG_DUMP (1 << 2)
210 /* How to print a vma value. */
211 typedef enum print_mode
223 static bfd_vma (*byte_get
) (unsigned char *, int);
224 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
228 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
229 ((X)->sh_name >= string_table_length \
230 ? "<corrupt>" : string_table + (X)->sh_name))
232 /* Given st_shndx I, map to section_headers index. */
233 #define SECTION_HEADER_INDEX(I) \
234 ((I) < SHN_LORESERVE \
236 : ((I) <= SHN_HIRESERVE \
238 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
240 /* Reverse of the above. */
241 #define SECTION_HEADER_NUM(N) \
242 ((N) < SHN_LORESERVE \
244 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
246 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
248 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
250 #define BYTE_GET(field) byte_get (field, sizeof (field))
252 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
254 #define GET_ELF_SYMBOLS(file, section) \
255 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
256 : get_64bit_elf_symbols (file, section))
258 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
259 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
260 already been called and verified that the string exists. */
261 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
263 /* This is just a bit of syntatic sugar. */
264 #define streq(a,b) (strcmp ((a), (b)) == 0)
265 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
268 error (const char *message
, ...)
272 va_start (args
, message
);
273 fprintf (stderr
, _("%s: Error: "), program_name
);
274 vfprintf (stderr
, message
, args
);
279 warn (const char *message
, ...)
283 va_start (args
, message
);
284 fprintf (stderr
, _("%s: Warning: "), program_name
);
285 vfprintf (stderr
, message
, args
);
290 cmalloc (size_t nmemb
, size_t size
)
292 /* Check for overflow. */
293 if (nmemb
>= ~(size_t) 0 / size
)
296 return malloc (nmemb
* size
);
300 xcmalloc (size_t nmemb
, size_t size
)
302 /* Check for overflow. */
303 if (nmemb
>= ~(size_t) 0 / size
)
306 return xmalloc (nmemb
* size
);
310 xcrealloc (void *ptr
, size_t nmemb
, size_t size
)
312 /* Check for overflow. */
313 if (nmemb
>= ~(size_t) 0 / size
)
316 return xrealloc (ptr
, nmemb
* size
);
320 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
325 if (size
== 0 || nmemb
== 0)
328 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
330 error (_("Unable to seek to 0x%x for %s\n"),
331 archive_file_offset
+ offset
, reason
);
338 /* Check for overflow. */
339 if (nmemb
< (~(size_t) 0 - 1) / size
)
340 /* + 1 so that we can '\0' terminate invalid string table sections. */
341 mvar
= malloc (size
* nmemb
+ 1);
345 error (_("Out of memory allocating 0x%x bytes for %s\n"),
346 size
* nmemb
, reason
);
350 ((char *) mvar
)[size
* nmemb
] = '\0';
353 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
355 error (_("Unable to read in 0x%x bytes of %s\n"), size
* nmemb
, reason
);
365 byte_get_little_endian (unsigned char *field
, int size
)
373 return ((unsigned int) (field
[0]))
374 | (((unsigned int) (field
[1])) << 8);
378 /* We want to extract data from an 8 byte wide field and
379 place it into a 4 byte wide field. Since this is a little
380 endian source we can just use the 4 byte extraction code. */
384 return ((unsigned long) (field
[0]))
385 | (((unsigned long) (field
[1])) << 8)
386 | (((unsigned long) (field
[2])) << 16)
387 | (((unsigned long) (field
[3])) << 24);
391 return ((bfd_vma
) (field
[0]))
392 | (((bfd_vma
) (field
[1])) << 8)
393 | (((bfd_vma
) (field
[2])) << 16)
394 | (((bfd_vma
) (field
[3])) << 24)
395 | (((bfd_vma
) (field
[4])) << 32)
396 | (((bfd_vma
) (field
[5])) << 40)
397 | (((bfd_vma
) (field
[6])) << 48)
398 | (((bfd_vma
) (field
[7])) << 56);
401 error (_("Unhandled data length: %d\n"), size
);
407 byte_get_signed (unsigned char *field
, int size
)
409 bfd_vma x
= byte_get (field
, size
);
414 return (x
^ 0x80) - 0x80;
416 return (x
^ 0x8000) - 0x8000;
418 return (x
^ 0x80000000) - 0x80000000;
427 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
432 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
433 field
[6] = ((value
>> 24) >> 24) & 0xff;
434 field
[5] = ((value
>> 24) >> 16) & 0xff;
435 field
[4] = ((value
>> 24) >> 8) & 0xff;
438 field
[3] = (value
>> 24) & 0xff;
439 field
[2] = (value
>> 16) & 0xff;
442 field
[1] = (value
>> 8) & 0xff;
445 field
[0] = value
& 0xff;
449 error (_("Unhandled data length: %d\n"), size
);
454 #if defined BFD64 && !BFD_HOST_64BIT_LONG
456 print_dec_vma (bfd_vma vma
, int is_signed
)
462 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
471 *bufp
++ = '0' + vma
% 10;
483 print_hex_vma (bfd_vma vma
)
491 char digit
= '0' + (vma
& 0x0f);
493 digit
+= 'a' - '0' - 10;
506 /* Print a VMA value. */
508 print_vma (bfd_vma vma
, print_mode mode
)
517 return printf ("0x%8.8lx", (unsigned long) vma
);
520 return printf ("%8.8lx", (unsigned long) vma
);
524 return printf ("%5ld", (long) vma
);
528 return printf ("0x%lx", (unsigned long) vma
);
531 return printf ("%lx", (unsigned long) vma
);
534 return printf ("%ld", (unsigned long) vma
);
537 return printf ("%lu", (unsigned long) vma
);
560 #if BFD_HOST_64BIT_LONG
561 return nc
+ printf ("%lx", vma
);
563 return nc
+ print_hex_vma (vma
);
567 #if BFD_HOST_64BIT_LONG
568 return printf ("%ld", vma
);
570 return print_dec_vma (vma
, 1);
574 #if BFD_HOST_64BIT_LONG
576 return printf ("%5ld", vma
);
578 return printf ("%#lx", vma
);
581 return printf ("%5ld", _bfd_int64_low (vma
));
583 return print_hex_vma (vma
);
587 #if BFD_HOST_64BIT_LONG
588 return printf ("%lu", vma
);
590 return print_dec_vma (vma
, 0);
598 /* Display a symbol on stdout. If do_wide is not true then
599 format the symbol to be at most WIDTH characters,
600 truncating as necessary. If WIDTH is negative then
601 format the string to be exactly - WIDTH characters,
602 truncating or padding as necessary. */
605 print_symbol (int width
, const char *symbol
)
608 printf ("%s", symbol
);
610 printf ("%-*.*s", width
, width
, symbol
);
612 printf ("%-.*s", width
, symbol
);
616 byte_get_big_endian (unsigned char *field
, int size
)
624 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
628 /* Although we are extracing data from an 8 byte wide field,
629 we are returning only 4 bytes of data. */
634 return ((unsigned long) (field
[3]))
635 | (((unsigned long) (field
[2])) << 8)
636 | (((unsigned long) (field
[1])) << 16)
637 | (((unsigned long) (field
[0])) << 24);
641 return ((bfd_vma
) (field
[7]))
642 | (((bfd_vma
) (field
[6])) << 8)
643 | (((bfd_vma
) (field
[5])) << 16)
644 | (((bfd_vma
) (field
[4])) << 24)
645 | (((bfd_vma
) (field
[3])) << 32)
646 | (((bfd_vma
) (field
[2])) << 40)
647 | (((bfd_vma
) (field
[1])) << 48)
648 | (((bfd_vma
) (field
[0])) << 56);
652 error (_("Unhandled data length: %d\n"), size
);
658 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
663 field
[7] = value
& 0xff;
664 field
[6] = (value
>> 8) & 0xff;
665 field
[5] = (value
>> 16) & 0xff;
666 field
[4] = (value
>> 24) & 0xff;
671 field
[3] = value
& 0xff;
672 field
[2] = (value
>> 8) & 0xff;
676 field
[1] = value
& 0xff;
680 field
[0] = value
& 0xff;
684 error (_("Unhandled data length: %d\n"), size
);
689 /* Return a pointer to section NAME, or NULL if no such section exists. */
691 static Elf_Internal_Shdr
*
692 find_section (const char *name
)
696 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
697 if (streq (SECTION_NAME (section_headers
+ i
), name
))
698 return section_headers
+ i
;
703 /* Guess the relocation size commonly used by the specific machines. */
706 guess_is_rela (unsigned long e_machine
)
710 /* Targets that use REL relocations. */
725 /* Targets that use RELA relocations. */
740 case EM_CYGNUS_MN10200
:
742 case EM_CYGNUS_MN10300
:
790 warn (_("Don't know about relocations on this machine architecture\n"));
796 slurp_rela_relocs (FILE *file
,
797 unsigned long rel_offset
,
798 unsigned long rel_size
,
799 Elf_Internal_Rela
**relasp
,
800 unsigned long *nrelasp
)
802 Elf_Internal_Rela
*relas
;
803 unsigned long nrelas
;
808 Elf32_External_Rela
*erelas
;
810 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
814 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
816 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
821 error (_("out of memory parsing relocs"));
825 for (i
= 0; i
< nrelas
; i
++)
827 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
828 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
829 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
836 Elf64_External_Rela
*erelas
;
838 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
842 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
844 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
849 error (_("out of memory parsing relocs"));
853 for (i
= 0; i
< nrelas
; i
++)
855 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
856 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
857 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
868 slurp_rel_relocs (FILE *file
,
869 unsigned long rel_offset
,
870 unsigned long rel_size
,
871 Elf_Internal_Rela
**relsp
,
872 unsigned long *nrelsp
)
874 Elf_Internal_Rela
*rels
;
880 Elf32_External_Rel
*erels
;
882 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
886 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
888 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
893 error (_("out of memory parsing relocs"));
897 for (i
= 0; i
< nrels
; i
++)
899 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
900 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
901 rels
[i
].r_addend
= 0;
908 Elf64_External_Rel
*erels
;
910 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
914 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
916 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
921 error (_("out of memory parsing relocs"));
925 for (i
= 0; i
< nrels
; i
++)
927 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
928 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
929 rels
[i
].r_addend
= 0;
939 /* Display the contents of the relocation data found at the specified
943 dump_relocations (FILE *file
,
944 unsigned long rel_offset
,
945 unsigned long rel_size
,
946 Elf_Internal_Sym
*symtab
,
949 unsigned long strtablen
,
953 Elf_Internal_Rela
*rels
;
956 if (is_rela
== UNKNOWN
)
957 is_rela
= guess_is_rela (elf_header
.e_machine
);
961 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
966 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
975 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
977 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
982 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
984 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
992 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
994 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
999 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1001 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1005 for (i
= 0; i
< rel_size
; i
++)
1008 const char *rtype2
= NULL
;
1009 const char *rtype3
= NULL
;
1012 bfd_vma symtab_index
;
1017 offset
= rels
[i
].r_offset
;
1018 info
= rels
[i
].r_info
;
1022 type
= ELF32_R_TYPE (info
);
1023 symtab_index
= ELF32_R_SYM (info
);
1027 /* The #ifdef BFD64 below is to prevent a compile time warning.
1028 We know that if we do not have a 64 bit data type that we
1029 will never execute this code anyway. */
1031 if (elf_header
.e_machine
== EM_MIPS
)
1033 /* In little-endian objects, r_info isn't really a 64-bit
1034 little-endian value: it has a 32-bit little-endian
1035 symbol index followed by four individual byte fields.
1036 Reorder INFO accordingly. */
1037 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1038 info
= (((info
& 0xffffffff) << 32)
1039 | ((info
>> 56) & 0xff)
1040 | ((info
>> 40) & 0xff00)
1041 | ((info
>> 24) & 0xff0000)
1042 | ((info
>> 8) & 0xff000000));
1043 type
= ELF64_MIPS_R_TYPE (info
);
1044 type2
= ELF64_MIPS_R_TYPE2 (info
);
1045 type3
= ELF64_MIPS_R_TYPE3 (info
);
1047 else if (elf_header
.e_machine
== EM_SPARCV9
)
1048 type
= ELF64_R_TYPE_ID (info
);
1050 type
= ELF64_R_TYPE (info
);
1052 symtab_index
= ELF64_R_SYM (info
);
1058 #ifdef _bfd_int64_low
1059 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1061 printf ("%8.8lx %8.8lx ", offset
, info
);
1066 #ifdef _bfd_int64_low
1068 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1069 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1070 _bfd_int64_high (offset
),
1071 _bfd_int64_low (offset
),
1072 _bfd_int64_high (info
),
1073 _bfd_int64_low (info
));
1076 ? "%16.16lx %16.16lx "
1077 : "%12.12lx %12.12lx ",
1082 switch (elf_header
.e_machine
)
1089 case EM_CYGNUS_M32R
:
1090 rtype
= elf_m32r_reloc_type (type
);
1095 rtype
= elf_i386_reloc_type (type
);
1100 rtype
= elf_m68hc11_reloc_type (type
);
1104 rtype
= elf_m68k_reloc_type (type
);
1108 rtype
= elf_i960_reloc_type (type
);
1113 rtype
= elf_avr_reloc_type (type
);
1116 case EM_OLD_SPARCV9
:
1117 case EM_SPARC32PLUS
:
1120 rtype
= elf_sparc_reloc_type (type
);
1124 case EM_CYGNUS_V850
:
1125 rtype
= v850_reloc_type (type
);
1129 case EM_CYGNUS_D10V
:
1130 rtype
= elf_d10v_reloc_type (type
);
1134 case EM_CYGNUS_D30V
:
1135 rtype
= elf_d30v_reloc_type (type
);
1139 rtype
= elf_dlx_reloc_type (type
);
1143 rtype
= elf_sh_reloc_type (type
);
1147 case EM_CYGNUS_MN10300
:
1148 rtype
= elf_mn10300_reloc_type (type
);
1152 case EM_CYGNUS_MN10200
:
1153 rtype
= elf_mn10200_reloc_type (type
);
1157 case EM_CYGNUS_FR30
:
1158 rtype
= elf_fr30_reloc_type (type
);
1162 rtype
= elf_frv_reloc_type (type
);
1166 rtype
= elf_mcore_reloc_type (type
);
1170 rtype
= elf_mmix_reloc_type (type
);
1175 rtype
= elf_msp430_reloc_type (type
);
1179 rtype
= elf_ppc_reloc_type (type
);
1183 rtype
= elf_ppc64_reloc_type (type
);
1187 case EM_MIPS_RS3_LE
:
1188 rtype
= elf_mips_reloc_type (type
);
1191 rtype2
= elf_mips_reloc_type (type2
);
1192 rtype3
= elf_mips_reloc_type (type3
);
1197 rtype
= elf_alpha_reloc_type (type
);
1201 rtype
= elf_arm_reloc_type (type
);
1205 rtype
= elf_arc_reloc_type (type
);
1209 rtype
= elf_hppa_reloc_type (type
);
1215 rtype
= elf_h8_reloc_type (type
);
1220 rtype
= elf_or32_reloc_type (type
);
1225 rtype
= elf_pj_reloc_type (type
);
1228 rtype
= elf_ia64_reloc_type (type
);
1232 rtype
= elf_cris_reloc_type (type
);
1236 rtype
= elf_i860_reloc_type (type
);
1240 rtype
= elf_x86_64_reloc_type (type
);
1244 rtype
= i370_reloc_type (type
);
1249 rtype
= elf_s390_reloc_type (type
);
1253 rtype
= elf_xstormy16_reloc_type (type
);
1257 rtype
= elf_crx_reloc_type (type
);
1261 rtype
= elf_vax_reloc_type (type
);
1266 rtype
= elf_ip2k_reloc_type (type
);
1270 rtype
= elf_iq2000_reloc_type (type
);
1275 rtype
= elf_xtensa_reloc_type (type
);
1279 rtype
= elf_ms1_reloc_type (type
);
1284 #ifdef _bfd_int64_low
1285 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1287 printf (_("unrecognized: %-7lx"), type
);
1290 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1292 if (elf_header
.e_machine
== EM_ALPHA
1293 && streq (rtype
, "R_ALPHA_LITUSE")
1296 switch (rels
[i
].r_addend
)
1298 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1299 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1300 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1301 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1302 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1303 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1304 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1305 default: rtype
= NULL
;
1308 printf (" (%s)", rtype
);
1312 printf (_("<unknown addend: %lx>"),
1313 (unsigned long) rels
[i
].r_addend
);
1316 else if (symtab_index
)
1318 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1319 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1322 Elf_Internal_Sym
*psym
;
1324 psym
= symtab
+ symtab_index
;
1327 print_vma (psym
->st_value
, LONG_HEX
);
1328 printf (is_32bit_elf
? " " : " ");
1330 if (psym
->st_name
== 0)
1332 const char *sec_name
= "<null>";
1335 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1337 bfd_vma sec_index
= (bfd_vma
) -1;
1339 if (psym
->st_shndx
< SHN_LORESERVE
)
1340 sec_index
= psym
->st_shndx
;
1341 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1342 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1345 if (sec_index
!= (bfd_vma
) -1)
1346 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1347 else if (psym
->st_shndx
== SHN_ABS
)
1349 else if (psym
->st_shndx
== SHN_COMMON
)
1350 sec_name
= "COMMON";
1351 else if (elf_header
.e_machine
== EM_IA_64
1352 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1353 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1354 sec_name
= "ANSI_COM";
1357 sprintf (name_buf
, "<section 0x%x>",
1358 (unsigned int) psym
->st_shndx
);
1359 sec_name
= name_buf
;
1362 print_symbol (22, sec_name
);
1364 else if (strtab
== NULL
)
1365 printf (_("<string table index: %3ld>"), psym
->st_name
);
1366 else if (psym
->st_name
>= strtablen
)
1367 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1369 print_symbol (22, strtab
+ psym
->st_name
);
1372 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1377 printf ("%*c", is_32bit_elf
?
1378 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1379 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1382 if (elf_header
.e_machine
== EM_SPARCV9
&& streq (rtype
, "R_SPARC_OLO10"))
1383 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1387 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1389 printf (" Type2: ");
1392 #ifdef _bfd_int64_low
1393 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1395 printf (_("unrecognized: %-7lx"), type2
);
1398 printf ("%-17.17s", rtype2
);
1400 printf ("\n Type3: ");
1403 #ifdef _bfd_int64_low
1404 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1406 printf (_("unrecognized: %-7lx"), type3
);
1409 printf ("%-17.17s", rtype3
);
1421 get_mips_dynamic_type (unsigned long type
)
1425 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1426 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1427 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1428 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1429 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1430 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1431 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1432 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1433 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1434 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1435 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1436 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1437 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1438 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1439 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1440 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1441 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1442 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1443 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1444 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1445 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1446 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1447 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1448 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1449 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1450 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1451 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1452 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1453 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1454 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1455 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1456 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1457 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1458 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1459 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1460 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1461 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1462 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1463 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1464 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1465 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1466 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1467 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1474 get_sparc64_dynamic_type (unsigned long type
)
1478 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1485 get_ppc_dynamic_type (unsigned long type
)
1489 case DT_PPC_GOT
: return "PPC_GOT";
1496 get_ppc64_dynamic_type (unsigned long type
)
1500 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1501 case DT_PPC64_OPD
: return "PPC64_OPD";
1502 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1509 get_parisc_dynamic_type (unsigned long type
)
1513 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1514 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1515 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1516 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1517 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1518 case DT_HP_PREINIT
: return "HP_PREINIT";
1519 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1520 case DT_HP_NEEDED
: return "HP_NEEDED";
1521 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1522 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1523 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1524 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1525 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1532 get_ia64_dynamic_type (unsigned long type
)
1536 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1543 get_alpha_dynamic_type (unsigned long type
)
1547 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1554 get_dynamic_type (unsigned long type
)
1556 static char buff
[64];
1560 case DT_NULL
: return "NULL";
1561 case DT_NEEDED
: return "NEEDED";
1562 case DT_PLTRELSZ
: return "PLTRELSZ";
1563 case DT_PLTGOT
: return "PLTGOT";
1564 case DT_HASH
: return "HASH";
1565 case DT_STRTAB
: return "STRTAB";
1566 case DT_SYMTAB
: return "SYMTAB";
1567 case DT_RELA
: return "RELA";
1568 case DT_RELASZ
: return "RELASZ";
1569 case DT_RELAENT
: return "RELAENT";
1570 case DT_STRSZ
: return "STRSZ";
1571 case DT_SYMENT
: return "SYMENT";
1572 case DT_INIT
: return "INIT";
1573 case DT_FINI
: return "FINI";
1574 case DT_SONAME
: return "SONAME";
1575 case DT_RPATH
: return "RPATH";
1576 case DT_SYMBOLIC
: return "SYMBOLIC";
1577 case DT_REL
: return "REL";
1578 case DT_RELSZ
: return "RELSZ";
1579 case DT_RELENT
: return "RELENT";
1580 case DT_PLTREL
: return "PLTREL";
1581 case DT_DEBUG
: return "DEBUG";
1582 case DT_TEXTREL
: return "TEXTREL";
1583 case DT_JMPREL
: return "JMPREL";
1584 case DT_BIND_NOW
: return "BIND_NOW";
1585 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1586 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1587 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1588 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1589 case DT_RUNPATH
: return "RUNPATH";
1590 case DT_FLAGS
: return "FLAGS";
1592 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1593 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1595 case DT_CHECKSUM
: return "CHECKSUM";
1596 case DT_PLTPADSZ
: return "PLTPADSZ";
1597 case DT_MOVEENT
: return "MOVEENT";
1598 case DT_MOVESZ
: return "MOVESZ";
1599 case DT_FEATURE
: return "FEATURE";
1600 case DT_POSFLAG_1
: return "POSFLAG_1";
1601 case DT_SYMINSZ
: return "SYMINSZ";
1602 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1604 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1605 case DT_CONFIG
: return "CONFIG";
1606 case DT_DEPAUDIT
: return "DEPAUDIT";
1607 case DT_AUDIT
: return "AUDIT";
1608 case DT_PLTPAD
: return "PLTPAD";
1609 case DT_MOVETAB
: return "MOVETAB";
1610 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1612 case DT_VERSYM
: return "VERSYM";
1614 case DT_RELACOUNT
: return "RELACOUNT";
1615 case DT_RELCOUNT
: return "RELCOUNT";
1616 case DT_FLAGS_1
: return "FLAGS_1";
1617 case DT_VERDEF
: return "VERDEF";
1618 case DT_VERDEFNUM
: return "VERDEFNUM";
1619 case DT_VERNEED
: return "VERNEED";
1620 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1622 case DT_AUXILIARY
: return "AUXILIARY";
1623 case DT_USED
: return "USED";
1624 case DT_FILTER
: return "FILTER";
1626 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1627 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1628 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1629 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1630 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1633 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1637 switch (elf_header
.e_machine
)
1640 case EM_MIPS_RS3_LE
:
1641 result
= get_mips_dynamic_type (type
);
1644 result
= get_sparc64_dynamic_type (type
);
1647 result
= get_ppc_dynamic_type (type
);
1650 result
= get_ppc64_dynamic_type (type
);
1653 result
= get_ia64_dynamic_type (type
);
1656 result
= get_alpha_dynamic_type (type
);
1666 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1668 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1672 switch (elf_header
.e_machine
)
1675 result
= get_parisc_dynamic_type (type
);
1685 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1689 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1696 get_file_type (unsigned e_type
)
1698 static char buff
[32];
1702 case ET_NONE
: return _("NONE (None)");
1703 case ET_REL
: return _("REL (Relocatable file)");
1704 case ET_EXEC
: return _("EXEC (Executable file)");
1705 case ET_DYN
: return _("DYN (Shared object file)");
1706 case ET_CORE
: return _("CORE (Core file)");
1709 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1710 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1711 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1712 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1714 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1720 get_machine_name (unsigned e_machine
)
1722 static char buff
[64]; /* XXX */
1726 case EM_NONE
: return _("None");
1727 case EM_M32
: return "WE32100";
1728 case EM_SPARC
: return "Sparc";
1729 case EM_386
: return "Intel 80386";
1730 case EM_68K
: return "MC68000";
1731 case EM_88K
: return "MC88000";
1732 case EM_486
: return "Intel 80486";
1733 case EM_860
: return "Intel 80860";
1734 case EM_MIPS
: return "MIPS R3000";
1735 case EM_S370
: return "IBM System/370";
1736 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1737 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1738 case EM_PARISC
: return "HPPA";
1739 case EM_PPC_OLD
: return "Power PC (old)";
1740 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1741 case EM_960
: return "Intel 90860";
1742 case EM_PPC
: return "PowerPC";
1743 case EM_PPC64
: return "PowerPC64";
1744 case EM_V800
: return "NEC V800";
1745 case EM_FR20
: return "Fujitsu FR20";
1746 case EM_RH32
: return "TRW RH32";
1747 case EM_MCORE
: return "MCORE";
1748 case EM_ARM
: return "ARM";
1749 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1750 case EM_SH
: return "Renesas / SuperH SH";
1751 case EM_SPARCV9
: return "Sparc v9";
1752 case EM_TRICORE
: return "Siemens Tricore";
1753 case EM_ARC
: return "ARC";
1754 case EM_H8_300
: return "Renesas H8/300";
1755 case EM_H8_300H
: return "Renesas H8/300H";
1756 case EM_H8S
: return "Renesas H8S";
1757 case EM_H8_500
: return "Renesas H8/500";
1758 case EM_IA_64
: return "Intel IA-64";
1759 case EM_MIPS_X
: return "Stanford MIPS-X";
1760 case EM_COLDFIRE
: return "Motorola Coldfire";
1761 case EM_68HC12
: return "Motorola M68HC12";
1762 case EM_ALPHA
: return "Alpha";
1763 case EM_CYGNUS_D10V
:
1764 case EM_D10V
: return "d10v";
1765 case EM_CYGNUS_D30V
:
1766 case EM_D30V
: return "d30v";
1767 case EM_CYGNUS_M32R
:
1768 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1769 case EM_CYGNUS_V850
:
1770 case EM_V850
: return "NEC v850";
1771 case EM_CYGNUS_MN10300
:
1772 case EM_MN10300
: return "mn10300";
1773 case EM_CYGNUS_MN10200
:
1774 case EM_MN10200
: return "mn10200";
1775 case EM_CYGNUS_FR30
:
1776 case EM_FR30
: return "Fujitsu FR30";
1777 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1779 case EM_PJ
: return "picoJava";
1780 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1781 case EM_PCP
: return "Siemens PCP";
1782 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1783 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1784 case EM_STARCORE
: return "Motorola Star*Core processor";
1785 case EM_ME16
: return "Toyota ME16 processor";
1786 case EM_ST100
: return "STMicroelectronics ST100 processor";
1787 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1788 case EM_FX66
: return "Siemens FX66 microcontroller";
1789 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1790 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1791 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1792 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1793 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1794 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1795 case EM_SVX
: return "Silicon Graphics SVx";
1796 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1797 case EM_VAX
: return "Digital VAX";
1799 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1800 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1801 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1802 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1803 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1804 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1805 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1806 case EM_PRISM
: return "Vitesse Prism";
1807 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1809 case EM_S390
: return "IBM S/390";
1810 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1812 case EM_OR32
: return "OpenRISC";
1813 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1814 case EM_DLX
: return "OpenDLX";
1816 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1817 case EM_IQ2000
: return "Vitesse IQ2000";
1819 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1820 case EM_MS1
: return "Morpho Techologies MS1 processor";
1822 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1828 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1833 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1834 e_flags
&= ~ EF_ARM_EABIMASK
;
1836 /* Handle "generic" ARM flags. */
1837 if (e_flags
& EF_ARM_RELEXEC
)
1839 strcat (buf
, ", relocatable executable");
1840 e_flags
&= ~ EF_ARM_RELEXEC
;
1843 if (e_flags
& EF_ARM_HASENTRY
)
1845 strcat (buf
, ", has entry point");
1846 e_flags
&= ~ EF_ARM_HASENTRY
;
1849 /* Now handle EABI specific flags. */
1853 strcat (buf
, ", <unrecognized EABI>");
1858 case EF_ARM_EABI_VER1
:
1859 strcat (buf
, ", Version1 EABI");
1864 /* Process flags one bit at a time. */
1865 flag
= e_flags
& - e_flags
;
1870 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1871 strcat (buf
, ", sorted symbol tables");
1881 case EF_ARM_EABI_VER2
:
1882 strcat (buf
, ", Version2 EABI");
1887 /* Process flags one bit at a time. */
1888 flag
= e_flags
& - e_flags
;
1893 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1894 strcat (buf
, ", sorted symbol tables");
1897 case EF_ARM_DYNSYMSUSESEGIDX
:
1898 strcat (buf
, ", dynamic symbols use segment index");
1901 case EF_ARM_MAPSYMSFIRST
:
1902 strcat (buf
, ", mapping symbols precede others");
1912 case EF_ARM_EABI_VER3
:
1913 strcat (buf
, ", Version3 EABI");
1916 case EF_ARM_EABI_VER4
:
1917 strcat (buf
, ", Version4 EABI");
1922 /* Process flags one bit at a time. */
1923 flag
= e_flags
& - e_flags
;
1929 strcat (buf
, ", BE8");
1933 strcat (buf
, ", LE8");
1943 case EF_ARM_EABI_UNKNOWN
:
1944 strcat (buf
, ", GNU EABI");
1949 /* Process flags one bit at a time. */
1950 flag
= e_flags
& - e_flags
;
1955 case EF_ARM_INTERWORK
:
1956 strcat (buf
, ", interworking enabled");
1959 case EF_ARM_APCS_26
:
1960 strcat (buf
, ", uses APCS/26");
1963 case EF_ARM_APCS_FLOAT
:
1964 strcat (buf
, ", uses APCS/float");
1968 strcat (buf
, ", position independent");
1972 strcat (buf
, ", 8 bit structure alignment");
1975 case EF_ARM_NEW_ABI
:
1976 strcat (buf
, ", uses new ABI");
1979 case EF_ARM_OLD_ABI
:
1980 strcat (buf
, ", uses old ABI");
1983 case EF_ARM_SOFT_FLOAT
:
1984 strcat (buf
, ", software FP");
1987 case EF_ARM_VFP_FLOAT
:
1988 strcat (buf
, ", VFP");
1991 case EF_ARM_MAVERICK_FLOAT
:
1992 strcat (buf
, ", Maverick FP");
2003 strcat (buf
,", <unknown>");
2007 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2009 static char buf
[1024];
2021 decode_ARM_machine_flags (e_flags
, buf
);
2025 switch (e_flags
& EF_FRV_CPU_MASK
)
2027 case EF_FRV_CPU_GENERIC
:
2031 strcat (buf
, ", fr???");
2034 case EF_FRV_CPU_FR300
:
2035 strcat (buf
, ", fr300");
2038 case EF_FRV_CPU_FR400
:
2039 strcat (buf
, ", fr400");
2041 case EF_FRV_CPU_FR405
:
2042 strcat (buf
, ", fr405");
2045 case EF_FRV_CPU_FR450
:
2046 strcat (buf
, ", fr450");
2049 case EF_FRV_CPU_FR500
:
2050 strcat (buf
, ", fr500");
2052 case EF_FRV_CPU_FR550
:
2053 strcat (buf
, ", fr550");
2056 case EF_FRV_CPU_SIMPLE
:
2057 strcat (buf
, ", simple");
2059 case EF_FRV_CPU_TOMCAT
:
2060 strcat (buf
, ", tomcat");
2066 if (e_flags
& EF_CPU32
)
2067 strcat (buf
, ", cpu32");
2068 if (e_flags
& EF_M68000
)
2069 strcat (buf
, ", m68000");
2073 if (e_flags
& EF_PPC_EMB
)
2074 strcat (buf
, ", emb");
2076 if (e_flags
& EF_PPC_RELOCATABLE
)
2077 strcat (buf
, ", relocatable");
2079 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2080 strcat (buf
, ", relocatable-lib");
2084 case EM_CYGNUS_V850
:
2085 switch (e_flags
& EF_V850_ARCH
)
2088 strcat (buf
, ", v850e1");
2091 strcat (buf
, ", v850e");
2094 strcat (buf
, ", v850");
2097 strcat (buf
, ", unknown v850 architecture variant");
2103 case EM_CYGNUS_M32R
:
2104 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2105 strcat (buf
, ", m32r");
2110 case EM_MIPS_RS3_LE
:
2111 if (e_flags
& EF_MIPS_NOREORDER
)
2112 strcat (buf
, ", noreorder");
2114 if (e_flags
& EF_MIPS_PIC
)
2115 strcat (buf
, ", pic");
2117 if (e_flags
& EF_MIPS_CPIC
)
2118 strcat (buf
, ", cpic");
2120 if (e_flags
& EF_MIPS_UCODE
)
2121 strcat (buf
, ", ugen_reserved");
2123 if (e_flags
& EF_MIPS_ABI2
)
2124 strcat (buf
, ", abi2");
2126 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2127 strcat (buf
, ", odk first");
2129 if (e_flags
& EF_MIPS_32BITMODE
)
2130 strcat (buf
, ", 32bitmode");
2132 switch ((e_flags
& EF_MIPS_MACH
))
2134 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2135 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2136 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2137 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2138 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2139 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2140 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2141 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2142 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2143 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2145 /* We simply ignore the field in this case to avoid confusion:
2146 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2149 default: strcat (buf
, ", unknown CPU"); break;
2152 switch ((e_flags
& EF_MIPS_ABI
))
2154 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2155 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2156 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2157 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2159 /* We simply ignore the field in this case to avoid confusion:
2160 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2161 This means it is likely to be an o32 file, but not for
2164 default: strcat (buf
, ", unknown ABI"); break;
2167 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2168 strcat (buf
, ", mdmx");
2170 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2171 strcat (buf
, ", mips16");
2173 switch ((e_flags
& EF_MIPS_ARCH
))
2175 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2176 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2177 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2178 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2179 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2180 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2181 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2182 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2183 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2184 default: strcat (buf
, ", unknown ISA"); break;
2190 switch ((e_flags
& EF_SH_MACH_MASK
))
2192 case EF_SH1
: strcat (buf
, ", sh1"); break;
2193 case EF_SH2
: strcat (buf
, ", sh2"); break;
2194 case EF_SH3
: strcat (buf
, ", sh3"); break;
2195 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2196 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2197 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2198 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2199 case EF_SH4
: strcat (buf
, ", sh4"); break;
2200 case EF_SH5
: strcat (buf
, ", sh5"); break;
2201 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2202 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2203 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2204 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2205 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2206 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2207 default: strcat (buf
, ", unknown ISA"); break;
2213 if (e_flags
& EF_SPARC_32PLUS
)
2214 strcat (buf
, ", v8+");
2216 if (e_flags
& EF_SPARC_SUN_US1
)
2217 strcat (buf
, ", ultrasparcI");
2219 if (e_flags
& EF_SPARC_SUN_US3
)
2220 strcat (buf
, ", ultrasparcIII");
2222 if (e_flags
& EF_SPARC_HAL_R1
)
2223 strcat (buf
, ", halr1");
2225 if (e_flags
& EF_SPARC_LEDATA
)
2226 strcat (buf
, ", ledata");
2228 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2229 strcat (buf
, ", tso");
2231 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2232 strcat (buf
, ", pso");
2234 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2235 strcat (buf
, ", rmo");
2239 switch (e_flags
& EF_PARISC_ARCH
)
2241 case EFA_PARISC_1_0
:
2242 strcpy (buf
, ", PA-RISC 1.0");
2244 case EFA_PARISC_1_1
:
2245 strcpy (buf
, ", PA-RISC 1.1");
2247 case EFA_PARISC_2_0
:
2248 strcpy (buf
, ", PA-RISC 2.0");
2253 if (e_flags
& EF_PARISC_TRAPNIL
)
2254 strcat (buf
, ", trapnil");
2255 if (e_flags
& EF_PARISC_EXT
)
2256 strcat (buf
, ", ext");
2257 if (e_flags
& EF_PARISC_LSB
)
2258 strcat (buf
, ", lsb");
2259 if (e_flags
& EF_PARISC_WIDE
)
2260 strcat (buf
, ", wide");
2261 if (e_flags
& EF_PARISC_NO_KABP
)
2262 strcat (buf
, ", no kabp");
2263 if (e_flags
& EF_PARISC_LAZYSWAP
)
2264 strcat (buf
, ", lazyswap");
2269 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2270 strcat (buf
, ", new calling convention");
2272 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2273 strcat (buf
, ", gnu calling convention");
2277 if ((e_flags
& EF_IA_64_ABI64
))
2278 strcat (buf
, ", 64-bit");
2280 strcat (buf
, ", 32-bit");
2281 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2282 strcat (buf
, ", reduced fp model");
2283 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2284 strcat (buf
, ", no function descriptors, constant gp");
2285 else if ((e_flags
& EF_IA_64_CONS_GP
))
2286 strcat (buf
, ", constant gp");
2287 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2288 strcat (buf
, ", absolute");
2292 if ((e_flags
& EF_VAX_NONPIC
))
2293 strcat (buf
, ", non-PIC");
2294 if ((e_flags
& EF_VAX_DFLOAT
))
2295 strcat (buf
, ", D-Float");
2296 if ((e_flags
& EF_VAX_GFLOAT
))
2297 strcat (buf
, ", G-Float");
2306 get_osabi_name (unsigned int osabi
)
2308 static char buff
[32];
2312 case ELFOSABI_NONE
: return "UNIX - System V";
2313 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2314 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2315 case ELFOSABI_LINUX
: return "UNIX - Linux";
2316 case ELFOSABI_HURD
: return "GNU/Hurd";
2317 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2318 case ELFOSABI_AIX
: return "UNIX - AIX";
2319 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2320 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2321 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2322 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2323 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2324 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2325 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2326 case ELFOSABI_AROS
: return "Amiga Research OS";
2327 case ELFOSABI_STANDALONE
: return _("Standalone App");
2328 case ELFOSABI_ARM
: return "ARM";
2330 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2336 get_arm_segment_type (unsigned long type
)
2350 get_mips_segment_type (unsigned long type
)
2354 case PT_MIPS_REGINFO
:
2356 case PT_MIPS_RTPROC
:
2358 case PT_MIPS_OPTIONS
:
2368 get_parisc_segment_type (unsigned long type
)
2372 case PT_HP_TLS
: return "HP_TLS";
2373 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2374 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2375 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2376 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2377 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2378 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2379 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2380 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2381 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2382 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2383 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2384 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2385 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2394 get_ia64_segment_type (unsigned long type
)
2398 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2399 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2400 case PT_HP_TLS
: return "HP_TLS";
2401 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2402 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2403 case PT_IA_64_HP_STACK
: return "HP_STACK";
2412 get_segment_type (unsigned long p_type
)
2414 static char buff
[32];
2418 case PT_NULL
: return "NULL";
2419 case PT_LOAD
: return "LOAD";
2420 case PT_DYNAMIC
: return "DYNAMIC";
2421 case PT_INTERP
: return "INTERP";
2422 case PT_NOTE
: return "NOTE";
2423 case PT_SHLIB
: return "SHLIB";
2424 case PT_PHDR
: return "PHDR";
2425 case PT_TLS
: return "TLS";
2427 case PT_GNU_EH_FRAME
:
2428 return "GNU_EH_FRAME";
2429 case PT_GNU_STACK
: return "GNU_STACK";
2430 case PT_GNU_RELRO
: return "GNU_RELRO";
2433 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2437 switch (elf_header
.e_machine
)
2440 result
= get_arm_segment_type (p_type
);
2443 case EM_MIPS_RS3_LE
:
2444 result
= get_mips_segment_type (p_type
);
2447 result
= get_parisc_segment_type (p_type
);
2450 result
= get_ia64_segment_type (p_type
);
2460 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2462 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2466 switch (elf_header
.e_machine
)
2469 result
= get_parisc_segment_type (p_type
);
2472 result
= get_ia64_segment_type (p_type
);
2482 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2485 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2492 get_mips_section_type_name (unsigned int sh_type
)
2496 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2497 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2498 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2499 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2500 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2501 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2502 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2503 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2504 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2505 case SHT_MIPS_RELD
: return "MIPS_RELD";
2506 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2507 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2508 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2509 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2510 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2511 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2512 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2513 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2514 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2515 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2516 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2517 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2518 case SHT_MIPS_LINE
: return "MIPS_LINE";
2519 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2520 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2521 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2522 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2523 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2524 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2525 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2526 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2527 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2528 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2529 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2530 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2531 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2532 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2533 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2534 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2542 get_parisc_section_type_name (unsigned int sh_type
)
2546 case SHT_PARISC_EXT
: return "PARISC_EXT";
2547 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2548 case SHT_PARISC_DOC
: return "PARISC_DOC";
2556 get_ia64_section_type_name (unsigned int sh_type
)
2558 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2559 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2560 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2564 case SHT_IA_64_EXT
: return "IA_64_EXT";
2565 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2566 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2574 get_x86_64_section_type_name (unsigned int sh_type
)
2578 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2586 get_arm_section_type_name (unsigned int sh_type
)
2599 get_section_type_name (unsigned int sh_type
)
2601 static char buff
[32];
2605 case SHT_NULL
: return "NULL";
2606 case SHT_PROGBITS
: return "PROGBITS";
2607 case SHT_SYMTAB
: return "SYMTAB";
2608 case SHT_STRTAB
: return "STRTAB";
2609 case SHT_RELA
: return "RELA";
2610 case SHT_HASH
: return "HASH";
2611 case SHT_DYNAMIC
: return "DYNAMIC";
2612 case SHT_NOTE
: return "NOTE";
2613 case SHT_NOBITS
: return "NOBITS";
2614 case SHT_REL
: return "REL";
2615 case SHT_SHLIB
: return "SHLIB";
2616 case SHT_DYNSYM
: return "DYNSYM";
2617 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2618 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2619 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2620 case SHT_GROUP
: return "GROUP";
2621 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2622 case SHT_GNU_verdef
: return "VERDEF";
2623 case SHT_GNU_verneed
: return "VERNEED";
2624 case SHT_GNU_versym
: return "VERSYM";
2625 case 0x6ffffff0: return "VERSYM";
2626 case 0x6ffffffc: return "VERDEF";
2627 case 0x7ffffffd: return "AUXILIARY";
2628 case 0x7fffffff: return "FILTER";
2629 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2632 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2636 switch (elf_header
.e_machine
)
2639 case EM_MIPS_RS3_LE
:
2640 result
= get_mips_section_type_name (sh_type
);
2643 result
= get_parisc_section_type_name (sh_type
);
2646 result
= get_ia64_section_type_name (sh_type
);
2649 result
= get_x86_64_section_type_name (sh_type
);
2652 result
= get_arm_section_type_name (sh_type
);
2662 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2664 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2665 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2666 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2667 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2669 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2675 #define OPTION_DEBUG_DUMP 512
2677 static struct option options
[] =
2679 {"all", no_argument
, 0, 'a'},
2680 {"file-header", no_argument
, 0, 'h'},
2681 {"program-headers", no_argument
, 0, 'l'},
2682 {"headers", no_argument
, 0, 'e'},
2683 {"histogram", no_argument
, 0, 'I'},
2684 {"segments", no_argument
, 0, 'l'},
2685 {"sections", no_argument
, 0, 'S'},
2686 {"section-headers", no_argument
, 0, 'S'},
2687 {"section-groups", no_argument
, 0, 'g'},
2688 {"full-section-name",no_argument
, 0, 'N'},
2689 {"symbols", no_argument
, 0, 's'},
2690 {"syms", no_argument
, 0, 's'},
2691 {"relocs", no_argument
, 0, 'r'},
2692 {"notes", no_argument
, 0, 'n'},
2693 {"dynamic", no_argument
, 0, 'd'},
2694 {"arch-specific", no_argument
, 0, 'A'},
2695 {"version-info", no_argument
, 0, 'V'},
2696 {"use-dynamic", no_argument
, 0, 'D'},
2697 {"hex-dump", required_argument
, 0, 'x'},
2698 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2699 {"unwind", no_argument
, 0, 'u'},
2700 #ifdef SUPPORT_DISASSEMBLY
2701 {"instruction-dump", required_argument
, 0, 'i'},
2704 {"version", no_argument
, 0, 'v'},
2705 {"wide", no_argument
, 0, 'W'},
2706 {"help", no_argument
, 0, 'H'},
2707 {0, no_argument
, 0, 0}
2713 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2714 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2715 fprintf (stdout
, _(" Options are:\n\
2716 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2717 -h --file-header Display the ELF file header\n\
2718 -l --program-headers Display the program headers\n\
2719 --segments An alias for --program-headers\n\
2720 -S --section-headers Display the sections' header\n\
2721 --sections An alias for --section-headers\n\
2722 -g --section-groups Display the section groups\n\
2723 -N --full-section-name\n\
2724 Display the full section name\n\
2725 -e --headers Equivalent to: -h -l -S\n\
2726 -s --syms Display the symbol table\n\
2727 --symbols An alias for --syms\n\
2728 -n --notes Display the core notes (if present)\n\
2729 -r --relocs Display the relocations (if present)\n\
2730 -u --unwind Display the unwind info (if present)\n\
2731 -d --dynamic Display the dynamic section (if present)\n\
2732 -V --version-info Display the version sections (if present)\n\
2733 -A --arch-specific Display architecture specific information (if any).\n\
2734 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2735 -x --hex-dump=<number> Dump the contents of section <number>\n\
2736 -w[liaprmfFsoR] or\n\
2737 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2738 Display the contents of DWARF2 debug sections\n"));
2739 #ifdef SUPPORT_DISASSEMBLY
2740 fprintf (stdout
, _("\
2741 -i --instruction-dump=<number>\n\
2742 Disassemble the contents of section <number>\n"));
2744 fprintf (stdout
, _("\
2745 -I --histogram Display histogram of bucket list lengths\n\
2746 -W --wide Allow output width to exceed 80 characters\n\
2747 -H --help Display this information\n\
2748 -v --version Display the version number of readelf\n"));
2749 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2754 /* Record the fact that the user wants the contents of section number
2755 SECTION to be displayed using the method(s) encoded as flags bits
2756 in TYPE. Note, TYPE can be zero if we are creating the array for
2760 request_dump (unsigned int section
, int type
)
2762 if (section
>= num_dump_sects
)
2764 char *new_dump_sects
;
2766 new_dump_sects
= calloc (section
+ 1, 1);
2768 if (new_dump_sects
== NULL
)
2769 error (_("Out of memory allocating dump request table."));
2772 /* Copy current flag settings. */
2773 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2777 dump_sects
= new_dump_sects
;
2778 num_dump_sects
= section
+ 1;
2783 dump_sects
[section
] |= type
;
2789 parse_args (int argc
, char **argv
)
2796 while ((c
= getopt_long
2797 (argc
, argv
, "ersuahnldSDAINgw::x:i:vVWH", options
, NULL
)) != EOF
)
2818 do_section_groups
++;
2826 do_section_groups
++;
2829 do_full_section_name
++;
2871 section
= strtoul (optarg
, & cp
, 0);
2872 if (! *cp
&& section
>= 0)
2874 request_dump (section
, HEX_DUMP
);
2884 unsigned int index
= 0;
2888 while (optarg
[index
])
2889 switch (optarg
[index
++])
2898 do_debug_abbrevs
= 1;
2908 do_debug_pubnames
= 1;
2912 do_debug_aranges
= 1;
2916 do_debug_ranges
= 1;
2920 do_debug_frames_interp
= 1;
2922 do_debug_frames
= 1;
2927 do_debug_macinfo
= 1;
2941 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2946 case OPTION_DEBUG_DUMP
:
2954 const char * option
;
2957 debug_dump_long_opts
;
2959 debug_dump_long_opts opts_table
[] =
2961 /* Please keep this table alpha- sorted. */
2962 { "Ranges", & do_debug_ranges
},
2963 { "abbrev", & do_debug_abbrevs
},
2964 { "aranges", & do_debug_aranges
},
2965 { "frames", & do_debug_frames
},
2966 { "frames-interp", & do_debug_frames_interp
},
2967 { "info", & do_debug_info
},
2968 { "line", & do_debug_lines
},
2969 { "loc", & do_debug_loc
},
2970 { "macro", & do_debug_macinfo
},
2971 { "pubnames", & do_debug_pubnames
},
2972 /* This entry is for compatability
2973 with earlier versions of readelf. */
2974 { "ranges", & do_debug_aranges
},
2975 { "str", & do_debug_str
},
2986 debug_dump_long_opts
* entry
;
2988 for (entry
= opts_table
; entry
->option
; entry
++)
2990 size_t len
= strlen (entry
->option
);
2992 if (strneq (p
, entry
->option
, len
)
2993 && (p
[len
] == ',' || p
[len
] == '\0'))
2995 * entry
->variable
= 1;
2997 /* The --debug-dump=frames-interp option also
2998 enables the --debug-dump=frames option. */
2999 if (do_debug_frames_interp
)
3000 do_debug_frames
= 1;
3007 if (entry
->option
== NULL
)
3009 warn (_("Unrecognized debug option '%s'\n"), p
);
3010 p
= strchr (p
, ',');
3020 #ifdef SUPPORT_DISASSEMBLY
3023 section
= strtoul (optarg
, & cp
, 0);
3024 if (! *cp
&& section
>= 0)
3026 request_dump (section
, DISASS_DUMP
);
3032 print_version (program_name
);
3042 /* xgettext:c-format */
3043 error (_("Invalid option '-%c'\n"), c
);
3050 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3051 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3052 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3053 && !do_section_groups
)
3057 warn (_("Nothing to do.\n"));
3063 get_elf_class (unsigned int elf_class
)
3065 static char buff
[32];
3069 case ELFCLASSNONE
: return _("none");
3070 case ELFCLASS32
: return "ELF32";
3071 case ELFCLASS64
: return "ELF64";
3073 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3079 get_data_encoding (unsigned int encoding
)
3081 static char buff
[32];
3085 case ELFDATANONE
: return _("none");
3086 case ELFDATA2LSB
: return _("2's complement, little endian");
3087 case ELFDATA2MSB
: return _("2's complement, big endian");
3089 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3094 /* Decode the data held in 'elf_header'. */
3097 process_file_header (void)
3099 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3100 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3101 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3102 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3105 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3113 printf (_("ELF Header:\n"));
3114 printf (_(" Magic: "));
3115 for (i
= 0; i
< EI_NIDENT
; i
++)
3116 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3118 printf (_(" Class: %s\n"),
3119 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3120 printf (_(" Data: %s\n"),
3121 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3122 printf (_(" Version: %d %s\n"),
3123 elf_header
.e_ident
[EI_VERSION
],
3124 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3126 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3129 printf (_(" OS/ABI: %s\n"),
3130 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3131 printf (_(" ABI Version: %d\n"),
3132 elf_header
.e_ident
[EI_ABIVERSION
]);
3133 printf (_(" Type: %s\n"),
3134 get_file_type (elf_header
.e_type
));
3135 printf (_(" Machine: %s\n"),
3136 get_machine_name (elf_header
.e_machine
));
3137 printf (_(" Version: 0x%lx\n"),
3138 (unsigned long) elf_header
.e_version
);
3140 printf (_(" Entry point address: "));
3141 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3142 printf (_("\n Start of program headers: "));
3143 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3144 printf (_(" (bytes into file)\n Start of section headers: "));
3145 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3146 printf (_(" (bytes into file)\n"));
3148 printf (_(" Flags: 0x%lx%s\n"),
3149 (unsigned long) elf_header
.e_flags
,
3150 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3151 printf (_(" Size of this header: %ld (bytes)\n"),
3152 (long) elf_header
.e_ehsize
);
3153 printf (_(" Size of program headers: %ld (bytes)\n"),
3154 (long) elf_header
.e_phentsize
);
3155 printf (_(" Number of program headers: %ld\n"),
3156 (long) elf_header
.e_phnum
);
3157 printf (_(" Size of section headers: %ld (bytes)\n"),
3158 (long) elf_header
.e_shentsize
);
3159 printf (_(" Number of section headers: %ld"),
3160 (long) elf_header
.e_shnum
);
3161 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3162 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3163 putc ('\n', stdout
);
3164 printf (_(" Section header string table index: %ld"),
3165 (long) elf_header
.e_shstrndx
);
3166 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3167 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3168 putc ('\n', stdout
);
3171 if (section_headers
!= NULL
)
3173 if (elf_header
.e_shnum
== 0)
3174 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3175 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3176 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3177 free (section_headers
);
3178 section_headers
= NULL
;
3186 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3188 Elf32_External_Phdr
*phdrs
;
3189 Elf32_External_Phdr
*external
;
3190 Elf_Internal_Phdr
*internal
;
3193 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3194 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3195 _("program headers"));
3199 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3200 i
< elf_header
.e_phnum
;
3201 i
++, internal
++, external
++)
3203 internal
->p_type
= BYTE_GET (external
->p_type
);
3204 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3205 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3206 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3207 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3208 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3209 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3210 internal
->p_align
= BYTE_GET (external
->p_align
);
3219 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3221 Elf64_External_Phdr
*phdrs
;
3222 Elf64_External_Phdr
*external
;
3223 Elf_Internal_Phdr
*internal
;
3226 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3227 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3228 _("program headers"));
3232 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3233 i
< elf_header
.e_phnum
;
3234 i
++, internal
++, external
++)
3236 internal
->p_type
= BYTE_GET (external
->p_type
);
3237 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3238 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3239 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3240 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3241 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3242 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3243 internal
->p_align
= BYTE_GET (external
->p_align
);
3251 /* Returns 1 if the program headers were read into `program_headers'. */
3254 get_program_headers (FILE *file
)
3256 Elf_Internal_Phdr
*phdrs
;
3258 /* Check cache of prior read. */
3259 if (program_headers
!= NULL
)
3262 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3266 error (_("Out of memory\n"));
3271 ? get_32bit_program_headers (file
, phdrs
)
3272 : get_64bit_program_headers (file
, phdrs
))
3274 program_headers
= phdrs
;
3282 /* Returns 1 if the program headers were loaded. */
3285 process_program_headers (FILE *file
)
3287 Elf_Internal_Phdr
*segment
;
3290 if (elf_header
.e_phnum
== 0)
3293 printf (_("\nThere are no program headers in this file.\n"));
3297 if (do_segments
&& !do_header
)
3299 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3300 printf (_("Entry point "));
3301 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3302 printf (_("\nThere are %d program headers, starting at offset "),
3303 elf_header
.e_phnum
);
3304 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3308 if (! get_program_headers (file
))
3313 if (elf_header
.e_phnum
> 1)
3314 printf (_("\nProgram Headers:\n"));
3316 printf (_("\nProgram Headers:\n"));
3320 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3323 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3327 (_(" Type Offset VirtAddr PhysAddr\n"));
3329 (_(" FileSiz MemSiz Flags Align\n"));
3336 for (i
= 0, segment
= program_headers
;
3337 i
< elf_header
.e_phnum
;
3342 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3346 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3347 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3348 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3349 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3350 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3352 (segment
->p_flags
& PF_R
? 'R' : ' '),
3353 (segment
->p_flags
& PF_W
? 'W' : ' '),
3354 (segment
->p_flags
& PF_X
? 'E' : ' '));
3355 printf ("%#lx", (unsigned long) segment
->p_align
);
3359 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3360 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3363 print_vma (segment
->p_offset
, FULL_HEX
);
3367 print_vma (segment
->p_vaddr
, FULL_HEX
);
3369 print_vma (segment
->p_paddr
, FULL_HEX
);
3372 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3373 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3376 print_vma (segment
->p_filesz
, FULL_HEX
);
3380 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3381 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3384 print_vma (segment
->p_offset
, FULL_HEX
);
3388 (segment
->p_flags
& PF_R
? 'R' : ' '),
3389 (segment
->p_flags
& PF_W
? 'W' : ' '),
3390 (segment
->p_flags
& PF_X
? 'E' : ' '));
3392 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3393 printf ("%#lx", (unsigned long) segment
->p_align
);
3396 print_vma (segment
->p_align
, PREFIX_HEX
);
3401 print_vma (segment
->p_offset
, FULL_HEX
);
3403 print_vma (segment
->p_vaddr
, FULL_HEX
);
3405 print_vma (segment
->p_paddr
, FULL_HEX
);
3407 print_vma (segment
->p_filesz
, FULL_HEX
);
3409 print_vma (segment
->p_memsz
, FULL_HEX
);
3411 (segment
->p_flags
& PF_R
? 'R' : ' '),
3412 (segment
->p_flags
& PF_W
? 'W' : ' '),
3413 (segment
->p_flags
& PF_X
? 'E' : ' '));
3414 print_vma (segment
->p_align
, HEX
);
3418 switch (segment
->p_type
)
3422 error (_("more than one dynamic segment\n"));
3424 /* Try to locate the .dynamic section. If there is
3425 a section header table, we can easily locate it. */
3426 if (section_headers
!= NULL
)
3428 Elf_Internal_Shdr
*sec
;
3430 sec
= find_section (".dynamic");
3431 if (sec
== NULL
|| sec
->sh_size
== 0)
3433 error (_("no .dynamic section in the dynamic segment"));
3437 dynamic_addr
= sec
->sh_offset
;
3438 dynamic_size
= sec
->sh_size
;
3440 if (dynamic_addr
< segment
->p_offset
3441 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3442 warn (_("the .dynamic section is not contained within the dynamic segment"));
3443 else if (dynamic_addr
> segment
->p_offset
)
3444 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3448 /* Otherwise, we can only assume that the .dynamic
3449 section is the first section in the DYNAMIC segment. */
3450 dynamic_addr
= segment
->p_offset
;
3451 dynamic_size
= segment
->p_filesz
;
3456 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3458 error (_("Unable to find program interpreter name\n"));
3461 program_interpreter
[0] = 0;
3462 fscanf (file
, "%63s", program_interpreter
);
3465 printf (_("\n [Requesting program interpreter: %s]"),
3466 program_interpreter
);
3472 putc ('\n', stdout
);
3475 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3477 printf (_("\n Section to Segment mapping:\n"));
3478 printf (_(" Segment Sections...\n"));
3480 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3483 Elf_Internal_Shdr
*section
;
3485 segment
= program_headers
+ i
;
3486 section
= section_headers
;
3488 printf (" %2.2d ", i
);
3490 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3492 if (section
->sh_size
> 0
3493 /* Compare allocated sections by VMA, unallocated
3494 sections by file offset. */
3495 && (section
->sh_flags
& SHF_ALLOC
3496 ? (section
->sh_addr
>= segment
->p_vaddr
3497 && section
->sh_addr
+ section
->sh_size
3498 <= segment
->p_vaddr
+ segment
->p_memsz
)
3499 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3500 && (section
->sh_offset
+ section
->sh_size
3501 <= segment
->p_offset
+ segment
->p_filesz
)))
3502 /* .tbss is special. It doesn't contribute memory space
3503 to normal segments. */
3504 && (!((section
->sh_flags
& SHF_TLS
) != 0
3505 && section
->sh_type
== SHT_NOBITS
)
3506 || segment
->p_type
== PT_TLS
))
3507 printf ("%s ", SECTION_NAME (section
));
3518 /* Find the file offset corresponding to VMA by using the program headers. */
3521 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3523 Elf_Internal_Phdr
*seg
;
3525 if (! get_program_headers (file
))
3527 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3531 for (seg
= program_headers
;
3532 seg
< program_headers
+ elf_header
.e_phnum
;
3535 if (seg
->p_type
!= PT_LOAD
)
3538 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3539 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3540 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3543 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3550 get_32bit_section_headers (FILE *file
, unsigned int num
)
3552 Elf32_External_Shdr
*shdrs
;
3553 Elf_Internal_Shdr
*internal
;
3556 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3557 elf_header
.e_shentsize
, num
, _("section headers"));
3561 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3563 if (section_headers
== NULL
)
3565 error (_("Out of memory\n"));
3569 for (i
= 0, internal
= section_headers
;
3573 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3574 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3575 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3576 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3577 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3578 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3579 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3580 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3581 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3582 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3591 get_64bit_section_headers (FILE *file
, unsigned int num
)
3593 Elf64_External_Shdr
*shdrs
;
3594 Elf_Internal_Shdr
*internal
;
3597 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3598 elf_header
.e_shentsize
, num
, _("section headers"));
3602 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3604 if (section_headers
== NULL
)
3606 error (_("Out of memory\n"));
3610 for (i
= 0, internal
= section_headers
;
3614 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3615 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3616 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3617 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3618 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3619 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3620 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3621 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3622 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3623 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3631 static Elf_Internal_Sym
*
3632 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3634 unsigned long number
;
3635 Elf32_External_Sym
*esyms
;
3636 Elf_External_Sym_Shndx
*shndx
;
3637 Elf_Internal_Sym
*isyms
;
3638 Elf_Internal_Sym
*psym
;
3641 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3647 if (symtab_shndx_hdr
!= NULL
3648 && (symtab_shndx_hdr
->sh_link
3649 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3651 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3652 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3660 number
= section
->sh_size
/ section
->sh_entsize
;
3661 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3665 error (_("Out of memory\n"));
3672 for (j
= 0, psym
= isyms
;
3676 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3677 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3678 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3679 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3680 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3682 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3683 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3684 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3694 static Elf_Internal_Sym
*
3695 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3697 unsigned long number
;
3698 Elf64_External_Sym
*esyms
;
3699 Elf_External_Sym_Shndx
*shndx
;
3700 Elf_Internal_Sym
*isyms
;
3701 Elf_Internal_Sym
*psym
;
3704 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3710 if (symtab_shndx_hdr
!= NULL
3711 && (symtab_shndx_hdr
->sh_link
3712 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3714 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3715 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3723 number
= section
->sh_size
/ section
->sh_entsize
;
3724 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3728 error (_("Out of memory\n"));
3735 for (j
= 0, psym
= isyms
;
3739 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3740 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3741 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3742 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3743 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3745 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3746 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3747 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3758 get_elf_section_flags (bfd_vma sh_flags
)
3760 static char buff
[33];
3767 flag
= sh_flags
& - sh_flags
;
3772 case SHF_WRITE
: *p
= 'W'; break;
3773 case SHF_ALLOC
: *p
= 'A'; break;
3774 case SHF_EXECINSTR
: *p
= 'X'; break;
3775 case SHF_MERGE
: *p
= 'M'; break;
3776 case SHF_STRINGS
: *p
= 'S'; break;
3777 case SHF_INFO_LINK
: *p
= 'I'; break;
3778 case SHF_LINK_ORDER
: *p
= 'L'; break;
3779 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3780 case SHF_GROUP
: *p
= 'G'; break;
3781 case SHF_TLS
: *p
= 'T'; break;
3784 if (flag
& SHF_MASKOS
)
3787 sh_flags
&= ~ SHF_MASKOS
;
3789 else if (flag
& SHF_MASKPROC
)
3792 sh_flags
&= ~ SHF_MASKPROC
;
3806 process_section_headers (FILE *file
)
3808 Elf_Internal_Shdr
*section
;
3811 section_headers
= NULL
;
3813 if (elf_header
.e_shnum
== 0)
3816 printf (_("\nThere are no sections in this file.\n"));
3821 if (do_sections
&& !do_header
)
3822 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3823 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3827 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3830 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3833 /* Read in the string table, so that we have names to display. */
3834 if (SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
3836 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3838 if (section
->sh_size
!= 0)
3840 string_table
= get_data (NULL
, file
, section
->sh_offset
,
3841 1, section
->sh_size
, _("string table"));
3843 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
3847 /* Scan the sections for the dynamic symbol table
3848 and dynamic string table and debug sections. */
3849 dynamic_symbols
= NULL
;
3850 dynamic_strings
= NULL
;
3851 dynamic_syminfo
= NULL
;
3852 symtab_shndx_hdr
= NULL
;
3854 eh_addr_size
= is_32bit_elf
? 4 : 8;
3855 switch (elf_header
.e_machine
)
3858 case EM_MIPS_RS3_LE
:
3859 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
3860 FDE addresses. However, the ABI also has a semi-official ILP32
3861 variant for which the normal FDE address size rules apply.
3863 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
3864 section, where XX is the size of longs in bits. Unfortunately,
3865 earlier compilers provided no way of distinguishing ILP32 objects
3866 from LP64 objects, so if there's any doubt, we should assume that
3867 the official LP64 form is being used. */
3868 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
3869 && find_section (".gcc_compiled_long32") == NULL
)
3874 for (i
= 0, section
= section_headers
;
3875 i
< elf_header
.e_shnum
;
3878 char *name
= SECTION_NAME (section
);
3880 if (section
->sh_type
== SHT_DYNSYM
)
3882 if (dynamic_symbols
!= NULL
)
3884 error (_("File contains multiple dynamic symbol tables\n"));
3888 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3889 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3891 else if (section
->sh_type
== SHT_STRTAB
3892 && streq (name
, ".dynstr"))
3894 if (dynamic_strings
!= NULL
)
3896 error (_("File contains multiple dynamic string tables\n"));
3900 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
3901 1, section
->sh_size
, _("dynamic strings"));
3902 dynamic_strings_length
= section
->sh_size
;
3904 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3906 if (symtab_shndx_hdr
!= NULL
)
3908 error (_("File contains multiple symtab shndx tables\n"));
3911 symtab_shndx_hdr
= section
;
3913 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3914 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3915 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3916 || do_debug_loc
|| do_debug_ranges
)
3917 && strneq (name
, ".debug_", 7))
3922 || (do_debug_info
&& streq (name
, "info"))
3923 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
3924 || (do_debug_lines
&& streq (name
, "line"))
3925 || (do_debug_pubnames
&& streq (name
, "pubnames"))
3926 || (do_debug_aranges
&& streq (name
, "aranges"))
3927 || (do_debug_ranges
&& streq (name
, "ranges"))
3928 || (do_debug_frames
&& streq (name
, "frame"))
3929 || (do_debug_macinfo
&& streq (name
, "macinfo"))
3930 || (do_debug_str
&& streq (name
, "str"))
3931 || (do_debug_loc
&& streq (name
, "loc"))
3933 request_dump (i
, DEBUG_DUMP
);
3935 /* linkonce section to be combined with .debug_info at link time. */
3936 else if ((do_debugging
|| do_debug_info
)
3937 && strneq (name
, ".gnu.linkonce.wi.", 17))
3938 request_dump (i
, DEBUG_DUMP
);
3939 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
3940 request_dump (i
, DEBUG_DUMP
);
3946 if (elf_header
.e_shnum
> 1)
3947 printf (_("\nSection Headers:\n"));
3949 printf (_("\nSection Header:\n"));
3953 if (do_full_section_name
)
3955 printf (_(" [Nr] Name\n"));
3956 printf (_(" Type Addr Off Size ES Flg Lk Inf Al\n"));
3960 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3964 if (do_full_section_name
)
3966 printf (_(" [Nr] Name\n"));
3967 printf (_(" Type Address Off Size ES Flg Lk Inf Al\n"));
3971 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3975 if (do_full_section_name
)
3977 printf (_(" [Nr] Name\n"));
3978 printf (_(" Flags Type Address Offset\n"));
3979 printf (_(" Size EntSize Link Info Align\n"));
3983 printf (_(" [Nr] Name Type Address Offset\n"));
3984 printf (_(" Size EntSize Flags Link Info Align\n"));
3988 for (i
= 0, section
= section_headers
;
3989 i
< elf_header
.e_shnum
;
3992 if (do_full_section_name
)
3994 printf (" [%2u] %s\n",
3995 SECTION_HEADER_NUM (i
),
3996 SECTION_NAME (section
));
3997 if (is_32bit_elf
|| do_wide
)
3998 printf (" %-15.15s ",
3999 get_section_type_name (section
->sh_type
));
4002 printf (" [%2u] %-17.17s %-15.15s ",
4003 SECTION_HEADER_NUM (i
),
4004 SECTION_NAME (section
),
4005 get_section_type_name (section
->sh_type
));
4009 print_vma (section
->sh_addr
, LONG_HEX
);
4011 printf ( " %6.6lx %6.6lx %2.2lx",
4012 (unsigned long) section
->sh_offset
,
4013 (unsigned long) section
->sh_size
,
4014 (unsigned long) section
->sh_entsize
);
4016 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4018 printf ("%2ld %3lu %2ld\n",
4019 (unsigned long) section
->sh_link
,
4020 (unsigned long) section
->sh_info
,
4021 (unsigned long) section
->sh_addralign
);
4025 print_vma (section
->sh_addr
, LONG_HEX
);
4027 if ((long) section
->sh_offset
== section
->sh_offset
)
4028 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4032 print_vma (section
->sh_offset
, LONG_HEX
);
4035 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4036 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4040 print_vma (section
->sh_size
, LONG_HEX
);
4043 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4044 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4048 print_vma (section
->sh_entsize
, LONG_HEX
);
4051 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4053 printf ("%2ld %3lu ",
4054 (unsigned long) section
->sh_link
,
4055 (unsigned long) section
->sh_info
);
4057 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4058 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4061 print_vma (section
->sh_addralign
, DEC
);
4065 else if (do_full_section_name
)
4067 printf (" %-15.15s %-15.15s ",
4068 get_elf_section_flags (section
->sh_flags
),
4069 get_section_type_name (section
->sh_type
));
4071 print_vma (section
->sh_addr
, LONG_HEX
);
4072 if ((long) section
->sh_offset
== section
->sh_offset
)
4073 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4077 print_vma (section
->sh_offset
, LONG_HEX
);
4080 print_vma (section
->sh_size
, LONG_HEX
);
4082 print_vma (section
->sh_entsize
, LONG_HEX
);
4084 printf (" %2ld %3lu %ld\n",
4085 (unsigned long) section
->sh_link
,
4086 (unsigned long) section
->sh_info
,
4087 (unsigned long) section
->sh_addralign
);
4092 print_vma (section
->sh_addr
, LONG_HEX
);
4093 if ((long) section
->sh_offset
== section
->sh_offset
)
4094 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4098 print_vma (section
->sh_offset
, LONG_HEX
);
4101 print_vma (section
->sh_size
, LONG_HEX
);
4103 print_vma (section
->sh_entsize
, LONG_HEX
);
4105 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4107 printf (" %2ld %3lu %ld\n",
4108 (unsigned long) section
->sh_link
,
4109 (unsigned long) section
->sh_info
,
4110 (unsigned long) section
->sh_addralign
);
4114 printf (_("Key to Flags:\n\
4115 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4116 I (info), L (link order), G (group), x (unknown)\n\
4117 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4123 get_group_flags (unsigned int flags
)
4125 static char buff
[32];
4132 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4139 process_section_groups (FILE *file
)
4141 Elf_Internal_Shdr
*section
;
4143 struct group
*group
;
4144 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4145 Elf_Internal_Sym
*symtab
;
4149 /* Don't process section groups unless needed. */
4150 if (!do_unwind
&& !do_section_groups
)
4153 if (elf_header
.e_shnum
== 0)
4155 if (do_section_groups
)
4156 printf (_("\nThere are no sections in this file.\n"));
4161 if (section_headers
== NULL
)
4163 error (_("Section headers are not available!\n"));
4167 section_headers_groups
= calloc (elf_header
.e_shnum
,
4168 sizeof (struct group
*));
4170 if (section_headers_groups
== NULL
)
4172 error (_("Out of memory\n"));
4176 /* Scan the sections for the group section. */
4178 for (i
= 0, section
= section_headers
;
4179 i
< elf_header
.e_shnum
;
4181 if (section
->sh_type
== SHT_GROUP
)
4184 if (group_count
== 0)
4186 if (do_section_groups
)
4187 printf (_("\nThere are no section groups in this file.\n"));
4192 section_groups
= calloc (group_count
, sizeof (struct group
));
4194 if (section_groups
== NULL
)
4196 error (_("Out of memory\n"));
4205 for (i
= 0, section
= section_headers
, group
= section_groups
;
4206 i
< elf_header
.e_shnum
;
4209 if (section
->sh_type
== SHT_GROUP
)
4211 char *name
= SECTION_NAME (section
);
4213 unsigned char *start
, *indices
;
4214 unsigned int entry
, j
, size
;
4215 Elf_Internal_Shdr
*sec
;
4216 Elf_Internal_Sym
*sym
;
4218 /* Get the symbol table. */
4219 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4220 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4223 error (_("Bad sh_link in group section `%s'\n"), name
);
4227 if (symtab_sec
!= sec
)
4232 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4235 sym
= symtab
+ section
->sh_info
;
4237 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4239 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4242 error (_("Bad sh_info in group section `%s'\n"), name
);
4246 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4255 /* Get the string table. */
4256 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4257 >= elf_header
.e_shnum
)
4266 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4271 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4272 1, strtab_sec
->sh_size
,
4274 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4276 group_name
= sym
->st_name
< strtab_size
4277 ? strtab
+ sym
->st_name
: "<corrupt>";
4280 start
= get_data (NULL
, file
, section
->sh_offset
,
4281 1, section
->sh_size
, _("section data"));
4284 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4285 entry
= byte_get (indices
, 4);
4288 if (do_section_groups
)
4290 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4291 get_group_flags (entry
), i
, name
, group_name
, size
);
4293 printf (_(" [Index] Name\n"));
4296 group
->group_index
= i
;
4298 for (j
= 0; j
< size
; j
++)
4300 struct group_list
*g
;
4302 entry
= byte_get (indices
, 4);
4305 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4307 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4308 entry
, i
, elf_header
.e_shnum
- 1);
4311 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4313 error (_("invalid section [%5u] in group section [%5u]\n"),
4318 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4323 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4325 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4330 /* Intel C/C++ compiler may put section 0 in a
4331 section group. We just warn it the first time
4332 and ignore it afterwards. */
4333 static int warned
= 0;
4336 error (_("section 0 in group section [%5u]\n"),
4337 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4343 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4346 if (do_section_groups
)
4348 sec
= SECTION_HEADER (entry
);
4349 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4352 g
= xmalloc (sizeof (struct group_list
));
4353 g
->section_index
= entry
;
4354 g
->next
= group
->root
;
4378 } dynamic_relocations
[] =
4380 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4381 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4382 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4385 /* Process the reloc section. */
4388 process_relocs (FILE *file
)
4390 unsigned long rel_size
;
4391 unsigned long rel_offset
;
4397 if (do_using_dynamic
)
4401 int has_dynamic_reloc
;
4404 has_dynamic_reloc
= 0;
4406 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4408 is_rela
= dynamic_relocations
[i
].rela
;
4409 name
= dynamic_relocations
[i
].name
;
4410 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4411 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4413 has_dynamic_reloc
|= rel_size
;
4415 if (is_rela
== UNKNOWN
)
4417 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4418 switch (dynamic_info
[DT_PLTREL
])
4432 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4433 name
, rel_offset
, rel_size
);
4435 dump_relocations (file
,
4436 offset_from_vma (file
, rel_offset
, rel_size
),
4438 dynamic_symbols
, num_dynamic_syms
,
4439 dynamic_strings
, dynamic_strings_length
, is_rela
);
4443 if (! has_dynamic_reloc
)
4444 printf (_("\nThere are no dynamic relocations in this file.\n"));
4448 Elf_Internal_Shdr
*section
;
4452 for (i
= 0, section
= section_headers
;
4453 i
< elf_header
.e_shnum
;
4456 if ( section
->sh_type
!= SHT_RELA
4457 && section
->sh_type
!= SHT_REL
)
4460 rel_offset
= section
->sh_offset
;
4461 rel_size
= section
->sh_size
;
4465 Elf_Internal_Shdr
*strsec
;
4468 printf (_("\nRelocation section "));
4470 if (string_table
== NULL
)
4471 printf ("%d", section
->sh_name
);
4473 printf (_("'%s'"), SECTION_NAME (section
));
4475 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4476 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4478 is_rela
= section
->sh_type
== SHT_RELA
;
4480 if (section
->sh_link
4481 && SECTION_HEADER_INDEX (section
->sh_link
)
4482 < elf_header
.e_shnum
)
4484 Elf_Internal_Shdr
*symsec
;
4485 Elf_Internal_Sym
*symtab
;
4486 unsigned long nsyms
;
4487 unsigned long strtablen
= 0;
4488 char *strtab
= NULL
;
4490 symsec
= SECTION_HEADER (section
->sh_link
);
4491 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4492 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4497 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4498 < elf_header
.e_shnum
)
4500 strsec
= SECTION_HEADER (symsec
->sh_link
);
4502 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4505 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4508 dump_relocations (file
, rel_offset
, rel_size
,
4509 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4515 dump_relocations (file
, rel_offset
, rel_size
,
4516 NULL
, 0, NULL
, 0, is_rela
);
4523 printf (_("\nThere are no relocations in this file.\n"));
4529 /* Process the unwind section. */
4531 #include "unwind-ia64.h"
4533 /* An absolute address consists of a section and an offset. If the
4534 section is NULL, the offset itself is the address, otherwise, the
4535 address equals to LOAD_ADDRESS(section) + offset. */
4539 unsigned short section
;
4543 struct ia64_unw_aux_info
4545 struct ia64_unw_table_entry
4547 struct absaddr start
;
4549 struct absaddr info
;
4551 *table
; /* Unwind table. */
4552 unsigned long table_len
; /* Length of unwind table. */
4553 unsigned char *info
; /* Unwind info. */
4554 unsigned long info_size
; /* Size of unwind info. */
4555 bfd_vma info_addr
; /* starting address of unwind info. */
4556 bfd_vma seg_base
; /* Starting address of segment. */
4557 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4558 unsigned long nsyms
; /* Number of symbols. */
4559 char *strtab
; /* The string table. */
4560 unsigned long strtab_size
; /* Size of string table. */
4564 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4565 unsigned long nsyms
,
4567 unsigned long strtab_size
,
4568 struct absaddr addr
,
4569 const char **symname
,
4572 bfd_vma dist
= 0x100000;
4573 Elf_Internal_Sym
*sym
, *best
= NULL
;
4576 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4578 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4579 && sym
->st_name
!= 0
4580 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4581 && addr
.offset
>= sym
->st_value
4582 && addr
.offset
- sym
->st_value
< dist
)
4585 dist
= addr
.offset
- sym
->st_value
;
4592 *symname
= (best
->st_name
>= strtab_size
4593 ? "<corrupt>" : strtab
+ best
->st_name
);
4598 *offset
= addr
.offset
;
4602 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4604 struct ia64_unw_table_entry
*tp
;
4607 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4611 const unsigned char *dp
;
4612 const unsigned char *head
;
4613 const char *procname
;
4615 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4616 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4618 fputs ("\n<", stdout
);
4622 fputs (procname
, stdout
);
4625 printf ("+%lx", (unsigned long) offset
);
4628 fputs (">: [", stdout
);
4629 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4630 fputc ('-', stdout
);
4631 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4632 printf ("], info at +0x%lx\n",
4633 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4635 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4636 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4638 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4639 (unsigned) UNW_VER (stamp
),
4640 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4641 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4642 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4643 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4645 if (UNW_VER (stamp
) != 1)
4647 printf ("\tUnknown version.\n");
4652 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4653 dp
= unw_decode (dp
, in_body
, & in_body
);
4658 slurp_ia64_unwind_table (FILE *file
,
4659 struct ia64_unw_aux_info
*aux
,
4660 Elf_Internal_Shdr
*sec
)
4662 unsigned long size
, nrelas
, i
;
4663 Elf_Internal_Phdr
*seg
;
4664 struct ia64_unw_table_entry
*tep
;
4665 Elf_Internal_Shdr
*relsec
;
4666 Elf_Internal_Rela
*rela
, *rp
;
4667 unsigned char *table
, *tp
;
4668 Elf_Internal_Sym
*sym
;
4669 const char *relname
;
4671 /* First, find the starting address of the segment that includes
4674 if (elf_header
.e_phnum
)
4676 if (! get_program_headers (file
))
4679 for (seg
= program_headers
;
4680 seg
< program_headers
+ elf_header
.e_phnum
;
4683 if (seg
->p_type
!= PT_LOAD
)
4686 if (sec
->sh_addr
>= seg
->p_vaddr
4687 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4689 aux
->seg_base
= seg
->p_vaddr
;
4695 /* Second, build the unwind table from the contents of the unwind section: */
4696 size
= sec
->sh_size
;
4697 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4701 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4703 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4705 tep
->start
.section
= SHN_UNDEF
;
4706 tep
->end
.section
= SHN_UNDEF
;
4707 tep
->info
.section
= SHN_UNDEF
;
4710 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4711 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4712 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4716 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4717 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4718 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4720 tep
->start
.offset
+= aux
->seg_base
;
4721 tep
->end
.offset
+= aux
->seg_base
;
4722 tep
->info
.offset
+= aux
->seg_base
;
4726 /* Third, apply any relocations to the unwind table: */
4728 for (relsec
= section_headers
;
4729 relsec
< section_headers
+ elf_header
.e_shnum
;
4732 if (relsec
->sh_type
!= SHT_RELA
4733 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4734 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4737 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4741 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4745 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4746 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4750 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4751 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4754 if (! strneq (relname
, "R_IA64_SEGREL", 13))
4756 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4760 i
= rp
->r_offset
/ (3 * eh_addr_size
);
4762 switch (rp
->r_offset
/eh_addr_size
% 3)
4765 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4766 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
4769 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4770 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
4773 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4774 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
4784 aux
->table_len
= size
/ (3 * eh_addr_size
);
4789 ia64_process_unwind (FILE *file
)
4791 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4792 unsigned long i
, unwcount
= 0, unwstart
= 0;
4793 struct ia64_unw_aux_info aux
;
4795 memset (& aux
, 0, sizeof (aux
));
4797 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4799 if (sec
->sh_type
== SHT_SYMTAB
4800 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
4802 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4803 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4805 strsec
= SECTION_HEADER (sec
->sh_link
);
4806 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4807 1, strsec
->sh_size
, _("string table"));
4808 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
4810 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4815 printf (_("\nThere are no unwind sections in this file.\n"));
4817 while (unwcount
-- > 0)
4822 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4823 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4824 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4831 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4833 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
4835 /* We need to find which section group it is in. */
4836 struct group_list
*g
= section_headers_groups
[i
]->root
;
4838 for (; g
!= NULL
; g
= g
->next
)
4840 sec
= SECTION_HEADER (g
->section_index
);
4842 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
4847 i
= elf_header
.e_shnum
;
4849 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
4851 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
4852 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4853 suffix
= SECTION_NAME (unwsec
) + len
;
4854 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4856 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
4857 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4862 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4863 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
4864 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4865 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4867 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
4868 suffix
= SECTION_NAME (unwsec
) + len
;
4869 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4871 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
4872 && streq (SECTION_NAME (sec
) + len2
, suffix
))
4876 if (i
== elf_header
.e_shnum
)
4878 printf (_("\nCould not find unwind info section for "));
4880 if (string_table
== NULL
)
4881 printf ("%d", unwsec
->sh_name
);
4883 printf (_("'%s'"), SECTION_NAME (unwsec
));
4887 aux
.info_size
= sec
->sh_size
;
4888 aux
.info_addr
= sec
->sh_addr
;
4889 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
4892 printf (_("\nUnwind section "));
4894 if (string_table
== NULL
)
4895 printf ("%d", unwsec
->sh_name
);
4897 printf (_("'%s'"), SECTION_NAME (unwsec
));
4899 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4900 (unsigned long) unwsec
->sh_offset
,
4901 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
4903 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4905 if (aux
.table_len
> 0)
4906 dump_ia64_unwind (& aux
);
4909 free ((char *) aux
.table
);
4911 free ((char *) aux
.info
);
4920 free ((char *) aux
.strtab
);
4925 struct hppa_unw_aux_info
4927 struct hppa_unw_table_entry
4929 struct absaddr start
;
4931 unsigned int Cannot_unwind
:1; /* 0 */
4932 unsigned int Millicode
:1; /* 1 */
4933 unsigned int Millicode_save_sr0
:1; /* 2 */
4934 unsigned int Region_description
:2; /* 3..4 */
4935 unsigned int reserved1
:1; /* 5 */
4936 unsigned int Entry_SR
:1; /* 6 */
4937 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
4938 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
4939 unsigned int Args_stored
:1; /* 16 */
4940 unsigned int Variable_Frame
:1; /* 17 */
4941 unsigned int Separate_Package_Body
:1; /* 18 */
4942 unsigned int Frame_Extension_Millicode
:1; /* 19 */
4943 unsigned int Stack_Overflow_Check
:1; /* 20 */
4944 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
4945 unsigned int Ada_Region
:1; /* 22 */
4946 unsigned int cxx_info
:1; /* 23 */
4947 unsigned int cxx_try_catch
:1; /* 24 */
4948 unsigned int sched_entry_seq
:1; /* 25 */
4949 unsigned int reserved2
:1; /* 26 */
4950 unsigned int Save_SP
:1; /* 27 */
4951 unsigned int Save_RP
:1; /* 28 */
4952 unsigned int Save_MRP_in_frame
:1; /* 29 */
4953 unsigned int extn_ptr_defined
:1; /* 30 */
4954 unsigned int Cleanup_defined
:1; /* 31 */
4956 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
4957 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
4958 unsigned int Large_frame
:1; /* 2 */
4959 unsigned int Pseudo_SP_Set
:1; /* 3 */
4960 unsigned int reserved4
:1; /* 4 */
4961 unsigned int Total_frame_size
:27; /* 5..31 */
4963 *table
; /* Unwind table. */
4964 unsigned long table_len
; /* Length of unwind table. */
4965 bfd_vma seg_base
; /* Starting address of segment. */
4966 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4967 unsigned long nsyms
; /* Number of symbols. */
4968 char *strtab
; /* The string table. */
4969 unsigned long strtab_size
; /* Size of string table. */
4973 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
4975 struct hppa_unw_table_entry
*tp
;
4977 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4980 const char *procname
;
4982 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4983 aux
->strtab_size
, tp
->start
, &procname
,
4986 fputs ("\n<", stdout
);
4990 fputs (procname
, stdout
);
4993 printf ("+%lx", (unsigned long) offset
);
4996 fputs (">: [", stdout
);
4997 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4998 fputc ('-', stdout
);
4999 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5002 #define PF(_m) if (tp->_m) printf (#_m " ");
5003 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5006 PF(Millicode_save_sr0
);
5007 /* PV(Region_description); */
5013 PF(Separate_Package_Body
);
5014 PF(Frame_Extension_Millicode
);
5015 PF(Stack_Overflow_Check
);
5016 PF(Two_Instruction_SP_Increment
);
5020 PF(sched_entry_seq
);
5023 PF(Save_MRP_in_frame
);
5024 PF(extn_ptr_defined
);
5025 PF(Cleanup_defined
);
5026 PF(MPE_XL_interrupt_marker
);
5027 PF(HP_UX_interrupt_marker
);
5030 PV(Total_frame_size
);
5039 slurp_hppa_unwind_table (FILE *file
,
5040 struct hppa_unw_aux_info
*aux
,
5041 Elf_Internal_Shdr
*sec
)
5043 unsigned long size
, unw_ent_size
, nrelas
, i
;
5044 Elf_Internal_Phdr
*seg
;
5045 struct hppa_unw_table_entry
*tep
;
5046 Elf_Internal_Shdr
*relsec
;
5047 Elf_Internal_Rela
*rela
, *rp
;
5048 unsigned char *table
, *tp
;
5049 Elf_Internal_Sym
*sym
;
5050 const char *relname
;
5052 /* First, find the starting address of the segment that includes
5055 if (elf_header
.e_phnum
)
5057 if (! get_program_headers (file
))
5060 for (seg
= program_headers
;
5061 seg
< program_headers
+ elf_header
.e_phnum
;
5064 if (seg
->p_type
!= PT_LOAD
)
5067 if (sec
->sh_addr
>= seg
->p_vaddr
5068 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5070 aux
->seg_base
= seg
->p_vaddr
;
5076 /* Second, build the unwind table from the contents of the unwind
5078 size
= sec
->sh_size
;
5079 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5083 unw_ent_size
= 2 * eh_addr_size
+ 8;
5085 tep
= aux
->table
= xcmalloc (size
/ unw_ent_size
, sizeof (aux
->table
[0]));
5087 for (tp
= table
; tp
< table
+ size
; tp
+= (2 * eh_addr_size
+ 8), ++tep
)
5089 unsigned int tmp1
, tmp2
;
5091 tep
->start
.section
= SHN_UNDEF
;
5092 tep
->end
.section
= SHN_UNDEF
;
5096 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5097 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5098 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5099 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5103 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5104 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5105 tmp1
= byte_get ((unsigned char *) tp
+ 16, 4);
5106 tmp2
= byte_get ((unsigned char *) tp
+ 20, 4);
5109 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5110 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5111 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5112 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5113 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5114 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5115 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5116 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5117 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5118 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5119 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5120 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5121 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5122 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5123 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5124 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5125 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5126 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5127 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5128 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5129 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5130 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5131 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5132 tep
->Cleanup_defined
= tmp1
& 0x1;
5134 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5135 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5136 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5137 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5138 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5139 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5141 tep
->start
.offset
+= aux
->seg_base
;
5142 tep
->end
.offset
+= aux
->seg_base
;
5146 /* Third, apply any relocations to the unwind table. */
5148 for (relsec
= section_headers
;
5149 relsec
< section_headers
+ elf_header
.e_shnum
;
5152 if (relsec
->sh_type
!= SHT_RELA
5153 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5154 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5157 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5161 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5165 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5166 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5170 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5171 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5174 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5175 if (strncmp (relname
, "R_PARISC_SEGREL", 15) != 0)
5177 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5181 i
= rp
->r_offset
/ unw_ent_size
;
5183 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5186 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5187 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5190 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5191 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5201 aux
->table_len
= size
/ unw_ent_size
;
5207 hppa_process_unwind (FILE *file
)
5209 struct hppa_unw_aux_info aux
;
5210 Elf_Internal_Shdr
*unwsec
= NULL
;
5211 Elf_Internal_Shdr
*strsec
;
5212 Elf_Internal_Shdr
*sec
;
5215 memset (& aux
, 0, sizeof (aux
));
5217 if (string_table
== NULL
)
5220 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5222 if (sec
->sh_type
== SHT_SYMTAB
5223 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5225 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5226 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5228 strsec
= SECTION_HEADER (sec
->sh_link
);
5229 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5230 1, strsec
->sh_size
, _("string table"));
5231 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5233 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5238 printf (_("\nThere are no unwind sections in this file.\n"));
5240 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5242 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5244 printf (_("\nUnwind section "));
5245 printf (_("'%s'"), SECTION_NAME (sec
));
5247 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5248 (unsigned long) sec
->sh_offset
,
5249 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5251 slurp_hppa_unwind_table (file
, &aux
, sec
);
5252 if (aux
.table_len
> 0)
5253 dump_hppa_unwind (&aux
);
5256 free ((char *) aux
.table
);
5264 free ((char *) aux
.strtab
);
5270 process_unwind (FILE *file
)
5272 struct unwind_handler
{
5274 int (*handler
)(FILE *file
);
5276 { EM_IA_64
, ia64_process_unwind
},
5277 { EM_PARISC
, hppa_process_unwind
},
5285 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5286 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5287 return handlers
[i
].handler (file
);
5289 printf (_("\nThere are no unwind sections in this file.\n"));
5294 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5296 switch (entry
->d_tag
)
5299 if (entry
->d_un
.d_val
== 0)
5303 static const char * opts
[] =
5305 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5306 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5307 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5308 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5313 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5314 if (entry
->d_un
.d_val
& (1 << cnt
))
5316 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5323 case DT_MIPS_IVERSION
:
5324 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5325 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5327 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5330 case DT_MIPS_TIME_STAMP
:
5335 time_t time
= entry
->d_un
.d_val
;
5336 tmp
= gmtime (&time
);
5337 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5338 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5339 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5340 printf ("Time Stamp: %s\n", timebuf
);
5344 case DT_MIPS_RLD_VERSION
:
5345 case DT_MIPS_LOCAL_GOTNO
:
5346 case DT_MIPS_CONFLICTNO
:
5347 case DT_MIPS_LIBLISTNO
:
5348 case DT_MIPS_SYMTABNO
:
5349 case DT_MIPS_UNREFEXTNO
:
5350 case DT_MIPS_HIPAGENO
:
5351 case DT_MIPS_DELTA_CLASS_NO
:
5352 case DT_MIPS_DELTA_INSTANCE_NO
:
5353 case DT_MIPS_DELTA_RELOC_NO
:
5354 case DT_MIPS_DELTA_SYM_NO
:
5355 case DT_MIPS_DELTA_CLASSSYM_NO
:
5356 case DT_MIPS_COMPACT_SIZE
:
5357 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5361 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5367 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5369 switch (entry
->d_tag
)
5371 case DT_HP_DLD_FLAGS
:
5380 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5381 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5382 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5383 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5384 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5385 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5386 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5387 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5388 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5389 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5390 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
5394 bfd_vma val
= entry
->d_un
.d_val
;
5396 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5397 if (val
& flags
[cnt
].bit
)
5401 fputs (flags
[cnt
].str
, stdout
);
5403 val
^= flags
[cnt
].bit
;
5406 if (val
!= 0 || first
)
5410 print_vma (val
, HEX
);
5416 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5423 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5425 switch (entry
->d_tag
)
5427 case DT_IA_64_PLT_RESERVE
:
5428 /* First 3 slots reserved. */
5429 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5431 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5435 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5442 get_32bit_dynamic_section (FILE *file
)
5444 Elf32_External_Dyn
*edyn
, *ext
;
5445 Elf_Internal_Dyn
*entry
;
5447 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5448 _("dynamic section"));
5452 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5453 might not have the luxury of section headers. Look for the DT_NULL
5454 terminator to determine the number of entries. */
5455 for (ext
= edyn
, dynamic_nent
= 0;
5456 (char *) ext
< (char *) edyn
+ dynamic_size
;
5460 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5464 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5465 if (dynamic_section
== NULL
)
5467 error (_("Out of memory\n"));
5472 for (ext
= edyn
, entry
= dynamic_section
;
5473 entry
< dynamic_section
+ dynamic_nent
;
5476 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5477 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5486 get_64bit_dynamic_section (FILE *file
)
5488 Elf64_External_Dyn
*edyn
, *ext
;
5489 Elf_Internal_Dyn
*entry
;
5491 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5492 _("dynamic section"));
5496 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5497 might not have the luxury of section headers. Look for the DT_NULL
5498 terminator to determine the number of entries. */
5499 for (ext
= edyn
, dynamic_nent
= 0;
5500 (char *) ext
< (char *) edyn
+ dynamic_size
;
5504 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5508 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5509 if (dynamic_section
== NULL
)
5511 error (_("Out of memory\n"));
5516 for (ext
= edyn
, entry
= dynamic_section
;
5517 entry
< dynamic_section
+ dynamic_nent
;
5520 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5521 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5530 print_dynamic_flags (bfd_vma flags
)
5538 flag
= flags
& - flags
;
5548 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5549 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5550 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5551 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5552 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5553 default: fputs ("unknown", stdout
); break;
5559 /* Parse and display the contents of the dynamic section. */
5562 process_dynamic_section (FILE *file
)
5564 Elf_Internal_Dyn
*entry
;
5566 if (dynamic_size
== 0)
5569 printf (_("\nThere is no dynamic section in this file.\n"));
5576 if (! get_32bit_dynamic_section (file
))
5579 else if (! get_64bit_dynamic_section (file
))
5582 /* Find the appropriate symbol table. */
5583 if (dynamic_symbols
== NULL
)
5585 for (entry
= dynamic_section
;
5586 entry
< dynamic_section
+ dynamic_nent
;
5589 Elf_Internal_Shdr section
;
5591 if (entry
->d_tag
!= DT_SYMTAB
)
5594 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5596 /* Since we do not know how big the symbol table is,
5597 we default to reading in the entire file (!) and
5598 processing that. This is overkill, I know, but it
5600 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5602 if (archive_file_offset
!= 0)
5603 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5606 if (fseek (file
, 0, SEEK_END
))
5607 error (_("Unable to seek to end of file!"));
5609 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5613 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5615 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5617 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5618 if (num_dynamic_syms
< 1)
5620 error (_("Unable to determine the number of symbols to load\n"));
5624 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5628 /* Similarly find a string table. */
5629 if (dynamic_strings
== NULL
)
5631 for (entry
= dynamic_section
;
5632 entry
< dynamic_section
+ dynamic_nent
;
5635 unsigned long offset
;
5638 if (entry
->d_tag
!= DT_STRTAB
)
5641 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5643 /* Since we do not know how big the string table is,
5644 we default to reading in the entire file (!) and
5645 processing that. This is overkill, I know, but it
5648 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5650 if (archive_file_offset
!= 0)
5651 str_tab_len
= archive_file_size
- offset
;
5654 if (fseek (file
, 0, SEEK_END
))
5655 error (_("Unable to seek to end of file\n"));
5656 str_tab_len
= ftell (file
) - offset
;
5659 if (str_tab_len
< 1)
5662 (_("Unable to determine the length of the dynamic string table\n"));
5666 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5667 _("dynamic string table"));
5668 dynamic_strings_length
= str_tab_len
;
5673 /* And find the syminfo section if available. */
5674 if (dynamic_syminfo
== NULL
)
5676 unsigned long syminsz
= 0;
5678 for (entry
= dynamic_section
;
5679 entry
< dynamic_section
+ dynamic_nent
;
5682 if (entry
->d_tag
== DT_SYMINENT
)
5684 /* Note: these braces are necessary to avoid a syntax
5685 error from the SunOS4 C compiler. */
5686 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5688 else if (entry
->d_tag
== DT_SYMINSZ
)
5689 syminsz
= entry
->d_un
.d_val
;
5690 else if (entry
->d_tag
== DT_SYMINFO
)
5691 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5695 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5697 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5698 Elf_Internal_Syminfo
*syminfo
;
5700 /* There is a syminfo section. Read the data. */
5701 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5702 syminsz
, _("symbol information"));
5706 dynamic_syminfo
= malloc (syminsz
);
5707 if (dynamic_syminfo
== NULL
)
5709 error (_("Out of memory\n"));
5713 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5714 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5715 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5716 ++syminfo
, ++extsym
)
5718 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5719 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5726 if (do_dynamic
&& dynamic_addr
)
5727 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5728 dynamic_addr
, dynamic_nent
);
5730 printf (_(" Tag Type Name/Value\n"));
5732 for (entry
= dynamic_section
;
5733 entry
< dynamic_section
+ dynamic_nent
;
5741 print_vma (entry
->d_tag
, FULL_HEX
);
5742 dtype
= get_dynamic_type (entry
->d_tag
);
5743 printf (" (%s)%*s", dtype
,
5744 ((is_32bit_elf
? 27 : 19)
5745 - (int) strlen (dtype
)),
5749 switch (entry
->d_tag
)
5753 print_dynamic_flags (entry
->d_un
.d_val
);
5763 switch (entry
->d_tag
)
5766 printf (_("Auxiliary library"));
5770 printf (_("Filter library"));
5774 printf (_("Configuration file"));
5778 printf (_("Dependency audit library"));
5782 printf (_("Audit library"));
5786 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5787 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5791 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5800 printf (_("Flags:"));
5802 if (entry
->d_un
.d_val
== 0)
5803 printf (_(" None\n"));
5806 unsigned long int val
= entry
->d_un
.d_val
;
5808 if (val
& DTF_1_PARINIT
)
5810 printf (" PARINIT");
5811 val
^= DTF_1_PARINIT
;
5813 if (val
& DTF_1_CONFEXP
)
5815 printf (" CONFEXP");
5816 val
^= DTF_1_CONFEXP
;
5819 printf (" %lx", val
);
5828 printf (_("Flags:"));
5830 if (entry
->d_un
.d_val
== 0)
5831 printf (_(" None\n"));
5834 unsigned long int val
= entry
->d_un
.d_val
;
5836 if (val
& DF_P1_LAZYLOAD
)
5838 printf (" LAZYLOAD");
5839 val
^= DF_P1_LAZYLOAD
;
5841 if (val
& DF_P1_GROUPPERM
)
5843 printf (" GROUPPERM");
5844 val
^= DF_P1_GROUPPERM
;
5847 printf (" %lx", val
);
5856 printf (_("Flags:"));
5857 if (entry
->d_un
.d_val
== 0)
5858 printf (_(" None\n"));
5861 unsigned long int val
= entry
->d_un
.d_val
;
5868 if (val
& DF_1_GLOBAL
)
5873 if (val
& DF_1_GROUP
)
5878 if (val
& DF_1_NODELETE
)
5880 printf (" NODELETE");
5881 val
^= DF_1_NODELETE
;
5883 if (val
& DF_1_LOADFLTR
)
5885 printf (" LOADFLTR");
5886 val
^= DF_1_LOADFLTR
;
5888 if (val
& DF_1_INITFIRST
)
5890 printf (" INITFIRST");
5891 val
^= DF_1_INITFIRST
;
5893 if (val
& DF_1_NOOPEN
)
5898 if (val
& DF_1_ORIGIN
)
5903 if (val
& DF_1_DIRECT
)
5908 if (val
& DF_1_TRANS
)
5913 if (val
& DF_1_INTERPOSE
)
5915 printf (" INTERPOSE");
5916 val
^= DF_1_INTERPOSE
;
5918 if (val
& DF_1_NODEFLIB
)
5920 printf (" NODEFLIB");
5921 val
^= DF_1_NODEFLIB
;
5923 if (val
& DF_1_NODUMP
)
5928 if (val
& DF_1_CONLFAT
)
5930 printf (" CONLFAT");
5931 val
^= DF_1_CONLFAT
;
5934 printf (" %lx", val
);
5941 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5943 puts (get_dynamic_type (entry
->d_un
.d_val
));
5963 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5969 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5970 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
5976 switch (entry
->d_tag
)
5979 printf (_("Shared library: [%s]"), name
);
5981 if (streq (name
, program_interpreter
))
5982 printf (_(" program interpreter"));
5986 printf (_("Library soname: [%s]"), name
);
5990 printf (_("Library rpath: [%s]"), name
);
5994 printf (_("Library runpath: [%s]"), name
);
5998 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6003 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6016 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6020 case DT_INIT_ARRAYSZ
:
6021 case DT_FINI_ARRAYSZ
:
6022 case DT_GNU_CONFLICTSZ
:
6023 case DT_GNU_LIBLISTSZ
:
6026 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6027 printf (" (bytes)\n");
6037 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6050 if (entry
->d_tag
== DT_USED
6051 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6053 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6057 printf (_("Not needed object: [%s]\n"), name
);
6062 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6068 /* The value of this entry is ignored. */
6073 case DT_GNU_PRELINKED
:
6077 time_t time
= entry
->d_un
.d_val
;
6079 tmp
= gmtime (&time
);
6080 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6081 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6082 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6088 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6089 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6094 switch (elf_header
.e_machine
)
6097 case EM_MIPS_RS3_LE
:
6098 dynamic_section_mips_val (entry
);
6101 dynamic_section_parisc_val (entry
);
6104 dynamic_section_ia64_val (entry
);
6107 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6119 get_ver_flags (unsigned int flags
)
6121 static char buff
[32];
6128 if (flags
& VER_FLG_BASE
)
6129 strcat (buff
, "BASE ");
6131 if (flags
& VER_FLG_WEAK
)
6133 if (flags
& VER_FLG_BASE
)
6134 strcat (buff
, "| ");
6136 strcat (buff
, "WEAK ");
6139 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6140 strcat (buff
, "| <unknown>");
6145 /* Display the contents of the version sections. */
6147 process_version_sections (FILE *file
)
6149 Elf_Internal_Shdr
*section
;
6156 for (i
= 0, section
= section_headers
;
6157 i
< elf_header
.e_shnum
;
6160 switch (section
->sh_type
)
6162 case SHT_GNU_verdef
:
6164 Elf_External_Verdef
*edefs
;
6171 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6172 SECTION_NAME (section
), section
->sh_info
);
6174 printf (_(" Addr: 0x"));
6175 printf_vma (section
->sh_addr
);
6176 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6177 (unsigned long) section
->sh_offset
, section
->sh_link
,
6178 SECTION_HEADER_INDEX (section
->sh_link
)
6179 < elf_header
.e_shnum
6180 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6183 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6185 _("version definition section"));
6189 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6192 Elf_External_Verdef
*edef
;
6193 Elf_Internal_Verdef ent
;
6194 Elf_External_Verdaux
*eaux
;
6195 Elf_Internal_Verdaux aux
;
6199 vstart
= ((char *) edefs
) + idx
;
6201 edef
= (Elf_External_Verdef
*) vstart
;
6203 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6204 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6205 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6206 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6207 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6208 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6209 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6211 printf (_(" %#06x: Rev: %d Flags: %s"),
6212 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6214 printf (_(" Index: %d Cnt: %d "),
6215 ent
.vd_ndx
, ent
.vd_cnt
);
6217 vstart
+= ent
.vd_aux
;
6219 eaux
= (Elf_External_Verdaux
*) vstart
;
6221 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6222 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6224 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6225 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6227 printf (_("Name index: %ld\n"), aux
.vda_name
);
6229 isum
= idx
+ ent
.vd_aux
;
6231 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6233 isum
+= aux
.vda_next
;
6234 vstart
+= aux
.vda_next
;
6236 eaux
= (Elf_External_Verdaux
*) vstart
;
6238 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6239 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6241 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6242 printf (_(" %#06x: Parent %d: %s\n"),
6243 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6245 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6246 isum
, j
, aux
.vda_name
);
6256 case SHT_GNU_verneed
:
6258 Elf_External_Verneed
*eneed
;
6264 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6265 SECTION_NAME (section
), section
->sh_info
);
6267 printf (_(" Addr: 0x"));
6268 printf_vma (section
->sh_addr
);
6269 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6270 (unsigned long) section
->sh_offset
, section
->sh_link
,
6271 SECTION_HEADER_INDEX (section
->sh_link
)
6272 < elf_header
.e_shnum
6273 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6276 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6278 _("version need section"));
6282 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6284 Elf_External_Verneed
*entry
;
6285 Elf_Internal_Verneed ent
;
6290 vstart
= ((char *) eneed
) + idx
;
6292 entry
= (Elf_External_Verneed
*) vstart
;
6294 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6295 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6296 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6297 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6298 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6300 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6302 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6303 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6305 printf (_(" File: %lx"), ent
.vn_file
);
6307 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6309 vstart
+= ent
.vn_aux
;
6311 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6313 Elf_External_Vernaux
*eaux
;
6314 Elf_Internal_Vernaux aux
;
6316 eaux
= (Elf_External_Vernaux
*) vstart
;
6318 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6319 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6320 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6321 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6322 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6324 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6325 printf (_(" %#06x: Name: %s"),
6326 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6328 printf (_(" %#06x: Name index: %lx"),
6329 isum
, aux
.vna_name
);
6331 printf (_(" Flags: %s Version: %d\n"),
6332 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6334 isum
+= aux
.vna_next
;
6335 vstart
+= aux
.vna_next
;
6345 case SHT_GNU_versym
:
6347 Elf_Internal_Shdr
*link_section
;
6350 unsigned char *edata
;
6351 unsigned short *data
;
6353 Elf_Internal_Sym
*symbols
;
6354 Elf_Internal_Shdr
*string_sec
;
6357 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6360 link_section
= SECTION_HEADER (section
->sh_link
);
6361 total
= section
->sh_size
/ section
->sh_entsize
;
6363 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6364 >= elf_header
.e_shnum
)
6369 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6371 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6373 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6374 string_sec
->sh_size
, _("version string table"));
6378 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6379 SECTION_NAME (section
), total
);
6381 printf (_(" Addr: "));
6382 printf_vma (section
->sh_addr
);
6383 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6384 (unsigned long) section
->sh_offset
, section
->sh_link
,
6385 SECTION_NAME (link_section
));
6387 off
= offset_from_vma (file
,
6388 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6389 total
* sizeof (short));
6390 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6391 _("version symbol data"));
6398 data
= cmalloc (total
, sizeof (short));
6400 for (cnt
= total
; cnt
--;)
6401 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6406 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6409 int check_def
, check_need
;
6412 printf (" %03x:", cnt
);
6414 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6415 switch (data
[cnt
+ j
])
6418 fputs (_(" 0 (*local*) "), stdout
);
6422 fputs (_(" 1 (*global*) "), stdout
);
6426 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6427 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6431 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6432 >= elf_header
.e_shnum
6433 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6436 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6443 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6445 Elf_Internal_Verneed ivn
;
6446 unsigned long offset
;
6448 offset
= offset_from_vma
6449 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6450 sizeof (Elf_External_Verneed
));
6454 Elf_Internal_Vernaux ivna
;
6455 Elf_External_Verneed evn
;
6456 Elf_External_Vernaux evna
;
6457 unsigned long a_off
;
6459 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6462 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6463 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6465 a_off
= offset
+ ivn
.vn_aux
;
6469 get_data (&evna
, file
, a_off
, sizeof (evna
),
6470 1, _("version need aux (2)"));
6472 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6473 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6475 a_off
+= ivna
.vna_next
;
6477 while (ivna
.vna_other
!= data
[cnt
+ j
]
6478 && ivna
.vna_next
!= 0);
6480 if (ivna
.vna_other
== data
[cnt
+ j
])
6482 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6484 name
= strtab
+ ivna
.vna_name
;
6485 nn
+= printf ("(%s%-*s",
6487 12 - (int) strlen (name
),
6493 offset
+= ivn
.vn_next
;
6495 while (ivn
.vn_next
);
6498 if (check_def
&& data
[cnt
+ j
] != 0x8001
6499 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6501 Elf_Internal_Verdef ivd
;
6502 Elf_External_Verdef evd
;
6503 unsigned long offset
;
6505 offset
= offset_from_vma
6506 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6511 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6514 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6515 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6517 offset
+= ivd
.vd_next
;
6519 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6520 && ivd
.vd_next
!= 0);
6522 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6524 Elf_External_Verdaux evda
;
6525 Elf_Internal_Verdaux ivda
;
6527 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6529 get_data (&evda
, file
,
6530 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6532 _("version def aux"));
6534 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6536 name
= strtab
+ ivda
.vda_name
;
6537 nn
+= printf ("(%s%-*s",
6539 12 - (int) strlen (name
),
6545 printf ("%*c", 18 - nn
, ' ');
6563 printf (_("\nNo version information found in this file.\n"));
6569 get_symbol_binding (unsigned int binding
)
6571 static char buff
[32];
6575 case STB_LOCAL
: return "LOCAL";
6576 case STB_GLOBAL
: return "GLOBAL";
6577 case STB_WEAK
: return "WEAK";
6579 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6580 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6582 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6583 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6585 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6591 get_symbol_type (unsigned int type
)
6593 static char buff
[32];
6597 case STT_NOTYPE
: return "NOTYPE";
6598 case STT_OBJECT
: return "OBJECT";
6599 case STT_FUNC
: return "FUNC";
6600 case STT_SECTION
: return "SECTION";
6601 case STT_FILE
: return "FILE";
6602 case STT_COMMON
: return "COMMON";
6603 case STT_TLS
: return "TLS";
6605 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6607 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6608 return "THUMB_FUNC";
6610 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6613 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6614 return "PARISC_MILLI";
6616 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6618 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6620 if (elf_header
.e_machine
== EM_PARISC
)
6622 if (type
== STT_HP_OPAQUE
)
6624 if (type
== STT_HP_STUB
)
6628 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6631 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6637 get_symbol_visibility (unsigned int visibility
)
6641 case STV_DEFAULT
: return "DEFAULT";
6642 case STV_INTERNAL
: return "INTERNAL";
6643 case STV_HIDDEN
: return "HIDDEN";
6644 case STV_PROTECTED
: return "PROTECTED";
6650 get_symbol_index_type (unsigned int type
)
6652 static char buff
[32];
6656 case SHN_UNDEF
: return "UND";
6657 case SHN_ABS
: return "ABS";
6658 case SHN_COMMON
: return "COM";
6660 if (type
== SHN_IA_64_ANSI_COMMON
6661 && elf_header
.e_machine
== EM_IA_64
6662 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6664 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6665 sprintf (buff
, "PRC[0x%04x]", type
);
6666 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6667 sprintf (buff
, "OS [0x%04x]", type
);
6668 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6669 sprintf (buff
, "RSV[0x%04x]", type
);
6671 sprintf (buff
, "%3d", type
);
6679 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6681 unsigned char *e_data
;
6684 e_data
= cmalloc (number
, ent_size
);
6688 error (_("Out of memory\n"));
6692 if (fread (e_data
, ent_size
, number
, file
) != number
)
6694 error (_("Unable to read in dynamic data\n"));
6698 i_data
= cmalloc (number
, sizeof (*i_data
));
6702 error (_("Out of memory\n"));
6708 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
6715 /* Dump the symbol table. */
6717 process_symbol_table (FILE *file
)
6719 Elf_Internal_Shdr
*section
;
6720 bfd_vma nbuckets
= 0;
6721 bfd_vma nchains
= 0;
6722 bfd_vma
*buckets
= NULL
;
6723 bfd_vma
*chains
= NULL
;
6725 if (! do_syms
&& !do_histogram
)
6728 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
6731 unsigned char nb
[8];
6732 unsigned char nc
[8];
6733 int hash_ent_size
= 4;
6735 if ((elf_header
.e_machine
== EM_ALPHA
6736 || elf_header
.e_machine
== EM_S390
6737 || elf_header
.e_machine
== EM_S390_OLD
)
6738 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
6742 (archive_file_offset
6743 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
6744 sizeof nb
+ sizeof nc
)),
6747 error (_("Unable to seek to start of dynamic information"));
6751 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
6753 error (_("Failed to read in number of buckets\n"));
6757 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
6759 error (_("Failed to read in number of chains\n"));
6763 nbuckets
= byte_get (nb
, hash_ent_size
);
6764 nchains
= byte_get (nc
, hash_ent_size
);
6766 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
6767 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
6769 if (buckets
== NULL
|| chains
== NULL
)
6774 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
6779 printf (_("\nSymbol table for image:\n"));
6781 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6783 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
6785 for (hn
= 0; hn
< nbuckets
; hn
++)
6790 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
6792 Elf_Internal_Sym
*psym
;
6795 psym
= dynamic_symbols
+ si
;
6797 n
= print_vma (si
, DEC_5
);
6799 fputs (" " + n
, stdout
);
6800 printf (" %3lu: ", hn
);
6801 print_vma (psym
->st_value
, LONG_HEX
);
6803 print_vma (psym
->st_size
, DEC_5
);
6805 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6806 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6807 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6808 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
6809 if (VALID_DYNAMIC_NAME (psym
->st_name
))
6810 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
6812 printf (" <corrupt: %14ld>", psym
->st_name
);
6817 else if (do_syms
&& !do_using_dynamic
)
6821 for (i
= 0, section
= section_headers
;
6822 i
< elf_header
.e_shnum
;
6826 char *strtab
= NULL
;
6827 unsigned long int strtab_size
= 0;
6828 Elf_Internal_Sym
*symtab
;
6829 Elf_Internal_Sym
*psym
;
6832 if ( section
->sh_type
!= SHT_SYMTAB
6833 && section
->sh_type
!= SHT_DYNSYM
)
6836 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
6837 SECTION_NAME (section
),
6838 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
6840 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6842 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
6844 symtab
= GET_ELF_SYMBOLS (file
, section
);
6848 if (section
->sh_link
== elf_header
.e_shstrndx
)
6850 strtab
= string_table
;
6851 strtab_size
= string_table_length
;
6853 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
6855 Elf_Internal_Shdr
*string_sec
;
6857 string_sec
= SECTION_HEADER (section
->sh_link
);
6859 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
6860 1, string_sec
->sh_size
, _("string table"));
6861 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
6864 for (si
= 0, psym
= symtab
;
6865 si
< section
->sh_size
/ section
->sh_entsize
;
6868 printf ("%6d: ", si
);
6869 print_vma (psym
->st_value
, LONG_HEX
);
6871 print_vma (psym
->st_size
, DEC_5
);
6872 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6873 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6874 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6875 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6876 print_symbol (25, psym
->st_name
< strtab_size
6877 ? strtab
+ psym
->st_name
: "<corrupt>");
6879 if (section
->sh_type
== SHT_DYNSYM
&&
6880 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6882 unsigned char data
[2];
6883 unsigned short vers_data
;
6884 unsigned long offset
;
6888 offset
= offset_from_vma
6889 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6890 sizeof data
+ si
* sizeof (vers_data
));
6892 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6893 sizeof (data
), 1, _("version data"));
6895 vers_data
= byte_get (data
, 2);
6897 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
6898 < elf_header
.e_shnum
6899 && SECTION_HEADER (psym
->st_shndx
)->sh_type
6902 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6904 if ((vers_data
& 0x8000) || vers_data
> 1)
6906 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6907 && (is_nobits
|| ! check_def
))
6909 Elf_External_Verneed evn
;
6910 Elf_Internal_Verneed ivn
;
6911 Elf_Internal_Vernaux ivna
;
6913 /* We must test both. */
6914 offset
= offset_from_vma
6915 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6920 unsigned long vna_off
;
6922 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6925 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6926 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6928 vna_off
= offset
+ ivn
.vn_aux
;
6932 Elf_External_Vernaux evna
;
6934 get_data (&evna
, file
, vna_off
,
6936 _("version need aux (3)"));
6938 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6939 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6940 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6942 vna_off
+= ivna
.vna_next
;
6944 while (ivna
.vna_other
!= vers_data
6945 && ivna
.vna_next
!= 0);
6947 if (ivna
.vna_other
== vers_data
)
6950 offset
+= ivn
.vn_next
;
6952 while (ivn
.vn_next
!= 0);
6954 if (ivna
.vna_other
== vers_data
)
6957 ivna
.vna_name
< strtab_size
6958 ? strtab
+ ivna
.vna_name
: "<corrupt>",
6962 else if (! is_nobits
)
6963 error (_("bad dynamic symbol"));
6970 if (vers_data
!= 0x8001
6971 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6973 Elf_Internal_Verdef ivd
;
6974 Elf_Internal_Verdaux ivda
;
6975 Elf_External_Verdaux evda
;
6976 unsigned long offset
;
6978 offset
= offset_from_vma
6980 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6981 sizeof (Elf_External_Verdef
));
6985 Elf_External_Verdef evd
;
6987 get_data (&evd
, file
, offset
, sizeof (evd
),
6988 1, _("version def"));
6990 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6991 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6992 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6994 offset
+= ivd
.vd_next
;
6996 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6997 && ivd
.vd_next
!= 0);
6999 offset
-= ivd
.vd_next
;
7000 offset
+= ivd
.vd_aux
;
7002 get_data (&evda
, file
, offset
, sizeof (evda
),
7003 1, _("version def aux"));
7005 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7007 if (psym
->st_name
!= ivda
.vda_name
)
7008 printf ((vers_data
& 0x8000)
7010 ivda
.vda_name
< strtab_size
7011 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7021 if (strtab
!= string_table
)
7027 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7029 if (do_histogram
&& buckets
!= NULL
)
7031 unsigned long *lengths
;
7032 unsigned long *counts
;
7035 unsigned long maxlength
= 0;
7036 unsigned long nzero_counts
= 0;
7037 unsigned long nsyms
= 0;
7039 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7040 (unsigned long) nbuckets
);
7041 printf (_(" Length Number %% of total Coverage\n"));
7043 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7044 if (lengths
== NULL
)
7046 error (_("Out of memory"));
7049 for (hn
= 0; hn
< nbuckets
; ++hn
)
7051 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7054 if (maxlength
< ++lengths
[hn
])
7059 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7062 error (_("Out of memory"));
7066 for (hn
= 0; hn
< nbuckets
; ++hn
)
7067 ++counts
[lengths
[hn
]];
7072 printf (" 0 %-10lu (%5.1f%%)\n",
7073 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7074 for (i
= 1; i
<= maxlength
; ++i
)
7076 nzero_counts
+= counts
[i
] * i
;
7077 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7078 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7079 (nzero_counts
* 100.0) / nsyms
);
7087 if (buckets
!= NULL
)
7097 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7101 if (dynamic_syminfo
== NULL
7103 /* No syminfo, this is ok. */
7106 /* There better should be a dynamic symbol section. */
7107 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7111 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7112 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7114 printf (_(" Num: Name BoundTo Flags\n"));
7115 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7117 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7119 printf ("%4d: ", i
);
7120 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7121 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7123 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7126 switch (dynamic_syminfo
[i
].si_boundto
)
7128 case SYMINFO_BT_SELF
:
7129 fputs ("SELF ", stdout
);
7131 case SYMINFO_BT_PARENT
:
7132 fputs ("PARENT ", stdout
);
7135 if (dynamic_syminfo
[i
].si_boundto
> 0
7136 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7137 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7139 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7143 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7147 if (flags
& SYMINFO_FLG_DIRECT
)
7149 if (flags
& SYMINFO_FLG_PASSTHRU
)
7150 printf (" PASSTHRU");
7151 if (flags
& SYMINFO_FLG_COPY
)
7153 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7154 printf (" LAZYLOAD");
7162 #ifdef SUPPORT_DISASSEMBLY
7164 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7166 printf (_("\nAssembly dump of section %s\n"),
7167 SECTION_NAME (section
));
7169 /* XXX -- to be done --- XXX */
7176 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7178 bfd_size_type bytes
;
7180 unsigned char *data
;
7181 unsigned char *start
;
7183 bytes
= section
->sh_size
;
7185 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7187 printf (_("\nSection '%s' has no data to dump.\n"),
7188 SECTION_NAME (section
));
7192 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7194 addr
= section
->sh_addr
;
7196 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7209 lbytes
= (bytes
> 16 ? 16 : bytes
);
7211 printf (" 0x%8.8lx ", (unsigned long) addr
);
7213 switch (elf_header
.e_ident
[EI_DATA
])
7217 for (j
= 15; j
>= 0; j
--)
7220 printf ("%2.2x", data
[j
]);
7230 for (j
= 0; j
< 16; j
++)
7233 printf ("%2.2x", data
[j
]);
7243 for (j
= 0; j
< lbytes
; j
++)
7246 if (k
>= ' ' && k
< 0x7f)
7265 static unsigned long int
7266 read_leb128 (unsigned char *data
, unsigned int *length_return
, int sign
)
7268 unsigned long int result
= 0;
7269 unsigned int num_read
= 0;
7270 unsigned int shift
= 0;
7278 result
|= ((unsigned long int) (byte
& 0x7f)) << shift
;
7283 while (byte
& 0x80);
7285 if (length_return
!= NULL
)
7286 *length_return
= num_read
;
7288 if (sign
&& (shift
< 8 * sizeof (result
)) && (byte
& 0x40))
7289 result
|= -1L << shift
;
7294 typedef struct State_Machine_Registers
7296 unsigned long address
;
7299 unsigned int column
;
7303 /* This variable hold the number of the last entry seen
7304 in the File Table. */
7305 unsigned int last_file_entry
;
7308 static SMR state_machine_regs
;
7311 reset_state_machine (int is_stmt
)
7313 state_machine_regs
.address
= 0;
7314 state_machine_regs
.file
= 1;
7315 state_machine_regs
.line
= 1;
7316 state_machine_regs
.column
= 0;
7317 state_machine_regs
.is_stmt
= is_stmt
;
7318 state_machine_regs
.basic_block
= 0;
7319 state_machine_regs
.end_sequence
= 0;
7320 state_machine_regs
.last_file_entry
= 0;
7323 /* Handled an extend line op.
7324 Returns the number of bytes read. */
7327 process_extended_line_op (unsigned char *data
, int is_stmt
, int pointer_size
)
7329 unsigned char op_code
;
7330 unsigned int bytes_read
;
7332 unsigned char *name
;
7335 len
= read_leb128 (data
, & bytes_read
, 0);
7340 warn (_("badly formed extended line op encountered!\n"));
7347 printf (_(" Extended opcode %d: "), op_code
);
7351 case DW_LNE_end_sequence
:
7352 printf (_("End of Sequence\n\n"));
7353 reset_state_machine (is_stmt
);
7356 case DW_LNE_set_address
:
7357 adr
= byte_get (data
, pointer_size
);
7358 printf (_("set Address to 0x%lx\n"), adr
);
7359 state_machine_regs
.address
= adr
;
7362 case DW_LNE_define_file
:
7363 printf (_(" define new File Table entry\n"));
7364 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
7366 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
7368 data
+= strlen ((char *) data
) + 1;
7369 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7371 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7373 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
7374 printf (_("%s\n\n"), name
);
7378 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
7385 static const char *debug_str_contents
;
7386 static bfd_vma debug_str_size
;
7389 load_debug_str (FILE *file
)
7391 Elf_Internal_Shdr
*sec
;
7393 /* If it is already loaded, do nothing. */
7394 if (debug_str_contents
!= NULL
)
7397 /* Locate the .debug_str section. */
7398 sec
= find_section (".debug_str");
7402 debug_str_size
= sec
->sh_size
;
7404 debug_str_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7405 _("debug_str section data"));
7409 free_debug_str (void)
7411 if (debug_str_contents
== NULL
)
7414 free ((char *) debug_str_contents
);
7415 debug_str_contents
= NULL
;
7420 fetch_indirect_string (unsigned long offset
)
7422 if (debug_str_contents
== NULL
)
7423 return _("<no .debug_str section>");
7425 if (offset
> debug_str_size
)
7427 warn (_("DW_FORM_strp offset too big: %x\n"), offset
);
7428 return _("<offset is too big>");
7431 return debug_str_contents
+ offset
;
7434 static const char *debug_loc_contents
;
7435 static bfd_vma debug_loc_size
;
7438 load_debug_loc (FILE *file
)
7440 Elf_Internal_Shdr
*sec
;
7442 /* If it is already loaded, do nothing. */
7443 if (debug_loc_contents
!= NULL
)
7446 /* Locate the .debug_loc section. */
7447 sec
= find_section (".debug_loc");
7451 debug_loc_size
= sec
->sh_size
;
7453 debug_loc_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7454 _("debug_loc section data"));
7458 free_debug_loc (void)
7460 if (debug_loc_contents
== NULL
)
7463 free ((char *) debug_loc_contents
);
7464 debug_loc_contents
= NULL
;
7468 static const char * debug_range_contents
;
7469 static unsigned long debug_range_size
;
7472 load_debug_range (FILE *file
)
7474 Elf_Internal_Shdr
*sec
;
7476 /* If it is already loaded, do nothing. */
7477 if (debug_range_contents
!= NULL
)
7480 /* Locate the .debug_ranges section. */
7481 sec
= find_section (".debug_ranges");
7485 debug_range_size
= sec
->sh_size
;
7487 debug_range_contents
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
7488 _("debug_range section data"));
7492 free_debug_range (void)
7494 if (debug_range_contents
== NULL
)
7497 free ((char *) debug_range_contents
);
7498 debug_range_contents
= NULL
;
7499 debug_range_size
= 0;
7502 /* Apply addends of RELA relocations. */
7505 debug_apply_rela_addends (FILE *file
,
7506 Elf_Internal_Shdr
*section
,
7508 unsigned char *sec_data
,
7509 unsigned char *start
,
7512 Elf_Internal_Shdr
*relsec
;
7514 if (end
- start
< reloc_size
)
7517 for (relsec
= section_headers
;
7518 relsec
< section_headers
+ elf_header
.e_shnum
;
7521 unsigned long nrelas
;
7522 Elf_Internal_Rela
*rela
, *rp
;
7523 Elf_Internal_Shdr
*symsec
;
7524 Elf_Internal_Sym
*symtab
;
7525 Elf_Internal_Sym
*sym
;
7527 if (relsec
->sh_type
!= SHT_RELA
7528 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7529 || SECTION_HEADER (relsec
->sh_info
) != section
7530 || relsec
->sh_size
== 0
7531 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7534 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7538 symsec
= SECTION_HEADER (relsec
->sh_link
);
7539 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7541 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7545 if (rp
->r_offset
>= (bfd_vma
) (start
- sec_data
)
7546 && rp
->r_offset
< (bfd_vma
) (end
- sec_data
) - reloc_size
)
7547 loc
= sec_data
+ rp
->r_offset
;
7553 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7555 if (ELF32_R_SYM (rp
->r_info
) != 0
7556 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7557 /* Relocations against object symbols can happen,
7558 eg when referencing a global array. For an
7559 example of this see the _clz.o binary in libgcc.a. */
7560 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7562 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7563 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7564 SECTION_NAME (section
));
7570 /* In MIPS little-endian objects, r_info isn't really a
7571 64-bit little-endian value: it has a 32-bit little-endian
7572 symbol index followed by four individual byte fields.
7573 Reorder INFO accordingly. */
7574 if (elf_header
.e_machine
== EM_MIPS
7575 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7576 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7577 | ((rp
->r_info
>> 56) & 0xff)
7578 | ((rp
->r_info
>> 40) & 0xff00)
7579 | ((rp
->r_info
>> 24) & 0xff0000)
7580 | ((rp
->r_info
>> 8) & 0xff000000));
7582 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7584 if (ELF64_R_SYM (rp
->r_info
) != 0
7585 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7586 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7588 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7589 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7590 SECTION_NAME (section
));
7595 byte_put (loc
, rp
->r_addend
, reloc_size
);
7605 /* FIXME: There are better and more efficient ways to handle
7606 these structures. For now though, I just want something that
7607 is simple to implement. */
7608 typedef struct abbrev_attr
7610 unsigned long attribute
;
7612 struct abbrev_attr
*next
;
7616 typedef struct abbrev_entry
7618 unsigned long entry
;
7621 struct abbrev_attr
*first_attr
;
7622 struct abbrev_attr
*last_attr
;
7623 struct abbrev_entry
*next
;
7627 static abbrev_entry
*first_abbrev
= NULL
;
7628 static abbrev_entry
*last_abbrev
= NULL
;
7633 abbrev_entry
*abbrev
;
7635 for (abbrev
= first_abbrev
; abbrev
;)
7637 abbrev_entry
*next
= abbrev
->next
;
7640 for (attr
= abbrev
->first_attr
; attr
;)
7642 abbrev_attr
*next
= attr
->next
;
7652 last_abbrev
= first_abbrev
= NULL
;
7656 add_abbrev (unsigned long number
, unsigned long tag
, int children
)
7658 abbrev_entry
*entry
;
7660 entry
= malloc (sizeof (*entry
));
7666 entry
->entry
= number
;
7668 entry
->children
= children
;
7669 entry
->first_attr
= NULL
;
7670 entry
->last_attr
= NULL
;
7673 if (first_abbrev
== NULL
)
7674 first_abbrev
= entry
;
7676 last_abbrev
->next
= entry
;
7678 last_abbrev
= entry
;
7682 add_abbrev_attr (unsigned long attribute
, unsigned long form
)
7686 attr
= malloc (sizeof (*attr
));
7692 attr
->attribute
= attribute
;
7696 if (last_abbrev
->first_attr
== NULL
)
7697 last_abbrev
->first_attr
= attr
;
7699 last_abbrev
->last_attr
->next
= attr
;
7701 last_abbrev
->last_attr
= attr
;
7704 /* Processes the (partial) contents of a .debug_abbrev section.
7705 Returns NULL if the end of the section was encountered.
7706 Returns the address after the last byte read if the end of
7707 an abbreviation set was found. */
7709 static unsigned char *
7710 process_abbrev_section (unsigned char *start
, unsigned char *end
)
7712 if (first_abbrev
!= NULL
)
7717 unsigned int bytes_read
;
7718 unsigned long entry
;
7720 unsigned long attribute
;
7723 entry
= read_leb128 (start
, & bytes_read
, 0);
7724 start
+= bytes_read
;
7726 /* A single zero is supposed to end the section according
7727 to the standard. If there's more, then signal that to
7730 return start
== end
? NULL
: start
;
7732 tag
= read_leb128 (start
, & bytes_read
, 0);
7733 start
+= bytes_read
;
7735 children
= *start
++;
7737 add_abbrev (entry
, tag
, children
);
7743 attribute
= read_leb128 (start
, & bytes_read
, 0);
7744 start
+= bytes_read
;
7746 form
= read_leb128 (start
, & bytes_read
, 0);
7747 start
+= bytes_read
;
7750 add_abbrev_attr (attribute
, form
);
7752 while (attribute
!= 0);
7759 get_TAG_name (unsigned long tag
)
7763 case DW_TAG_padding
: return "DW_TAG_padding";
7764 case DW_TAG_array_type
: return "DW_TAG_array_type";
7765 case DW_TAG_class_type
: return "DW_TAG_class_type";
7766 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
7767 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
7768 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
7769 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
7770 case DW_TAG_label
: return "DW_TAG_label";
7771 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
7772 case DW_TAG_member
: return "DW_TAG_member";
7773 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
7774 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
7775 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
7776 case DW_TAG_string_type
: return "DW_TAG_string_type";
7777 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
7778 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
7779 case DW_TAG_typedef
: return "DW_TAG_typedef";
7780 case DW_TAG_union_type
: return "DW_TAG_union_type";
7781 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
7782 case DW_TAG_variant
: return "DW_TAG_variant";
7783 case DW_TAG_common_block
: return "DW_TAG_common_block";
7784 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
7785 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
7786 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
7787 case DW_TAG_module
: return "DW_TAG_module";
7788 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
7789 case DW_TAG_set_type
: return "DW_TAG_set_type";
7790 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
7791 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
7792 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
7793 case DW_TAG_base_type
: return "DW_TAG_base_type";
7794 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
7795 case DW_TAG_const_type
: return "DW_TAG_const_type";
7796 case DW_TAG_constant
: return "DW_TAG_constant";
7797 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
7798 case DW_TAG_file_type
: return "DW_TAG_file_type";
7799 case DW_TAG_friend
: return "DW_TAG_friend";
7800 case DW_TAG_namelist
: return "DW_TAG_namelist";
7801 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
7802 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
7803 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
7804 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
7805 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
7806 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
7807 case DW_TAG_try_block
: return "DW_TAG_try_block";
7808 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
7809 case DW_TAG_variable
: return "DW_TAG_variable";
7810 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
7811 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
7812 case DW_TAG_format_label
: return "DW_TAG_format_label";
7813 case DW_TAG_function_template
: return "DW_TAG_function_template";
7814 case DW_TAG_class_template
: return "DW_TAG_class_template";
7815 /* DWARF 2.1 values. */
7816 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
7817 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
7818 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
7819 case DW_TAG_namespace
: return "DW_TAG_namespace";
7820 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
7821 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
7822 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
7823 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
7825 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
7826 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
7827 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
7830 static char buffer
[100];
7832 snprintf (buffer
, sizeof (buffer
), _("Unknown TAG value: %lx"), tag
);
7839 get_FORM_name (unsigned long form
)
7843 case DW_FORM_addr
: return "DW_FORM_addr";
7844 case DW_FORM_block2
: return "DW_FORM_block2";
7845 case DW_FORM_block4
: return "DW_FORM_block4";
7846 case DW_FORM_data2
: return "DW_FORM_data2";
7847 case DW_FORM_data4
: return "DW_FORM_data4";
7848 case DW_FORM_data8
: return "DW_FORM_data8";
7849 case DW_FORM_string
: return "DW_FORM_string";
7850 case DW_FORM_block
: return "DW_FORM_block";
7851 case DW_FORM_block1
: return "DW_FORM_block1";
7852 case DW_FORM_data1
: return "DW_FORM_data1";
7853 case DW_FORM_flag
: return "DW_FORM_flag";
7854 case DW_FORM_sdata
: return "DW_FORM_sdata";
7855 case DW_FORM_strp
: return "DW_FORM_strp";
7856 case DW_FORM_udata
: return "DW_FORM_udata";
7857 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7858 case DW_FORM_ref1
: return "DW_FORM_ref1";
7859 case DW_FORM_ref2
: return "DW_FORM_ref2";
7860 case DW_FORM_ref4
: return "DW_FORM_ref4";
7861 case DW_FORM_ref8
: return "DW_FORM_ref8";
7862 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7863 case DW_FORM_indirect
: return "DW_FORM_indirect";
7866 static char buffer
[100];
7868 snprintf (buffer
, sizeof (buffer
), _("Unknown FORM value: %lx"), form
);
7874 static unsigned char *
7875 display_block (unsigned char *data
, unsigned long length
)
7877 printf (_(" %lu byte block: "), length
);
7880 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7886 decode_location_expression (unsigned char * data
,
7887 unsigned int pointer_size
,
7888 unsigned long length
,
7889 unsigned long cu_offset
)
7892 unsigned int bytes_read
;
7893 unsigned long uvalue
;
7894 unsigned char *end
= data
+ length
;
7895 int need_frame_base
= 0;
7904 printf ("DW_OP_addr: %lx",
7905 (unsigned long) byte_get (data
, pointer_size
));
7906 data
+= pointer_size
;
7909 printf ("DW_OP_deref");
7912 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7915 printf ("DW_OP_const1s: %ld", (long) byte_get_signed (data
++, 1));
7918 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7922 printf ("DW_OP_const2s: %ld", (long) byte_get_signed (data
, 2));
7926 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7930 printf ("DW_OP_const4s: %ld", (long) byte_get_signed (data
, 4));
7934 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7935 (unsigned long) byte_get (data
+ 4, 4));
7939 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7940 (long) byte_get (data
+ 4, 4));
7944 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7948 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7952 printf ("DW_OP_dup");
7955 printf ("DW_OP_drop");
7958 printf ("DW_OP_over");
7961 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7964 printf ("DW_OP_swap");
7967 printf ("DW_OP_rot");
7970 printf ("DW_OP_xderef");
7973 printf ("DW_OP_abs");
7976 printf ("DW_OP_and");
7979 printf ("DW_OP_div");
7982 printf ("DW_OP_minus");
7985 printf ("DW_OP_mod");
7988 printf ("DW_OP_mul");
7991 printf ("DW_OP_neg");
7994 printf ("DW_OP_not");
7997 printf ("DW_OP_or");
8000 printf ("DW_OP_plus");
8002 case DW_OP_plus_uconst
:
8003 printf ("DW_OP_plus_uconst: %lu",
8004 read_leb128 (data
, &bytes_read
, 0));
8008 printf ("DW_OP_shl");
8011 printf ("DW_OP_shr");
8014 printf ("DW_OP_shra");
8017 printf ("DW_OP_xor");
8020 printf ("DW_OP_bra: %ld", (long) byte_get_signed (data
, 2));
8024 printf ("DW_OP_eq");
8027 printf ("DW_OP_ge");
8030 printf ("DW_OP_gt");
8033 printf ("DW_OP_le");
8036 printf ("DW_OP_lt");
8039 printf ("DW_OP_ne");
8042 printf ("DW_OP_skip: %ld", (long) byte_get_signed (data
, 2));
8078 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
8113 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
8148 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
8149 read_leb128 (data
, &bytes_read
, 1));
8154 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
8158 need_frame_base
= 1;
8159 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
8163 uvalue
= read_leb128 (data
, &bytes_read
, 0);
8165 printf ("DW_OP_bregx: %lu %ld", uvalue
,
8166 read_leb128 (data
, &bytes_read
, 1));
8170 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
8173 case DW_OP_deref_size
:
8174 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
8176 case DW_OP_xderef_size
:
8177 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
8180 printf ("DW_OP_nop");
8183 /* DWARF 3 extensions. */
8184 case DW_OP_push_object_address
:
8185 printf ("DW_OP_push_object_address");
8188 /* XXX: Strictly speaking for 64-bit DWARF3 files
8189 this ought to be an 8-byte wide computation. */
8190 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2) + cu_offset
);
8194 /* XXX: Strictly speaking for 64-bit DWARF3 files
8195 this ought to be an 8-byte wide computation. */
8196 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4) + cu_offset
);
8199 case DW_OP_call_ref
:
8200 printf ("DW_OP_call_ref");
8203 /* GNU extensions. */
8204 case DW_OP_GNU_push_tls_address
:
8205 printf ("DW_OP_GNU_push_tls_address");
8209 if (op
>= DW_OP_lo_user
8210 && op
<= DW_OP_hi_user
)
8211 printf (_("(User defined location op)"));
8213 printf (_("(Unknown location op)"));
8214 /* No way to tell where the next op is, so just bail. */
8215 return need_frame_base
;
8218 /* Separate the ops. */
8223 return need_frame_base
;
8226 /* This structure records the information that
8227 we extract from the.debug_info section. */
8230 unsigned int pointer_size
;
8231 unsigned long cu_offset
;
8232 unsigned long base_address
;
8233 /* This is an array of offsets to the location list table. */
8234 unsigned long *loc_offsets
;
8235 int *have_frame_base
;
8236 unsigned int num_loc_offsets
;
8237 unsigned int max_loc_offsets
;
8238 unsigned long *range_lists
;
8239 unsigned int num_range_lists
;
8240 unsigned int max_range_lists
;
8244 static debug_info
* debug_information
= NULL
;
8245 static unsigned int num_debug_info_entries
= 0;
8246 static unsigned int last_pointer_size
= 0;
8247 static int warned_about_missing_comp_units
= FALSE
;
8249 static unsigned char *
8250 read_and_display_attr_value (unsigned long attribute
,
8252 unsigned char *data
,
8253 unsigned long cu_offset
,
8254 unsigned long pointer_size
,
8255 unsigned long offset_size
,
8257 debug_info
*debug_info_p
,
8260 unsigned long uvalue
= 0;
8261 unsigned char *block_start
= NULL
;
8262 unsigned int bytes_read
;
8269 case DW_FORM_ref_addr
:
8270 if (dwarf_version
== 2)
8272 uvalue
= byte_get (data
, pointer_size
);
8273 data
+= pointer_size
;
8275 else if (dwarf_version
== 3)
8277 uvalue
= byte_get (data
, offset_size
);
8278 data
+= offset_size
;
8282 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8287 uvalue
= byte_get (data
, pointer_size
);
8288 data
+= pointer_size
;
8292 uvalue
= byte_get (data
, offset_size
);
8293 data
+= offset_size
;
8299 uvalue
= byte_get (data
++, 1);
8304 uvalue
= byte_get (data
, 2);
8310 uvalue
= byte_get (data
, 4);
8315 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8319 case DW_FORM_ref_udata
:
8321 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8325 case DW_FORM_indirect
:
8326 form
= read_leb128 (data
, & bytes_read
, 0);
8329 printf (" %s", get_FORM_name (form
));
8330 return read_and_display_attr_value (attribute
, form
, data
,
8331 cu_offset
, pointer_size
,
8332 offset_size
, dwarf_version
,
8333 debug_info_p
, do_loc
);
8338 case DW_FORM_ref_addr
:
8340 printf (" <#%lx>", uvalue
);
8346 case DW_FORM_ref_udata
:
8348 printf (" <%lx>", uvalue
+ cu_offset
);
8354 printf (" %#lx", uvalue
);
8363 printf (" %ld", uvalue
);
8370 uvalue
= byte_get (data
, 4);
8371 printf (" %lx", uvalue
);
8372 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8374 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8375 && num_debug_info_entries
== 0)
8377 if (sizeof (uvalue
) == 8)
8378 uvalue
= byte_get (data
, 8);
8380 error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
8385 case DW_FORM_string
:
8387 printf (" %s", data
);
8388 data
+= strlen ((char *) data
) + 1;
8392 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8393 block_start
= data
+ bytes_read
;
8395 data
= block_start
+ uvalue
;
8397 data
= display_block (block_start
, uvalue
);
8400 case DW_FORM_block1
:
8401 uvalue
= byte_get (data
, 1);
8402 block_start
= data
+ 1;
8404 data
= block_start
+ uvalue
;
8406 data
= display_block (block_start
, uvalue
);
8409 case DW_FORM_block2
:
8410 uvalue
= byte_get (data
, 2);
8411 block_start
= data
+ 2;
8413 data
= block_start
+ uvalue
;
8415 data
= display_block (block_start
, uvalue
);
8418 case DW_FORM_block4
:
8419 uvalue
= byte_get (data
, 4);
8420 block_start
= data
+ 4;
8422 data
= block_start
+ uvalue
;
8424 data
= display_block (block_start
, uvalue
);
8429 printf (_(" (indirect string, offset: 0x%lx): %s"),
8430 uvalue
, fetch_indirect_string (uvalue
));
8433 case DW_FORM_indirect
:
8434 /* Handled above. */
8438 warn (_("Unrecognized form: %d\n"), form
);
8442 /* For some attributes we can display further information. */
8443 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8444 && num_debug_info_entries
== 0)
8448 case DW_AT_frame_base
:
8449 have_frame_base
= 1;
8450 case DW_AT_location
:
8451 case DW_AT_data_member_location
:
8452 case DW_AT_vtable_elem_location
:
8453 case DW_AT_allocated
:
8454 case DW_AT_associated
:
8455 case DW_AT_data_location
:
8457 case DW_AT_upper_bound
:
8458 case DW_AT_lower_bound
:
8459 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8461 /* Process location list. */
8462 unsigned int max
= debug_info_p
->max_loc_offsets
;
8463 unsigned int num
= debug_info_p
->num_loc_offsets
;
8465 if (max
== 0 || num
>= max
)
8468 debug_info_p
->loc_offsets
8469 = xcrealloc (debug_info_p
->loc_offsets
,
8470 max
, sizeof (*debug_info_p
->loc_offsets
));
8471 debug_info_p
->have_frame_base
8472 = xcrealloc (debug_info_p
->have_frame_base
,
8473 max
, sizeof (*debug_info_p
->have_frame_base
));
8474 debug_info_p
->max_loc_offsets
= max
;
8476 debug_info_p
->loc_offsets
[num
] = uvalue
;
8477 debug_info_p
->have_frame_base
[num
] = have_frame_base
;
8478 debug_info_p
->num_loc_offsets
++;
8483 if (need_base_address
)
8484 debug_info_p
->base_address
= uvalue
;
8488 if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8490 /* Process range list. */
8491 unsigned int max
= debug_info_p
->max_range_lists
;
8492 unsigned int num
= debug_info_p
->num_range_lists
;
8494 if (max
== 0 || num
>= max
)
8497 debug_info_p
->range_lists
8498 = xcrealloc (debug_info_p
->range_lists
,
8499 max
, sizeof (*debug_info_p
->range_lists
));
8500 debug_info_p
->max_range_lists
= max
;
8502 debug_info_p
->range_lists
[num
] = uvalue
;
8503 debug_info_p
->num_range_lists
++;
8522 case DW_INL_not_inlined
:
8523 printf (_("(not inlined)"));
8525 case DW_INL_inlined
:
8526 printf (_("(inlined)"));
8528 case DW_INL_declared_not_inlined
:
8529 printf (_("(declared as inline but ignored)"));
8531 case DW_INL_declared_inlined
:
8532 printf (_("(declared as inline and inlined)"));
8535 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8540 case DW_AT_language
:
8543 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8544 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8545 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8546 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8547 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8548 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8549 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8550 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8551 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8552 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8553 /* DWARF 2.1 values. */
8554 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8555 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8556 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8557 /* MIPS extension. */
8558 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8559 /* UPC extension. */
8560 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8562 printf ("(Unknown: %lx)", uvalue
);
8567 case DW_AT_encoding
:
8570 case DW_ATE_void
: printf ("(void)"); break;
8571 case DW_ATE_address
: printf ("(machine address)"); break;
8572 case DW_ATE_boolean
: printf ("(boolean)"); break;
8573 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8574 case DW_ATE_float
: printf ("(float)"); break;
8575 case DW_ATE_signed
: printf ("(signed)"); break;
8576 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8577 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8578 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8579 /* DWARF 2.1 value. */
8580 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8581 /* GNU extension. */
8582 case DW_ATE_GNU_decimal_float
: printf ("(decimal float)"); break;
8584 if (uvalue
>= DW_ATE_lo_user
8585 && uvalue
<= DW_ATE_hi_user
)
8586 printf ("(user defined type)");
8588 printf ("(unknown type)");
8593 case DW_AT_accessibility
:
8596 case DW_ACCESS_public
: printf ("(public)"); break;
8597 case DW_ACCESS_protected
: printf ("(protected)"); break;
8598 case DW_ACCESS_private
: printf ("(private)"); break;
8600 printf ("(unknown accessibility)");
8605 case DW_AT_visibility
:
8608 case DW_VIS_local
: printf ("(local)"); break;
8609 case DW_VIS_exported
: printf ("(exported)"); break;
8610 case DW_VIS_qualified
: printf ("(qualified)"); break;
8611 default: printf ("(unknown visibility)"); break;
8615 case DW_AT_virtuality
:
8618 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8619 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8620 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8621 default: printf ("(unknown virtuality)"); break;
8625 case DW_AT_identifier_case
:
8628 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8629 case DW_ID_up_case
: printf ("(up_case)"); break;
8630 case DW_ID_down_case
: printf ("(down_case)"); break;
8631 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8632 default: printf ("(unknown case)"); break;
8636 case DW_AT_calling_convention
:
8639 case DW_CC_normal
: printf ("(normal)"); break;
8640 case DW_CC_program
: printf ("(program)"); break;
8641 case DW_CC_nocall
: printf ("(nocall)"); break;
8643 if (uvalue
>= DW_CC_lo_user
8644 && uvalue
<= DW_CC_hi_user
)
8645 printf ("(user defined)");
8647 printf ("(unknown convention)");
8651 case DW_AT_ordering
:
8654 case -1: printf ("(undefined)"); break;
8655 case 0: printf ("(row major)"); break;
8656 case 1: printf ("(column major)"); break;
8660 case DW_AT_frame_base
:
8661 have_frame_base
= 1;
8662 case DW_AT_location
:
8663 case DW_AT_data_member_location
:
8664 case DW_AT_vtable_elem_location
:
8665 case DW_AT_allocated
:
8666 case DW_AT_associated
:
8667 case DW_AT_data_location
:
8669 case DW_AT_upper_bound
:
8670 case DW_AT_lower_bound
:
8673 int need_frame_base
;
8676 need_frame_base
= decode_location_expression (block_start
,
8681 if (need_frame_base
&& !have_frame_base
)
8682 printf (_(" [without DW_AT_frame_base]"));
8684 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8685 printf (_("(location list)"));
8697 get_AT_name (unsigned long attribute
)
8701 case DW_AT_sibling
: return "DW_AT_sibling";
8702 case DW_AT_location
: return "DW_AT_location";
8703 case DW_AT_name
: return "DW_AT_name";
8704 case DW_AT_ordering
: return "DW_AT_ordering";
8705 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
8706 case DW_AT_byte_size
: return "DW_AT_byte_size";
8707 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
8708 case DW_AT_bit_size
: return "DW_AT_bit_size";
8709 case DW_AT_element_list
: return "DW_AT_element_list";
8710 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
8711 case DW_AT_low_pc
: return "DW_AT_low_pc";
8712 case DW_AT_high_pc
: return "DW_AT_high_pc";
8713 case DW_AT_language
: return "DW_AT_language";
8714 case DW_AT_member
: return "DW_AT_member";
8715 case DW_AT_discr
: return "DW_AT_discr";
8716 case DW_AT_discr_value
: return "DW_AT_discr_value";
8717 case DW_AT_visibility
: return "DW_AT_visibility";
8718 case DW_AT_import
: return "DW_AT_import";
8719 case DW_AT_string_length
: return "DW_AT_string_length";
8720 case DW_AT_common_reference
: return "DW_AT_common_reference";
8721 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
8722 case DW_AT_const_value
: return "DW_AT_const_value";
8723 case DW_AT_containing_type
: return "DW_AT_containing_type";
8724 case DW_AT_default_value
: return "DW_AT_default_value";
8725 case DW_AT_inline
: return "DW_AT_inline";
8726 case DW_AT_is_optional
: return "DW_AT_is_optional";
8727 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
8728 case DW_AT_producer
: return "DW_AT_producer";
8729 case DW_AT_prototyped
: return "DW_AT_prototyped";
8730 case DW_AT_return_addr
: return "DW_AT_return_addr";
8731 case DW_AT_start_scope
: return "DW_AT_start_scope";
8732 case DW_AT_stride_size
: return "DW_AT_stride_size";
8733 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
8734 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
8735 case DW_AT_accessibility
: return "DW_AT_accessibility";
8736 case DW_AT_address_class
: return "DW_AT_address_class";
8737 case DW_AT_artificial
: return "DW_AT_artificial";
8738 case DW_AT_base_types
: return "DW_AT_base_types";
8739 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
8740 case DW_AT_count
: return "DW_AT_count";
8741 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
8742 case DW_AT_decl_column
: return "DW_AT_decl_column";
8743 case DW_AT_decl_file
: return "DW_AT_decl_file";
8744 case DW_AT_decl_line
: return "DW_AT_decl_line";
8745 case DW_AT_declaration
: return "DW_AT_declaration";
8746 case DW_AT_discr_list
: return "DW_AT_discr_list";
8747 case DW_AT_encoding
: return "DW_AT_encoding";
8748 case DW_AT_external
: return "DW_AT_external";
8749 case DW_AT_frame_base
: return "DW_AT_frame_base";
8750 case DW_AT_friend
: return "DW_AT_friend";
8751 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
8752 case DW_AT_macro_info
: return "DW_AT_macro_info";
8753 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
8754 case DW_AT_priority
: return "DW_AT_priority";
8755 case DW_AT_segment
: return "DW_AT_segment";
8756 case DW_AT_specification
: return "DW_AT_specification";
8757 case DW_AT_static_link
: return "DW_AT_static_link";
8758 case DW_AT_type
: return "DW_AT_type";
8759 case DW_AT_use_location
: return "DW_AT_use_location";
8760 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
8761 case DW_AT_virtuality
: return "DW_AT_virtuality";
8762 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
8763 /* DWARF 2.1 values. */
8764 case DW_AT_allocated
: return "DW_AT_allocated";
8765 case DW_AT_associated
: return "DW_AT_associated";
8766 case DW_AT_data_location
: return "DW_AT_data_location";
8767 case DW_AT_stride
: return "DW_AT_stride";
8768 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
8769 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
8770 case DW_AT_extension
: return "DW_AT_extension";
8771 case DW_AT_ranges
: return "DW_AT_ranges";
8772 case DW_AT_trampoline
: return "DW_AT_trampoline";
8773 case DW_AT_call_column
: return "DW_AT_call_column";
8774 case DW_AT_call_file
: return "DW_AT_call_file";
8775 case DW_AT_call_line
: return "DW_AT_call_line";
8776 /* SGI/MIPS extensions. */
8777 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
8778 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
8779 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
8780 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
8781 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
8782 case DW_AT_MIPS_software_pipeline_depth
:
8783 return "DW_AT_MIPS_software_pipeline_depth";
8784 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
8785 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
8786 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
8787 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
8788 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
8789 /* GNU extensions. */
8790 case DW_AT_sf_names
: return "DW_AT_sf_names";
8791 case DW_AT_src_info
: return "DW_AT_src_info";
8792 case DW_AT_mac_info
: return "DW_AT_mac_info";
8793 case DW_AT_src_coords
: return "DW_AT_src_coords";
8794 case DW_AT_body_begin
: return "DW_AT_body_begin";
8795 case DW_AT_body_end
: return "DW_AT_body_end";
8796 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
8797 /* UPC extension. */
8798 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
8801 static char buffer
[100];
8803 snprintf (buffer
, sizeof (buffer
), _("Unknown AT value: %lx"),
8810 static unsigned char *
8811 read_and_display_attr (unsigned long attribute
,
8813 unsigned char *data
,
8814 unsigned long cu_offset
,
8815 unsigned long pointer_size
,
8816 unsigned long offset_size
,
8818 debug_info
*debug_info_p
,
8822 printf (" %-18s:", get_AT_name (attribute
));
8823 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8824 pointer_size
, offset_size
,
8825 dwarf_version
, debug_info_p
,
8833 /* Process the contents of a .debug_info section. If do_loc is non-zero
8834 then we are scanning for location lists and we do not want to display
8835 anything to the user. */
8838 process_debug_info (Elf_Internal_Shdr
*section
, unsigned char *start
,
8839 FILE *file
, int do_loc
)
8841 unsigned char *end
= start
+ section
->sh_size
;
8842 unsigned char *section_begin
;
8844 unsigned int num_units
= 0;
8846 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8847 && num_debug_info_entries
== 0)
8849 unsigned long length
;
8851 /* First scan the section to get the number of comp units. */
8852 for (section_begin
= start
, num_units
= 0; section_begin
< end
;
8855 /* Read the first 4 bytes. For a 32-bit DWARF section, this
8856 will be the length. For a 64-bit DWARF section, it'll be
8857 the escape code 0xffffffff followed by an 8 byte length. */
8858 length
= byte_get (section_begin
, 4);
8860 if (length
== 0xffffffff)
8862 length
= byte_get (section_begin
+ 4, 8);
8863 section_begin
+= length
+ 12;
8866 section_begin
+= length
+ 4;
8871 error (_("No comp units in .debug_info section ?"));
8875 /* Then allocate an array to hold the information. */
8876 debug_information
= cmalloc (num_units
,
8877 sizeof (* debug_information
));
8878 if (debug_information
== NULL
)
8880 error (_("Not enough memory for a debug info array of %u entries"),
8888 printf (_("The section %s contains:\n\n"),
8889 SECTION_NAME (section
));
8891 load_debug_str (file
);
8892 load_debug_loc (file
);
8893 load_debug_range (file
);
8896 for (section_begin
= start
, unit
= 0; start
< end
; unit
++)
8898 DWARF2_Internal_CompUnit compunit
;
8899 unsigned char *hdrptr
;
8900 unsigned char *cu_abbrev_offset_ptr
;
8901 unsigned char *tags
;
8903 unsigned long cu_offset
;
8905 int initial_length_size
;
8909 compunit
.cu_length
= byte_get (hdrptr
, 4);
8912 if (compunit
.cu_length
== 0xffffffff)
8914 compunit
.cu_length
= byte_get (hdrptr
, 8);
8917 initial_length_size
= 12;
8922 initial_length_size
= 4;
8925 compunit
.cu_version
= byte_get (hdrptr
, 2);
8928 cu_offset
= start
- section_begin
;
8929 start
+= compunit
.cu_length
+ initial_length_size
;
8931 if (elf_header
.e_type
== ET_REL
8932 && !debug_apply_rela_addends (file
, section
, offset_size
,
8933 section_begin
, hdrptr
, start
))
8936 cu_abbrev_offset_ptr
= hdrptr
;
8937 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8938 hdrptr
+= offset_size
;
8940 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8942 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
8943 && num_debug_info_entries
== 0)
8945 debug_information
[unit
].cu_offset
= cu_offset
;
8946 debug_information
[unit
].pointer_size
8947 = compunit
.cu_pointer_size
;
8948 debug_information
[unit
].base_address
= 0;
8949 debug_information
[unit
].loc_offsets
= NULL
;
8950 debug_information
[unit
].have_frame_base
= NULL
;
8951 debug_information
[unit
].max_loc_offsets
= 0;
8952 debug_information
[unit
].num_loc_offsets
= 0;
8953 debug_information
[unit
].range_lists
= NULL
;
8954 debug_information
[unit
].max_range_lists
= 0;
8955 debug_information
[unit
].num_range_lists
= 0;
8962 printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset
);
8963 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8964 printf (_(" Version: %d\n"), compunit
.cu_version
);
8965 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8966 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8969 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8971 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8977 /* Read in the abbrevs used by this compilation unit. */
8979 Elf_Internal_Shdr
*sec
;
8980 unsigned char *begin
;
8982 /* Locate the .debug_abbrev section and process it. */
8983 sec
= find_section (".debug_abbrev");
8986 warn (_("Unable to locate .debug_abbrev section!\n"));
8990 begin
= get_data (NULL
, file
, sec
->sh_offset
, 1, sec
->sh_size
,
8991 _("debug_abbrev section data"));
8995 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8996 begin
+ sec
->sh_size
);
9002 while (tags
< start
)
9004 unsigned int bytes_read
;
9005 unsigned long abbrev_number
;
9006 abbrev_entry
*entry
;
9009 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
9012 /* A null DIE marks the end of a list of children. */
9013 if (abbrev_number
== 0)
9019 /* Scan through the abbreviation list until we reach the
9021 for (entry
= first_abbrev
;
9022 entry
&& entry
->entry
!= abbrev_number
;
9023 entry
= entry
->next
)
9028 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
9034 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
9036 (unsigned long) (tags
- section_begin
9039 get_TAG_name (entry
->tag
));
9044 need_base_address
= 0;
9046 case DW_TAG_compile_unit
:
9047 need_base_address
= 1;
9049 case DW_TAG_entry_point
:
9050 case DW_TAG_inlined_subroutine
:
9051 case DW_TAG_subprogram
:
9052 need_base_address
= 0;
9053 /* Assuming that there is no DW_AT_frame_base. */
9054 have_frame_base
= 0;
9058 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9059 tags
= read_and_display_attr (attr
->attribute
,
9062 compunit
.cu_pointer_size
,
9064 compunit
.cu_version
,
9065 &debug_information
[unit
],
9068 if (entry
->children
)
9073 /* Set num_debug_info_entries here so that it can be used to check if
9074 we need to process .debug_loc and .debug_ranges sections. */
9075 if ((do_loc
|| do_debug_loc
|| do_debug_ranges
)
9076 && num_debug_info_entries
== 0)
9077 num_debug_info_entries
= num_units
;
9081 free_debug_range ();
9091 /* Retrieve the pointer size associated with the given compilation unit.
9092 Optionally the offset of this unit into the .debug_info section is
9093 also retutned. If there is no .debug_info section then an error
9094 message is issued and 0 is returned. If the requested comp unit has
9095 not been defined in the .debug_info section then a warning message
9096 is issued and the last know pointer size is returned. This message
9097 is only issued once per section dumped per file dumped. */
9100 get_pointer_size_and_offset_of_comp_unit (unsigned int comp_unit
,
9101 const char * section_name
,
9102 unsigned long * offset_return
)
9104 unsigned long offset
= 0;
9106 if (num_debug_info_entries
== 0)
9107 error (_("%s section needs a populated .debug_info section\n"),
9110 else if (comp_unit
>= num_debug_info_entries
)
9112 if (!warned_about_missing_comp_units
)
9114 warn (_("%s section has more comp units than .debug_info section\n"),
9116 warn (_("assuming that the pointer size is %d, from the last comp unit in .debug_info\n\n"),
9118 warned_about_missing_comp_units
= TRUE
;
9123 last_pointer_size
= debug_information
[comp_unit
].pointer_size
;
9124 offset
= debug_information
[comp_unit
].cu_offset
;
9127 if (offset_return
!= NULL
)
9128 * offset_return
= offset
;
9130 return last_pointer_size
;
9133 /* Locate and scan the .debug_info section in the file and record the pointer
9134 sizes and offsets for the compilation units in it. Usually an executable
9135 will have just one pointer size, but this is not guaranteed, and so we try
9136 not to make any assumptions. Returns zero upon failure, or the number of
9137 compilation units upon success. */
9140 get_debug_info (FILE * file
)
9142 Elf_Internal_Shdr
* section
;
9143 unsigned char * start
;
9146 /* Reset the last pointer size so that we can issue correct error
9147 messages if we are displaying the contents of more than one section. */
9148 last_pointer_size
= 0;
9149 warned_about_missing_comp_units
= FALSE
;
9151 /* If we already have the information there is nothing else to do. */
9152 if (num_debug_info_entries
> 0)
9153 return num_debug_info_entries
;
9155 section
= find_section (".debug_info");
9156 if (section
== NULL
)
9159 start
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9160 _("extracting information from .debug_info section"));
9164 ret
= process_debug_info (section
, start
, file
, 1);
9167 return ret
? num_debug_info_entries
: 0;
9171 display_debug_lines (Elf_Internal_Shdr
*section
,
9172 unsigned char *start
, FILE *file
)
9174 unsigned char *data
= start
;
9175 unsigned char *end
= start
+ section
->sh_size
;
9176 unsigned int comp_unit
= 0;
9178 printf (_("\nDump of debug contents of section %s:\n\n"),
9179 SECTION_NAME (section
));
9181 get_debug_info (file
);
9185 DWARF2_Internal_LineInfo info
;
9186 unsigned char *standard_opcodes
;
9187 unsigned char *end_of_sequence
;
9188 unsigned char *hdrptr
;
9189 unsigned int pointer_size
;
9190 int initial_length_size
;
9196 /* Check the length of the block. */
9197 info
.li_length
= byte_get (hdrptr
, 4);
9200 if (info
.li_length
== 0xffffffff)
9202 /* This section is 64-bit DWARF 3. */
9203 info
.li_length
= byte_get (hdrptr
, 8);
9206 initial_length_size
= 12;
9211 initial_length_size
= 4;
9214 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
9217 (_("The line info appears to be corrupt - the section is too small\n"));
9221 /* Check its version number. */
9222 info
.li_version
= byte_get (hdrptr
, 2);
9224 if (info
.li_version
!= 2 && info
.li_version
!= 3)
9226 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
9230 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
9231 hdrptr
+= offset_size
;
9232 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
9234 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
9236 info
.li_line_base
= byte_get (hdrptr
, 1);
9238 info
.li_line_range
= byte_get (hdrptr
, 1);
9240 info
.li_opcode_base
= byte_get (hdrptr
, 1);
9243 /* Sign extend the line base field. */
9244 info
.li_line_base
<<= 24;
9245 info
.li_line_base
>>= 24;
9247 /* Get the pointer size from the comp unit associated
9248 with this block of line number information. */
9249 pointer_size
= get_pointer_size_and_offset_of_comp_unit
9250 (comp_unit
, ".debug_line", NULL
);
9253 printf (_(" Length: %ld\n"), info
.li_length
);
9254 printf (_(" DWARF Version: %d\n"), info
.li_version
);
9255 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
9256 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
9257 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
9258 printf (_(" Line Base: %d\n"), info
.li_line_base
);
9259 printf (_(" Line Range: %d\n"), info
.li_line_range
);
9260 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
9261 printf (_(" (Pointer size: %u)%s\n"),
9263 warned_about_missing_comp_units
? " [assumed]" : "" );
9265 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
9267 reset_state_machine (info
.li_default_is_stmt
);
9269 /* Display the contents of the Opcodes table. */
9270 standard_opcodes
= hdrptr
;
9272 printf (_("\n Opcodes:\n"));
9274 for (i
= 1; i
< info
.li_opcode_base
; i
++)
9275 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
9277 /* Display the contents of the Directory table. */
9278 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
9281 printf (_("\n The Directory Table is empty.\n"));
9284 printf (_("\n The Directory Table:\n"));
9288 printf (_(" %s\n"), data
);
9290 data
+= strlen ((char *) data
) + 1;
9294 /* Skip the NUL at the end of the table. */
9297 /* Display the contents of the File Name table. */
9299 printf (_("\n The File Name Table is empty.\n"));
9302 printf (_("\n The File Name Table:\n"));
9303 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
9307 unsigned char *name
;
9308 unsigned int bytes_read
;
9310 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
9313 data
+= strlen ((char *) data
) + 1;
9315 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9317 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9319 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
9321 printf (_("%s\n"), name
);
9325 /* Skip the NUL at the end of the table. */
9328 /* Now display the statements. */
9329 printf (_("\n Line Number Statements:\n"));
9331 while (data
< end_of_sequence
)
9333 unsigned char op_code
;
9335 unsigned int bytes_read
;
9339 if (op_code
>= info
.li_opcode_base
)
9341 op_code
-= info
.li_opcode_base
;
9342 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
9343 state_machine_regs
.address
+= adv
;
9344 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
9345 op_code
, adv
, state_machine_regs
.address
);
9346 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
9347 state_machine_regs
.line
+= adv
;
9348 printf (_(" and Line by %d to %d\n"),
9349 adv
, state_machine_regs
.line
);
9351 else switch (op_code
)
9353 case DW_LNS_extended_op
:
9354 if (pointer_size
== 0)
9356 warn (_("Extend line ops need a valid pointer size, guessing at 4\n"));
9360 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
9365 printf (_(" Copy\n"));
9368 case DW_LNS_advance_pc
:
9369 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
9371 state_machine_regs
.address
+= adv
;
9372 printf (_(" Advance PC by %d to %lx\n"), adv
,
9373 state_machine_regs
.address
);
9376 case DW_LNS_advance_line
:
9377 adv
= read_leb128 (data
, & bytes_read
, 1);
9379 state_machine_regs
.line
+= adv
;
9380 printf (_(" Advance Line by %d to %d\n"), adv
,
9381 state_machine_regs
.line
);
9384 case DW_LNS_set_file
:
9385 adv
= read_leb128 (data
, & bytes_read
, 0);
9387 printf (_(" Set File Name to entry %d in the File Name Table\n"),
9389 state_machine_regs
.file
= adv
;
9392 case DW_LNS_set_column
:
9393 adv
= read_leb128 (data
, & bytes_read
, 0);
9395 printf (_(" Set column to %d\n"), adv
);
9396 state_machine_regs
.column
= adv
;
9399 case DW_LNS_negate_stmt
:
9400 adv
= state_machine_regs
.is_stmt
;
9402 printf (_(" Set is_stmt to %d\n"), adv
);
9403 state_machine_regs
.is_stmt
= adv
;
9406 case DW_LNS_set_basic_block
:
9407 printf (_(" Set basic block\n"));
9408 state_machine_regs
.basic_block
= 1;
9411 case DW_LNS_const_add_pc
:
9412 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
9413 * info
.li_min_insn_length
);
9414 state_machine_regs
.address
+= adv
;
9415 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
9416 state_machine_regs
.address
);
9419 case DW_LNS_fixed_advance_pc
:
9420 adv
= byte_get (data
, 2);
9422 state_machine_regs
.address
+= adv
;
9423 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
9424 adv
, state_machine_regs
.address
);
9427 case DW_LNS_set_prologue_end
:
9428 printf (_(" Set prologue_end to true\n"));
9431 case DW_LNS_set_epilogue_begin
:
9432 printf (_(" Set epilogue_begin to true\n"));
9435 case DW_LNS_set_isa
:
9436 adv
= read_leb128 (data
, & bytes_read
, 0);
9438 printf (_(" Set ISA to %d\n"), adv
);
9442 printf (_(" Unknown opcode %d with operands: "), op_code
);
9444 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
9446 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
9447 i
== 1 ? "" : ", ");
9461 display_debug_pubnames (Elf_Internal_Shdr
*section
,
9462 unsigned char *start
,
9463 FILE *file ATTRIBUTE_UNUSED
)
9465 DWARF2_Internal_PubNames pubnames
;
9468 end
= start
+ section
->sh_size
;
9470 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9474 unsigned char *data
;
9475 unsigned long offset
;
9476 int offset_size
, initial_length_size
;
9480 pubnames
.pn_length
= byte_get (data
, 4);
9482 if (pubnames
.pn_length
== 0xffffffff)
9484 pubnames
.pn_length
= byte_get (data
, 8);
9487 initial_length_size
= 12;
9492 initial_length_size
= 4;
9495 pubnames
.pn_version
= byte_get (data
, 2);
9497 pubnames
.pn_offset
= byte_get (data
, offset_size
);
9498 data
+= offset_size
;
9499 pubnames
.pn_size
= byte_get (data
, offset_size
);
9500 data
+= offset_size
;
9502 start
+= pubnames
.pn_length
+ initial_length_size
;
9504 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
9506 static int warned
= 0;
9510 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
9517 printf (_(" Length: %ld\n"),
9518 pubnames
.pn_length
);
9519 printf (_(" Version: %d\n"),
9520 pubnames
.pn_version
);
9521 printf (_(" Offset into .debug_info section: %ld\n"),
9522 pubnames
.pn_offset
);
9523 printf (_(" Size of area in .debug_info section: %ld\n"),
9526 printf (_("\n Offset\tName\n"));
9530 offset
= byte_get (data
, offset_size
);
9534 data
+= offset_size
;
9535 printf (" %-6ld\t\t%s\n", offset
, data
);
9536 data
+= strlen ((char *) data
) + 1;
9539 while (offset
!= 0);
9547 display_debug_macinfo (Elf_Internal_Shdr
*section
,
9548 unsigned char *start
,
9549 FILE *file ATTRIBUTE_UNUSED
)
9551 unsigned char *end
= start
+ section
->sh_size
;
9552 unsigned char *curr
= start
;
9553 unsigned int bytes_read
;
9554 enum dwarf_macinfo_record_type op
;
9556 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9560 unsigned int lineno
;
9568 case DW_MACINFO_start_file
:
9570 unsigned int filenum
;
9572 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9574 filenum
= read_leb128 (curr
, & bytes_read
, 0);
9577 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"),
9582 case DW_MACINFO_end_file
:
9583 printf (_(" DW_MACINFO_end_file\n"));
9586 case DW_MACINFO_define
:
9587 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9589 string
= (char *) curr
;
9590 curr
+= strlen (string
) + 1;
9591 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"),
9595 case DW_MACINFO_undef
:
9596 lineno
= read_leb128 (curr
, & bytes_read
, 0);
9598 string
= (char *) curr
;
9599 curr
+= strlen (string
) + 1;
9600 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"),
9604 case DW_MACINFO_vendor_ext
:
9606 unsigned int constant
;
9608 constant
= read_leb128 (curr
, & bytes_read
, 0);
9610 string
= (char *) curr
;
9611 curr
+= strlen (string
) + 1;
9612 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"),
9624 display_debug_abbrev (Elf_Internal_Shdr
*section
,
9625 unsigned char *start
,
9626 FILE *file ATTRIBUTE_UNUSED
)
9628 abbrev_entry
*entry
;
9629 unsigned char *end
= start
+ section
->sh_size
;
9631 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
9635 start
= process_abbrev_section (start
, end
);
9637 if (first_abbrev
== NULL
)
9640 printf (_(" Number TAG\n"));
9642 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
9646 printf (_(" %ld %s [%s]\n"),
9648 get_TAG_name (entry
->tag
),
9649 entry
->children
? _("has children") : _("no children"));
9651 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
9652 printf (_(" %-18s %s\n"),
9653 get_AT_name (attr
->attribute
),
9654 get_FORM_name (attr
->form
));
9667 display_debug_loc (Elf_Internal_Shdr
*section
,
9668 unsigned char *start
, FILE *file
)
9670 unsigned char *section_end
;
9671 unsigned long bytes
;
9672 unsigned char *section_begin
= start
;
9673 unsigned int num_loc_list
= 0;
9674 unsigned long last_offset
= 0;
9675 unsigned int first
= 0;
9678 int seen_first_offset
= 0;
9679 int use_debug_info
= 1;
9680 unsigned char *next
;
9682 bytes
= section
->sh_size
;
9683 section_end
= start
+ bytes
;
9687 printf (_("\nThe .debug_loc section is empty.\n"));
9691 get_debug_info (file
);
9693 /* Check the order of location list in .debug_info section. If
9694 offsets of location lists are in the ascending order, we can
9695 use `debug_information' directly. */
9696 for (i
= 0; i
< num_debug_info_entries
; i
++)
9700 num
= debug_information
[i
].num_loc_offsets
;
9701 num_loc_list
+= num
;
9703 /* Check if we can use `debug_information' directly. */
9704 if (use_debug_info
&& num
!= 0)
9706 if (!seen_first_offset
)
9708 /* This is the first location list. */
9709 last_offset
= debug_information
[i
].loc_offsets
[0];
9711 seen_first_offset
= 1;
9717 for (; j
< num
; j
++)
9720 debug_information
[i
].loc_offsets
[j
])
9725 last_offset
= debug_information
[i
].loc_offsets
[j
];
9730 if (!use_debug_info
)
9731 /* FIXME: Should we handle this case? */
9732 error (_("Location lists in .debug_info section aren't in ascending order!\n"));
9734 if (!seen_first_offset
)
9735 error (_("No location lists in .debug_info section!\n"));
9737 if (debug_information
[first
].loc_offsets
[0] != 0)
9738 warn (_("Location lists in .debug_loc section start at 0x%lx\n"),
9739 debug_information
[first
].loc_offsets
[0]);
9741 printf (_("Contents of the .debug_loc section:\n\n"));
9742 printf (_(" Offset Begin End Expression\n"));
9744 seen_first_offset
= 0;
9745 for (i
= first
; i
< num_debug_info_entries
; i
++)
9747 unsigned long begin
;
9749 unsigned short length
;
9750 unsigned long offset
;
9751 unsigned int pointer_size
;
9752 unsigned long cu_offset
;
9753 unsigned long base_address
;
9754 int need_frame_base
;
9757 pointer_size
= debug_information
[i
].pointer_size
;
9758 cu_offset
= debug_information
[i
].cu_offset
;
9760 for (j
= 0; j
< debug_information
[i
].num_loc_offsets
; j
++)
9762 has_frame_base
= debug_information
[i
].have_frame_base
[j
];
9763 offset
= debug_information
[i
].loc_offsets
[j
];
9764 next
= section_begin
+ offset
;
9765 base_address
= debug_information
[i
].base_address
;
9767 if (!seen_first_offset
)
9768 seen_first_offset
= 1;
9772 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_loc section.\n"),
9773 start
- section_begin
, next
- section_begin
);
9774 else if (start
> next
)
9775 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_loc section.\n"),
9776 start
- section_begin
, next
- section_begin
);
9780 if (offset
>= bytes
)
9782 warn (_("Offset 0x%lx is bigger than .debug_loc section size.\n"),
9789 if (start
+ 2 * pointer_size
> section_end
)
9791 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9796 begin
= byte_get (start
, pointer_size
);
9797 start
+= pointer_size
;
9798 end
= byte_get (start
, pointer_size
);
9799 start
+= pointer_size
;
9801 if (begin
== 0 && end
== 0)
9803 printf (_(" %8.8lx <End of list>\n"), offset
);
9807 /* Check base address specifiers. */
9808 if (begin
== -1UL && end
!= -1UL)
9811 printf (_(" %8.8lx %8.8lx %8.8lx (base address)\n"),
9812 offset
, begin
, end
);
9816 if (start
+ 2 > section_end
)
9818 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9823 length
= byte_get (start
, 2);
9826 if (start
+ length
> section_end
)
9828 warn (_("Location list starting at offset 0x%lx is not terminated.\n"),
9833 printf (" %8.8lx %8.8lx %8.8lx (",
9834 offset
, begin
+ base_address
, end
+ base_address
);
9835 need_frame_base
= decode_location_expression (start
,
9841 if (need_frame_base
&& !has_frame_base
)
9842 printf (_(" [without DW_AT_frame_base]"));
9845 fputs (_(" (start == end)"), stdout
);
9846 else if (begin
> end
)
9847 fputs (_(" (start > end)"), stdout
);
9859 display_debug_str (Elf_Internal_Shdr
*section
,
9860 unsigned char *start
,
9861 FILE *file ATTRIBUTE_UNUSED
)
9863 unsigned long bytes
;
9866 addr
= section
->sh_addr
;
9867 bytes
= section
->sh_size
;
9871 printf (_("\nThe .debug_str section is empty.\n"));
9875 printf (_("Contents of the .debug_str section:\n\n"));
9883 lbytes
= (bytes
> 16 ? 16 : bytes
);
9885 printf (" 0x%8.8lx ", (unsigned long) addr
);
9887 for (j
= 0; j
< 16; j
++)
9890 printf ("%2.2x", start
[j
]);
9898 for (j
= 0; j
< lbytes
; j
++)
9901 if (k
>= ' ' && k
< 0x80)
9921 display_debug_info (Elf_Internal_Shdr
* section
,
9922 unsigned char * start
, FILE * file
)
9924 return process_debug_info (section
, start
, file
, 0);
9929 display_debug_aranges (Elf_Internal_Shdr
*section
,
9930 unsigned char *start
,
9931 FILE *file ATTRIBUTE_UNUSED
)
9933 unsigned char *end
= start
+ section
->sh_size
;
9935 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
9939 unsigned char *hdrptr
;
9940 DWARF2_Internal_ARange arange
;
9941 unsigned char *ranges
;
9942 unsigned long length
;
9943 unsigned long address
;
9946 int initial_length_size
;
9950 arange
.ar_length
= byte_get (hdrptr
, 4);
9953 if (arange
.ar_length
== 0xffffffff)
9955 arange
.ar_length
= byte_get (hdrptr
, 8);
9958 initial_length_size
= 12;
9963 initial_length_size
= 4;
9966 arange
.ar_version
= byte_get (hdrptr
, 2);
9969 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
9970 hdrptr
+= offset_size
;
9972 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
9975 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
9978 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
9980 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
9984 printf (_(" Length: %ld\n"), arange
.ar_length
);
9985 printf (_(" Version: %d\n"), arange
.ar_version
);
9986 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
9987 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
9988 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
9990 printf (_("\n Address Length\n"));
9994 /* Must pad to an alignment boundary that is twice the pointer size. */
9995 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
9997 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
10001 address
= byte_get (ranges
, arange
.ar_pointer_size
);
10003 ranges
+= arange
.ar_pointer_size
;
10005 length
= byte_get (ranges
, arange
.ar_pointer_size
);
10007 ranges
+= arange
.ar_pointer_size
;
10009 /* A pair of zeros marks the end of the list. */
10010 if (address
== 0 && length
== 0)
10013 printf (" %8.8lx %lu\n", address
, length
);
10016 start
+= arange
.ar_length
+ initial_length_size
;
10025 display_debug_ranges (Elf_Internal_Shdr
*section
,
10026 unsigned char *start
,
10027 FILE *file ATTRIBUTE_UNUSED
)
10029 unsigned char *section_end
;
10030 unsigned long bytes
;
10031 unsigned char *section_begin
= start
;
10032 unsigned int num_range_list
= 0;
10033 unsigned long last_offset
= 0;
10034 unsigned int first
= 0;
10037 int seen_first_offset
= 0;
10038 int use_debug_info
= 1;
10039 unsigned char *next
;
10041 bytes
= section
->sh_size
;
10042 section_end
= start
+ bytes
;
10046 printf (_("\nThe .debug_ranges section is empty.\n"));
10050 get_debug_info (file
);
10052 /* Check the order of range list in .debug_info section. If
10053 offsets of range lists are in the ascending order, we can
10054 use `debug_information' directly. */
10055 for (i
= 0; i
< num_debug_info_entries
; i
++)
10059 num
= debug_information
[i
].num_range_lists
;
10060 num_range_list
+= num
;
10062 /* Check if we can use `debug_information' directly. */
10063 if (use_debug_info
&& num
!= 0)
10065 if (!seen_first_offset
)
10067 /* This is the first range list. */
10068 last_offset
= debug_information
[i
].range_lists
[0];
10070 seen_first_offset
= 1;
10076 for (; j
< num
; j
++)
10079 debug_information
[i
].range_lists
[j
])
10081 use_debug_info
= 0;
10084 last_offset
= debug_information
[i
].range_lists
[j
];
10089 if (!use_debug_info
)
10090 /* FIXME: Should we handle this case? */
10091 error (_("Range lists in .debug_info section aren't in ascending order!\n"));
10093 if (!seen_first_offset
)
10094 error (_("No range lists in .debug_info section!\n"));
10096 if (debug_information
[first
].range_lists
[0] != 0)
10097 warn (_("Range lists in .debug_ranges section start at 0x%lx\n"),
10098 debug_information
[first
].range_lists
[0]);
10100 printf (_("Contents of the .debug_ranges section:\n\n"));
10101 printf (_(" Offset Begin End\n"));
10103 seen_first_offset
= 0;
10104 for (i
= first
; i
< num_debug_info_entries
; i
++)
10106 unsigned long begin
;
10108 unsigned long offset
;
10109 unsigned int pointer_size
;
10110 unsigned long base_address
;
10112 pointer_size
= debug_information
[i
].pointer_size
;
10114 for (j
= 0; j
< debug_information
[i
].num_range_lists
; j
++)
10116 offset
= debug_information
[i
].range_lists
[j
];
10117 next
= section_begin
+ offset
;
10118 base_address
= debug_information
[i
].base_address
;
10120 if (!seen_first_offset
)
10121 seen_first_offset
= 1;
10125 warn (_("There is a hole [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10126 start
- section_begin
, next
- section_begin
);
10127 else if (start
> next
)
10128 warn (_("There is an overlap [0x%lx - 0x%lx] in .debug_ranges section.\n"),
10129 start
- section_begin
, next
- section_begin
);
10135 begin
= byte_get (start
, pointer_size
);
10136 start
+= pointer_size
;
10137 end
= byte_get (start
, pointer_size
);
10138 start
+= pointer_size
;
10140 if (begin
== 0 && end
== 0)
10142 printf (_(" %8.8lx <End of list>\n"), offset
);
10146 /* Check base address specifiers. */
10147 if (begin
== -1UL && end
!= -1UL)
10149 base_address
= end
;
10150 printf (" %8.8lx %8.8lx %8.8lx (base address)\n",
10151 offset
, begin
, end
);
10155 printf (" %8.8lx %8.8lx %8.8lx",
10156 offset
, begin
+ base_address
, end
+ base_address
);
10159 fputs (_(" (start == end)"), stdout
);
10160 else if (begin
> end
)
10161 fputs (_(" (start > end)"), stdout
);
10171 typedef struct Frame_Chunk
10173 struct Frame_Chunk
*next
;
10174 unsigned char *chunk_start
;
10176 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
10177 short int *col_type
;
10179 char *augmentation
;
10180 unsigned int code_factor
;
10182 unsigned long pc_begin
;
10183 unsigned long pc_range
;
10187 unsigned char fde_encoding
;
10188 unsigned char cfa_exp
;
10192 /* A marker for a col_type that means this column was never referenced
10193 in the frame info. */
10194 #define DW_CFA_unreferenced (-1)
10197 frame_need_space (Frame_Chunk
*fc
, int reg
)
10199 int prev
= fc
->ncols
;
10201 if (reg
< fc
->ncols
)
10204 fc
->ncols
= reg
+ 1;
10205 fc
->col_type
= xcrealloc (fc
->col_type
, fc
->ncols
, sizeof (short int));
10206 fc
->col_offset
= xcrealloc (fc
->col_offset
, fc
->ncols
, sizeof (int));
10208 while (prev
< fc
->ncols
)
10210 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
10211 fc
->col_offset
[prev
] = 0;
10217 frame_display_row (Frame_Chunk
*fc
, int *need_col_headers
, int *max_regs
)
10222 if (*max_regs
< fc
->ncols
)
10223 *max_regs
= fc
->ncols
;
10225 if (*need_col_headers
)
10227 *need_col_headers
= 0;
10229 printf (" LOC CFA ");
10231 for (r
= 0; r
< *max_regs
; r
++)
10232 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10237 printf ("r%-4d", r
);
10243 printf ("%08lx ", fc
->pc_begin
);
10245 strcpy (tmp
, "exp");
10247 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
10248 printf ("%-8s ", tmp
);
10250 for (r
= 0; r
< fc
->ncols
; r
++)
10252 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
10254 switch (fc
->col_type
[r
])
10256 case DW_CFA_undefined
:
10259 case DW_CFA_same_value
:
10262 case DW_CFA_offset
:
10263 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
10265 case DW_CFA_register
:
10266 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
10268 case DW_CFA_expression
:
10269 strcpy (tmp
, "exp");
10272 strcpy (tmp
, "n/a");
10275 printf ("%-5s", tmp
);
10282 size_of_encoded_value (int encoding
)
10284 switch (encoding
& 0x7)
10287 case 0: return eh_addr_size
;
10295 get_encoded_value (unsigned char *data
, int encoding
)
10297 int size
= size_of_encoded_value (encoding
);
10298 if (encoding
& DW_EH_PE_signed
)
10299 return byte_get_signed (data
, size
);
10301 return byte_get (data
, size
);
10304 #define GET(N) byte_get (start, N); start += N
10305 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
10306 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
10309 display_debug_frames (Elf_Internal_Shdr
*section
,
10310 unsigned char *start
,
10311 FILE *file ATTRIBUTE_UNUSED
)
10313 unsigned char *end
= start
+ section
->sh_size
;
10314 unsigned char *section_start
= start
;
10315 Frame_Chunk
*chunks
= 0;
10316 Frame_Chunk
*remembered_state
= 0;
10318 int is_eh
= streq (SECTION_NAME (section
), ".eh_frame");
10319 unsigned int length_return
;
10322 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
10324 while (start
< end
)
10326 unsigned char *saved_start
;
10327 unsigned char *block_end
;
10328 unsigned long length
;
10329 unsigned long cie_id
;
10332 int need_col_headers
= 1;
10333 unsigned char *augmentation_data
= NULL
;
10334 unsigned long augmentation_data_len
= 0;
10335 int encoded_ptr_size
= eh_addr_size
;
10337 int initial_length_size
;
10339 saved_start
= start
;
10340 length
= byte_get (start
, 4); start
+= 4;
10344 printf ("\n%08lx ZERO terminator\n\n",
10345 (unsigned long)(saved_start
- section_start
));
10349 if (length
== 0xffffffff)
10351 length
= byte_get (start
, 8);
10354 initial_length_size
= 12;
10359 initial_length_size
= 4;
10362 block_end
= saved_start
+ length
+ initial_length_size
;
10363 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
10365 if (elf_header
.e_type
== ET_REL
10366 && !debug_apply_rela_addends (file
, section
, offset_size
,
10367 section_start
, start
, block_end
))
10370 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
10374 fc
= xmalloc (sizeof (Frame_Chunk
));
10375 memset (fc
, 0, sizeof (Frame_Chunk
));
10379 fc
->chunk_start
= saved_start
;
10381 fc
->col_type
= xmalloc (sizeof (short int));
10382 fc
->col_offset
= xmalloc (sizeof (int));
10383 frame_need_space (fc
, max_regs
-1);
10385 version
= *start
++;
10387 fc
->augmentation
= (char *) start
;
10388 start
= (unsigned char *) strchr ((char *) start
, '\0') + 1;
10390 if (fc
->augmentation
[0] == 'z')
10392 fc
->code_factor
= LEB ();
10393 fc
->data_factor
= SLEB ();
10402 augmentation_data_len
= LEB ();
10403 augmentation_data
= start
;
10404 start
+= augmentation_data_len
;
10406 else if (streq (fc
->augmentation
, "eh"))
10408 start
+= eh_addr_size
;
10409 fc
->code_factor
= LEB ();
10410 fc
->data_factor
= SLEB ();
10422 fc
->code_factor
= LEB ();
10423 fc
->data_factor
= SLEB ();
10435 if (do_debug_frames_interp
)
10436 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
10437 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10438 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
10442 printf ("\n%08lx %08lx %08lx CIE\n",
10443 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
10444 printf (" Version: %d\n", version
);
10445 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
10446 printf (" Code alignment factor: %u\n", fc
->code_factor
);
10447 printf (" Data alignment factor: %d\n", fc
->data_factor
);
10448 printf (" Return address column: %d\n", fc
->ra
);
10450 if (augmentation_data_len
)
10453 printf (" Augmentation data: ");
10454 for (i
= 0; i
< augmentation_data_len
; ++i
)
10455 printf (" %02x", augmentation_data
[i
]);
10461 if (augmentation_data_len
)
10463 unsigned char *p
, *q
;
10464 p
= (unsigned char *) fc
->augmentation
+ 1;
10465 q
= augmentation_data
;
10471 else if (*p
== 'P')
10472 q
+= 1 + size_of_encoded_value (*q
);
10473 else if (*p
== 'R')
10474 fc
->fde_encoding
= *q
++;
10480 if (fc
->fde_encoding
)
10481 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10484 frame_need_space (fc
, fc
->ra
);
10488 unsigned char *look_for
;
10489 static Frame_Chunk fde_fc
;
10492 memset (fc
, 0, sizeof (Frame_Chunk
));
10494 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
10496 for (cie
= chunks
; cie
; cie
= cie
->next
)
10497 if (cie
->chunk_start
== look_for
)
10502 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
10503 cie_id
, saved_start
);
10506 fc
->col_type
= xmalloc (sizeof (short int));
10507 fc
->col_offset
= xmalloc (sizeof (int));
10508 frame_need_space (fc
, max_regs
- 1);
10510 fc
->augmentation
= "";
10511 fc
->fde_encoding
= 0;
10515 fc
->ncols
= cie
->ncols
;
10516 fc
->col_type
= xcmalloc (fc
->ncols
, sizeof (short int));
10517 fc
->col_offset
= xcmalloc (fc
->ncols
, sizeof (int));
10518 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
10519 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
10520 fc
->augmentation
= cie
->augmentation
;
10521 fc
->code_factor
= cie
->code_factor
;
10522 fc
->data_factor
= cie
->data_factor
;
10523 fc
->cfa_reg
= cie
->cfa_reg
;
10524 fc
->cfa_offset
= cie
->cfa_offset
;
10526 frame_need_space (fc
, max_regs
-1);
10527 fc
->fde_encoding
= cie
->fde_encoding
;
10530 if (fc
->fde_encoding
)
10531 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
10533 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
10534 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10535 /* Don't adjust for ET_REL since there's invariably a pcrel
10536 reloc here, which we haven't applied. */
10537 && elf_header
.e_type
!= ET_REL
)
10538 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
10539 start
+= encoded_ptr_size
;
10540 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
10541 start
+= encoded_ptr_size
;
10543 if (cie
->augmentation
[0] == 'z')
10545 augmentation_data_len
= LEB ();
10546 augmentation_data
= start
;
10547 start
+= augmentation_data_len
;
10550 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
10551 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
10552 (unsigned long)(cie
->chunk_start
- section_start
),
10553 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
10554 if (! do_debug_frames_interp
&& augmentation_data_len
)
10558 printf (" Augmentation data: ");
10559 for (i
= 0; i
< augmentation_data_len
; ++i
)
10560 printf (" %02x", augmentation_data
[i
]);
10566 /* At this point, fc is the current chunk, cie (if any) is set, and
10567 we're about to interpret instructions for the chunk. */
10568 /* ??? At present we need to do this always, since this sizes the
10569 fc->col_type and fc->col_offset arrays, which we write into always.
10570 We should probably split the interpreted and non-interpreted bits
10571 into two different routines, since there's so much that doesn't
10572 really overlap between them. */
10573 if (1 || do_debug_frames_interp
)
10575 /* Start by making a pass over the chunk, allocating storage
10576 and taking note of what registers are used. */
10577 unsigned char *tmp
= start
;
10579 while (start
< block_end
)
10582 unsigned long reg
, tmp
;
10589 /* Warning: if you add any more cases to this switch, be
10590 sure to add them to the corresponding switch below. */
10593 case DW_CFA_advance_loc
:
10595 case DW_CFA_offset
:
10597 frame_need_space (fc
, opa
);
10598 fc
->col_type
[opa
] = DW_CFA_undefined
;
10600 case DW_CFA_restore
:
10601 frame_need_space (fc
, opa
);
10602 fc
->col_type
[opa
] = DW_CFA_undefined
;
10604 case DW_CFA_set_loc
:
10605 start
+= encoded_ptr_size
;
10607 case DW_CFA_advance_loc1
:
10610 case DW_CFA_advance_loc2
:
10613 case DW_CFA_advance_loc4
:
10616 case DW_CFA_offset_extended
:
10617 reg
= LEB (); LEB ();
10618 frame_need_space (fc
, reg
);
10619 fc
->col_type
[reg
] = DW_CFA_undefined
;
10621 case DW_CFA_restore_extended
:
10623 frame_need_space (fc
, reg
);
10624 fc
->col_type
[reg
] = DW_CFA_undefined
;
10626 case DW_CFA_undefined
:
10628 frame_need_space (fc
, reg
);
10629 fc
->col_type
[reg
] = DW_CFA_undefined
;
10631 case DW_CFA_same_value
:
10633 frame_need_space (fc
, reg
);
10634 fc
->col_type
[reg
] = DW_CFA_undefined
;
10636 case DW_CFA_register
:
10637 reg
= LEB (); LEB ();
10638 frame_need_space (fc
, reg
);
10639 fc
->col_type
[reg
] = DW_CFA_undefined
;
10641 case DW_CFA_def_cfa
:
10644 case DW_CFA_def_cfa_register
:
10647 case DW_CFA_def_cfa_offset
:
10650 case DW_CFA_def_cfa_expression
:
10654 case DW_CFA_expression
:
10658 frame_need_space (fc
, reg
);
10659 fc
->col_type
[reg
] = DW_CFA_undefined
;
10661 case DW_CFA_offset_extended_sf
:
10662 reg
= LEB (); SLEB ();
10663 frame_need_space (fc
, reg
);
10664 fc
->col_type
[reg
] = DW_CFA_undefined
;
10666 case DW_CFA_def_cfa_sf
:
10669 case DW_CFA_def_cfa_offset_sf
:
10672 case DW_CFA_MIPS_advance_loc8
:
10675 case DW_CFA_GNU_args_size
:
10678 case DW_CFA_GNU_negative_offset_extended
:
10679 reg
= LEB (); LEB ();
10680 frame_need_space (fc
, reg
);
10681 fc
->col_type
[reg
] = DW_CFA_undefined
;
10690 /* Now we know what registers are used, make a second pass over
10691 the chunk, this time actually printing out the info. */
10693 while (start
< block_end
)
10696 unsigned long ul
, reg
, roffs
;
10705 /* Warning: if you add any more cases to this switch, be
10706 sure to add them to the corresponding switch above. */
10709 case DW_CFA_advance_loc
:
10710 if (do_debug_frames_interp
)
10711 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10713 printf (" DW_CFA_advance_loc: %d to %08lx\n",
10714 opa
* fc
->code_factor
,
10715 fc
->pc_begin
+ opa
* fc
->code_factor
);
10716 fc
->pc_begin
+= opa
* fc
->code_factor
;
10719 case DW_CFA_offset
:
10721 if (! do_debug_frames_interp
)
10722 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
10723 opa
, roffs
* fc
->data_factor
);
10724 fc
->col_type
[opa
] = DW_CFA_offset
;
10725 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
10728 case DW_CFA_restore
:
10729 if (! do_debug_frames_interp
)
10730 printf (" DW_CFA_restore: r%d\n", opa
);
10731 fc
->col_type
[opa
] = cie
->col_type
[opa
];
10732 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
10735 case DW_CFA_set_loc
:
10736 vma
= get_encoded_value (start
, fc
->fde_encoding
);
10737 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
10738 && elf_header
.e_type
!= ET_REL
)
10739 vma
+= section
->sh_addr
+ (start
- section_start
);
10740 start
+= encoded_ptr_size
;
10741 if (do_debug_frames_interp
)
10742 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10744 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
10745 fc
->pc_begin
= vma
;
10748 case DW_CFA_advance_loc1
:
10749 ofs
= byte_get (start
, 1); start
+= 1;
10750 if (do_debug_frames_interp
)
10751 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10753 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
10754 ofs
* fc
->code_factor
,
10755 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10756 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10759 case DW_CFA_advance_loc2
:
10760 ofs
= byte_get (start
, 2); start
+= 2;
10761 if (do_debug_frames_interp
)
10762 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10764 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
10765 ofs
* fc
->code_factor
,
10766 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10767 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10770 case DW_CFA_advance_loc4
:
10771 ofs
= byte_get (start
, 4); start
+= 4;
10772 if (do_debug_frames_interp
)
10773 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10775 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
10776 ofs
* fc
->code_factor
,
10777 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10778 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10781 case DW_CFA_offset_extended
:
10784 if (! do_debug_frames_interp
)
10785 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
10786 reg
, roffs
* fc
->data_factor
);
10787 fc
->col_type
[reg
] = DW_CFA_offset
;
10788 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
10791 case DW_CFA_restore_extended
:
10793 if (! do_debug_frames_interp
)
10794 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
10795 fc
->col_type
[reg
] = cie
->col_type
[reg
];
10796 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
10799 case DW_CFA_undefined
:
10801 if (! do_debug_frames_interp
)
10802 printf (" DW_CFA_undefined: r%ld\n", reg
);
10803 fc
->col_type
[reg
] = DW_CFA_undefined
;
10804 fc
->col_offset
[reg
] = 0;
10807 case DW_CFA_same_value
:
10809 if (! do_debug_frames_interp
)
10810 printf (" DW_CFA_same_value: r%ld\n", reg
);
10811 fc
->col_type
[reg
] = DW_CFA_same_value
;
10812 fc
->col_offset
[reg
] = 0;
10815 case DW_CFA_register
:
10818 if (! do_debug_frames_interp
)
10819 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
10820 fc
->col_type
[reg
] = DW_CFA_register
;
10821 fc
->col_offset
[reg
] = roffs
;
10824 case DW_CFA_remember_state
:
10825 if (! do_debug_frames_interp
)
10826 printf (" DW_CFA_remember_state\n");
10827 rs
= xmalloc (sizeof (Frame_Chunk
));
10828 rs
->ncols
= fc
->ncols
;
10829 rs
->col_type
= xcmalloc (rs
->ncols
, sizeof (short int));
10830 rs
->col_offset
= xcmalloc (rs
->ncols
, sizeof (int));
10831 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
10832 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
10833 rs
->next
= remembered_state
;
10834 remembered_state
= rs
;
10837 case DW_CFA_restore_state
:
10838 if (! do_debug_frames_interp
)
10839 printf (" DW_CFA_restore_state\n");
10840 rs
= remembered_state
;
10843 remembered_state
= rs
->next
;
10844 frame_need_space (fc
, rs
->ncols
-1);
10845 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
10846 memcpy (fc
->col_offset
, rs
->col_offset
,
10847 rs
->ncols
* sizeof (int));
10848 free (rs
->col_type
);
10849 free (rs
->col_offset
);
10852 else if (do_debug_frames_interp
)
10853 printf ("Mismatched DW_CFA_restore_state\n");
10856 case DW_CFA_def_cfa
:
10857 fc
->cfa_reg
= LEB ();
10858 fc
->cfa_offset
= LEB ();
10860 if (! do_debug_frames_interp
)
10861 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
10862 fc
->cfa_reg
, fc
->cfa_offset
);
10865 case DW_CFA_def_cfa_register
:
10866 fc
->cfa_reg
= LEB ();
10868 if (! do_debug_frames_interp
)
10869 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
10872 case DW_CFA_def_cfa_offset
:
10873 fc
->cfa_offset
= LEB ();
10874 if (! do_debug_frames_interp
)
10875 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
10879 if (! do_debug_frames_interp
)
10880 printf (" DW_CFA_nop\n");
10883 case DW_CFA_def_cfa_expression
:
10885 if (! do_debug_frames_interp
)
10887 printf (" DW_CFA_def_cfa_expression (");
10888 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10895 case DW_CFA_expression
:
10898 if (! do_debug_frames_interp
)
10900 printf (" DW_CFA_expression: r%ld (", reg
);
10901 decode_location_expression (start
, eh_addr_size
, ul
, 0);
10904 fc
->col_type
[reg
] = DW_CFA_expression
;
10908 case DW_CFA_offset_extended_sf
:
10911 frame_need_space (fc
, reg
);
10912 if (! do_debug_frames_interp
)
10913 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
10914 reg
, l
* fc
->data_factor
);
10915 fc
->col_type
[reg
] = DW_CFA_offset
;
10916 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10919 case DW_CFA_def_cfa_sf
:
10920 fc
->cfa_reg
= LEB ();
10921 fc
->cfa_offset
= SLEB ();
10922 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
10924 if (! do_debug_frames_interp
)
10925 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
10926 fc
->cfa_reg
, fc
->cfa_offset
);
10929 case DW_CFA_def_cfa_offset_sf
:
10930 fc
->cfa_offset
= SLEB ();
10931 fc
->cfa_offset
= fc
->cfa_offset
* fc
->data_factor
;
10932 if (! do_debug_frames_interp
)
10933 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
10936 case DW_CFA_MIPS_advance_loc8
:
10937 ofs
= byte_get (start
, 8); start
+= 8;
10938 if (do_debug_frames_interp
)
10939 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10941 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
10942 ofs
* fc
->code_factor
,
10943 fc
->pc_begin
+ ofs
* fc
->code_factor
);
10944 fc
->pc_begin
+= ofs
* fc
->code_factor
;
10947 case DW_CFA_GNU_window_save
:
10948 if (! do_debug_frames_interp
)
10949 printf (" DW_CFA_GNU_window_save\n");
10952 case DW_CFA_GNU_args_size
:
10954 if (! do_debug_frames_interp
)
10955 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
10958 case DW_CFA_GNU_negative_offset_extended
:
10961 frame_need_space (fc
, reg
);
10962 if (! do_debug_frames_interp
)
10963 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
10964 reg
, l
* fc
->data_factor
);
10965 fc
->col_type
[reg
] = DW_CFA_offset
;
10966 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
10970 warn (_("unsupported or unknown DW_CFA_%d\n"), op
);
10975 if (do_debug_frames_interp
)
10976 frame_display_row (fc
, &need_col_headers
, &max_regs
);
10991 display_debug_not_supported (Elf_Internal_Shdr
*section
,
10992 unsigned char *start ATTRIBUTE_UNUSED
,
10993 FILE *file ATTRIBUTE_UNUSED
)
10995 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
10996 SECTION_NAME (section
));
11001 /* A structure containing the name of a debug section
11002 and a pointer to a function that can decode it. */
11005 const char *const name
;
11006 int (*display
) (Elf_Internal_Shdr
*, unsigned char *, FILE *);
11010 { ".debug_abbrev", display_debug_abbrev
},
11011 { ".debug_aranges", display_debug_aranges
},
11012 { ".debug_frame", display_debug_frames
},
11013 { ".debug_info", display_debug_info
},
11014 { ".debug_line", display_debug_lines
},
11015 { ".debug_pubnames", display_debug_pubnames
},
11016 { ".eh_frame", display_debug_frames
},
11017 { ".debug_macinfo", display_debug_macinfo
},
11018 { ".debug_str", display_debug_str
},
11019 { ".debug_loc", display_debug_loc
},
11020 { ".debug_pubtypes", display_debug_pubnames
},
11021 { ".debug_ranges", display_debug_ranges
},
11022 { ".debug_static_func", display_debug_not_supported
},
11023 { ".debug_static_vars", display_debug_not_supported
},
11024 { ".debug_types", display_debug_not_supported
},
11025 { ".debug_weaknames", display_debug_not_supported
}
11029 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
11031 char *name
= SECTION_NAME (section
);
11032 bfd_size_type length
;
11036 length
= section
->sh_size
;
11039 printf (_("\nSection '%s' has no debugging data.\n"), name
);
11043 if (strneq (name
, ".gnu.linkonce.wi.", 17))
11044 name
= ".debug_info";
11046 /* See if we know how to display the contents of this section. */
11047 for (i
= NUM_ELEM (debug_displays
); i
--;)
11048 if (streq (debug_displays
[i
].name
, name
))
11050 unsigned char *start
;
11052 start
= get_data (NULL
, file
, section
->sh_offset
, 1, length
,
11053 _("debug section data"));
11060 result
&= debug_displays
[i
].display (section
, start
, file
);
11063 /* If we loaded in the abbrev section
11064 at some point, we must release it here. */
11072 printf (_("Unrecognized debug section: %s\n"), name
);
11080 process_section_contents (FILE *file
)
11082 Elf_Internal_Shdr
*section
;
11088 for (i
= 0, section
= section_headers
;
11089 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
11092 #ifdef SUPPORT_DISASSEMBLY
11093 if (dump_sects
[i
] & DISASS_DUMP
)
11094 disassemble_section (section
, file
);
11096 if (dump_sects
[i
] & HEX_DUMP
)
11097 dump_section (section
, file
);
11099 if (dump_sects
[i
] & DEBUG_DUMP
)
11100 display_debug_section (section
, file
);
11103 /* Check to see if the user requested a
11104 dump of a section that does not exist. */
11105 while (i
++ < num_dump_sects
)
11107 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
11111 process_mips_fpe_exception (int mask
)
11116 if (mask
& OEX_FPU_INEX
)
11117 fputs ("INEX", stdout
), first
= 0;
11118 if (mask
& OEX_FPU_UFLO
)
11119 printf ("%sUFLO", first
? "" : "|"), first
= 0;
11120 if (mask
& OEX_FPU_OFLO
)
11121 printf ("%sOFLO", first
? "" : "|"), first
= 0;
11122 if (mask
& OEX_FPU_DIV0
)
11123 printf ("%sDIV0", first
? "" : "|"), first
= 0;
11124 if (mask
& OEX_FPU_INVAL
)
11125 printf ("%sINVAL", first
? "" : "|");
11128 fputs ("0", stdout
);
11132 process_mips_specific (FILE *file
)
11134 Elf_Internal_Dyn
*entry
;
11135 size_t liblist_offset
= 0;
11136 size_t liblistno
= 0;
11137 size_t conflictsno
= 0;
11138 size_t options_offset
= 0;
11139 size_t conflicts_offset
= 0;
11141 /* We have a lot of special sections. Thanks SGI! */
11142 if (dynamic_section
== NULL
)
11143 /* No information available. */
11146 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
11147 switch (entry
->d_tag
)
11149 case DT_MIPS_LIBLIST
:
11151 = offset_from_vma (file
, entry
->d_un
.d_val
,
11152 liblistno
* sizeof (Elf32_External_Lib
));
11154 case DT_MIPS_LIBLISTNO
:
11155 liblistno
= entry
->d_un
.d_val
;
11157 case DT_MIPS_OPTIONS
:
11158 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
11160 case DT_MIPS_CONFLICT
:
11162 = offset_from_vma (file
, entry
->d_un
.d_val
,
11163 conflictsno
* sizeof (Elf32_External_Conflict
));
11165 case DT_MIPS_CONFLICTNO
:
11166 conflictsno
= entry
->d_un
.d_val
;
11172 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
11174 Elf32_External_Lib
*elib
;
11177 elib
= get_data (NULL
, file
, liblist_offset
,
11178 liblistno
, sizeof (Elf32_External_Lib
),
11182 printf ("\nSection '.liblist' contains %lu entries:\n",
11183 (unsigned long) liblistno
);
11184 fputs (" Library Time Stamp Checksum Version Flags\n",
11187 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
11194 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11195 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11196 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11197 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11198 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11200 tmp
= gmtime (&time
);
11201 snprintf (timebuf
, sizeof (timebuf
),
11202 "%04u-%02u-%02uT%02u:%02u:%02u",
11203 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11204 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11206 printf ("%3lu: ", (unsigned long) cnt
);
11207 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
11208 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
11210 printf ("<corrupt: %9ld>", liblist
.l_name
);
11211 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
11212 liblist
.l_version
);
11214 if (liblist
.l_flags
== 0)
11218 static const struct
11225 { " EXACT_MATCH", LL_EXACT_MATCH
},
11226 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
11227 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
11228 { " EXPORTS", LL_EXPORTS
},
11229 { " DELAY_LOAD", LL_DELAY_LOAD
},
11230 { " DELTA", LL_DELTA
}
11232 int flags
= liblist
.l_flags
;
11236 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
11238 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
11240 fputs (l_flags_vals
[fcnt
].name
, stdout
);
11241 flags
^= l_flags_vals
[fcnt
].bit
;
11244 printf (" %#x", (unsigned int) flags
);
11254 if (options_offset
!= 0)
11256 Elf_External_Options
*eopt
;
11257 Elf_Internal_Shdr
*sect
= section_headers
;
11258 Elf_Internal_Options
*iopt
;
11259 Elf_Internal_Options
*option
;
11263 /* Find the section header so that we get the size. */
11264 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
11267 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
11271 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
11274 error (_("Out of memory"));
11281 while (offset
< sect
->sh_size
)
11283 Elf_External_Options
*eoption
;
11285 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
11287 option
->kind
= BYTE_GET (eoption
->kind
);
11288 option
->size
= BYTE_GET (eoption
->size
);
11289 option
->section
= BYTE_GET (eoption
->section
);
11290 option
->info
= BYTE_GET (eoption
->info
);
11292 offset
+= option
->size
;
11298 printf (_("\nSection '%s' contains %d entries:\n"),
11299 SECTION_NAME (sect
), cnt
);
11307 switch (option
->kind
)
11310 /* This shouldn't happen. */
11311 printf (" NULL %d %lx", option
->section
, option
->info
);
11314 printf (" REGINFO ");
11315 if (elf_header
.e_machine
== EM_MIPS
)
11318 Elf32_External_RegInfo
*ereg
;
11319 Elf32_RegInfo reginfo
;
11321 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
11322 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11323 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11324 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11325 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11326 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11327 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11329 printf ("GPR %08lx GP 0x%lx\n",
11330 reginfo
.ri_gprmask
,
11331 (unsigned long) reginfo
.ri_gp_value
);
11332 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11333 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11334 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11339 Elf64_External_RegInfo
*ereg
;
11340 Elf64_Internal_RegInfo reginfo
;
11342 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
11343 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
11344 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
11345 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
11346 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
11347 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
11348 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
11350 printf ("GPR %08lx GP 0x",
11351 reginfo
.ri_gprmask
);
11352 printf_vma (reginfo
.ri_gp_value
);
11355 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
11356 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
11357 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
11361 case ODK_EXCEPTIONS
:
11362 fputs (" EXCEPTIONS fpe_min(", stdout
);
11363 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
11364 fputs (") fpe_max(", stdout
);
11365 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
11366 fputs (")", stdout
);
11368 if (option
->info
& OEX_PAGE0
)
11369 fputs (" PAGE0", stdout
);
11370 if (option
->info
& OEX_SMM
)
11371 fputs (" SMM", stdout
);
11372 if (option
->info
& OEX_FPDBUG
)
11373 fputs (" FPDBUG", stdout
);
11374 if (option
->info
& OEX_DISMISS
)
11375 fputs (" DISMISS", stdout
);
11378 fputs (" PAD ", stdout
);
11379 if (option
->info
& OPAD_PREFIX
)
11380 fputs (" PREFIX", stdout
);
11381 if (option
->info
& OPAD_POSTFIX
)
11382 fputs (" POSTFIX", stdout
);
11383 if (option
->info
& OPAD_SYMBOL
)
11384 fputs (" SYMBOL", stdout
);
11387 fputs (" HWPATCH ", stdout
);
11388 if (option
->info
& OHW_R4KEOP
)
11389 fputs (" R4KEOP", stdout
);
11390 if (option
->info
& OHW_R8KPFETCH
)
11391 fputs (" R8KPFETCH", stdout
);
11392 if (option
->info
& OHW_R5KEOP
)
11393 fputs (" R5KEOP", stdout
);
11394 if (option
->info
& OHW_R5KCVTL
)
11395 fputs (" R5KCVTL", stdout
);
11398 fputs (" FILL ", stdout
);
11399 /* XXX Print content of info word? */
11402 fputs (" TAGS ", stdout
);
11403 /* XXX Print content of info word? */
11406 fputs (" HWAND ", stdout
);
11407 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11408 fputs (" R4KEOP_CHECKED", stdout
);
11409 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11410 fputs (" R4KEOP_CLEAN", stdout
);
11413 fputs (" HWOR ", stdout
);
11414 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
11415 fputs (" R4KEOP_CHECKED", stdout
);
11416 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
11417 fputs (" R4KEOP_CLEAN", stdout
);
11420 printf (" GP_GROUP %#06lx self-contained %#06lx",
11421 option
->info
& OGP_GROUP
,
11422 (option
->info
& OGP_SELF
) >> 16);
11425 printf (" IDENT %#06lx self-contained %#06lx",
11426 option
->info
& OGP_GROUP
,
11427 (option
->info
& OGP_SELF
) >> 16);
11430 /* This shouldn't happen. */
11431 printf (" %3d ??? %d %lx",
11432 option
->kind
, option
->section
, option
->info
);
11436 len
= sizeof (*eopt
);
11437 while (len
< option
->size
)
11438 if (((char *) option
)[len
] >= ' '
11439 && ((char *) option
)[len
] < 0x7f)
11440 printf ("%c", ((char *) option
)[len
++]);
11442 printf ("\\%03o", ((char *) option
)[len
++]);
11444 fputs ("\n", stdout
);
11452 if (conflicts_offset
!= 0 && conflictsno
!= 0)
11454 Elf32_Conflict
*iconf
;
11457 if (dynamic_symbols
== NULL
)
11459 error (_("conflict list found without a dynamic symbol table"));
11463 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
11466 error (_("Out of memory"));
11472 Elf32_External_Conflict
*econf32
;
11474 econf32
= get_data (NULL
, file
, conflicts_offset
,
11475 conflictsno
, sizeof (*econf32
), _("conflict"));
11479 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11480 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
11486 Elf64_External_Conflict
*econf64
;
11488 econf64
= get_data (NULL
, file
, conflicts_offset
,
11489 conflictsno
, sizeof (*econf64
), _("conflict"));
11493 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11494 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
11499 printf (_("\nSection '.conflict' contains %lu entries:\n"),
11500 (unsigned long) conflictsno
);
11501 puts (_(" Num: Index Value Name"));
11503 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
11505 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
11507 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
11508 print_vma (psym
->st_value
, FULL_HEX
);
11510 if (VALID_DYNAMIC_NAME (psym
->st_name
))
11511 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
11513 printf ("<corrupt: %14ld>", psym
->st_name
);
11524 process_gnu_liblist (FILE *file
)
11526 Elf_Internal_Shdr
*section
, *string_sec
;
11527 Elf32_External_Lib
*elib
;
11529 size_t strtab_size
;
11536 for (i
= 0, section
= section_headers
;
11537 i
< elf_header
.e_shnum
;
11540 switch (section
->sh_type
)
11542 case SHT_GNU_LIBLIST
:
11543 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
11546 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
11551 string_sec
= SECTION_HEADER (section
->sh_link
);
11553 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
11554 string_sec
->sh_size
, _("liblist string table"));
11555 strtab_size
= string_sec
->sh_size
;
11558 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
11564 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
11565 SECTION_NAME (section
),
11566 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
11568 puts (" Library Time Stamp Checksum Version Flags");
11570 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
11578 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
11579 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
11580 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
11581 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
11582 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
11584 tmp
= gmtime (&time
);
11585 snprintf (timebuf
, sizeof (timebuf
),
11586 "%04u-%02u-%02uT%02u:%02u:%02u",
11587 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
11588 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
11590 printf ("%3lu: ", (unsigned long) cnt
);
11592 printf ("%-20s", liblist
.l_name
< strtab_size
11593 ? strtab
+ liblist
.l_name
: "<corrupt>");
11595 printf ("%-20.20s", liblist
.l_name
< strtab_size
11596 ? strtab
+ liblist
.l_name
: "<corrupt>");
11597 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
11598 liblist
.l_version
, liblist
.l_flags
);
11608 static const char *
11609 get_note_type (unsigned e_type
)
11611 static char buff
[64];
11613 if (elf_header
.e_type
== ET_CORE
)
11617 return _("NT_AUXV (auxiliary vector)");
11619 return _("NT_PRSTATUS (prstatus structure)");
11621 return _("NT_FPREGSET (floating point registers)");
11623 return _("NT_PRPSINFO (prpsinfo structure)");
11624 case NT_TASKSTRUCT
:
11625 return _("NT_TASKSTRUCT (task structure)");
11627 return _("NT_PRXFPREG (user_xfpregs structure)");
11629 return _("NT_PSTATUS (pstatus structure)");
11631 return _("NT_FPREGS (floating point registers)");
11633 return _("NT_PSINFO (psinfo structure)");
11635 return _("NT_LWPSTATUS (lwpstatus_t structure)");
11637 return _("NT_LWPSINFO (lwpsinfo_t structure)");
11638 case NT_WIN32PSTATUS
:
11639 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
11647 return _("NT_VERSION (version)");
11649 return _("NT_ARCH (architecture)");
11654 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11658 static const char *
11659 get_netbsd_elfcore_note_type (unsigned e_type
)
11661 static char buff
[64];
11663 if (e_type
== NT_NETBSDCORE_PROCINFO
)
11665 /* NetBSD core "procinfo" structure. */
11666 return _("NetBSD procinfo structure");
11669 /* As of Jan 2002 there are no other machine-independent notes
11670 defined for NetBSD core files. If the note type is less
11671 than the start of the machine-dependent note types, we don't
11674 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
11676 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
11680 switch (elf_header
.e_machine
)
11682 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
11683 and PT_GETFPREGS == mach+2. */
11688 case EM_SPARC32PLUS
:
11692 case NT_NETBSDCORE_FIRSTMACH
+0:
11693 return _("PT_GETREGS (reg structure)");
11694 case NT_NETBSDCORE_FIRSTMACH
+2:
11695 return _("PT_GETFPREGS (fpreg structure)");
11701 /* On all other arch's, PT_GETREGS == mach+1 and
11702 PT_GETFPREGS == mach+3. */
11706 case NT_NETBSDCORE_FIRSTMACH
+1:
11707 return _("PT_GETREGS (reg structure)");
11708 case NT_NETBSDCORE_FIRSTMACH
+3:
11709 return _("PT_GETFPREGS (fpreg structure)");
11715 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
11716 e_type
- NT_NETBSDCORE_FIRSTMACH
);
11720 /* Note that by the ELF standard, the name field is already null byte
11721 terminated, and namesz includes the terminating null byte.
11722 I.E. the value of namesz for the name "FSF" is 4.
11724 If the value of namesz is zero, there is no name present. */
11726 process_note (Elf_Internal_Note
*pnote
)
11730 if (pnote
->namesz
== 0)
11731 /* If there is no note name, then use the default set of
11732 note type strings. */
11733 nt
= get_note_type (pnote
->type
);
11735 else if (strneq (pnote
->namedata
, "NetBSD-CORE", 11))
11736 /* NetBSD-specific core file notes. */
11737 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
11740 /* Don't recognize this note name; just use the default set of
11741 note type strings. */
11742 nt
= get_note_type (pnote
->type
);
11744 printf (" %s\t\t0x%08lx\t%s\n",
11745 pnote
->namesz
? pnote
->namedata
: "(NONE)",
11746 pnote
->descsz
, nt
);
11752 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
11754 Elf_External_Note
*pnotes
;
11755 Elf_External_Note
*external
;
11761 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
11767 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
11768 (unsigned long) offset
, (unsigned long) length
);
11769 printf (_(" Owner\t\tData size\tDescription\n"));
11771 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
11773 Elf_External_Note
*next
;
11774 Elf_Internal_Note inote
;
11777 inote
.type
= BYTE_GET (external
->type
);
11778 inote
.namesz
= BYTE_GET (external
->namesz
);
11779 inote
.namedata
= external
->name
;
11780 inote
.descsz
= BYTE_GET (external
->descsz
);
11781 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
11782 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
11784 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
11786 if (((char *) next
) > (((char *) pnotes
) + length
))
11788 warn (_("corrupt note found at offset %x into core notes\n"),
11789 ((char *) external
) - ((char *) pnotes
));
11790 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
11791 inote
.type
, inote
.namesz
, inote
.descsz
);
11797 /* Verify that name is null terminated. It appears that at least
11798 one version of Linux (RedHat 6.0) generates corefiles that don't
11799 comply with the ELF spec by failing to include the null byte in
11801 if (inote
.namedata
[inote
.namesz
] != '\0')
11803 temp
= malloc (inote
.namesz
+ 1);
11807 error (_("Out of memory\n"));
11812 strncpy (temp
, inote
.namedata
, inote
.namesz
);
11813 temp
[inote
.namesz
] = 0;
11815 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
11816 inote
.namedata
= temp
;
11819 res
&= process_note (& inote
);
11834 process_corefile_note_segments (FILE *file
)
11836 Elf_Internal_Phdr
*segment
;
11840 if (! get_program_headers (file
))
11843 for (i
= 0, segment
= program_headers
;
11844 i
< elf_header
.e_phnum
;
11847 if (segment
->p_type
== PT_NOTE
)
11848 res
&= process_corefile_note_segment (file
,
11849 (bfd_vma
) segment
->p_offset
,
11850 (bfd_vma
) segment
->p_filesz
);
11857 process_note_sections (FILE *file
)
11859 Elf_Internal_Shdr
*section
;
11863 for (i
= 0, section
= section_headers
;
11864 i
< elf_header
.e_shnum
;
11866 if (section
->sh_type
== SHT_NOTE
)
11867 res
&= process_corefile_note_segment (file
,
11868 (bfd_vma
) section
->sh_offset
,
11869 (bfd_vma
) section
->sh_size
);
11875 process_notes (FILE *file
)
11877 /* If we have not been asked to display the notes then do nothing. */
11881 if (elf_header
.e_type
!= ET_CORE
)
11882 return process_note_sections (file
);
11884 /* No program headers means no NOTE segment. */
11885 if (elf_header
.e_phnum
> 0)
11886 return process_corefile_note_segments (file
);
11888 printf (_("No note segments present in the core file.\n"));
11893 process_arch_specific (FILE *file
)
11898 switch (elf_header
.e_machine
)
11901 case EM_MIPS_RS3_LE
:
11902 return process_mips_specific (file
);
11911 get_file_header (FILE *file
)
11913 /* Read in the identity array. */
11914 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
11917 /* Determine how to read the rest of the header. */
11918 switch (elf_header
.e_ident
[EI_DATA
])
11920 default: /* fall through */
11921 case ELFDATANONE
: /* fall through */
11923 byte_get
= byte_get_little_endian
;
11924 byte_put
= byte_put_little_endian
;
11927 byte_get
= byte_get_big_endian
;
11928 byte_put
= byte_put_big_endian
;
11932 /* For now we only support 32 bit and 64 bit ELF files. */
11933 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
11935 /* Read in the rest of the header. */
11938 Elf32_External_Ehdr ehdr32
;
11940 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
11943 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
11944 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
11945 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
11946 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
11947 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
11948 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
11949 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
11950 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
11951 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
11952 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
11953 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
11954 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
11955 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
11959 Elf64_External_Ehdr ehdr64
;
11961 /* If we have been compiled with sizeof (bfd_vma) == 4, then
11962 we will not be able to cope with the 64bit data found in
11963 64 ELF files. Detect this now and abort before we start
11964 overwriting things. */
11965 if (sizeof (bfd_vma
) < 8)
11967 error (_("This instance of readelf has been built without support for a\n\
11968 64 bit data type and so it cannot read 64 bit ELF files.\n"));
11972 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
11975 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
11976 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
11977 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
11978 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
11979 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
11980 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
11981 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
11982 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
11983 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
11984 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
11985 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
11986 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
11987 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
11990 if (elf_header
.e_shoff
)
11992 /* There may be some extensions in the first section header. Don't
11993 bomb if we can't read it. */
11995 get_32bit_section_headers (file
, 1);
11997 get_64bit_section_headers (file
, 1);
12003 /* Process one ELF object file according to the command line options.
12004 This file may actually be stored in an archive. The file is
12005 positioned at the start of the ELF object. */
12008 process_object (char *file_name
, FILE *file
)
12012 if (! get_file_header (file
))
12014 error (_("%s: Failed to read file header\n"), file_name
);
12018 /* Initialise per file variables. */
12019 for (i
= NUM_ELEM (version_info
); i
--;)
12020 version_info
[i
] = 0;
12022 for (i
= NUM_ELEM (dynamic_info
); i
--;)
12023 dynamic_info
[i
] = 0;
12025 /* Process the file. */
12027 printf (_("\nFile: %s\n"), file_name
);
12029 /* Initialise the dump_sects array from the cmdline_dump_sects array.
12030 Note we do this even if cmdline_dump_sects is empty because we
12031 must make sure that the dump_sets array is zeroed out before each
12032 object file is processed. */
12033 if (num_dump_sects
> num_cmdline_dump_sects
)
12034 memset (dump_sects
, 0, num_dump_sects
);
12036 if (num_cmdline_dump_sects
> 0)
12038 if (num_dump_sects
== 0)
12039 /* A sneaky way of allocating the dump_sects array. */
12040 request_dump (num_cmdline_dump_sects
, 0);
12042 assert (num_dump_sects
>= num_cmdline_dump_sects
);
12043 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
12046 if (! process_file_header ())
12049 if (! process_section_headers (file
))
12051 /* Without loaded section headers we cannot process lots of
12053 do_unwind
= do_version
= do_dump
= do_arch
= 0;
12055 if (! do_using_dynamic
)
12056 do_syms
= do_reloc
= 0;
12059 if (! process_section_groups (file
))
12061 /* Without loaded section groups we cannot process unwind. */
12065 if (process_program_headers (file
))
12066 process_dynamic_section (file
);
12068 process_relocs (file
);
12070 process_unwind (file
);
12072 process_symbol_table (file
);
12074 process_syminfo (file
);
12076 process_version_sections (file
);
12078 process_section_contents (file
);
12080 process_notes (file
);
12082 process_gnu_liblist (file
);
12084 process_arch_specific (file
);
12086 if (program_headers
)
12088 free (program_headers
);
12089 program_headers
= NULL
;
12092 if (section_headers
)
12094 free (section_headers
);
12095 section_headers
= NULL
;
12100 free (string_table
);
12101 string_table
= NULL
;
12102 string_table_length
= 0;
12105 if (dynamic_strings
)
12107 free (dynamic_strings
);
12108 dynamic_strings
= NULL
;
12109 dynamic_strings_length
= 0;
12112 if (dynamic_symbols
)
12114 free (dynamic_symbols
);
12115 dynamic_symbols
= NULL
;
12116 num_dynamic_syms
= 0;
12119 if (dynamic_syminfo
)
12121 free (dynamic_syminfo
);
12122 dynamic_syminfo
= NULL
;
12125 if (section_headers_groups
)
12127 free (section_headers_groups
);
12128 section_headers_groups
= NULL
;
12131 if (section_groups
)
12133 struct group_list
*g
, *next
;
12135 for (i
= 0; i
< group_count
; i
++)
12137 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
12144 free (section_groups
);
12145 section_groups
= NULL
;
12148 if (debug_information
)
12150 for (i
= 0; i
< num_debug_info_entries
; i
++)
12152 if (!debug_information
[i
].max_loc_offsets
)
12154 free (debug_information
[i
].loc_offsets
);
12155 free (debug_information
[i
].have_frame_base
);
12157 if (!debug_information
[i
].max_range_lists
)
12158 free (debug_information
[i
].range_lists
);
12160 free (debug_information
);
12161 debug_information
= NULL
;
12162 num_debug_info_entries
= 0;
12168 /* Process an ELF archive. The file is positioned just after the
12172 process_archive (char *file_name
, FILE *file
)
12174 struct ar_hdr arhdr
;
12176 unsigned long size
;
12177 char *longnames
= NULL
;
12178 unsigned long longnames_size
= 0;
12179 size_t file_name_size
;
12184 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12185 if (got
!= sizeof arhdr
)
12190 error (_("%s: failed to read archive header\n"), file_name
);
12194 if (memcmp (arhdr
.ar_name
, "/ ", 16) == 0)
12196 /* This is the archive symbol table. Skip it.
12197 FIXME: We should have an option to dump it. */
12198 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12199 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
12201 error (_("%s: failed to skip archive symbol table\n"), file_name
);
12205 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12206 if (got
!= sizeof arhdr
)
12211 error (_("%s: failed to read archive header\n"), file_name
);
12216 if (memcmp (arhdr
.ar_name
, "// ", 16) == 0)
12218 /* This is the archive string table holding long member
12221 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12223 longnames
= malloc (longnames_size
);
12224 if (longnames
== NULL
)
12226 error (_("Out of memory\n"));
12230 if (fread (longnames
, longnames_size
, 1, file
) != 1)
12233 error (_("%s: failed to read string table\n"), file_name
);
12237 if ((longnames_size
& 1) != 0)
12240 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12241 if (got
!= sizeof arhdr
)
12248 error (_("%s: failed to read archive header\n"), file_name
);
12253 file_name_size
= strlen (file_name
);
12262 if (arhdr
.ar_name
[0] == '/')
12266 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
12267 if (off
>= longnames_size
)
12269 error (_("%s: invalid archive string table offset %lu\n"), off
);
12274 name
= longnames
+ off
;
12275 nameend
= memchr (name
, '/', longnames_size
- off
);
12279 name
= arhdr
.ar_name
;
12280 nameend
= memchr (name
, '/', 16);
12283 if (nameend
== NULL
)
12285 error (_("%s: bad archive file name\n"));
12290 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
12291 if (namealc
== NULL
)
12293 error (_("Out of memory\n"));
12298 memcpy (namealc
, file_name
, file_name_size
);
12299 namealc
[file_name_size
] = '(';
12300 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
12301 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
12302 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
12304 archive_file_offset
= ftell (file
);
12305 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
12307 ret
|= process_object (namealc
, file
);
12312 (archive_file_offset
12313 + archive_file_size
12314 + (archive_file_size
& 1)),
12317 error (_("%s: failed to seek to next archive header\n"), file_name
);
12322 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
12323 if (got
!= sizeof arhdr
)
12328 error (_("%s: failed to read archive header\n"), file_name
);
12334 if (longnames
!= 0)
12341 process_file (char *file_name
)
12344 struct stat statbuf
;
12345 char armag
[SARMAG
];
12348 if (stat (file_name
, &statbuf
) < 0)
12350 if (errno
== ENOENT
)
12351 error (_("'%s': No such file\n"), file_name
);
12353 error (_("Could not locate '%s'. System error message: %s\n"),
12354 file_name
, strerror (errno
));
12358 if (! S_ISREG (statbuf
.st_mode
))
12360 error (_("'%s' is not an ordinary file\n"), file_name
);
12364 file
= fopen (file_name
, "rb");
12367 error (_("Input file '%s' is not readable.\n"), file_name
);
12371 if (fread (armag
, SARMAG
, 1, file
) != 1)
12373 error (_("%s: Failed to read file header\n"), file_name
);
12378 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
12379 ret
= process_archive (file_name
, file
);
12383 archive_file_size
= archive_file_offset
= 0;
12384 ret
= process_object (file_name
, file
);
12392 #ifdef SUPPORT_DISASSEMBLY
12393 /* Needed by the i386 disassembler. For extra credit, someone could
12394 fix this so that we insert symbolic addresses here, esp for GOT/PLT
12398 print_address (unsigned int addr
, FILE *outfile
)
12400 fprintf (outfile
,"0x%8.8x", addr
);
12403 /* Needed by the i386 disassembler. */
12405 db_task_printsym (unsigned int addr
)
12407 print_address (addr
, stderr
);
12412 main (int argc
, char **argv
)
12416 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
12417 setlocale (LC_MESSAGES
, "");
12419 #if defined (HAVE_SETLOCALE)
12420 setlocale (LC_CTYPE
, "");
12422 bindtextdomain (PACKAGE
, LOCALEDIR
);
12423 textdomain (PACKAGE
);
12425 parse_args (argc
, argv
);
12427 if (num_dump_sects
> 0)
12429 /* Make a copy of the dump_sects array. */
12430 cmdline_dump_sects
= malloc (num_dump_sects
);
12431 if (cmdline_dump_sects
== NULL
)
12432 error (_("Out of memory allocating dump request table."));
12435 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
12436 num_cmdline_dump_sects
= num_dump_sects
;
12440 if (optind
< (argc
- 1))
12444 while (optind
< argc
)
12445 err
|= process_file (argv
[optind
++]);
12447 if (dump_sects
!= NULL
)
12449 if (cmdline_dump_sects
!= NULL
)
12450 free (cmdline_dump_sects
);