1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008 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 3 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. */
60 # ifdef HAVE_SYS_PARAM_H
61 # include <sys/param.h>
65 # define PATH_MAX MAXPATHLEN
67 # define PATH_MAX 1024
73 /* Define BFD64 here, even if our default architecture is 32 bit ELF
74 as this will allow us to read in and parse 64bit and 32bit ELF files.
75 Only do this if we believe that the compiler can support a 64 bit
76 data type. For now we only rely on GCC being able to do this. */
84 #include "elf/common.h"
85 #include "elf/external.h"
86 #include "elf/internal.h"
89 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
90 we can obtain the H8 reloc numbers. We need these for the
91 get_reloc_size() function. We include h8.h again after defining
92 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
97 /* Undo the effects of #including reloc-macros.h. */
99 #undef START_RELOC_NUMBERS
103 #undef END_RELOC_NUMBERS
104 #undef _RELOC_MACROS_H
106 /* The following headers use the elf/reloc-macros.h file to
107 automatically generate relocation recognition functions
108 such as elf_mips_reloc_type() */
110 #define RELOC_MACROS_GEN_FUNC
112 #include "elf/alpha.h"
116 #include "elf/bfin.h"
117 #include "elf/cr16.h"
118 #include "elf/cris.h"
120 #include "elf/d10v.h"
121 #include "elf/d30v.h"
123 #include "elf/fr30.h"
126 #include "elf/hppa.h"
127 #include "elf/i386.h"
128 #include "elf/i370.h"
129 #include "elf/i860.h"
130 #include "elf/i960.h"
131 #include "elf/ia64.h"
132 #include "elf/ip2k.h"
133 #include "elf/iq2000.h"
134 #include "elf/m32c.h"
135 #include "elf/m32r.h"
136 #include "elf/m68k.h"
137 #include "elf/m68hc11.h"
138 #include "elf/mcore.h"
140 #include "elf/mips.h"
141 #include "elf/mmix.h"
142 #include "elf/mn10200.h"
143 #include "elf/mn10300.h"
145 #include "elf/msp430.h"
146 #include "elf/or32.h"
149 #include "elf/ppc64.h"
150 #include "elf/s390.h"
151 #include "elf/score.h"
153 #include "elf/sparc.h"
155 #include "elf/v850.h"
157 #include "elf/x86-64.h"
158 #include "elf/xstormy16.h"
159 #include "elf/xtensa.h"
164 #include "libiberty.h"
165 #include "safe-ctype.h"
167 char *program_name
= "readelf";
169 static long archive_file_offset
;
170 static unsigned long archive_file_size
;
171 static unsigned long dynamic_addr
;
172 static bfd_size_type dynamic_size
;
173 static unsigned int dynamic_nent
;
174 static char *dynamic_strings
;
175 static unsigned long dynamic_strings_length
;
176 static char *string_table
;
177 static unsigned long string_table_length
;
178 static unsigned long num_dynamic_syms
;
179 static Elf_Internal_Sym
*dynamic_symbols
;
180 static Elf_Internal_Syminfo
*dynamic_syminfo
;
181 static unsigned long dynamic_syminfo_offset
;
182 static unsigned int dynamic_syminfo_nent
;
183 static char program_interpreter
[PATH_MAX
];
184 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
185 static bfd_vma dynamic_info_DT_GNU_HASH
;
186 static bfd_vma version_info
[16];
187 static Elf_Internal_Ehdr elf_header
;
188 static Elf_Internal_Shdr
*section_headers
;
189 static Elf_Internal_Phdr
*program_headers
;
190 static Elf_Internal_Dyn
*dynamic_section
;
191 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
192 static int show_name
;
193 static int do_dynamic
;
196 static int do_sections
;
197 static int do_section_groups
;
198 static int do_section_details
;
199 static int do_segments
;
200 static int do_unwind
;
201 static int do_using_dynamic
;
202 static int do_header
;
204 static int do_version
;
205 static int do_histogram
;
206 static int do_debugging
;
209 static int do_archive_index
;
210 static int is_32bit_elf
;
214 struct group_list
*next
;
215 unsigned int section_index
;
220 struct group_list
*root
;
221 unsigned int group_index
;
224 static size_t group_count
;
225 static struct group
*section_groups
;
226 static struct group
**section_headers_groups
;
229 /* Flag bits indicating particular types of dump. */
230 #define HEX_DUMP (1 << 0) /* The -x command line switch. */
231 #define DISASS_DUMP (1 << 1) /* The -i command line switch. */
232 #define DEBUG_DUMP (1 << 2) /* The -w command line switch. */
233 #define STRING_DUMP (1 << 3) /* The -p command line switch. */
235 typedef unsigned char dump_type
;
237 /* A linked list of the section names for which dumps were requested. */
238 struct dump_list_entry
242 struct dump_list_entry
*next
;
244 static struct dump_list_entry
*dump_sects_byname
;
246 /* A dynamic array of flags indicating for which sections a dump
247 has been requested via command line switches. */
248 static dump_type
* cmdline_dump_sects
= NULL
;
249 static unsigned int num_cmdline_dump_sects
= 0;
251 /* A dynamic array of flags indicating for which sections a dump of
252 some kind has been requested. It is reset on a per-object file
253 basis and then initialised from the cmdline_dump_sects array,
254 the results of interpreting the -w switch, and the
255 dump_sects_byname list. */
256 static dump_type
* dump_sects
= NULL
;
257 static unsigned int num_dump_sects
= 0;
260 /* How to print a vma value. */
261 typedef enum print_mode
273 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
277 #define SECTION_NAME(X) \
278 ((X) == NULL ? "<none>" \
279 : string_table == NULL ? "<no-name>" \
280 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
281 : string_table + (X)->sh_name))
283 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
285 #define BYTE_GET(field) byte_get (field, sizeof (field))
287 #define GET_ELF_SYMBOLS(file, section) \
288 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
289 : get_64bit_elf_symbols (file, section))
291 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
292 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
293 already been called and verified that the string exists. */
294 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
296 /* This is just a bit of syntatic sugar. */
297 #define streq(a,b) (strcmp ((a), (b)) == 0)
298 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
299 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
302 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
307 if (size
== 0 || nmemb
== 0)
310 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
312 error (_("Unable to seek to 0x%lx for %s\n"),
313 (unsigned long) archive_file_offset
+ offset
, reason
);
320 /* Check for overflow. */
321 if (nmemb
< (~(size_t) 0 - 1) / size
)
322 /* + 1 so that we can '\0' terminate invalid string table sections. */
323 mvar
= malloc (size
* nmemb
+ 1);
327 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
328 (unsigned long)(size
* nmemb
), reason
);
332 ((char *) mvar
)[size
* nmemb
] = '\0';
335 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
337 error (_("Unable to read in 0x%lx bytes of %s\n"),
338 (unsigned long)(size
* nmemb
), reason
);
348 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
353 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
354 field
[6] = ((value
>> 24) >> 24) & 0xff;
355 field
[5] = ((value
>> 24) >> 16) & 0xff;
356 field
[4] = ((value
>> 24) >> 8) & 0xff;
359 field
[3] = (value
>> 24) & 0xff;
360 field
[2] = (value
>> 16) & 0xff;
363 field
[1] = (value
>> 8) & 0xff;
366 field
[0] = value
& 0xff;
370 error (_("Unhandled data length: %d\n"), size
);
375 /* Print a VMA value. */
378 print_vma (bfd_vma vma
, print_mode mode
)
391 return nc
+ printf ("%8.8" BFD_VMA_FMT
"x", vma
);
398 return printf ("%5" BFD_VMA_FMT
"d", vma
);
406 return nc
+ printf ("%" BFD_VMA_FMT
"x", vma
);
409 return printf ("%" BFD_VMA_FMT
"d", vma
);
412 return printf ("%" BFD_VMA_FMT
"u", vma
);
417 /* Display a symbol on stdout. Handles the display of
418 non-printing characters.
419 If DO_WIDE is not true then format the symbol to be
420 at most WIDTH characters, truncating as necessary.
421 If WIDTH is negative then format the string to be
422 exactly - WIDTH characters, truncating or padding
426 print_symbol (int width
, const char *symbol
)
428 const char * format_string
;
433 format_string
= "%.*s";
434 /* Set the width to a very large value. This simplifies the code below. */
439 format_string
= "%-*.*2s";
440 /* Keep the width positive. This also helps. */
445 format_string
= "%-.*s";
454 /* Look for non-printing symbols inside the symbol's name.
455 This test is triggered in particular by the names generated
456 by the assembler for local labels. */
457 while (ISPRINT (* c
))
467 printf (format_string
, len
, symbol
);
472 if (* c
== 0 || width
== 0)
475 /* Now display the non-printing character, if
476 there is room left in which to dipslay it. */
482 printf ("^%c", *c
+ 0x40);
491 printf ("<0x%.2x>", *c
);
501 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
506 field
[7] = value
& 0xff;
507 field
[6] = (value
>> 8) & 0xff;
508 field
[5] = (value
>> 16) & 0xff;
509 field
[4] = (value
>> 24) & 0xff;
514 field
[3] = value
& 0xff;
515 field
[2] = (value
>> 8) & 0xff;
519 field
[1] = value
& 0xff;
523 field
[0] = value
& 0xff;
527 error (_("Unhandled data length: %d\n"), size
);
532 /* Return a pointer to section NAME, or NULL if no such section exists. */
534 static Elf_Internal_Shdr
*
535 find_section (const char *name
)
539 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
540 if (streq (SECTION_NAME (section_headers
+ i
), name
))
541 return section_headers
+ i
;
546 /* Guess the relocation size commonly used by the specific machines. */
549 guess_is_rela (unsigned int e_machine
)
553 /* Targets that use REL relocations. */
569 /* Targets that use RELA relocations. */
573 case EM_ALTERA_NIOS2
:
600 case EM_CYGNUS_MN10200
:
602 case EM_CYGNUS_MN10300
:
643 warn (_("Don't know about relocations on this machine architecture\n"));
649 slurp_rela_relocs (FILE *file
,
650 unsigned long rel_offset
,
651 unsigned long rel_size
,
652 Elf_Internal_Rela
**relasp
,
653 unsigned long *nrelasp
)
655 Elf_Internal_Rela
*relas
;
656 unsigned long nrelas
;
661 Elf32_External_Rela
*erelas
;
663 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
667 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
669 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
674 error (_("out of memory parsing relocs\n"));
678 for (i
= 0; i
< nrelas
; i
++)
680 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
681 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
682 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
689 Elf64_External_Rela
*erelas
;
691 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
695 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
697 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
702 error (_("out of memory parsing relocs\n"));
706 for (i
= 0; i
< nrelas
; i
++)
708 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
709 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
710 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
712 /* The #ifdef BFD64 below is to prevent a compile time
713 warning. We know that if we do not have a 64 bit data
714 type that we will never execute this code anyway. */
716 if (elf_header
.e_machine
== EM_MIPS
717 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
719 /* In little-endian objects, r_info isn't really a
720 64-bit little-endian value: it has a 32-bit
721 little-endian symbol index followed by four
722 individual byte fields. Reorder INFO
724 bfd_vma info
= relas
[i
].r_info
;
725 info
= (((info
& 0xffffffff) << 32)
726 | ((info
>> 56) & 0xff)
727 | ((info
>> 40) & 0xff00)
728 | ((info
>> 24) & 0xff0000)
729 | ((info
>> 8) & 0xff000000));
730 relas
[i
].r_info
= info
;
743 slurp_rel_relocs (FILE *file
,
744 unsigned long rel_offset
,
745 unsigned long rel_size
,
746 Elf_Internal_Rela
**relsp
,
747 unsigned long *nrelsp
)
749 Elf_Internal_Rela
*rels
;
755 Elf32_External_Rel
*erels
;
757 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
761 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
763 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
768 error (_("out of memory parsing relocs\n"));
772 for (i
= 0; i
< nrels
; i
++)
774 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
775 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
776 rels
[i
].r_addend
= 0;
783 Elf64_External_Rel
*erels
;
785 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
789 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
791 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
796 error (_("out of memory parsing relocs\n"));
800 for (i
= 0; i
< nrels
; i
++)
802 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
803 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
804 rels
[i
].r_addend
= 0;
806 /* The #ifdef BFD64 below is to prevent a compile time
807 warning. We know that if we do not have a 64 bit data
808 type that we will never execute this code anyway. */
810 if (elf_header
.e_machine
== EM_MIPS
811 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
813 /* In little-endian objects, r_info isn't really a
814 64-bit little-endian value: it has a 32-bit
815 little-endian symbol index followed by four
816 individual byte fields. Reorder INFO
818 bfd_vma info
= rels
[i
].r_info
;
819 info
= (((info
& 0xffffffff) << 32)
820 | ((info
>> 56) & 0xff)
821 | ((info
>> 40) & 0xff00)
822 | ((info
>> 24) & 0xff0000)
823 | ((info
>> 8) & 0xff000000));
824 rels
[i
].r_info
= info
;
836 /* Returns the reloc type extracted from the reloc info field. */
839 get_reloc_type (bfd_vma reloc_info
)
842 return ELF32_R_TYPE (reloc_info
);
844 switch (elf_header
.e_machine
)
847 /* Note: We assume that reloc_info has already been adjusted for us. */
848 return ELF64_MIPS_R_TYPE (reloc_info
);
851 return ELF64_R_TYPE_ID (reloc_info
);
854 return ELF64_R_TYPE (reloc_info
);
858 /* Return the symbol index extracted from the reloc info field. */
861 get_reloc_symindex (bfd_vma reloc_info
)
863 return is_32bit_elf
? ELF32_R_SYM (reloc_info
) : ELF64_R_SYM (reloc_info
);
866 /* Display the contents of the relocation data found at the specified
870 dump_relocations (FILE *file
,
871 unsigned long rel_offset
,
872 unsigned long rel_size
,
873 Elf_Internal_Sym
*symtab
,
876 unsigned long strtablen
,
880 Elf_Internal_Rela
*rels
;
883 if (is_rela
== UNKNOWN
)
884 is_rela
= guess_is_rela (elf_header
.e_machine
);
888 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
893 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
902 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
904 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
909 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
911 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
919 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
921 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
926 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
928 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
932 for (i
= 0; i
< rel_size
; i
++)
937 bfd_vma symtab_index
;
940 offset
= rels
[i
].r_offset
;
941 info
= rels
[i
].r_info
;
943 type
= get_reloc_type (info
);
944 symtab_index
= get_reloc_symindex (info
);
948 printf ("%8.8lx %8.8lx ",
949 (unsigned long) offset
& 0xffffffff,
950 (unsigned long) info
& 0xffffffff);
954 #if BFD_HOST_64BIT_LONG
956 ? "%16.16lx %16.16lx "
957 : "%12.12lx %12.12lx ",
959 #elif BFD_HOST_64BIT_LONG_LONG
962 ? "%16.16llx %16.16llx "
963 : "%12.12llx %12.12llx ",
967 ? "%16.16I64x %16.16I64x "
968 : "%12.12I64x %12.12I64x ",
973 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
974 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
975 _bfd_int64_high (offset
),
976 _bfd_int64_low (offset
),
977 _bfd_int64_high (info
),
978 _bfd_int64_low (info
));
982 switch (elf_header
.e_machine
)
990 rtype
= elf_m32r_reloc_type (type
);
995 rtype
= elf_i386_reloc_type (type
);
1000 rtype
= elf_m68hc11_reloc_type (type
);
1004 rtype
= elf_m68k_reloc_type (type
);
1008 rtype
= elf_i960_reloc_type (type
);
1013 rtype
= elf_avr_reloc_type (type
);
1016 case EM_OLD_SPARCV9
:
1017 case EM_SPARC32PLUS
:
1020 rtype
= elf_sparc_reloc_type (type
);
1024 rtype
= elf_spu_reloc_type (type
);
1028 case EM_CYGNUS_V850
:
1029 rtype
= v850_reloc_type (type
);
1033 case EM_CYGNUS_D10V
:
1034 rtype
= elf_d10v_reloc_type (type
);
1038 case EM_CYGNUS_D30V
:
1039 rtype
= elf_d30v_reloc_type (type
);
1043 rtype
= elf_dlx_reloc_type (type
);
1047 rtype
= elf_sh_reloc_type (type
);
1051 case EM_CYGNUS_MN10300
:
1052 rtype
= elf_mn10300_reloc_type (type
);
1056 case EM_CYGNUS_MN10200
:
1057 rtype
= elf_mn10200_reloc_type (type
);
1061 case EM_CYGNUS_FR30
:
1062 rtype
= elf_fr30_reloc_type (type
);
1066 rtype
= elf_frv_reloc_type (type
);
1070 rtype
= elf_mcore_reloc_type (type
);
1074 rtype
= elf_mmix_reloc_type (type
);
1079 rtype
= elf_msp430_reloc_type (type
);
1083 rtype
= elf_ppc_reloc_type (type
);
1087 rtype
= elf_ppc64_reloc_type (type
);
1091 case EM_MIPS_RS3_LE
:
1092 rtype
= elf_mips_reloc_type (type
);
1096 rtype
= elf_alpha_reloc_type (type
);
1100 rtype
= elf_arm_reloc_type (type
);
1104 rtype
= elf_arc_reloc_type (type
);
1108 rtype
= elf_hppa_reloc_type (type
);
1114 rtype
= elf_h8_reloc_type (type
);
1119 rtype
= elf_or32_reloc_type (type
);
1124 rtype
= elf_pj_reloc_type (type
);
1127 rtype
= elf_ia64_reloc_type (type
);
1131 rtype
= elf_cris_reloc_type (type
);
1135 rtype
= elf_i860_reloc_type (type
);
1139 rtype
= elf_x86_64_reloc_type (type
);
1143 rtype
= i370_reloc_type (type
);
1148 rtype
= elf_s390_reloc_type (type
);
1152 rtype
= elf_score_reloc_type (type
);
1156 rtype
= elf_xstormy16_reloc_type (type
);
1160 rtype
= elf_crx_reloc_type (type
);
1164 rtype
= elf_vax_reloc_type (type
);
1169 rtype
= elf_ip2k_reloc_type (type
);
1173 rtype
= elf_iq2000_reloc_type (type
);
1178 rtype
= elf_xtensa_reloc_type (type
);
1183 rtype
= elf_m32c_reloc_type (type
);
1187 rtype
= elf_mt_reloc_type (type
);
1191 rtype
= elf_bfin_reloc_type (type
);
1195 rtype
= elf_mep_reloc_type (type
);
1200 rtype
= elf_cr16_reloc_type (type
);
1205 printf (_("unrecognized: %-7lx"), (unsigned long) type
& 0xffffffff);
1207 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1209 if (elf_header
.e_machine
== EM_ALPHA
1211 && streq (rtype
, "R_ALPHA_LITUSE")
1214 switch (rels
[i
].r_addend
)
1216 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1217 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1218 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1219 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1220 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1221 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1222 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1223 default: rtype
= NULL
;
1226 printf (" (%s)", rtype
);
1230 printf (_("<unknown addend: %lx>"),
1231 (unsigned long) rels
[i
].r_addend
);
1234 else if (symtab_index
)
1236 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1237 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1240 Elf_Internal_Sym
*psym
;
1242 psym
= symtab
+ symtab_index
;
1245 print_vma (psym
->st_value
, LONG_HEX
);
1246 printf (is_32bit_elf
? " " : " ");
1248 if (psym
->st_name
== 0)
1250 const char *sec_name
= "<null>";
1253 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1255 if (psym
->st_shndx
< elf_header
.e_shnum
)
1257 = SECTION_NAME (section_headers
+ psym
->st_shndx
);
1258 else if (psym
->st_shndx
== SHN_ABS
)
1260 else if (psym
->st_shndx
== SHN_COMMON
)
1261 sec_name
= "COMMON";
1262 else if (elf_header
.e_machine
== EM_MIPS
1263 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1264 sec_name
= "SCOMMON";
1265 else if (elf_header
.e_machine
== EM_MIPS
1266 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1267 sec_name
= "SUNDEF";
1268 else if (elf_header
.e_machine
== EM_X86_64
1269 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1270 sec_name
= "LARGE_COMMON";
1271 else if (elf_header
.e_machine
== EM_IA_64
1272 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1273 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1274 sec_name
= "ANSI_COM";
1275 else if (elf_header
.e_machine
== EM_IA_64
1276 && (elf_header
.e_ident
[EI_OSABI
]
1277 == ELFOSABI_OPENVMS
)
1278 && psym
->st_shndx
== SHN_IA_64_VMS_SYMVEC
)
1279 sec_name
= "VMS_SYMVEC";
1282 sprintf (name_buf
, "<section 0x%x>",
1283 (unsigned int) psym
->st_shndx
);
1284 sec_name
= name_buf
;
1287 print_symbol (22, sec_name
);
1289 else if (strtab
== NULL
)
1290 printf (_("<string table index: %3ld>"), psym
->st_name
);
1291 else if (psym
->st_name
>= strtablen
)
1292 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1294 print_symbol (22, strtab
+ psym
->st_name
);
1297 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1302 printf ("%*c", is_32bit_elf
?
1303 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1304 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1307 if (elf_header
.e_machine
== EM_SPARCV9
1309 && streq (rtype
, "R_SPARC_OLO10"))
1310 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1315 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1317 bfd_vma type2
= ELF64_MIPS_R_TYPE2 (info
);
1318 bfd_vma type3
= ELF64_MIPS_R_TYPE3 (info
);
1319 const char *rtype2
= elf_mips_reloc_type (type2
);
1320 const char *rtype3
= elf_mips_reloc_type (type3
);
1322 printf (" Type2: ");
1325 printf (_("unrecognized: %-7lx"),
1326 (unsigned long) type2
& 0xffffffff);
1328 printf ("%-17.17s", rtype2
);
1330 printf ("\n Type3: ");
1333 printf (_("unrecognized: %-7lx"),
1334 (unsigned long) type3
& 0xffffffff);
1336 printf ("%-17.17s", rtype3
);
1347 get_mips_dynamic_type (unsigned long type
)
1351 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1352 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1353 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1354 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1355 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1356 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1357 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1358 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1359 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1360 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1361 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1362 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1363 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1364 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1365 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1366 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1367 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1368 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1369 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1370 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1371 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1372 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1373 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1374 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1375 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1376 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1377 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1378 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1379 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1380 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1381 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1382 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1383 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1384 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1385 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1386 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1387 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1388 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1389 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1390 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1391 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1392 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1393 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1394 case DT_MIPS_PLTGOT
: return "MIPS_PLTGOT";
1395 case DT_MIPS_RWPLT
: return "MIPS_RWPLT";
1402 get_sparc64_dynamic_type (unsigned long type
)
1406 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1413 get_ppc_dynamic_type (unsigned long type
)
1417 case DT_PPC_GOT
: return "PPC_GOT";
1424 get_ppc64_dynamic_type (unsigned long type
)
1428 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1429 case DT_PPC64_OPD
: return "PPC64_OPD";
1430 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1437 get_parisc_dynamic_type (unsigned long type
)
1441 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1442 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1443 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1444 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1445 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1446 case DT_HP_PREINIT
: return "HP_PREINIT";
1447 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1448 case DT_HP_NEEDED
: return "HP_NEEDED";
1449 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1450 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1451 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1452 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1453 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1454 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1455 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1456 case DT_HP_FILTERED
: return "HP_FILTERED";
1457 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1458 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1459 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1460 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1461 case DT_PLT
: return "PLT";
1462 case DT_PLT_SIZE
: return "PLT_SIZE";
1463 case DT_DLT
: return "DLT";
1464 case DT_DLT_SIZE
: return "DLT_SIZE";
1471 get_ia64_dynamic_type (unsigned long type
)
1475 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1476 case DT_IA_64_VMS_SUBTYPE
: return "VMS_SUBTYPE";
1477 case DT_IA_64_VMS_IMGIOCNT
: return "VMS_IMGIOCNT";
1478 case DT_IA_64_VMS_LNKFLAGS
: return "VMS_LNKFLAGS";
1479 case DT_IA_64_VMS_VIR_MEM_BLK_SIZ
: return "VMS_VIR_MEM_BLK_SIZ";
1480 case DT_IA_64_VMS_IDENT
: return "VMS_IDENT";
1481 case DT_IA_64_VMS_NEEDED_IDENT
: return "VMS_NEEDED_IDENT";
1482 case DT_IA_64_VMS_IMG_RELA_CNT
: return "VMS_IMG_RELA_CNT";
1483 case DT_IA_64_VMS_SEG_RELA_CNT
: return "VMS_SEG_RELA_CNT";
1484 case DT_IA_64_VMS_FIXUP_RELA_CNT
: return "VMS_FIXUP_RELA_CNT";
1485 case DT_IA_64_VMS_FIXUP_NEEDED
: return "VMS_FIXUP_NEEDED";
1486 case DT_IA_64_VMS_SYMVEC_CNT
: return "VMS_SYMVEC_CNT";
1487 case DT_IA_64_VMS_XLATED
: return "VMS_XLATED";
1488 case DT_IA_64_VMS_STACKSIZE
: return "VMS_STACKSIZE";
1489 case DT_IA_64_VMS_UNWINDSZ
: return "VMS_UNWINDSZ";
1490 case DT_IA_64_VMS_UNWIND_CODSEG
: return "VMS_UNWIND_CODSEG";
1491 case DT_IA_64_VMS_UNWIND_INFOSEG
: return "VMS_UNWIND_INFOSEG";
1492 case DT_IA_64_VMS_LINKTIME
: return "VMS_LINKTIME";
1493 case DT_IA_64_VMS_SEG_NO
: return "VMS_SEG_NO";
1494 case DT_IA_64_VMS_SYMVEC_OFFSET
: return "VMS_SYMVEC_OFFSET";
1495 case DT_IA_64_VMS_SYMVEC_SEG
: return "VMS_SYMVEC_SEG";
1496 case DT_IA_64_VMS_UNWIND_OFFSET
: return "VMS_UNWIND_OFFSET";
1497 case DT_IA_64_VMS_UNWIND_SEG
: return "VMS_UNWIND_SEG";
1498 case DT_IA_64_VMS_STRTAB_OFFSET
: return "VMS_STRTAB_OFFSET";
1499 case DT_IA_64_VMS_SYSVER_OFFSET
: return "VMS_SYSVER_OFFSET";
1500 case DT_IA_64_VMS_IMG_RELA_OFF
: return "VMS_IMG_RELA_OFF";
1501 case DT_IA_64_VMS_SEG_RELA_OFF
: return "VMS_SEG_RELA_OFF";
1502 case DT_IA_64_VMS_FIXUP_RELA_OFF
: return "VMS_FIXUP_RELA_OFF";
1503 case DT_IA_64_VMS_PLTGOT_OFFSET
: return "VMS_PLTGOT_OFFSET";
1504 case DT_IA_64_VMS_PLTGOT_SEG
: return "VMS_PLTGOT_SEG";
1505 case DT_IA_64_VMS_FPMODE
: return "VMS_FPMODE";
1512 get_alpha_dynamic_type (unsigned long type
)
1516 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1523 get_score_dynamic_type (unsigned long type
)
1527 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1528 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1529 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1530 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1531 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1532 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1540 get_dynamic_type (unsigned long type
)
1542 static char buff
[64];
1546 case DT_NULL
: return "NULL";
1547 case DT_NEEDED
: return "NEEDED";
1548 case DT_PLTRELSZ
: return "PLTRELSZ";
1549 case DT_PLTGOT
: return "PLTGOT";
1550 case DT_HASH
: return "HASH";
1551 case DT_STRTAB
: return "STRTAB";
1552 case DT_SYMTAB
: return "SYMTAB";
1553 case DT_RELA
: return "RELA";
1554 case DT_RELASZ
: return "RELASZ";
1555 case DT_RELAENT
: return "RELAENT";
1556 case DT_STRSZ
: return "STRSZ";
1557 case DT_SYMENT
: return "SYMENT";
1558 case DT_INIT
: return "INIT";
1559 case DT_FINI
: return "FINI";
1560 case DT_SONAME
: return "SONAME";
1561 case DT_RPATH
: return "RPATH";
1562 case DT_SYMBOLIC
: return "SYMBOLIC";
1563 case DT_REL
: return "REL";
1564 case DT_RELSZ
: return "RELSZ";
1565 case DT_RELENT
: return "RELENT";
1566 case DT_PLTREL
: return "PLTREL";
1567 case DT_DEBUG
: return "DEBUG";
1568 case DT_TEXTREL
: return "TEXTREL";
1569 case DT_JMPREL
: return "JMPREL";
1570 case DT_BIND_NOW
: return "BIND_NOW";
1571 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1572 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1573 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1574 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1575 case DT_RUNPATH
: return "RUNPATH";
1576 case DT_FLAGS
: return "FLAGS";
1578 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1579 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1581 case DT_CHECKSUM
: return "CHECKSUM";
1582 case DT_PLTPADSZ
: return "PLTPADSZ";
1583 case DT_MOVEENT
: return "MOVEENT";
1584 case DT_MOVESZ
: return "MOVESZ";
1585 case DT_FEATURE
: return "FEATURE";
1586 case DT_POSFLAG_1
: return "POSFLAG_1";
1587 case DT_SYMINSZ
: return "SYMINSZ";
1588 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1590 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1591 case DT_CONFIG
: return "CONFIG";
1592 case DT_DEPAUDIT
: return "DEPAUDIT";
1593 case DT_AUDIT
: return "AUDIT";
1594 case DT_PLTPAD
: return "PLTPAD";
1595 case DT_MOVETAB
: return "MOVETAB";
1596 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1598 case DT_VERSYM
: return "VERSYM";
1600 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1601 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1602 case DT_RELACOUNT
: return "RELACOUNT";
1603 case DT_RELCOUNT
: return "RELCOUNT";
1604 case DT_FLAGS_1
: return "FLAGS_1";
1605 case DT_VERDEF
: return "VERDEF";
1606 case DT_VERDEFNUM
: return "VERDEFNUM";
1607 case DT_VERNEED
: return "VERNEED";
1608 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1610 case DT_AUXILIARY
: return "AUXILIARY";
1611 case DT_USED
: return "USED";
1612 case DT_FILTER
: return "FILTER";
1614 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1615 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1616 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1617 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1618 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1619 case DT_GNU_HASH
: return "GNU_HASH";
1622 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1626 switch (elf_header
.e_machine
)
1629 case EM_MIPS_RS3_LE
:
1630 result
= get_mips_dynamic_type (type
);
1633 result
= get_sparc64_dynamic_type (type
);
1636 result
= get_ppc_dynamic_type (type
);
1639 result
= get_ppc64_dynamic_type (type
);
1642 result
= get_ia64_dynamic_type (type
);
1645 result
= get_alpha_dynamic_type (type
);
1648 result
= get_score_dynamic_type (type
);
1658 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1660 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1661 || (elf_header
.e_machine
== EM_PARISC
1662 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1666 switch (elf_header
.e_machine
)
1669 result
= get_parisc_dynamic_type (type
);
1672 result
= get_ia64_dynamic_type (type
);
1682 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1686 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1693 get_file_type (unsigned e_type
)
1695 static char buff
[32];
1699 case ET_NONE
: return _("NONE (None)");
1700 case ET_REL
: return _("REL (Relocatable file)");
1701 case ET_EXEC
: return _("EXEC (Executable file)");
1702 case ET_DYN
: return _("DYN (Shared object file)");
1703 case ET_CORE
: return _("CORE (Core file)");
1706 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1707 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1708 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1709 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1711 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1717 get_machine_name (unsigned e_machine
)
1719 static char buff
[64]; /* XXX */
1723 case EM_NONE
: return _("None");
1724 case EM_M32
: return "WE32100";
1725 case EM_SPARC
: return "Sparc";
1726 case EM_SPU
: return "SPU";
1727 case EM_386
: return "Intel 80386";
1728 case EM_68K
: return "MC68000";
1729 case EM_88K
: return "MC88000";
1730 case EM_486
: return "Intel 80486";
1731 case EM_860
: return "Intel 80860";
1732 case EM_MIPS
: return "MIPS R3000";
1733 case EM_S370
: return "IBM System/370";
1734 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1735 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1736 case EM_PARISC
: return "HPPA";
1737 case EM_PPC_OLD
: return "Power PC (old)";
1738 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1739 case EM_960
: return "Intel 90860";
1740 case EM_PPC
: return "PowerPC";
1741 case EM_PPC64
: return "PowerPC64";
1742 case EM_V800
: return "NEC V800";
1743 case EM_FR20
: return "Fujitsu FR20";
1744 case EM_RH32
: return "TRW RH32";
1745 case EM_MCORE
: return "MCORE";
1746 case EM_ARM
: return "ARM";
1747 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1748 case EM_SH
: return "Renesas / SuperH SH";
1749 case EM_SPARCV9
: return "Sparc v9";
1750 case EM_TRICORE
: return "Siemens Tricore";
1751 case EM_ARC
: return "ARC";
1752 case EM_H8_300
: return "Renesas H8/300";
1753 case EM_H8_300H
: return "Renesas H8/300H";
1754 case EM_H8S
: return "Renesas H8S";
1755 case EM_H8_500
: return "Renesas H8/500";
1756 case EM_IA_64
: return "Intel IA-64";
1757 case EM_MIPS_X
: return "Stanford MIPS-X";
1758 case EM_COLDFIRE
: return "Motorola Coldfire";
1759 case EM_68HC12
: return "Motorola M68HC12";
1760 case EM_ALPHA
: return "Alpha";
1761 case EM_CYGNUS_D10V
:
1762 case EM_D10V
: return "d10v";
1763 case EM_CYGNUS_D30V
:
1764 case EM_D30V
: return "d30v";
1765 case EM_CYGNUS_M32R
:
1766 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1767 case EM_CYGNUS_V850
:
1768 case EM_V850
: return "NEC v850";
1769 case EM_CYGNUS_MN10300
:
1770 case EM_MN10300
: return "mn10300";
1771 case EM_CYGNUS_MN10200
:
1772 case EM_MN10200
: return "mn10200";
1773 case EM_CYGNUS_FR30
:
1774 case EM_FR30
: return "Fujitsu FR30";
1775 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1777 case EM_PJ
: return "picoJava";
1778 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1779 case EM_PCP
: return "Siemens PCP";
1780 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1781 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1782 case EM_STARCORE
: return "Motorola Star*Core processor";
1783 case EM_ME16
: return "Toyota ME16 processor";
1784 case EM_ST100
: return "STMicroelectronics ST100 processor";
1785 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1786 case EM_FX66
: return "Siemens FX66 microcontroller";
1787 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1788 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1789 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1790 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1791 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1792 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1793 case EM_SVX
: return "Silicon Graphics SVx";
1794 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1795 case EM_VAX
: return "Digital VAX";
1797 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1798 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1799 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1800 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1801 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1802 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1803 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1804 case EM_PRISM
: return "Vitesse Prism";
1805 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1807 case EM_S390
: return "IBM S/390";
1808 case EM_SCORE
: return "SUNPLUS S+Core";
1809 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1811 case EM_OR32
: return "OpenRISC";
1812 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1813 case EM_DLX
: return "OpenDLX";
1815 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1816 case EM_IQ2000
: return "Vitesse IQ2000";
1818 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1820 case EM_M32C
: return "Renesas M32c";
1821 case EM_MT
: return "Morpho Techologies MT processor";
1822 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1823 case EM_NIOS32
: return "Altera Nios";
1824 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1825 case EM_XC16X
: return "Infineon Technologies xc16x";
1826 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1828 case EM_CR16_OLD
: return "National Semiconductor's CR16";
1830 snprintf (buff
, sizeof (buff
), _("<unknown>: 0x%x"), e_machine
);
1836 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1841 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1842 e_flags
&= ~ EF_ARM_EABIMASK
;
1844 /* Handle "generic" ARM flags. */
1845 if (e_flags
& EF_ARM_RELEXEC
)
1847 strcat (buf
, ", relocatable executable");
1848 e_flags
&= ~ EF_ARM_RELEXEC
;
1851 if (e_flags
& EF_ARM_HASENTRY
)
1853 strcat (buf
, ", has entry point");
1854 e_flags
&= ~ EF_ARM_HASENTRY
;
1857 /* Now handle EABI specific flags. */
1861 strcat (buf
, ", <unrecognized EABI>");
1866 case EF_ARM_EABI_VER1
:
1867 strcat (buf
, ", Version1 EABI");
1872 /* Process flags one bit at a time. */
1873 flag
= e_flags
& - e_flags
;
1878 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1879 strcat (buf
, ", sorted symbol tables");
1889 case EF_ARM_EABI_VER2
:
1890 strcat (buf
, ", Version2 EABI");
1895 /* Process flags one bit at a time. */
1896 flag
= e_flags
& - e_flags
;
1901 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1902 strcat (buf
, ", sorted symbol tables");
1905 case EF_ARM_DYNSYMSUSESEGIDX
:
1906 strcat (buf
, ", dynamic symbols use segment index");
1909 case EF_ARM_MAPSYMSFIRST
:
1910 strcat (buf
, ", mapping symbols precede others");
1920 case EF_ARM_EABI_VER3
:
1921 strcat (buf
, ", Version3 EABI");
1924 case EF_ARM_EABI_VER4
:
1925 strcat (buf
, ", Version4 EABI");
1928 case EF_ARM_EABI_VER5
:
1929 strcat (buf
, ", Version5 EABI");
1935 /* Process flags one bit at a time. */
1936 flag
= e_flags
& - e_flags
;
1942 strcat (buf
, ", BE8");
1946 strcat (buf
, ", LE8");
1956 case EF_ARM_EABI_UNKNOWN
:
1957 strcat (buf
, ", GNU EABI");
1962 /* Process flags one bit at a time. */
1963 flag
= e_flags
& - e_flags
;
1968 case EF_ARM_INTERWORK
:
1969 strcat (buf
, ", interworking enabled");
1972 case EF_ARM_APCS_26
:
1973 strcat (buf
, ", uses APCS/26");
1976 case EF_ARM_APCS_FLOAT
:
1977 strcat (buf
, ", uses APCS/float");
1981 strcat (buf
, ", position independent");
1985 strcat (buf
, ", 8 bit structure alignment");
1988 case EF_ARM_NEW_ABI
:
1989 strcat (buf
, ", uses new ABI");
1992 case EF_ARM_OLD_ABI
:
1993 strcat (buf
, ", uses old ABI");
1996 case EF_ARM_SOFT_FLOAT
:
1997 strcat (buf
, ", software FP");
2000 case EF_ARM_VFP_FLOAT
:
2001 strcat (buf
, ", VFP");
2004 case EF_ARM_MAVERICK_FLOAT
:
2005 strcat (buf
, ", Maverick FP");
2016 strcat (buf
,", <unknown>");
2020 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
2022 static char buf
[1024];
2034 decode_ARM_machine_flags (e_flags
, buf
);
2038 switch (e_flags
& EF_FRV_CPU_MASK
)
2040 case EF_FRV_CPU_GENERIC
:
2044 strcat (buf
, ", fr???");
2047 case EF_FRV_CPU_FR300
:
2048 strcat (buf
, ", fr300");
2051 case EF_FRV_CPU_FR400
:
2052 strcat (buf
, ", fr400");
2054 case EF_FRV_CPU_FR405
:
2055 strcat (buf
, ", fr405");
2058 case EF_FRV_CPU_FR450
:
2059 strcat (buf
, ", fr450");
2062 case EF_FRV_CPU_FR500
:
2063 strcat (buf
, ", fr500");
2065 case EF_FRV_CPU_FR550
:
2066 strcat (buf
, ", fr550");
2069 case EF_FRV_CPU_SIMPLE
:
2070 strcat (buf
, ", simple");
2072 case EF_FRV_CPU_TOMCAT
:
2073 strcat (buf
, ", tomcat");
2079 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2080 strcat (buf
, ", m68000");
2081 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2082 strcat (buf
, ", cpu32");
2083 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2084 strcat (buf
, ", fido_a");
2087 char const *isa
= _("unknown");
2088 char const *mac
= _("unknown mac");
2089 char const *additional
= NULL
;
2091 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2093 case EF_M68K_CF_ISA_A_NODIV
:
2095 additional
= ", nodiv";
2097 case EF_M68K_CF_ISA_A
:
2100 case EF_M68K_CF_ISA_A_PLUS
:
2103 case EF_M68K_CF_ISA_B_NOUSP
:
2105 additional
= ", nousp";
2107 case EF_M68K_CF_ISA_B
:
2111 strcat (buf
, ", cf, isa ");
2114 strcat (buf
, additional
);
2115 if (e_flags
& EF_M68K_CF_FLOAT
)
2116 strcat (buf
, ", float");
2117 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2122 case EF_M68K_CF_MAC
:
2125 case EF_M68K_CF_EMAC
:
2138 if (e_flags
& EF_PPC_EMB
)
2139 strcat (buf
, ", emb");
2141 if (e_flags
& EF_PPC_RELOCATABLE
)
2142 strcat (buf
, ", relocatable");
2144 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2145 strcat (buf
, ", relocatable-lib");
2149 case EM_CYGNUS_V850
:
2150 switch (e_flags
& EF_V850_ARCH
)
2153 strcat (buf
, ", v850e1");
2156 strcat (buf
, ", v850e");
2159 strcat (buf
, ", v850");
2162 strcat (buf
, ", unknown v850 architecture variant");
2168 case EM_CYGNUS_M32R
:
2169 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2170 strcat (buf
, ", m32r");
2174 case EM_MIPS_RS3_LE
:
2175 if (e_flags
& EF_MIPS_NOREORDER
)
2176 strcat (buf
, ", noreorder");
2178 if (e_flags
& EF_MIPS_PIC
)
2179 strcat (buf
, ", pic");
2181 if (e_flags
& EF_MIPS_CPIC
)
2182 strcat (buf
, ", cpic");
2184 if (e_flags
& EF_MIPS_UCODE
)
2185 strcat (buf
, ", ugen_reserved");
2187 if (e_flags
& EF_MIPS_ABI2
)
2188 strcat (buf
, ", abi2");
2190 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2191 strcat (buf
, ", odk first");
2193 if (e_flags
& EF_MIPS_32BITMODE
)
2194 strcat (buf
, ", 32bitmode");
2196 switch ((e_flags
& EF_MIPS_MACH
))
2198 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2199 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2200 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2201 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2202 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2203 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2204 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2205 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2206 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2207 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2208 case E_MIPS_MACH_LS2E
: strcat (buf
, ", loongson-2e"); break;
2209 case E_MIPS_MACH_LS2F
: strcat (buf
, ", loongson-2f"); break;
2210 case E_MIPS_MACH_OCTEON
: strcat (buf
, ", octeon"); break;
2212 /* We simply ignore the field in this case to avoid confusion:
2213 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2216 default: strcat (buf
, ", unknown CPU"); break;
2219 switch ((e_flags
& EF_MIPS_ABI
))
2221 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2222 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2223 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2224 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2226 /* We simply ignore the field in this case to avoid confusion:
2227 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2228 This means it is likely to be an o32 file, but not for
2231 default: strcat (buf
, ", unknown ABI"); break;
2234 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2235 strcat (buf
, ", mdmx");
2237 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2238 strcat (buf
, ", mips16");
2240 switch ((e_flags
& EF_MIPS_ARCH
))
2242 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2243 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2244 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2245 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2246 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2247 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2248 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2249 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2250 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2251 default: strcat (buf
, ", unknown ISA"); break;
2257 switch ((e_flags
& EF_SH_MACH_MASK
))
2259 case EF_SH1
: strcat (buf
, ", sh1"); break;
2260 case EF_SH2
: strcat (buf
, ", sh2"); break;
2261 case EF_SH3
: strcat (buf
, ", sh3"); break;
2262 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2263 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2264 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2265 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2266 case EF_SH4
: strcat (buf
, ", sh4"); break;
2267 case EF_SH5
: strcat (buf
, ", sh5"); break;
2268 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2269 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2270 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2271 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2272 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2273 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2274 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2275 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2276 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2277 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2278 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2279 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2280 default: strcat (buf
, ", unknown ISA"); break;
2286 if (e_flags
& EF_SPARC_32PLUS
)
2287 strcat (buf
, ", v8+");
2289 if (e_flags
& EF_SPARC_SUN_US1
)
2290 strcat (buf
, ", ultrasparcI");
2292 if (e_flags
& EF_SPARC_SUN_US3
)
2293 strcat (buf
, ", ultrasparcIII");
2295 if (e_flags
& EF_SPARC_HAL_R1
)
2296 strcat (buf
, ", halr1");
2298 if (e_flags
& EF_SPARC_LEDATA
)
2299 strcat (buf
, ", ledata");
2301 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2302 strcat (buf
, ", tso");
2304 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2305 strcat (buf
, ", pso");
2307 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2308 strcat (buf
, ", rmo");
2312 switch (e_flags
& EF_PARISC_ARCH
)
2314 case EFA_PARISC_1_0
:
2315 strcpy (buf
, ", PA-RISC 1.0");
2317 case EFA_PARISC_1_1
:
2318 strcpy (buf
, ", PA-RISC 1.1");
2320 case EFA_PARISC_2_0
:
2321 strcpy (buf
, ", PA-RISC 2.0");
2326 if (e_flags
& EF_PARISC_TRAPNIL
)
2327 strcat (buf
, ", trapnil");
2328 if (e_flags
& EF_PARISC_EXT
)
2329 strcat (buf
, ", ext");
2330 if (e_flags
& EF_PARISC_LSB
)
2331 strcat (buf
, ", lsb");
2332 if (e_flags
& EF_PARISC_WIDE
)
2333 strcat (buf
, ", wide");
2334 if (e_flags
& EF_PARISC_NO_KABP
)
2335 strcat (buf
, ", no kabp");
2336 if (e_flags
& EF_PARISC_LAZYSWAP
)
2337 strcat (buf
, ", lazyswap");
2342 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2343 strcat (buf
, ", new calling convention");
2345 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2346 strcat (buf
, ", gnu calling convention");
2350 if ((e_flags
& EF_IA_64_ABI64
))
2351 strcat (buf
, ", 64-bit");
2353 strcat (buf
, ", 32-bit");
2354 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2355 strcat (buf
, ", reduced fp model");
2356 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2357 strcat (buf
, ", no function descriptors, constant gp");
2358 else if ((e_flags
& EF_IA_64_CONS_GP
))
2359 strcat (buf
, ", constant gp");
2360 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2361 strcat (buf
, ", absolute");
2365 if ((e_flags
& EF_VAX_NONPIC
))
2366 strcat (buf
, ", non-PIC");
2367 if ((e_flags
& EF_VAX_DFLOAT
))
2368 strcat (buf
, ", D-Float");
2369 if ((e_flags
& EF_VAX_GFLOAT
))
2370 strcat (buf
, ", G-Float");
2379 get_osabi_name (unsigned int osabi
)
2381 static char buff
[32];
2385 case ELFOSABI_NONE
: return "UNIX - System V";
2386 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2387 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2388 case ELFOSABI_LINUX
: return "UNIX - Linux";
2389 case ELFOSABI_HURD
: return "GNU/Hurd";
2390 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2391 case ELFOSABI_AIX
: return "UNIX - AIX";
2392 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2393 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2394 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2395 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2396 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2397 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2398 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2399 case ELFOSABI_AROS
: return "AROS";
2400 case ELFOSABI_STANDALONE
: return _("Standalone App");
2401 case ELFOSABI_ARM
: return "ARM";
2403 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2409 get_arm_segment_type (unsigned long type
)
2423 get_mips_segment_type (unsigned long type
)
2427 case PT_MIPS_REGINFO
:
2429 case PT_MIPS_RTPROC
:
2431 case PT_MIPS_OPTIONS
:
2441 get_parisc_segment_type (unsigned long type
)
2445 case PT_HP_TLS
: return "HP_TLS";
2446 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2447 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2448 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2449 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2450 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2451 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2452 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2453 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2454 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2455 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2456 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2457 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2458 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2459 case PT_HP_STACK
: return "HP_STACK";
2460 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2461 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2462 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2463 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2472 get_ia64_segment_type (unsigned long type
)
2476 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2477 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2478 case PT_HP_TLS
: return "HP_TLS";
2479 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2480 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2481 case PT_IA_64_HP_STACK
: return "HP_STACK";
2490 get_segment_type (unsigned long p_type
)
2492 static char buff
[32];
2496 case PT_NULL
: return "NULL";
2497 case PT_LOAD
: return "LOAD";
2498 case PT_DYNAMIC
: return "DYNAMIC";
2499 case PT_INTERP
: return "INTERP";
2500 case PT_NOTE
: return "NOTE";
2501 case PT_SHLIB
: return "SHLIB";
2502 case PT_PHDR
: return "PHDR";
2503 case PT_TLS
: return "TLS";
2505 case PT_GNU_EH_FRAME
:
2506 return "GNU_EH_FRAME";
2507 case PT_GNU_STACK
: return "GNU_STACK";
2508 case PT_GNU_RELRO
: return "GNU_RELRO";
2511 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2515 switch (elf_header
.e_machine
)
2518 result
= get_arm_segment_type (p_type
);
2521 case EM_MIPS_RS3_LE
:
2522 result
= get_mips_segment_type (p_type
);
2525 result
= get_parisc_segment_type (p_type
);
2528 result
= get_ia64_segment_type (p_type
);
2538 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2540 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2544 switch (elf_header
.e_machine
)
2547 result
= get_parisc_segment_type (p_type
);
2550 result
= get_ia64_segment_type (p_type
);
2560 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2563 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2570 get_mips_section_type_name (unsigned int sh_type
)
2574 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2575 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2576 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2577 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2578 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2579 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2580 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2581 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2582 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2583 case SHT_MIPS_RELD
: return "MIPS_RELD";
2584 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2585 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2586 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2587 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2588 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2589 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2590 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2591 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2592 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2593 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2594 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2595 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2596 case SHT_MIPS_LINE
: return "MIPS_LINE";
2597 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2598 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2599 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2600 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2601 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2602 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2603 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2604 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2605 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2606 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2607 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2608 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2609 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2610 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2611 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2612 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2620 get_parisc_section_type_name (unsigned int sh_type
)
2624 case SHT_PARISC_EXT
: return "PARISC_EXT";
2625 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2626 case SHT_PARISC_DOC
: return "PARISC_DOC";
2627 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2628 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2629 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2630 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2638 get_ia64_section_type_name (unsigned int sh_type
)
2640 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2641 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2642 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2646 case SHT_IA_64_EXT
: return "IA_64_EXT";
2647 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2648 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2649 case SHT_IA_64_VMS_TRACE
: return "VMS_TRACE";
2650 case SHT_IA_64_VMS_TIE_SIGNATURES
: return "VMS_TIE_SIGNATURES";
2651 case SHT_IA_64_VMS_DEBUG
: return "VMS_DEBUG";
2652 case SHT_IA_64_VMS_DEBUG_STR
: return "VMS_DEBUG_STR";
2653 case SHT_IA_64_VMS_LINKAGES
: return "VMS_LINKAGES";
2654 case SHT_IA_64_VMS_SYMBOL_VECTOR
: return "VMS_SYMBOL_VECTOR";
2655 case SHT_IA_64_VMS_FIXUP
: return "VMS_FIXUP";
2663 get_x86_64_section_type_name (unsigned int sh_type
)
2667 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2675 get_arm_section_type_name (unsigned int sh_type
)
2681 case SHT_ARM_PREEMPTMAP
:
2682 return "ARM_PREEMPTMAP";
2683 case SHT_ARM_ATTRIBUTES
:
2684 return "ARM_ATTRIBUTES";
2692 get_section_type_name (unsigned int sh_type
)
2694 static char buff
[32];
2698 case SHT_NULL
: return "NULL";
2699 case SHT_PROGBITS
: return "PROGBITS";
2700 case SHT_SYMTAB
: return "SYMTAB";
2701 case SHT_STRTAB
: return "STRTAB";
2702 case SHT_RELA
: return "RELA";
2703 case SHT_HASH
: return "HASH";
2704 case SHT_DYNAMIC
: return "DYNAMIC";
2705 case SHT_NOTE
: return "NOTE";
2706 case SHT_NOBITS
: return "NOBITS";
2707 case SHT_REL
: return "REL";
2708 case SHT_SHLIB
: return "SHLIB";
2709 case SHT_DYNSYM
: return "DYNSYM";
2710 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2711 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2712 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2713 case SHT_GNU_HASH
: return "GNU_HASH";
2714 case SHT_GROUP
: return "GROUP";
2715 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2716 case SHT_GNU_verdef
: return "VERDEF";
2717 case SHT_GNU_verneed
: return "VERNEED";
2718 case SHT_GNU_versym
: return "VERSYM";
2719 case 0x6ffffff0: return "VERSYM";
2720 case 0x6ffffffc: return "VERDEF";
2721 case 0x7ffffffd: return "AUXILIARY";
2722 case 0x7fffffff: return "FILTER";
2723 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2726 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2730 switch (elf_header
.e_machine
)
2733 case EM_MIPS_RS3_LE
:
2734 result
= get_mips_section_type_name (sh_type
);
2737 result
= get_parisc_section_type_name (sh_type
);
2740 result
= get_ia64_section_type_name (sh_type
);
2743 result
= get_x86_64_section_type_name (sh_type
);
2746 result
= get_arm_section_type_name (sh_type
);
2756 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2758 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2762 switch (elf_header
.e_machine
)
2765 result
= get_ia64_section_type_name (sh_type
);
2775 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2777 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2778 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2780 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2786 #define OPTION_DEBUG_DUMP 512
2788 static struct option options
[] =
2790 {"all", no_argument
, 0, 'a'},
2791 {"file-header", no_argument
, 0, 'h'},
2792 {"program-headers", no_argument
, 0, 'l'},
2793 {"headers", no_argument
, 0, 'e'},
2794 {"histogram", no_argument
, 0, 'I'},
2795 {"segments", no_argument
, 0, 'l'},
2796 {"sections", no_argument
, 0, 'S'},
2797 {"section-headers", no_argument
, 0, 'S'},
2798 {"section-groups", no_argument
, 0, 'g'},
2799 {"section-details", no_argument
, 0, 't'},
2800 {"full-section-name",no_argument
, 0, 'N'},
2801 {"symbols", no_argument
, 0, 's'},
2802 {"syms", no_argument
, 0, 's'},
2803 {"relocs", no_argument
, 0, 'r'},
2804 {"notes", no_argument
, 0, 'n'},
2805 {"dynamic", no_argument
, 0, 'd'},
2806 {"arch-specific", no_argument
, 0, 'A'},
2807 {"version-info", no_argument
, 0, 'V'},
2808 {"use-dynamic", no_argument
, 0, 'D'},
2809 {"unwind", no_argument
, 0, 'u'},
2810 {"archive-index", no_argument
, 0, 'c'},
2811 {"hex-dump", required_argument
, 0, 'x'},
2812 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2813 {"string-dump", required_argument
, 0, 'p'},
2814 #ifdef SUPPORT_DISASSEMBLY
2815 {"instruction-dump", required_argument
, 0, 'i'},
2818 {"version", no_argument
, 0, 'v'},
2819 {"wide", no_argument
, 0, 'W'},
2820 {"help", no_argument
, 0, 'H'},
2821 {0, no_argument
, 0, 0}
2825 usage (FILE *stream
)
2827 fprintf (stream
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2828 fprintf (stream
, _(" Display information about the contents of ELF format files\n"));
2829 fprintf (stream
, _(" Options are:\n\
2830 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2831 -h --file-header Display the ELF file header\n\
2832 -l --program-headers Display the program headers\n\
2833 --segments An alias for --program-headers\n\
2834 -S --section-headers Display the sections' header\n\
2835 --sections An alias for --section-headers\n\
2836 -g --section-groups Display the section groups\n\
2837 -t --section-details Display the section details\n\
2838 -e --headers Equivalent to: -h -l -S\n\
2839 -s --syms Display the symbol table\n\
2840 --symbols An alias for --syms\n\
2841 -n --notes Display the core notes (if present)\n\
2842 -r --relocs Display the relocations (if present)\n\
2843 -u --unwind Display the unwind info (if present)\n\
2844 -d --dynamic Display the dynamic section (if present)\n\
2845 -V --version-info Display the version sections (if present)\n\
2846 -A --arch-specific Display architecture specific information (if any).\n\
2847 -c --archive-index Display the symbol/file index in an archive\n\
2848 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2849 -x --hex-dump=<number|name>\n\
2850 Dump the contents of section <number|name> as bytes\n\
2851 -p --string-dump=<number|name>\n\
2852 Dump the contents of section <number|name> as strings\n\
2853 -w[lLiaprmfFsoR] or\n\
2854 --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2855 Display the contents of DWARF2 debug sections\n"));
2856 #ifdef SUPPORT_DISASSEMBLY
2857 fprintf (stream
, _("\
2858 -i --instruction-dump=<number|name>\n\
2859 Disassemble the contents of section <number|name>\n"));
2861 fprintf (stream
, _("\
2862 -I --histogram Display histogram of bucket list lengths\n\
2863 -W --wide Allow output width to exceed 80 characters\n\
2864 @<file> Read options from <file>\n\
2865 -H --help Display this information\n\
2866 -v --version Display the version number of readelf\n"));
2868 if (REPORT_BUGS_TO
[0] && stream
== stdout
)
2869 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2871 exit (stream
== stdout
? 0 : 1);
2874 /* Record the fact that the user wants the contents of section number
2875 SECTION to be displayed using the method(s) encoded as flags bits
2876 in TYPE. Note, TYPE can be zero if we are creating the array for
2880 request_dump_bynumber (unsigned int section
, dump_type type
)
2882 if (section
>= num_dump_sects
)
2884 dump_type
*new_dump_sects
;
2886 new_dump_sects
= calloc (section
+ 1, sizeof (* dump_sects
));
2888 if (new_dump_sects
== NULL
)
2889 error (_("Out of memory allocating dump request table.\n"));
2892 /* Copy current flag settings. */
2893 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
* sizeof (* dump_sects
));
2897 dump_sects
= new_dump_sects
;
2898 num_dump_sects
= section
+ 1;
2903 dump_sects
[section
] |= type
;
2908 /* Request a dump by section name. */
2911 request_dump_byname (const char *section
, dump_type type
)
2913 struct dump_list_entry
*new_request
;
2915 new_request
= malloc (sizeof (struct dump_list_entry
));
2917 error (_("Out of memory allocating dump request table.\n"));
2919 new_request
->name
= strdup (section
);
2920 if (!new_request
->name
)
2921 error (_("Out of memory allocating dump request table.\n"));
2923 new_request
->type
= type
;
2925 new_request
->next
= dump_sects_byname
;
2926 dump_sects_byname
= new_request
;
2930 parse_args (int argc
, char **argv
)
2937 while ((c
= getopt_long
2938 (argc
, argv
, "ADHINSVWacdeghi:lnp:rstuvw::x:", options
, NULL
)) != EOF
)
2959 do_section_groups
++;
2967 do_section_groups
++;
2972 do_section_details
++;
3017 section
= strtoul (optarg
, & cp
, 0);
3018 if (! *cp
&& section
>= 0)
3019 request_dump_bynumber (section
, HEX_DUMP
);
3021 request_dump_byname (optarg
, HEX_DUMP
);
3025 section
= strtoul (optarg
, & cp
, 0);
3026 if (! *cp
&& section
>= 0)
3027 request_dump_bynumber (section
, STRING_DUMP
);
3029 request_dump_byname (optarg
, STRING_DUMP
);
3037 unsigned int index
= 0;
3041 while (optarg
[index
])
3042 switch (optarg
[index
++])
3049 do_debug_abbrevs
= 1;
3057 do_debug_lines_decoded
= 1;
3061 do_debug_pubnames
= 1;
3065 do_debug_aranges
= 1;
3069 do_debug_ranges
= 1;
3073 do_debug_frames_interp
= 1;
3075 do_debug_frames
= 1;
3079 do_debug_macinfo
= 1;
3091 warn (_("Unrecognized debug option '%s'\n"), optarg
);
3096 case OPTION_DEBUG_DUMP
:
3104 const char * option
;
3107 debug_dump_long_opts
;
3109 debug_dump_long_opts opts_table
[] =
3111 /* Please keep this table alpha- sorted. */
3112 { "Ranges", & do_debug_ranges
},
3113 { "abbrev", & do_debug_abbrevs
},
3114 { "aranges", & do_debug_aranges
},
3115 { "frames", & do_debug_frames
},
3116 { "frames-interp", & do_debug_frames_interp
},
3117 { "info", & do_debug_info
},
3118 { "line", & do_debug_lines
}, /* For backwards compatibility. */
3119 { "rawline", & do_debug_lines
},
3120 { "decodedline", & do_debug_lines_decoded
},
3121 { "loc", & do_debug_loc
},
3122 { "macro", & do_debug_macinfo
},
3123 { "pubnames", & do_debug_pubnames
},
3124 /* This entry is for compatability
3125 with earlier versions of readelf. */
3126 { "ranges", & do_debug_aranges
},
3127 { "str", & do_debug_str
},
3138 debug_dump_long_opts
* entry
;
3140 for (entry
= opts_table
; entry
->option
; entry
++)
3142 size_t len
= strlen (entry
->option
);
3144 if (strneq (p
, entry
->option
, len
)
3145 && (p
[len
] == ',' || p
[len
] == '\0'))
3147 * entry
->variable
= 1;
3149 /* The --debug-dump=frames-interp option also
3150 enables the --debug-dump=frames option. */
3151 if (do_debug_frames_interp
)
3152 do_debug_frames
= 1;
3159 if (entry
->option
== NULL
)
3161 warn (_("Unrecognized debug option '%s'\n"), p
);
3162 p
= strchr (p
, ',');
3172 #ifdef SUPPORT_DISASSEMBLY
3175 section
= strtoul (optarg
, & cp
, 0);
3176 if (! *cp
&& section
>= 0)
3177 request_dump_bynumber (section
, DISASS_DUMP
);
3179 request_dump_byname (optarg
, DISASS_DUMP
);
3182 print_version (program_name
);
3191 /* xgettext:c-format */
3192 error (_("Invalid option '-%c'\n"), c
);
3199 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3200 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3201 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3202 && !do_section_groups
&& !do_archive_index
)
3206 warn (_("Nothing to do.\n"));
3212 get_elf_class (unsigned int elf_class
)
3214 static char buff
[32];
3218 case ELFCLASSNONE
: return _("none");
3219 case ELFCLASS32
: return "ELF32";
3220 case ELFCLASS64
: return "ELF64";
3222 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3228 get_data_encoding (unsigned int encoding
)
3230 static char buff
[32];
3234 case ELFDATANONE
: return _("none");
3235 case ELFDATA2LSB
: return _("2's complement, little endian");
3236 case ELFDATA2MSB
: return _("2's complement, big endian");
3238 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3243 /* Decode the data held in 'elf_header'. */
3246 process_file_header (void)
3248 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3249 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3250 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3251 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3254 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3258 init_dwarf_regnames (elf_header
.e_machine
);
3264 printf (_("ELF Header:\n"));
3265 printf (_(" Magic: "));
3266 for (i
= 0; i
< EI_NIDENT
; i
++)
3267 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3269 printf (_(" Class: %s\n"),
3270 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3271 printf (_(" Data: %s\n"),
3272 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3273 printf (_(" Version: %d %s\n"),
3274 elf_header
.e_ident
[EI_VERSION
],
3275 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3277 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3280 printf (_(" OS/ABI: %s\n"),
3281 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3282 printf (_(" ABI Version: %d\n"),
3283 elf_header
.e_ident
[EI_ABIVERSION
]);
3284 printf (_(" Type: %s\n"),
3285 get_file_type (elf_header
.e_type
));
3286 printf (_(" Machine: %s\n"),
3287 get_machine_name (elf_header
.e_machine
));
3288 printf (_(" Version: 0x%lx\n"),
3289 (unsigned long) elf_header
.e_version
);
3291 printf (_(" Entry point address: "));
3292 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3293 printf (_("\n Start of program headers: "));
3294 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3295 printf (_(" (bytes into file)\n Start of section headers: "));
3296 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3297 printf (_(" (bytes into file)\n"));
3299 printf (_(" Flags: 0x%lx%s\n"),
3300 (unsigned long) elf_header
.e_flags
,
3301 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3302 printf (_(" Size of this header: %ld (bytes)\n"),
3303 (long) elf_header
.e_ehsize
);
3304 printf (_(" Size of program headers: %ld (bytes)\n"),
3305 (long) elf_header
.e_phentsize
);
3306 printf (_(" Number of program headers: %ld\n"),
3307 (long) elf_header
.e_phnum
);
3308 printf (_(" Size of section headers: %ld (bytes)\n"),
3309 (long) elf_header
.e_shentsize
);
3310 printf (_(" Number of section headers: %ld"),
3311 (long) elf_header
.e_shnum
);
3312 if (section_headers
!= NULL
&& elf_header
.e_shnum
== SHN_UNDEF
)
3313 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3314 putc ('\n', stdout
);
3315 printf (_(" Section header string table index: %ld"),
3316 (long) elf_header
.e_shstrndx
);
3317 if (section_headers
!= NULL
3318 && elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3319 printf (" (%u)", section_headers
[0].sh_link
);
3320 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3321 printf (" <corrupt: out of range>");
3322 putc ('\n', stdout
);
3325 if (section_headers
!= NULL
)
3327 if (elf_header
.e_shnum
== SHN_UNDEF
)
3328 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3329 if (elf_header
.e_shstrndx
== (SHN_XINDEX
& 0xffff))
3330 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3331 else if (elf_header
.e_shstrndx
>= elf_header
.e_shnum
)
3332 elf_header
.e_shstrndx
= SHN_UNDEF
;
3333 free (section_headers
);
3334 section_headers
= NULL
;
3342 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3344 Elf32_External_Phdr
*phdrs
;
3345 Elf32_External_Phdr
*external
;
3346 Elf_Internal_Phdr
*internal
;
3349 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3350 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3351 _("program headers"));
3355 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3356 i
< elf_header
.e_phnum
;
3357 i
++, internal
++, external
++)
3359 internal
->p_type
= BYTE_GET (external
->p_type
);
3360 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3361 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3362 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3363 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3364 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3365 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3366 internal
->p_align
= BYTE_GET (external
->p_align
);
3375 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3377 Elf64_External_Phdr
*phdrs
;
3378 Elf64_External_Phdr
*external
;
3379 Elf_Internal_Phdr
*internal
;
3382 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3383 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3384 _("program headers"));
3388 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3389 i
< elf_header
.e_phnum
;
3390 i
++, internal
++, external
++)
3392 internal
->p_type
= BYTE_GET (external
->p_type
);
3393 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3394 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3395 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3396 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3397 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3398 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3399 internal
->p_align
= BYTE_GET (external
->p_align
);
3407 /* Returns 1 if the program headers were read into `program_headers'. */
3410 get_program_headers (FILE *file
)
3412 Elf_Internal_Phdr
*phdrs
;
3414 /* Check cache of prior read. */
3415 if (program_headers
!= NULL
)
3418 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3422 error (_("Out of memory\n"));
3427 ? get_32bit_program_headers (file
, phdrs
)
3428 : get_64bit_program_headers (file
, phdrs
))
3430 program_headers
= phdrs
;
3438 /* Returns 1 if the program headers were loaded. */
3441 process_program_headers (FILE *file
)
3443 Elf_Internal_Phdr
*segment
;
3446 if (elf_header
.e_phnum
== 0)
3449 printf (_("\nThere are no program headers in this file.\n"));
3453 if (do_segments
&& !do_header
)
3455 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3456 printf (_("Entry point "));
3457 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3458 printf (_("\nThere are %d program headers, starting at offset "),
3459 elf_header
.e_phnum
);
3460 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3464 if (! get_program_headers (file
))
3469 if (elf_header
.e_phnum
> 1)
3470 printf (_("\nProgram Headers:\n"));
3472 printf (_("\nProgram Headers:\n"));
3476 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3479 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3483 (_(" Type Offset VirtAddr PhysAddr\n"));
3485 (_(" FileSiz MemSiz Flags Align\n"));
3492 for (i
= 0, segment
= program_headers
;
3493 i
< elf_header
.e_phnum
;
3498 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3502 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3503 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3504 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3505 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3506 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3508 (segment
->p_flags
& PF_R
? 'R' : ' '),
3509 (segment
->p_flags
& PF_W
? 'W' : ' '),
3510 (segment
->p_flags
& PF_X
? 'E' : ' '));
3511 printf ("%#lx", (unsigned long) segment
->p_align
);
3515 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3516 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3519 print_vma (segment
->p_offset
, FULL_HEX
);
3523 print_vma (segment
->p_vaddr
, FULL_HEX
);
3525 print_vma (segment
->p_paddr
, FULL_HEX
);
3528 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3529 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3532 print_vma (segment
->p_filesz
, FULL_HEX
);
3536 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3537 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3540 print_vma (segment
->p_offset
, FULL_HEX
);
3544 (segment
->p_flags
& PF_R
? 'R' : ' '),
3545 (segment
->p_flags
& PF_W
? 'W' : ' '),
3546 (segment
->p_flags
& PF_X
? 'E' : ' '));
3548 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3549 printf ("%#lx", (unsigned long) segment
->p_align
);
3552 print_vma (segment
->p_align
, PREFIX_HEX
);
3557 print_vma (segment
->p_offset
, FULL_HEX
);
3559 print_vma (segment
->p_vaddr
, FULL_HEX
);
3561 print_vma (segment
->p_paddr
, FULL_HEX
);
3563 print_vma (segment
->p_filesz
, FULL_HEX
);
3565 print_vma (segment
->p_memsz
, FULL_HEX
);
3567 (segment
->p_flags
& PF_R
? 'R' : ' '),
3568 (segment
->p_flags
& PF_W
? 'W' : ' '),
3569 (segment
->p_flags
& PF_X
? 'E' : ' '));
3570 print_vma (segment
->p_align
, HEX
);
3574 switch (segment
->p_type
)
3578 error (_("more than one dynamic segment\n"));
3580 /* By default, assume that the .dynamic section is the first
3581 section in the DYNAMIC segment. */
3582 dynamic_addr
= segment
->p_offset
;
3583 dynamic_size
= segment
->p_filesz
;
3585 /* Try to locate the .dynamic section. If there is
3586 a section header table, we can easily locate it. */
3587 if (section_headers
!= NULL
)
3589 Elf_Internal_Shdr
*sec
;
3591 sec
= find_section (".dynamic");
3592 if (sec
== NULL
|| sec
->sh_size
== 0)
3594 error (_("no .dynamic section in the dynamic segment\n"));
3598 if (sec
->sh_type
== SHT_NOBITS
)
3604 dynamic_addr
= sec
->sh_offset
;
3605 dynamic_size
= sec
->sh_size
;
3607 if (dynamic_addr
< segment
->p_offset
3608 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3609 warn (_("the .dynamic section is not contained"
3610 " within the dynamic segment\n"));
3611 else if (dynamic_addr
> segment
->p_offset
)
3612 warn (_("the .dynamic section is not the first section"
3613 " in the dynamic segment.\n"));
3618 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3620 error (_("Unable to find program interpreter name\n"));
3624 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3626 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3627 error (_("Internal error: failed to create format string to display program interpreter\n"));
3629 program_interpreter
[0] = 0;
3630 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3631 error (_("Unable to read program interpreter name\n"));
3634 printf (_("\n [Requesting program interpreter: %s]"),
3635 program_interpreter
);
3641 putc ('\n', stdout
);
3644 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3646 printf (_("\n Section to Segment mapping:\n"));
3647 printf (_(" Segment Sections...\n"));
3649 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3652 Elf_Internal_Shdr
*section
;
3654 segment
= program_headers
+ i
;
3655 section
= section_headers
+ 1;
3657 printf (" %2.2d ", i
);
3659 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3661 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3662 printf ("%s ", SECTION_NAME (section
));
3673 /* Find the file offset corresponding to VMA by using the program headers. */
3676 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3678 Elf_Internal_Phdr
*seg
;
3680 if (! get_program_headers (file
))
3682 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3686 for (seg
= program_headers
;
3687 seg
< program_headers
+ elf_header
.e_phnum
;
3690 if (seg
->p_type
!= PT_LOAD
)
3693 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3694 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3695 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3698 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3699 (unsigned long) vma
);
3705 get_32bit_section_headers (FILE *file
, unsigned int num
)
3707 Elf32_External_Shdr
*shdrs
;
3708 Elf_Internal_Shdr
*internal
;
3711 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3712 elf_header
.e_shentsize
, num
, _("section headers"));
3716 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3718 if (section_headers
== NULL
)
3720 error (_("Out of memory\n"));
3724 for (i
= 0, internal
= section_headers
;
3728 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3729 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3730 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3731 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3732 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3733 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3734 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3735 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3736 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3737 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3746 get_64bit_section_headers (FILE *file
, unsigned int num
)
3748 Elf64_External_Shdr
*shdrs
;
3749 Elf_Internal_Shdr
*internal
;
3752 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3753 elf_header
.e_shentsize
, num
, _("section headers"));
3757 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3759 if (section_headers
== NULL
)
3761 error (_("Out of memory\n"));
3765 for (i
= 0, internal
= section_headers
;
3769 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3770 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3771 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3772 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3773 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3774 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3775 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3776 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3777 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3778 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3786 static Elf_Internal_Sym
*
3787 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3789 unsigned long number
;
3790 Elf32_External_Sym
*esyms
;
3791 Elf_External_Sym_Shndx
*shndx
;
3792 Elf_Internal_Sym
*isyms
;
3793 Elf_Internal_Sym
*psym
;
3796 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3802 if (symtab_shndx_hdr
!= NULL
3803 && (symtab_shndx_hdr
->sh_link
3804 == (unsigned long) (section
- section_headers
)))
3806 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3807 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3815 number
= section
->sh_size
/ section
->sh_entsize
;
3816 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3820 error (_("Out of memory\n"));
3827 for (j
= 0, psym
= isyms
;
3831 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3832 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3833 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3834 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3835 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3837 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3838 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3839 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3840 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3841 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3851 static Elf_Internal_Sym
*
3852 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3854 unsigned long number
;
3855 Elf64_External_Sym
*esyms
;
3856 Elf_External_Sym_Shndx
*shndx
;
3857 Elf_Internal_Sym
*isyms
;
3858 Elf_Internal_Sym
*psym
;
3861 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3867 if (symtab_shndx_hdr
!= NULL
3868 && (symtab_shndx_hdr
->sh_link
3869 == (unsigned long) (section
- section_headers
)))
3871 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3872 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3880 number
= section
->sh_size
/ section
->sh_entsize
;
3881 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3885 error (_("Out of memory\n"));
3892 for (j
= 0, psym
= isyms
;
3896 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3897 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3898 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3899 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3900 if (psym
->st_shndx
== (SHN_XINDEX
& 0xffff) && shndx
!= NULL
)
3902 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3903 else if (psym
->st_shndx
>= (SHN_LORESERVE
& 0xffff))
3904 psym
->st_shndx
+= SHN_LORESERVE
- (SHN_LORESERVE
& 0xffff);
3905 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3906 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3917 get_elf_section_flags (bfd_vma sh_flags
)
3919 static char buff
[1024];
3921 int field_size
= is_32bit_elf
? 8 : 16;
3922 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3923 bfd_vma os_flags
= 0;
3924 bfd_vma proc_flags
= 0;
3925 bfd_vma unknown_flags
= 0;
3939 { "LINK ORDER", 10 },
3940 { "OS NONCONF", 10 },
3943 /* IA-64 specific. */
3946 /* IA-64 OpenVMS specific. */
3947 { "VMS_GLOBAL", 10 },
3948 { "VMS_OVERLAID", 12 },
3949 { "VMS_SHARED", 10 },
3950 { "VMS_VECTOR", 10 },
3951 { "VMS_ALLOC_64BIT", 15 },
3952 { "VMS_PROTECTED", 13}
3955 if (do_section_details
)
3957 sprintf (buff
, "[%*.*lx]: ",
3958 field_size
, field_size
, (unsigned long) sh_flags
);
3959 p
+= field_size
+ 4;
3966 flag
= sh_flags
& - sh_flags
;
3969 if (do_section_details
)
3973 case SHF_WRITE
: index
= 0; break;
3974 case SHF_ALLOC
: index
= 1; break;
3975 case SHF_EXECINSTR
: index
= 2; break;
3976 case SHF_MERGE
: index
= 3; break;
3977 case SHF_STRINGS
: index
= 4; break;
3978 case SHF_INFO_LINK
: index
= 5; break;
3979 case SHF_LINK_ORDER
: index
= 6; break;
3980 case SHF_OS_NONCONFORMING
: index
= 7; break;
3981 case SHF_GROUP
: index
= 8; break;
3982 case SHF_TLS
: index
= 9; break;
3986 if (elf_header
.e_machine
== EM_IA_64
)
3988 if (flag
== SHF_IA_64_SHORT
)
3990 else if (flag
== SHF_IA_64_NORECOV
)
3993 else if (elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_OPENVMS
)
3996 case SHF_IA_64_VMS_GLOBAL
: index
= 12; break;
3997 case SHF_IA_64_VMS_OVERLAID
: index
= 13; break;
3998 case SHF_IA_64_VMS_SHARED
: index
= 14; break;
3999 case SHF_IA_64_VMS_VECTOR
: index
= 15; break;
4000 case SHF_IA_64_VMS_ALLOC_64BIT
: index
= 16; break;
4001 case SHF_IA_64_VMS_PROTECTED
: index
= 17; break;
4011 if (p
!= buff
+ field_size
+ 4)
4013 if (size
< (10 + 2))
4020 size
-= flags
[index
].len
;
4021 p
= stpcpy (p
, flags
[index
].str
);
4023 else if (flag
& SHF_MASKOS
)
4025 else if (flag
& SHF_MASKPROC
)
4028 unknown_flags
|= flag
;
4034 case SHF_WRITE
: *p
= 'W'; break;
4035 case SHF_ALLOC
: *p
= 'A'; break;
4036 case SHF_EXECINSTR
: *p
= 'X'; break;
4037 case SHF_MERGE
: *p
= 'M'; break;
4038 case SHF_STRINGS
: *p
= 'S'; break;
4039 case SHF_INFO_LINK
: *p
= 'I'; break;
4040 case SHF_LINK_ORDER
: *p
= 'L'; break;
4041 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
4042 case SHF_GROUP
: *p
= 'G'; break;
4043 case SHF_TLS
: *p
= 'T'; break;
4046 if (elf_header
.e_machine
== EM_X86_64
4047 && flag
== SHF_X86_64_LARGE
)
4049 else if (flag
& SHF_MASKOS
)
4052 sh_flags
&= ~ SHF_MASKOS
;
4054 else if (flag
& SHF_MASKPROC
)
4057 sh_flags
&= ~ SHF_MASKPROC
;
4067 if (do_section_details
)
4071 size
-= 5 + field_size
;
4072 if (p
!= buff
+ field_size
+ 4)
4080 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
4081 (unsigned long) os_flags
);
4082 p
+= 5 + field_size
;
4086 size
-= 7 + field_size
;
4087 if (p
!= buff
+ field_size
+ 4)
4095 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
4096 (unsigned long) proc_flags
);
4097 p
+= 7 + field_size
;
4101 size
-= 10 + field_size
;
4102 if (p
!= buff
+ field_size
+ 4)
4110 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
4111 (unsigned long) unknown_flags
);
4112 p
+= 10 + field_size
;
4121 process_section_headers (FILE *file
)
4123 Elf_Internal_Shdr
*section
;
4126 section_headers
= NULL
;
4128 if (elf_header
.e_shnum
== 0)
4131 printf (_("\nThere are no sections in this file.\n"));
4136 if (do_sections
&& !do_header
)
4137 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4138 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4142 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4145 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4148 /* Read in the string table, so that we have names to display. */
4149 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4150 && elf_header
.e_shstrndx
< elf_header
.e_shnum
)
4152 section
= section_headers
+ elf_header
.e_shstrndx
;
4154 if (section
->sh_size
!= 0)
4156 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4157 1, section
->sh_size
, _("string table"));
4159 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4163 /* Scan the sections for the dynamic symbol table
4164 and dynamic string table and debug sections. */
4165 dynamic_symbols
= NULL
;
4166 dynamic_strings
= NULL
;
4167 dynamic_syminfo
= NULL
;
4168 symtab_shndx_hdr
= NULL
;
4170 eh_addr_size
= is_32bit_elf
? 4 : 8;
4171 switch (elf_header
.e_machine
)
4174 case EM_MIPS_RS3_LE
:
4175 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4176 FDE addresses. However, the ABI also has a semi-official ILP32
4177 variant for which the normal FDE address size rules apply.
4179 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4180 section, where XX is the size of longs in bits. Unfortunately,
4181 earlier compilers provided no way of distinguishing ILP32 objects
4182 from LP64 objects, so if there's any doubt, we should assume that
4183 the official LP64 form is being used. */
4184 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4185 && find_section (".gcc_compiled_long32") == NULL
)
4191 switch (elf_header
.e_flags
& EF_H8_MACH
)
4193 case E_H8_MACH_H8300
:
4194 case E_H8_MACH_H8300HN
:
4195 case E_H8_MACH_H8300SN
:
4196 case E_H8_MACH_H8300SXN
:
4199 case E_H8_MACH_H8300H
:
4200 case E_H8_MACH_H8300S
:
4201 case E_H8_MACH_H8300SX
:
4209 switch (elf_header
.e_flags
& EF_M32C_CPU_MASK
)
4211 case EF_M32C_CPU_M16C
:
4218 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4221 size_t expected_entsize \
4222 = is_32bit_elf ? size32 : size64; \
4223 if (section->sh_entsize != expected_entsize) \
4224 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4225 i, (unsigned long int) section->sh_entsize, \
4226 (unsigned long int) expected_entsize); \
4227 section->sh_entsize = expected_entsize; \
4230 #define CHECK_ENTSIZE(section, i, type) \
4231 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4232 sizeof (Elf64_External_##type))
4234 for (i
= 0, section
= section_headers
;
4235 i
< elf_header
.e_shnum
;
4238 char *name
= SECTION_NAME (section
);
4240 if (section
->sh_type
== SHT_DYNSYM
)
4242 if (dynamic_symbols
!= NULL
)
4244 error (_("File contains multiple dynamic symbol tables\n"));
4248 CHECK_ENTSIZE (section
, i
, Sym
);
4249 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4250 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4252 else if (section
->sh_type
== SHT_STRTAB
4253 && streq (name
, ".dynstr"))
4255 if (dynamic_strings
!= NULL
)
4257 error (_("File contains multiple dynamic string tables\n"));
4261 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4262 1, section
->sh_size
, _("dynamic strings"));
4263 dynamic_strings_length
= section
->sh_size
;
4265 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4267 if (symtab_shndx_hdr
!= NULL
)
4269 error (_("File contains multiple symtab shndx tables\n"));
4272 symtab_shndx_hdr
= section
;
4274 else if (section
->sh_type
== SHT_SYMTAB
)
4275 CHECK_ENTSIZE (section
, i
, Sym
);
4276 else if (section
->sh_type
== SHT_GROUP
)
4277 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4278 else if (section
->sh_type
== SHT_REL
)
4279 CHECK_ENTSIZE (section
, i
, Rel
);
4280 else if (section
->sh_type
== SHT_RELA
)
4281 CHECK_ENTSIZE (section
, i
, Rela
);
4282 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4283 || do_debug_lines
|| do_debug_lines_decoded
|| do_debug_pubnames
4284 || do_debug_aranges
|| do_debug_frames
|| do_debug_macinfo
4285 || do_debug_str
|| do_debug_loc
|| do_debug_ranges
)
4286 && (const_strneq (name
, ".debug_")
4287 || const_strneq (name
, ".zdebug_")))
4290 name
+= sizeof (".zdebug_") - 1;
4292 name
+= sizeof (".debug_") - 1;
4295 || (do_debug_info
&& streq (name
, "info"))
4296 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4297 || ((do_debug_lines
|| do_debug_lines_decoded
)
4298 && streq (name
, "line"))
4299 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4300 || (do_debug_aranges
&& streq (name
, "aranges"))
4301 || (do_debug_ranges
&& streq (name
, "ranges"))
4302 || (do_debug_frames
&& streq (name
, "frame"))
4303 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4304 || (do_debug_str
&& streq (name
, "str"))
4305 || (do_debug_loc
&& streq (name
, "loc"))
4307 request_dump_bynumber (i
, DEBUG_DUMP
);
4309 /* Linkonce section to be combined with .debug_info at link time. */
4310 else if ((do_debugging
|| do_debug_info
)
4311 && const_strneq (name
, ".gnu.linkonce.wi."))
4312 request_dump_bynumber (i
, DEBUG_DUMP
);
4313 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4314 request_dump_bynumber (i
, DEBUG_DUMP
);
4320 if (elf_header
.e_shnum
> 1)
4321 printf (_("\nSection Headers:\n"));
4323 printf (_("\nSection Header:\n"));
4327 if (do_section_details
)
4329 printf (_(" [Nr] Name\n"));
4330 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4334 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4338 if (do_section_details
)
4340 printf (_(" [Nr] Name\n"));
4341 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4345 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4349 if (do_section_details
)
4351 printf (_(" [Nr] Name\n"));
4352 printf (_(" Type Address Offset Link\n"));
4353 printf (_(" Size EntSize Info Align\n"));
4357 printf (_(" [Nr] Name Type Address Offset\n"));
4358 printf (_(" Size EntSize Flags Link Info Align\n"));
4362 if (do_section_details
)
4363 printf (_(" Flags\n"));
4365 for (i
= 0, section
= section_headers
;
4366 i
< elf_header
.e_shnum
;
4369 if (do_section_details
)
4371 printf (" [%2u] %s\n",
4373 SECTION_NAME (section
));
4374 if (is_32bit_elf
|| do_wide
)
4375 printf (" %-15.15s ",
4376 get_section_type_name (section
->sh_type
));
4379 printf ((do_wide
? " [%2u] %-17s %-15s "
4380 : " [%2u] %-17.17s %-15.15s "),
4382 SECTION_NAME (section
),
4383 get_section_type_name (section
->sh_type
));
4387 print_vma (section
->sh_addr
, LONG_HEX
);
4389 printf ( " %6.6lx %6.6lx %2.2lx",
4390 (unsigned long) section
->sh_offset
,
4391 (unsigned long) section
->sh_size
,
4392 (unsigned long) section
->sh_entsize
);
4394 if (do_section_details
)
4395 fputs (" ", stdout
);
4397 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4399 printf ("%2u %3u %2lu\n",
4402 (unsigned long) section
->sh_addralign
);
4406 print_vma (section
->sh_addr
, LONG_HEX
);
4408 if ((long) section
->sh_offset
== section
->sh_offset
)
4409 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4413 print_vma (section
->sh_offset
, LONG_HEX
);
4416 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4417 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4421 print_vma (section
->sh_size
, LONG_HEX
);
4424 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4425 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4429 print_vma (section
->sh_entsize
, LONG_HEX
);
4432 if (do_section_details
)
4433 fputs (" ", stdout
);
4435 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4437 printf ("%2u %3u ", section
->sh_link
, section
->sh_info
);
4439 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4440 printf ("%2lu\n", (unsigned long) section
->sh_addralign
);
4443 print_vma (section
->sh_addralign
, DEC
);
4447 else if (do_section_details
)
4449 printf (" %-15.15s ",
4450 get_section_type_name (section
->sh_type
));
4451 print_vma (section
->sh_addr
, LONG_HEX
);
4452 if ((long) section
->sh_offset
== section
->sh_offset
)
4453 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4457 print_vma (section
->sh_offset
, LONG_HEX
);
4459 printf (" %u\n ", section
->sh_link
);
4460 print_vma (section
->sh_size
, LONG_HEX
);
4462 print_vma (section
->sh_entsize
, LONG_HEX
);
4464 printf (" %-16u %lu\n",
4466 (unsigned long) section
->sh_addralign
);
4471 print_vma (section
->sh_addr
, LONG_HEX
);
4472 if ((long) section
->sh_offset
== section
->sh_offset
)
4473 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4477 print_vma (section
->sh_offset
, LONG_HEX
);
4480 print_vma (section
->sh_size
, LONG_HEX
);
4482 print_vma (section
->sh_entsize
, LONG_HEX
);
4484 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4486 printf (" %2u %3u %lu\n",
4489 (unsigned long) section
->sh_addralign
);
4492 if (do_section_details
)
4493 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4496 if (!do_section_details
)
4497 printf (_("Key to Flags:\n\
4498 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4499 I (info), L (link order), G (group), x (unknown)\n\
4500 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4506 get_group_flags (unsigned int flags
)
4508 static char buff
[32];
4515 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4522 process_section_groups (FILE *file
)
4524 Elf_Internal_Shdr
*section
;
4526 struct group
*group
;
4527 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4528 Elf_Internal_Sym
*symtab
;
4532 /* Don't process section groups unless needed. */
4533 if (!do_unwind
&& !do_section_groups
)
4536 if (elf_header
.e_shnum
== 0)
4538 if (do_section_groups
)
4539 printf (_("\nThere are no sections in this file.\n"));
4544 if (section_headers
== NULL
)
4546 error (_("Section headers are not available!\n"));
4550 section_headers_groups
= calloc (elf_header
.e_shnum
,
4551 sizeof (struct group
*));
4553 if (section_headers_groups
== NULL
)
4555 error (_("Out of memory\n"));
4559 /* Scan the sections for the group section. */
4561 for (i
= 0, section
= section_headers
;
4562 i
< elf_header
.e_shnum
;
4564 if (section
->sh_type
== SHT_GROUP
)
4567 if (group_count
== 0)
4569 if (do_section_groups
)
4570 printf (_("\nThere are no section groups in this file.\n"));
4575 section_groups
= calloc (group_count
, sizeof (struct group
));
4577 if (section_groups
== NULL
)
4579 error (_("Out of memory\n"));
4588 for (i
= 0, section
= section_headers
, group
= section_groups
;
4589 i
< elf_header
.e_shnum
;
4592 if (section
->sh_type
== SHT_GROUP
)
4594 char *name
= SECTION_NAME (section
);
4596 unsigned char *start
, *indices
;
4597 unsigned int entry
, j
, size
;
4598 Elf_Internal_Shdr
*sec
;
4599 Elf_Internal_Sym
*sym
;
4601 /* Get the symbol table. */
4602 if (section
->sh_link
>= elf_header
.e_shnum
4603 || ((sec
= section_headers
+ section
->sh_link
)->sh_type
4606 error (_("Bad sh_link in group section `%s'\n"), name
);
4610 if (symtab_sec
!= sec
)
4615 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4618 sym
= symtab
+ section
->sh_info
;
4620 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4622 if (sym
->st_shndx
== 0
4623 || sym
->st_shndx
>= elf_header
.e_shnum
)
4625 error (_("Bad sh_info in group section `%s'\n"), name
);
4629 group_name
= SECTION_NAME (section_headers
+ sym
->st_shndx
);
4638 /* Get the string table. */
4639 if (symtab_sec
->sh_link
>= elf_header
.e_shnum
)
4648 != (sec
= section_headers
+ symtab_sec
->sh_link
))
4653 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4654 1, strtab_sec
->sh_size
,
4656 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4658 group_name
= sym
->st_name
< strtab_size
4659 ? strtab
+ sym
->st_name
: "<corrupt>";
4662 start
= get_data (NULL
, file
, section
->sh_offset
,
4663 1, section
->sh_size
, _("section data"));
4666 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4667 entry
= byte_get (indices
, 4);
4670 if (do_section_groups
)
4672 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4673 get_group_flags (entry
), i
, name
, group_name
, size
);
4675 printf (_(" [Index] Name\n"));
4678 group
->group_index
= i
;
4680 for (j
= 0; j
< size
; j
++)
4682 struct group_list
*g
;
4684 entry
= byte_get (indices
, 4);
4687 if (entry
>= elf_header
.e_shnum
)
4689 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4690 entry
, i
, elf_header
.e_shnum
- 1);
4694 if (section_headers_groups
[entry
] != NULL
)
4698 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4700 section_headers_groups
[entry
]->group_index
);
4705 /* Intel C/C++ compiler may put section 0 in a
4706 section group. We just warn it the first time
4707 and ignore it afterwards. */
4708 static int warned
= 0;
4711 error (_("section 0 in group section [%5u]\n"),
4712 section_headers_groups
[entry
]->group_index
);
4718 section_headers_groups
[entry
] = group
;
4720 if (do_section_groups
)
4722 sec
= section_headers
+ entry
;
4723 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4726 g
= xmalloc (sizeof (struct group_list
));
4727 g
->section_index
= entry
;
4728 g
->next
= group
->root
;
4752 } dynamic_relocations
[] =
4754 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4755 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4756 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4759 /* Process the reloc section. */
4762 process_relocs (FILE *file
)
4764 unsigned long rel_size
;
4765 unsigned long rel_offset
;
4771 if (do_using_dynamic
)
4775 int has_dynamic_reloc
;
4778 has_dynamic_reloc
= 0;
4780 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4782 is_rela
= dynamic_relocations
[i
].rela
;
4783 name
= dynamic_relocations
[i
].name
;
4784 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4785 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4787 has_dynamic_reloc
|= rel_size
;
4789 if (is_rela
== UNKNOWN
)
4791 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4792 switch (dynamic_info
[DT_PLTREL
])
4806 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4807 name
, rel_offset
, rel_size
);
4809 dump_relocations (file
,
4810 offset_from_vma (file
, rel_offset
, rel_size
),
4812 dynamic_symbols
, num_dynamic_syms
,
4813 dynamic_strings
, dynamic_strings_length
, is_rela
);
4817 if (! has_dynamic_reloc
)
4818 printf (_("\nThere are no dynamic relocations in this file.\n"));
4822 Elf_Internal_Shdr
*section
;
4826 for (i
= 0, section
= section_headers
;
4827 i
< elf_header
.e_shnum
;
4830 if ( section
->sh_type
!= SHT_RELA
4831 && section
->sh_type
!= SHT_REL
)
4834 rel_offset
= section
->sh_offset
;
4835 rel_size
= section
->sh_size
;
4839 Elf_Internal_Shdr
*strsec
;
4842 printf (_("\nRelocation section "));
4844 if (string_table
== NULL
)
4845 printf ("%d", section
->sh_name
);
4847 printf (_("'%s'"), SECTION_NAME (section
));
4849 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4850 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4852 is_rela
= section
->sh_type
== SHT_RELA
;
4854 if (section
->sh_link
!= 0
4855 && section
->sh_link
< elf_header
.e_shnum
)
4857 Elf_Internal_Shdr
*symsec
;
4858 Elf_Internal_Sym
*symtab
;
4859 unsigned long nsyms
;
4860 unsigned long strtablen
= 0;
4861 char *strtab
= NULL
;
4863 symsec
= section_headers
+ section
->sh_link
;
4864 if (symsec
->sh_type
!= SHT_SYMTAB
4865 && symsec
->sh_type
!= SHT_DYNSYM
)
4868 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4869 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4874 if (symsec
->sh_link
!= 0
4875 && symsec
->sh_link
< elf_header
.e_shnum
)
4877 strsec
= section_headers
+ symsec
->sh_link
;
4879 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4882 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4885 dump_relocations (file
, rel_offset
, rel_size
,
4886 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4892 dump_relocations (file
, rel_offset
, rel_size
,
4893 NULL
, 0, NULL
, 0, is_rela
);
4900 printf (_("\nThere are no relocations in this file.\n"));
4906 /* Process the unwind section. */
4908 #include "unwind-ia64.h"
4910 /* An absolute address consists of a section and an offset. If the
4911 section is NULL, the offset itself is the address, otherwise, the
4912 address equals to LOAD_ADDRESS(section) + offset. */
4916 unsigned short section
;
4920 #define ABSADDR(a) \
4922 ? section_headers [(a).section].sh_addr + (a).offset \
4925 struct ia64_unw_aux_info
4927 struct ia64_unw_table_entry
4929 struct absaddr start
;
4931 struct absaddr info
;
4933 *table
; /* Unwind table. */
4934 unsigned long table_len
; /* Length of unwind table. */
4935 unsigned char *info
; /* Unwind info. */
4936 unsigned long info_size
; /* Size of unwind info. */
4937 bfd_vma info_addr
; /* starting address of unwind info. */
4938 bfd_vma seg_base
; /* Starting address of segment. */
4939 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4940 unsigned long nsyms
; /* Number of symbols. */
4941 char *strtab
; /* The string table. */
4942 unsigned long strtab_size
; /* Size of string table. */
4946 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4947 unsigned long nsyms
,
4949 unsigned long strtab_size
,
4950 struct absaddr addr
,
4951 const char **symname
,
4954 bfd_vma dist
= 0x100000;
4955 Elf_Internal_Sym
*sym
, *best
= NULL
;
4958 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4960 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4961 && sym
->st_name
!= 0
4962 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4963 && addr
.offset
>= sym
->st_value
4964 && addr
.offset
- sym
->st_value
< dist
)
4967 dist
= addr
.offset
- sym
->st_value
;
4974 *symname
= (best
->st_name
>= strtab_size
4975 ? "<corrupt>" : strtab
+ best
->st_name
);
4980 *offset
= addr
.offset
;
4984 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4986 struct ia64_unw_table_entry
*tp
;
4989 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4993 const unsigned char *dp
;
4994 const unsigned char *head
;
4995 const char *procname
;
4997 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4998 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
5000 fputs ("\n<", stdout
);
5004 fputs (procname
, stdout
);
5007 printf ("+%lx", (unsigned long) offset
);
5010 fputs (">: [", stdout
);
5011 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5012 fputc ('-', stdout
);
5013 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5014 printf ("], info at +0x%lx\n",
5015 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
5017 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
5018 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
5020 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
5021 (unsigned) UNW_VER (stamp
),
5022 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
5023 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
5024 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
5025 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
5027 if (UNW_VER (stamp
) != 1)
5029 printf ("\tUnknown version.\n");
5034 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
5035 dp
= unw_decode (dp
, in_body
, & in_body
);
5040 slurp_ia64_unwind_table (FILE *file
,
5041 struct ia64_unw_aux_info
*aux
,
5042 Elf_Internal_Shdr
*sec
)
5044 unsigned long size
, nrelas
, i
;
5045 Elf_Internal_Phdr
*seg
;
5046 struct ia64_unw_table_entry
*tep
;
5047 Elf_Internal_Shdr
*relsec
;
5048 Elf_Internal_Rela
*rela
, *rp
;
5049 unsigned char *table
, *tp
;
5050 Elf_Internal_Sym
*sym
;
5051 const char *relname
;
5053 /* First, find the starting address of the segment that includes
5056 if (elf_header
.e_phnum
)
5058 if (! get_program_headers (file
))
5061 for (seg
= program_headers
;
5062 seg
< program_headers
+ elf_header
.e_phnum
;
5065 if (seg
->p_type
!= PT_LOAD
)
5068 if (sec
->sh_addr
>= seg
->p_vaddr
5069 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5071 aux
->seg_base
= seg
->p_vaddr
;
5077 /* Second, build the unwind table from the contents of the unwind section: */
5078 size
= sec
->sh_size
;
5079 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5083 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
5085 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
5087 tep
->start
.section
= SHN_UNDEF
;
5088 tep
->end
.section
= SHN_UNDEF
;
5089 tep
->info
.section
= SHN_UNDEF
;
5092 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5093 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5094 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
5098 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
5099 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
5100 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
5102 tep
->start
.offset
+= aux
->seg_base
;
5103 tep
->end
.offset
+= aux
->seg_base
;
5104 tep
->info
.offset
+= aux
->seg_base
;
5108 /* Third, apply any relocations to the unwind table: */
5109 for (relsec
= section_headers
;
5110 relsec
< section_headers
+ elf_header
.e_shnum
;
5113 if (relsec
->sh_type
!= SHT_RELA
5114 || relsec
->sh_info
>= elf_header
.e_shnum
5115 || section_headers
+ relsec
->sh_info
!= sec
)
5118 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5122 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5124 relname
= elf_ia64_reloc_type (get_reloc_type (rp
->r_info
));
5125 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5127 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5129 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5133 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5135 switch (rp
->r_offset
/eh_addr_size
% 3)
5138 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5139 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5142 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5143 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5146 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5147 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5157 aux
->table_len
= size
/ (3 * eh_addr_size
);
5162 ia64_process_unwind (FILE *file
)
5164 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
5165 unsigned long i
, unwcount
= 0, unwstart
= 0;
5166 struct ia64_unw_aux_info aux
;
5168 memset (& aux
, 0, sizeof (aux
));
5170 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5172 if (sec
->sh_type
== SHT_SYMTAB
5173 && sec
->sh_link
< elf_header
.e_shnum
)
5175 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5176 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5178 strsec
= section_headers
+ sec
->sh_link
;
5179 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5180 1, strsec
->sh_size
, _("string table"));
5181 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5183 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5188 printf (_("\nThere are no unwind sections in this file.\n"));
5190 while (unwcount
-- > 0)
5195 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5196 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5197 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5204 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5206 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5208 /* We need to find which section group it is in. */
5209 struct group_list
*g
= section_headers_groups
[i
]->root
;
5211 for (; g
!= NULL
; g
= g
->next
)
5213 sec
= section_headers
+ g
->section_index
;
5215 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5220 i
= elf_header
.e_shnum
;
5222 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5224 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5225 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5226 suffix
= SECTION_NAME (unwsec
) + len
;
5227 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5229 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5230 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5235 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5236 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5237 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5238 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5240 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5241 suffix
= SECTION_NAME (unwsec
) + len
;
5242 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5244 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5245 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5249 if (i
== elf_header
.e_shnum
)
5251 printf (_("\nCould not find unwind info section for "));
5253 if (string_table
== NULL
)
5254 printf ("%d", unwsec
->sh_name
);
5256 printf (_("'%s'"), SECTION_NAME (unwsec
));
5260 aux
.info_size
= sec
->sh_size
;
5261 aux
.info_addr
= sec
->sh_addr
;
5262 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5265 printf (_("\nUnwind section "));
5267 if (string_table
== NULL
)
5268 printf ("%d", unwsec
->sh_name
);
5270 printf (_("'%s'"), SECTION_NAME (unwsec
));
5272 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5273 (unsigned long) unwsec
->sh_offset
,
5274 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5276 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5278 if (aux
.table_len
> 0)
5279 dump_ia64_unwind (& aux
);
5282 free ((char *) aux
.table
);
5284 free ((char *) aux
.info
);
5293 free ((char *) aux
.strtab
);
5298 struct hppa_unw_aux_info
5300 struct hppa_unw_table_entry
5302 struct absaddr start
;
5304 unsigned int Cannot_unwind
:1; /* 0 */
5305 unsigned int Millicode
:1; /* 1 */
5306 unsigned int Millicode_save_sr0
:1; /* 2 */
5307 unsigned int Region_description
:2; /* 3..4 */
5308 unsigned int reserved1
:1; /* 5 */
5309 unsigned int Entry_SR
:1; /* 6 */
5310 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5311 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5312 unsigned int Args_stored
:1; /* 16 */
5313 unsigned int Variable_Frame
:1; /* 17 */
5314 unsigned int Separate_Package_Body
:1; /* 18 */
5315 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5316 unsigned int Stack_Overflow_Check
:1; /* 20 */
5317 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5318 unsigned int Ada_Region
:1; /* 22 */
5319 unsigned int cxx_info
:1; /* 23 */
5320 unsigned int cxx_try_catch
:1; /* 24 */
5321 unsigned int sched_entry_seq
:1; /* 25 */
5322 unsigned int reserved2
:1; /* 26 */
5323 unsigned int Save_SP
:1; /* 27 */
5324 unsigned int Save_RP
:1; /* 28 */
5325 unsigned int Save_MRP_in_frame
:1; /* 29 */
5326 unsigned int extn_ptr_defined
:1; /* 30 */
5327 unsigned int Cleanup_defined
:1; /* 31 */
5329 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5330 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5331 unsigned int Large_frame
:1; /* 2 */
5332 unsigned int Pseudo_SP_Set
:1; /* 3 */
5333 unsigned int reserved4
:1; /* 4 */
5334 unsigned int Total_frame_size
:27; /* 5..31 */
5336 *table
; /* Unwind table. */
5337 unsigned long table_len
; /* Length of unwind table. */
5338 bfd_vma seg_base
; /* Starting address of segment. */
5339 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5340 unsigned long nsyms
; /* Number of symbols. */
5341 char *strtab
; /* The string table. */
5342 unsigned long strtab_size
; /* Size of string table. */
5346 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5348 struct hppa_unw_table_entry
*tp
;
5350 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5353 const char *procname
;
5355 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5356 aux
->strtab_size
, tp
->start
, &procname
,
5359 fputs ("\n<", stdout
);
5363 fputs (procname
, stdout
);
5366 printf ("+%lx", (unsigned long) offset
);
5369 fputs (">: [", stdout
);
5370 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5371 fputc ('-', stdout
);
5372 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5375 #define PF(_m) if (tp->_m) printf (#_m " ");
5376 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5379 PF(Millicode_save_sr0
);
5380 /* PV(Region_description); */
5386 PF(Separate_Package_Body
);
5387 PF(Frame_Extension_Millicode
);
5388 PF(Stack_Overflow_Check
);
5389 PF(Two_Instruction_SP_Increment
);
5393 PF(sched_entry_seq
);
5396 PF(Save_MRP_in_frame
);
5397 PF(extn_ptr_defined
);
5398 PF(Cleanup_defined
);
5399 PF(MPE_XL_interrupt_marker
);
5400 PF(HP_UX_interrupt_marker
);
5403 PV(Total_frame_size
);
5412 slurp_hppa_unwind_table (FILE *file
,
5413 struct hppa_unw_aux_info
*aux
,
5414 Elf_Internal_Shdr
*sec
)
5416 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5417 Elf_Internal_Phdr
*seg
;
5418 struct hppa_unw_table_entry
*tep
;
5419 Elf_Internal_Shdr
*relsec
;
5420 Elf_Internal_Rela
*rela
, *rp
;
5421 unsigned char *table
, *tp
;
5422 Elf_Internal_Sym
*sym
;
5423 const char *relname
;
5425 /* First, find the starting address of the segment that includes
5428 if (elf_header
.e_phnum
)
5430 if (! get_program_headers (file
))
5433 for (seg
= program_headers
;
5434 seg
< program_headers
+ elf_header
.e_phnum
;
5437 if (seg
->p_type
!= PT_LOAD
)
5440 if (sec
->sh_addr
>= seg
->p_vaddr
5441 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5443 aux
->seg_base
= seg
->p_vaddr
;
5449 /* Second, build the unwind table from the contents of the unwind
5451 size
= sec
->sh_size
;
5452 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5457 nentries
= size
/ unw_ent_size
;
5458 size
= unw_ent_size
* nentries
;
5460 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5462 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5464 unsigned int tmp1
, tmp2
;
5466 tep
->start
.section
= SHN_UNDEF
;
5467 tep
->end
.section
= SHN_UNDEF
;
5469 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5470 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5471 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5472 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5474 tep
->start
.offset
+= aux
->seg_base
;
5475 tep
->end
.offset
+= aux
->seg_base
;
5477 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5478 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5479 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5480 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5481 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5482 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5483 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5484 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5485 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5486 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5487 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5488 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5489 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5490 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5491 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5492 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5493 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5494 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5495 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5496 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5497 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5498 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5499 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5500 tep
->Cleanup_defined
= tmp1
& 0x1;
5502 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5503 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5504 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5505 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5506 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5507 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5511 /* Third, apply any relocations to the unwind table. */
5512 for (relsec
= section_headers
;
5513 relsec
< section_headers
+ elf_header
.e_shnum
;
5516 if (relsec
->sh_type
!= SHT_RELA
5517 || relsec
->sh_info
>= elf_header
.e_shnum
5518 || section_headers
+ relsec
->sh_info
!= sec
)
5521 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5525 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5527 relname
= elf_hppa_reloc_type (get_reloc_type (rp
->r_info
));
5528 sym
= aux
->symtab
+ get_reloc_symindex (rp
->r_info
);
5530 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5531 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5533 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5537 i
= rp
->r_offset
/ unw_ent_size
;
5539 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5542 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5543 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5546 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5547 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5557 aux
->table_len
= nentries
;
5563 hppa_process_unwind (FILE *file
)
5565 struct hppa_unw_aux_info aux
;
5566 Elf_Internal_Shdr
*unwsec
= NULL
;
5567 Elf_Internal_Shdr
*strsec
;
5568 Elf_Internal_Shdr
*sec
;
5571 memset (& aux
, 0, sizeof (aux
));
5573 if (string_table
== NULL
)
5576 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5578 if (sec
->sh_type
== SHT_SYMTAB
5579 && sec
->sh_link
< elf_header
.e_shnum
)
5581 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5582 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5584 strsec
= section_headers
+ sec
->sh_link
;
5585 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5586 1, strsec
->sh_size
, _("string table"));
5587 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5589 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5594 printf (_("\nThere are no unwind sections in this file.\n"));
5596 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5598 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5600 printf (_("\nUnwind section "));
5601 printf (_("'%s'"), SECTION_NAME (sec
));
5603 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5604 (unsigned long) sec
->sh_offset
,
5605 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5607 slurp_hppa_unwind_table (file
, &aux
, sec
);
5608 if (aux
.table_len
> 0)
5609 dump_hppa_unwind (&aux
);
5612 free ((char *) aux
.table
);
5620 free ((char *) aux
.strtab
);
5626 process_unwind (FILE *file
)
5628 struct unwind_handler
{
5630 int (*handler
)(FILE *file
);
5632 { EM_IA_64
, ia64_process_unwind
},
5633 { EM_PARISC
, hppa_process_unwind
},
5641 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5642 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5643 return handlers
[i
].handler (file
);
5645 printf (_("\nThere are no unwind sections in this file.\n"));
5650 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5652 switch (entry
->d_tag
)
5655 if (entry
->d_un
.d_val
== 0)
5659 static const char * opts
[] =
5661 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5662 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5663 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5664 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5669 for (cnt
= 0; cnt
< ARRAY_SIZE (opts
); ++cnt
)
5670 if (entry
->d_un
.d_val
& (1 << cnt
))
5672 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5679 case DT_MIPS_IVERSION
:
5680 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5681 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5683 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5686 case DT_MIPS_TIME_STAMP
:
5691 time_t time
= entry
->d_un
.d_val
;
5692 tmp
= gmtime (&time
);
5693 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5694 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5695 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5696 printf ("Time Stamp: %s\n", timebuf
);
5700 case DT_MIPS_RLD_VERSION
:
5701 case DT_MIPS_LOCAL_GOTNO
:
5702 case DT_MIPS_CONFLICTNO
:
5703 case DT_MIPS_LIBLISTNO
:
5704 case DT_MIPS_SYMTABNO
:
5705 case DT_MIPS_UNREFEXTNO
:
5706 case DT_MIPS_HIPAGENO
:
5707 case DT_MIPS_DELTA_CLASS_NO
:
5708 case DT_MIPS_DELTA_INSTANCE_NO
:
5709 case DT_MIPS_DELTA_RELOC_NO
:
5710 case DT_MIPS_DELTA_SYM_NO
:
5711 case DT_MIPS_DELTA_CLASSSYM_NO
:
5712 case DT_MIPS_COMPACT_SIZE
:
5713 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5717 printf ("%#lx\n", (unsigned long) entry
->d_un
.d_ptr
);
5723 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5725 switch (entry
->d_tag
)
5727 case DT_HP_DLD_FLAGS
:
5736 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5737 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5738 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5739 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5740 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5741 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5742 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5743 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5744 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5745 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5746 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5747 { DT_HP_GST
, "HP_GST" },
5748 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5749 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5750 { DT_HP_NODELETE
, "HP_NODELETE" },
5751 { DT_HP_GROUP
, "HP_GROUP" },
5752 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5756 bfd_vma val
= entry
->d_un
.d_val
;
5758 for (cnt
= 0; cnt
< ARRAY_SIZE (flags
); ++cnt
)
5759 if (val
& flags
[cnt
].bit
)
5763 fputs (flags
[cnt
].str
, stdout
);
5765 val
^= flags
[cnt
].bit
;
5768 if (val
!= 0 || first
)
5772 print_vma (val
, HEX
);
5778 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5785 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5787 switch (entry
->d_tag
)
5789 case DT_IA_64_PLT_RESERVE
:
5790 /* First 3 slots reserved. */
5791 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5793 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5797 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5804 get_32bit_dynamic_section (FILE *file
)
5806 Elf32_External_Dyn
*edyn
, *ext
;
5807 Elf_Internal_Dyn
*entry
;
5809 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5810 _("dynamic section"));
5814 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5815 might not have the luxury of section headers. Look for the DT_NULL
5816 terminator to determine the number of entries. */
5817 for (ext
= edyn
, dynamic_nent
= 0;
5818 (char *) ext
< (char *) edyn
+ dynamic_size
;
5822 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5826 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5827 if (dynamic_section
== NULL
)
5829 error (_("Out of memory\n"));
5834 for (ext
= edyn
, entry
= dynamic_section
;
5835 entry
< dynamic_section
+ dynamic_nent
;
5838 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5839 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5848 get_64bit_dynamic_section (FILE *file
)
5850 Elf64_External_Dyn
*edyn
, *ext
;
5851 Elf_Internal_Dyn
*entry
;
5853 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5854 _("dynamic section"));
5858 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5859 might not have the luxury of section headers. Look for the DT_NULL
5860 terminator to determine the number of entries. */
5861 for (ext
= edyn
, dynamic_nent
= 0;
5862 (char *) ext
< (char *) edyn
+ dynamic_size
;
5866 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5870 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5871 if (dynamic_section
== NULL
)
5873 error (_("Out of memory\n"));
5878 for (ext
= edyn
, entry
= dynamic_section
;
5879 entry
< dynamic_section
+ dynamic_nent
;
5882 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5883 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5892 print_dynamic_flags (bfd_vma flags
)
5900 flag
= flags
& - flags
;
5910 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5911 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5912 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5913 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5914 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5915 default: fputs ("unknown", stdout
); break;
5921 /* Parse and display the contents of the dynamic section. */
5924 process_dynamic_section (FILE *file
)
5926 Elf_Internal_Dyn
*entry
;
5928 if (dynamic_size
== 0)
5931 printf (_("\nThere is no dynamic section in this file.\n"));
5938 if (! get_32bit_dynamic_section (file
))
5941 else if (! get_64bit_dynamic_section (file
))
5944 /* Find the appropriate symbol table. */
5945 if (dynamic_symbols
== NULL
)
5947 for (entry
= dynamic_section
;
5948 entry
< dynamic_section
+ dynamic_nent
;
5951 Elf_Internal_Shdr section
;
5953 if (entry
->d_tag
!= DT_SYMTAB
)
5956 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5958 /* Since we do not know how big the symbol table is,
5959 we default to reading in the entire file (!) and
5960 processing that. This is overkill, I know, but it
5962 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5964 if (archive_file_offset
!= 0)
5965 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5968 if (fseek (file
, 0, SEEK_END
))
5969 error (_("Unable to seek to end of file!\n"));
5971 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5975 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5977 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5979 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5980 if (num_dynamic_syms
< 1)
5982 error (_("Unable to determine the number of symbols to load\n"));
5986 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5990 /* Similarly find a string table. */
5991 if (dynamic_strings
== NULL
)
5993 for (entry
= dynamic_section
;
5994 entry
< dynamic_section
+ dynamic_nent
;
5997 unsigned long offset
;
6000 if (entry
->d_tag
!= DT_STRTAB
)
6003 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
6005 /* Since we do not know how big the string table is,
6006 we default to reading in the entire file (!) and
6007 processing that. This is overkill, I know, but it
6010 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
6012 if (archive_file_offset
!= 0)
6013 str_tab_len
= archive_file_size
- offset
;
6016 if (fseek (file
, 0, SEEK_END
))
6017 error (_("Unable to seek to end of file\n"));
6018 str_tab_len
= ftell (file
) - offset
;
6021 if (str_tab_len
< 1)
6024 (_("Unable to determine the length of the dynamic string table\n"));
6028 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
6029 _("dynamic string table"));
6030 dynamic_strings_length
= str_tab_len
;
6035 /* And find the syminfo section if available. */
6036 if (dynamic_syminfo
== NULL
)
6038 unsigned long syminsz
= 0;
6040 for (entry
= dynamic_section
;
6041 entry
< dynamic_section
+ dynamic_nent
;
6044 if (entry
->d_tag
== DT_SYMINENT
)
6046 /* Note: these braces are necessary to avoid a syntax
6047 error from the SunOS4 C compiler. */
6048 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
6050 else if (entry
->d_tag
== DT_SYMINSZ
)
6051 syminsz
= entry
->d_un
.d_val
;
6052 else if (entry
->d_tag
== DT_SYMINFO
)
6053 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
6057 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
6059 Elf_External_Syminfo
*extsyminfo
, *extsym
;
6060 Elf_Internal_Syminfo
*syminfo
;
6062 /* There is a syminfo section. Read the data. */
6063 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
6064 syminsz
, _("symbol information"));
6068 dynamic_syminfo
= malloc (syminsz
);
6069 if (dynamic_syminfo
== NULL
)
6071 error (_("Out of memory\n"));
6075 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
6076 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
6077 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
6078 ++syminfo
, ++extsym
)
6080 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
6081 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
6088 if (do_dynamic
&& dynamic_addr
)
6089 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
6090 dynamic_addr
, dynamic_nent
);
6092 printf (_(" Tag Type Name/Value\n"));
6094 for (entry
= dynamic_section
;
6095 entry
< dynamic_section
+ dynamic_nent
;
6103 print_vma (entry
->d_tag
, FULL_HEX
);
6104 dtype
= get_dynamic_type (entry
->d_tag
);
6105 printf (" (%s)%*s", dtype
,
6106 ((is_32bit_elf
? 27 : 19)
6107 - (int) strlen (dtype
)),
6111 switch (entry
->d_tag
)
6115 print_dynamic_flags (entry
->d_un
.d_val
);
6125 switch (entry
->d_tag
)
6128 printf (_("Auxiliary library"));
6132 printf (_("Filter library"));
6136 printf (_("Configuration file"));
6140 printf (_("Dependency audit library"));
6144 printf (_("Audit library"));
6148 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6149 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6153 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6162 printf (_("Flags:"));
6164 if (entry
->d_un
.d_val
== 0)
6165 printf (_(" None\n"));
6168 unsigned long int val
= entry
->d_un
.d_val
;
6170 if (val
& DTF_1_PARINIT
)
6172 printf (" PARINIT");
6173 val
^= DTF_1_PARINIT
;
6175 if (val
& DTF_1_CONFEXP
)
6177 printf (" CONFEXP");
6178 val
^= DTF_1_CONFEXP
;
6181 printf (" %lx", val
);
6190 printf (_("Flags:"));
6192 if (entry
->d_un
.d_val
== 0)
6193 printf (_(" None\n"));
6196 unsigned long int val
= entry
->d_un
.d_val
;
6198 if (val
& DF_P1_LAZYLOAD
)
6200 printf (" LAZYLOAD");
6201 val
^= DF_P1_LAZYLOAD
;
6203 if (val
& DF_P1_GROUPPERM
)
6205 printf (" GROUPPERM");
6206 val
^= DF_P1_GROUPPERM
;
6209 printf (" %lx", val
);
6218 printf (_("Flags:"));
6219 if (entry
->d_un
.d_val
== 0)
6220 printf (_(" None\n"));
6223 unsigned long int val
= entry
->d_un
.d_val
;
6230 if (val
& DF_1_GLOBAL
)
6235 if (val
& DF_1_GROUP
)
6240 if (val
& DF_1_NODELETE
)
6242 printf (" NODELETE");
6243 val
^= DF_1_NODELETE
;
6245 if (val
& DF_1_LOADFLTR
)
6247 printf (" LOADFLTR");
6248 val
^= DF_1_LOADFLTR
;
6250 if (val
& DF_1_INITFIRST
)
6252 printf (" INITFIRST");
6253 val
^= DF_1_INITFIRST
;
6255 if (val
& DF_1_NOOPEN
)
6260 if (val
& DF_1_ORIGIN
)
6265 if (val
& DF_1_DIRECT
)
6270 if (val
& DF_1_TRANS
)
6275 if (val
& DF_1_INTERPOSE
)
6277 printf (" INTERPOSE");
6278 val
^= DF_1_INTERPOSE
;
6280 if (val
& DF_1_NODEFLIB
)
6282 printf (" NODEFLIB");
6283 val
^= DF_1_NODEFLIB
;
6285 if (val
& DF_1_NODUMP
)
6290 if (val
& DF_1_CONLFAT
)
6292 printf (" CONLFAT");
6293 val
^= DF_1_CONLFAT
;
6296 printf (" %lx", val
);
6303 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6305 puts (get_dynamic_type (entry
->d_un
.d_val
));
6325 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6331 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6332 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6338 switch (entry
->d_tag
)
6341 printf (_("Shared library: [%s]"), name
);
6343 if (streq (name
, program_interpreter
))
6344 printf (_(" program interpreter"));
6348 printf (_("Library soname: [%s]"), name
);
6352 printf (_("Library rpath: [%s]"), name
);
6356 printf (_("Library runpath: [%s]"), name
);
6360 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6365 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6378 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6382 case DT_INIT_ARRAYSZ
:
6383 case DT_FINI_ARRAYSZ
:
6384 case DT_GNU_CONFLICTSZ
:
6385 case DT_GNU_LIBLISTSZ
:
6388 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6389 printf (" (bytes)\n");
6399 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6412 if (entry
->d_tag
== DT_USED
6413 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6415 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6419 printf (_("Not needed object: [%s]\n"), name
);
6424 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6430 /* The value of this entry is ignored. */
6435 case DT_GNU_PRELINKED
:
6439 time_t time
= entry
->d_un
.d_val
;
6441 tmp
= gmtime (&time
);
6442 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6443 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6444 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6450 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6453 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6459 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6460 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6465 switch (elf_header
.e_machine
)
6468 case EM_MIPS_RS3_LE
:
6469 dynamic_section_mips_val (entry
);
6472 dynamic_section_parisc_val (entry
);
6475 dynamic_section_ia64_val (entry
);
6478 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6490 get_ver_flags (unsigned int flags
)
6492 static char buff
[32];
6499 if (flags
& VER_FLG_BASE
)
6500 strcat (buff
, "BASE ");
6502 if (flags
& VER_FLG_WEAK
)
6504 if (flags
& VER_FLG_BASE
)
6505 strcat (buff
, "| ");
6507 strcat (buff
, "WEAK ");
6510 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6511 strcat (buff
, "| <unknown>");
6516 /* Display the contents of the version sections. */
6518 process_version_sections (FILE *file
)
6520 Elf_Internal_Shdr
*section
;
6527 for (i
= 0, section
= section_headers
;
6528 i
< elf_header
.e_shnum
;
6531 switch (section
->sh_type
)
6533 case SHT_GNU_verdef
:
6535 Elf_External_Verdef
*edefs
;
6543 (_("\nVersion definition section '%s' contains %u entries:\n"),
6544 SECTION_NAME (section
), section
->sh_info
);
6546 printf (_(" Addr: 0x"));
6547 printf_vma (section
->sh_addr
);
6548 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6549 (unsigned long) section
->sh_offset
, section
->sh_link
,
6550 section
->sh_link
< elf_header
.e_shnum
6551 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6554 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6556 _("version definition section"));
6557 endbuf
= (char *) edefs
+ section
->sh_size
;
6561 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6564 Elf_External_Verdef
*edef
;
6565 Elf_Internal_Verdef ent
;
6566 Elf_External_Verdaux
*eaux
;
6567 Elf_Internal_Verdaux aux
;
6571 vstart
= ((char *) edefs
) + idx
;
6572 if (vstart
+ sizeof (*edef
) > endbuf
)
6575 edef
= (Elf_External_Verdef
*) vstart
;
6577 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6578 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6579 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6580 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6581 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6582 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6583 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6585 printf (_(" %#06x: Rev: %d Flags: %s"),
6586 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6588 printf (_(" Index: %d Cnt: %d "),
6589 ent
.vd_ndx
, ent
.vd_cnt
);
6591 vstart
+= ent
.vd_aux
;
6593 eaux
= (Elf_External_Verdaux
*) vstart
;
6595 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6596 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6598 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6599 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6601 printf (_("Name index: %ld\n"), aux
.vda_name
);
6603 isum
= idx
+ ent
.vd_aux
;
6605 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6607 isum
+= aux
.vda_next
;
6608 vstart
+= aux
.vda_next
;
6610 eaux
= (Elf_External_Verdaux
*) vstart
;
6611 if (vstart
+ sizeof (*eaux
) > endbuf
)
6614 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6615 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6617 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6618 printf (_(" %#06x: Parent %d: %s\n"),
6619 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6621 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6622 isum
, j
, aux
.vda_name
);
6625 printf (_(" Version def aux past end of section\n"));
6629 if (cnt
< section
->sh_info
)
6630 printf (_(" Version definition past end of section\n"));
6636 case SHT_GNU_verneed
:
6638 Elf_External_Verneed
*eneed
;
6645 printf (_("\nVersion needs section '%s' contains %u entries:\n"),
6646 SECTION_NAME (section
), section
->sh_info
);
6648 printf (_(" Addr: 0x"));
6649 printf_vma (section
->sh_addr
);
6650 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6651 (unsigned long) section
->sh_offset
, section
->sh_link
,
6652 section
->sh_link
< elf_header
.e_shnum
6653 ? SECTION_NAME (section_headers
+ section
->sh_link
)
6656 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6658 _("version need section"));
6659 endbuf
= (char *) eneed
+ section
->sh_size
;
6663 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6665 Elf_External_Verneed
*entry
;
6666 Elf_Internal_Verneed ent
;
6671 vstart
= ((char *) eneed
) + idx
;
6672 if (vstart
+ sizeof (*entry
) > endbuf
)
6675 entry
= (Elf_External_Verneed
*) vstart
;
6677 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6678 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6679 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6680 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6681 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6683 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6685 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6686 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6688 printf (_(" File: %lx"), ent
.vn_file
);
6690 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6692 vstart
+= ent
.vn_aux
;
6694 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6696 Elf_External_Vernaux
*eaux
;
6697 Elf_Internal_Vernaux aux
;
6699 if (vstart
+ sizeof (*eaux
) > endbuf
)
6701 eaux
= (Elf_External_Vernaux
*) vstart
;
6703 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6704 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6705 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6706 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6707 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6709 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6710 printf (_(" %#06x: Name: %s"),
6711 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6713 printf (_(" %#06x: Name index: %lx"),
6714 isum
, aux
.vna_name
);
6716 printf (_(" Flags: %s Version: %d\n"),
6717 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6719 isum
+= aux
.vna_next
;
6720 vstart
+= aux
.vna_next
;
6723 printf (_(" Version need aux past end of section\n"));
6727 if (cnt
< section
->sh_info
)
6728 printf (_(" Version need past end of section\n"));
6734 case SHT_GNU_versym
:
6736 Elf_Internal_Shdr
*link_section
;
6739 unsigned char *edata
;
6740 unsigned short *data
;
6742 Elf_Internal_Sym
*symbols
;
6743 Elf_Internal_Shdr
*string_sec
;
6746 if (section
->sh_link
>= elf_header
.e_shnum
)
6749 link_section
= section_headers
+ section
->sh_link
;
6750 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6752 if (link_section
->sh_link
>= elf_header
.e_shnum
)
6757 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6759 string_sec
= section_headers
+ link_section
->sh_link
;
6761 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6762 string_sec
->sh_size
, _("version string table"));
6766 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6767 SECTION_NAME (section
), total
);
6769 printf (_(" Addr: "));
6770 printf_vma (section
->sh_addr
);
6771 printf (_(" Offset: %#08lx Link: %u (%s)\n"),
6772 (unsigned long) section
->sh_offset
, section
->sh_link
,
6773 SECTION_NAME (link_section
));
6775 off
= offset_from_vma (file
,
6776 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6777 total
* sizeof (short));
6778 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6779 _("version symbol data"));
6786 data
= cmalloc (total
, sizeof (short));
6788 for (cnt
= total
; cnt
--;)
6789 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6794 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6797 int check_def
, check_need
;
6800 printf (" %03x:", cnt
);
6802 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6803 switch (data
[cnt
+ j
])
6806 fputs (_(" 0 (*local*) "), stdout
);
6810 fputs (_(" 1 (*global*) "), stdout
);
6814 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6815 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6819 if (symbols
[cnt
+ j
].st_shndx
>= elf_header
.e_shnum
6820 || section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
6823 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6830 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6832 Elf_Internal_Verneed ivn
;
6833 unsigned long offset
;
6835 offset
= offset_from_vma
6836 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6837 sizeof (Elf_External_Verneed
));
6841 Elf_Internal_Vernaux ivna
;
6842 Elf_External_Verneed evn
;
6843 Elf_External_Vernaux evna
;
6844 unsigned long a_off
;
6846 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6849 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6850 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6852 a_off
= offset
+ ivn
.vn_aux
;
6856 get_data (&evna
, file
, a_off
, sizeof (evna
),
6857 1, _("version need aux (2)"));
6859 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6860 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6862 a_off
+= ivna
.vna_next
;
6864 while (ivna
.vna_other
!= data
[cnt
+ j
]
6865 && ivna
.vna_next
!= 0);
6867 if (ivna
.vna_other
== data
[cnt
+ j
])
6869 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6871 if (ivna
.vna_name
>= string_sec
->sh_size
)
6872 name
= _("*invalid*");
6874 name
= strtab
+ ivna
.vna_name
;
6875 nn
+= printf ("(%s%-*s",
6877 12 - (int) strlen (name
),
6883 offset
+= ivn
.vn_next
;
6885 while (ivn
.vn_next
);
6888 if (check_def
&& data
[cnt
+ j
] != 0x8001
6889 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6891 Elf_Internal_Verdef ivd
;
6892 Elf_External_Verdef evd
;
6893 unsigned long offset
;
6895 offset
= offset_from_vma
6896 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6901 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6904 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6905 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6907 offset
+= ivd
.vd_next
;
6909 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6910 && ivd
.vd_next
!= 0);
6912 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6914 Elf_External_Verdaux evda
;
6915 Elf_Internal_Verdaux ivda
;
6917 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6919 get_data (&evda
, file
,
6920 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6922 _("version def aux"));
6924 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6926 if (ivda
.vda_name
>= string_sec
->sh_size
)
6927 name
= _("*invalid*");
6929 name
= strtab
+ ivda
.vda_name
;
6930 nn
+= printf ("(%s%-*s",
6932 12 - (int) strlen (name
),
6938 printf ("%*c", 18 - nn
, ' ');
6956 printf (_("\nNo version information found in this file.\n"));
6962 get_symbol_binding (unsigned int binding
)
6964 static char buff
[32];
6968 case STB_LOCAL
: return "LOCAL";
6969 case STB_GLOBAL
: return "GLOBAL";
6970 case STB_WEAK
: return "WEAK";
6972 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6973 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6975 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6976 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6978 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6984 get_symbol_type (unsigned int type
)
6986 static char buff
[32];
6990 case STT_NOTYPE
: return "NOTYPE";
6991 case STT_OBJECT
: return "OBJECT";
6992 case STT_FUNC
: return "FUNC";
6993 case STT_SECTION
: return "SECTION";
6994 case STT_FILE
: return "FILE";
6995 case STT_COMMON
: return "COMMON";
6996 case STT_TLS
: return "TLS";
6997 case STT_RELC
: return "RELC";
6998 case STT_SRELC
: return "SRELC";
7000 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
7002 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
7003 return "THUMB_FUNC";
7005 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
7008 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
7009 return "PARISC_MILLI";
7011 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
7013 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
7015 if (elf_header
.e_machine
== EM_PARISC
)
7017 if (type
== STT_HP_OPAQUE
)
7019 if (type
== STT_HP_STUB
)
7023 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
7026 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
7032 get_symbol_visibility (unsigned int visibility
)
7036 case STV_DEFAULT
: return "DEFAULT";
7037 case STV_INTERNAL
: return "INTERNAL";
7038 case STV_HIDDEN
: return "HIDDEN";
7039 case STV_PROTECTED
: return "PROTECTED";
7045 get_mips_symbol_other (unsigned int other
)
7049 case STO_OPTIONAL
: return "OPTIONAL";
7050 case STO_MIPS16
: return "MIPS16";
7051 case STO_MIPS_PLT
: return "MIPS PLT";
7052 case STO_MIPS_PIC
: return "MIPS PIC";
7053 default: return NULL
;
7058 get_symbol_other (unsigned int other
)
7060 const char * result
= NULL
;
7061 static char buff
[32];
7066 switch (elf_header
.e_machine
)
7069 result
= get_mips_symbol_other (other
);
7077 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
7082 get_symbol_index_type (unsigned int type
)
7084 static char buff
[32];
7088 case SHN_UNDEF
: return "UND";
7089 case SHN_ABS
: return "ABS";
7090 case SHN_COMMON
: return "COM";
7092 if (type
== SHN_IA_64_ANSI_COMMON
7093 && elf_header
.e_machine
== EM_IA_64
7094 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
7096 else if (elf_header
.e_machine
== EM_X86_64
7097 && type
== SHN_X86_64_LCOMMON
)
7099 else if (type
== SHN_MIPS_SCOMMON
7100 && elf_header
.e_machine
== EM_MIPS
)
7102 else if (type
== SHN_MIPS_SUNDEFINED
7103 && elf_header
.e_machine
== EM_MIPS
)
7105 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
7106 sprintf (buff
, "PRC[0x%04x]", type
& 0xffff);
7107 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
7108 sprintf (buff
, "OS [0x%04x]", type
& 0xffff);
7109 else if (type
>= SHN_LORESERVE
)
7110 sprintf (buff
, "RSV[0x%04x]", type
& 0xffff);
7112 sprintf (buff
, "%3d", type
);
7120 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
7122 unsigned char *e_data
;
7125 e_data
= cmalloc (number
, ent_size
);
7129 error (_("Out of memory\n"));
7133 if (fread (e_data
, ent_size
, number
, file
) != number
)
7135 error (_("Unable to read in dynamic data\n"));
7139 i_data
= cmalloc (number
, sizeof (*i_data
));
7143 error (_("Out of memory\n"));
7149 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7157 print_dynamic_symbol (bfd_vma si
, unsigned long hn
)
7159 Elf_Internal_Sym
*psym
;
7162 psym
= dynamic_symbols
+ si
;
7164 n
= print_vma (si
, DEC_5
);
7166 fputs (" " + n
, stdout
);
7167 printf (" %3lu: ", hn
);
7168 print_vma (psym
->st_value
, LONG_HEX
);
7170 print_vma (psym
->st_size
, DEC_5
);
7172 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7173 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7174 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7175 /* Check to see if any other bits in the st_other field are set.
7176 Note - displaying this information disrupts the layout of the
7177 table being generated, but for the moment this case is very
7179 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7180 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7181 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7182 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7183 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7185 printf (" <corrupt: %14ld>", psym
->st_name
);
7189 /* Dump the symbol table. */
7191 process_symbol_table (FILE *file
)
7193 Elf_Internal_Shdr
*section
;
7194 bfd_vma nbuckets
= 0;
7195 bfd_vma nchains
= 0;
7196 bfd_vma
*buckets
= NULL
;
7197 bfd_vma
*chains
= NULL
;
7198 bfd_vma ngnubuckets
= 0;
7199 bfd_vma
*gnubuckets
= NULL
;
7200 bfd_vma
*gnuchains
= NULL
;
7201 bfd_vma gnusymidx
= 0;
7203 if (! do_syms
&& !do_histogram
)
7206 if (dynamic_info
[DT_HASH
]
7208 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7210 unsigned char nb
[8];
7211 unsigned char nc
[8];
7212 int hash_ent_size
= 4;
7214 if ((elf_header
.e_machine
== EM_ALPHA
7215 || elf_header
.e_machine
== EM_S390
7216 || elf_header
.e_machine
== EM_S390_OLD
)
7217 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7221 (archive_file_offset
7222 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7223 sizeof nb
+ sizeof nc
)),
7226 error (_("Unable to seek to start of dynamic information\n"));
7230 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7232 error (_("Failed to read in number of buckets\n"));
7236 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7238 error (_("Failed to read in number of chains\n"));
7242 nbuckets
= byte_get (nb
, hash_ent_size
);
7243 nchains
= byte_get (nc
, hash_ent_size
);
7245 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7246 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7248 if (buckets
== NULL
|| chains
== NULL
)
7252 if (dynamic_info_DT_GNU_HASH
7254 || (do_using_dynamic
&& dynamic_strings
!= NULL
)))
7256 unsigned char nb
[16];
7257 bfd_vma i
, maxchain
= 0xffffffff, bitmaskwords
;
7258 bfd_vma buckets_vma
;
7261 (archive_file_offset
7262 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7266 error (_("Unable to seek to start of dynamic information\n"));
7270 if (fread (nb
, 16, 1, file
) != 1)
7272 error (_("Failed to read in number of buckets\n"));
7276 ngnubuckets
= byte_get (nb
, 4);
7277 gnusymidx
= byte_get (nb
+ 4, 4);
7278 bitmaskwords
= byte_get (nb
+ 8, 4);
7279 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7281 buckets_vma
+= bitmaskwords
* 4;
7283 buckets_vma
+= bitmaskwords
* 8;
7286 (archive_file_offset
7287 + offset_from_vma (file
, buckets_vma
, 4)),
7290 error (_("Unable to seek to start of dynamic information\n"));
7294 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7296 if (gnubuckets
== NULL
)
7299 for (i
= 0; i
< ngnubuckets
; i
++)
7300 if (gnubuckets
[i
] != 0)
7302 if (gnubuckets
[i
] < gnusymidx
)
7305 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7306 maxchain
= gnubuckets
[i
];
7309 if (maxchain
== 0xffffffff)
7312 maxchain
-= gnusymidx
;
7315 (archive_file_offset
7316 + offset_from_vma (file
, buckets_vma
7317 + 4 * (ngnubuckets
+ maxchain
), 4)),
7320 error (_("Unable to seek to start of dynamic information\n"));
7326 if (fread (nb
, 4, 1, file
) != 1)
7328 error (_("Failed to determine last chain length\n"));
7332 if (maxchain
+ 1 == 0)
7337 while ((byte_get (nb
, 4) & 1) == 0);
7340 (archive_file_offset
7341 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7344 error (_("Unable to seek to start of dynamic information\n"));
7348 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7350 if (gnuchains
== NULL
)
7354 if ((dynamic_info
[DT_HASH
] || dynamic_info_DT_GNU_HASH
)
7357 && dynamic_strings
!= NULL
)
7361 if (dynamic_info
[DT_HASH
])
7365 printf (_("\nSymbol table for image:\n"));
7367 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7369 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7371 for (hn
= 0; hn
< nbuckets
; hn
++)
7376 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7377 print_dynamic_symbol (si
, hn
);
7381 if (dynamic_info_DT_GNU_HASH
)
7383 printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
7385 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7387 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7389 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7390 if (gnubuckets
[hn
] != 0)
7392 bfd_vma si
= gnubuckets
[hn
];
7393 bfd_vma off
= si
- gnusymidx
;
7397 print_dynamic_symbol (si
, hn
);
7400 while ((gnuchains
[off
++] & 1) == 0);
7404 else if (do_syms
&& !do_using_dynamic
)
7408 for (i
= 0, section
= section_headers
;
7409 i
< elf_header
.e_shnum
;
7413 char *strtab
= NULL
;
7414 unsigned long int strtab_size
= 0;
7415 Elf_Internal_Sym
*symtab
;
7416 Elf_Internal_Sym
*psym
;
7419 if ( section
->sh_type
!= SHT_SYMTAB
7420 && section
->sh_type
!= SHT_DYNSYM
)
7423 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7424 SECTION_NAME (section
),
7425 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7427 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7429 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7431 symtab
= GET_ELF_SYMBOLS (file
, section
);
7435 if (section
->sh_link
== elf_header
.e_shstrndx
)
7437 strtab
= string_table
;
7438 strtab_size
= string_table_length
;
7440 else if (section
->sh_link
< elf_header
.e_shnum
)
7442 Elf_Internal_Shdr
*string_sec
;
7444 string_sec
= section_headers
+ section
->sh_link
;
7446 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7447 1, string_sec
->sh_size
, _("string table"));
7448 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7451 for (si
= 0, psym
= symtab
;
7452 si
< section
->sh_size
/ section
->sh_entsize
;
7455 printf ("%6d: ", si
);
7456 print_vma (psym
->st_value
, LONG_HEX
);
7458 print_vma (psym
->st_size
, DEC_5
);
7459 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7460 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7461 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7462 /* Check to see if any other bits in the st_other field are set.
7463 Note - displaying this information disrupts the layout of the
7464 table being generated, but for the moment this case is very rare. */
7465 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7466 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7467 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7468 print_symbol (25, psym
->st_name
< strtab_size
7469 ? strtab
+ psym
->st_name
: "<corrupt>");
7471 if (section
->sh_type
== SHT_DYNSYM
&&
7472 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7474 unsigned char data
[2];
7475 unsigned short vers_data
;
7476 unsigned long offset
;
7480 offset
= offset_from_vma
7481 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7482 sizeof data
+ si
* sizeof (vers_data
));
7484 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7485 sizeof (data
), 1, _("version data"));
7487 vers_data
= byte_get (data
, 2);
7489 is_nobits
= (psym
->st_shndx
< elf_header
.e_shnum
7490 && section_headers
[psym
->st_shndx
].sh_type
7493 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7495 if ((vers_data
& 0x8000) || vers_data
> 1)
7497 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7498 && (is_nobits
|| ! check_def
))
7500 Elf_External_Verneed evn
;
7501 Elf_Internal_Verneed ivn
;
7502 Elf_Internal_Vernaux ivna
;
7504 /* We must test both. */
7505 offset
= offset_from_vma
7506 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7511 unsigned long vna_off
;
7513 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7516 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7517 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7519 vna_off
= offset
+ ivn
.vn_aux
;
7523 Elf_External_Vernaux evna
;
7525 get_data (&evna
, file
, vna_off
,
7527 _("version need aux (3)"));
7529 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7530 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7531 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7533 vna_off
+= ivna
.vna_next
;
7535 while (ivna
.vna_other
!= vers_data
7536 && ivna
.vna_next
!= 0);
7538 if (ivna
.vna_other
== vers_data
)
7541 offset
+= ivn
.vn_next
;
7543 while (ivn
.vn_next
!= 0);
7545 if (ivna
.vna_other
== vers_data
)
7548 ivna
.vna_name
< strtab_size
7549 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7553 else if (! is_nobits
)
7554 error (_("bad dynamic symbol\n"));
7561 if (vers_data
!= 0x8001
7562 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7564 Elf_Internal_Verdef ivd
;
7565 Elf_Internal_Verdaux ivda
;
7566 Elf_External_Verdaux evda
;
7567 unsigned long offset
;
7569 offset
= offset_from_vma
7571 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7572 sizeof (Elf_External_Verdef
));
7576 Elf_External_Verdef evd
;
7578 get_data (&evd
, file
, offset
, sizeof (evd
),
7579 1, _("version def"));
7581 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7582 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7583 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7585 offset
+= ivd
.vd_next
;
7587 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7588 && ivd
.vd_next
!= 0);
7590 offset
-= ivd
.vd_next
;
7591 offset
+= ivd
.vd_aux
;
7593 get_data (&evda
, file
, offset
, sizeof (evda
),
7594 1, _("version def aux"));
7596 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7598 if (psym
->st_name
!= ivda
.vda_name
)
7599 printf ((vers_data
& 0x8000)
7601 ivda
.vda_name
< strtab_size
7602 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7612 if (strtab
!= string_table
)
7618 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7620 if (do_histogram
&& buckets
!= NULL
)
7622 unsigned long *lengths
;
7623 unsigned long *counts
;
7626 unsigned long maxlength
= 0;
7627 unsigned long nzero_counts
= 0;
7628 unsigned long nsyms
= 0;
7630 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7631 (unsigned long) nbuckets
);
7632 printf (_(" Length Number %% of total Coverage\n"));
7634 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7635 if (lengths
== NULL
)
7637 error (_("Out of memory\n"));
7640 for (hn
= 0; hn
< nbuckets
; ++hn
)
7642 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7645 if (maxlength
< ++lengths
[hn
])
7650 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7653 error (_("Out of memory\n"));
7657 for (hn
= 0; hn
< nbuckets
; ++hn
)
7658 ++counts
[lengths
[hn
]];
7663 printf (" 0 %-10lu (%5.1f%%)\n",
7664 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7665 for (i
= 1; i
<= maxlength
; ++i
)
7667 nzero_counts
+= counts
[i
] * i
;
7668 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7669 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7670 (nzero_counts
* 100.0) / nsyms
);
7678 if (buckets
!= NULL
)
7684 if (do_histogram
&& dynamic_info_DT_GNU_HASH
)
7686 unsigned long *lengths
;
7687 unsigned long *counts
;
7689 unsigned long maxlength
= 0;
7690 unsigned long nzero_counts
= 0;
7691 unsigned long nsyms
= 0;
7693 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7694 if (lengths
== NULL
)
7696 error (_("Out of memory\n"));
7700 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7701 (unsigned long) ngnubuckets
);
7702 printf (_(" Length Number %% of total Coverage\n"));
7704 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7705 if (gnubuckets
[hn
] != 0)
7707 bfd_vma off
, length
= 1;
7709 for (off
= gnubuckets
[hn
] - gnusymidx
;
7710 (gnuchains
[off
] & 1) == 0; ++off
)
7712 lengths
[hn
] = length
;
7713 if (length
> maxlength
)
7718 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7721 error (_("Out of memory\n"));
7725 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7726 ++counts
[lengths
[hn
]];
7728 if (ngnubuckets
> 0)
7731 printf (" 0 %-10lu (%5.1f%%)\n",
7732 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7733 for (j
= 1; j
<= maxlength
; ++j
)
7735 nzero_counts
+= counts
[j
] * j
;
7736 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7737 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7738 (nzero_counts
* 100.0) / nsyms
);
7752 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7756 if (dynamic_syminfo
== NULL
7758 /* No syminfo, this is ok. */
7761 /* There better should be a dynamic symbol section. */
7762 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7766 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7767 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7769 printf (_(" Num: Name BoundTo Flags\n"));
7770 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7772 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7774 printf ("%4d: ", i
);
7775 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7776 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7778 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7781 switch (dynamic_syminfo
[i
].si_boundto
)
7783 case SYMINFO_BT_SELF
:
7784 fputs ("SELF ", stdout
);
7786 case SYMINFO_BT_PARENT
:
7787 fputs ("PARENT ", stdout
);
7790 if (dynamic_syminfo
[i
].si_boundto
> 0
7791 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7792 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7794 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7798 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7802 if (flags
& SYMINFO_FLG_DIRECT
)
7804 if (flags
& SYMINFO_FLG_PASSTHRU
)
7805 printf (" PASSTHRU");
7806 if (flags
& SYMINFO_FLG_COPY
)
7808 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7809 printf (" LAZYLOAD");
7817 #ifdef SUPPORT_DISASSEMBLY
7819 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7821 printf (_("\nAssembly dump of section %s\n"),
7822 SECTION_NAME (section
));
7824 /* XXX -- to be done --- XXX */
7831 dump_section_as_strings (Elf_Internal_Shdr
*section
, FILE *file
)
7833 Elf_Internal_Shdr
*relsec
;
7834 bfd_size_type num_bytes
;
7839 char *name
= SECTION_NAME (section
);
7840 bfd_boolean some_strings_shown
;
7842 num_bytes
= section
->sh_size
;
7844 if (num_bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7846 printf (_("\nSection '%s' has no data to dump.\n"), name
);
7850 addr
= section
->sh_addr
;
7852 start
= get_data (NULL
, file
, section
->sh_offset
, 1, num_bytes
,
7857 printf (_("\nString dump of section '%s':\n"), name
);
7859 /* If the section being dumped has relocations against it the user might
7860 be expecting these relocations to have been applied. Check for this
7861 case and issue a warning message in order to avoid confusion.
7862 FIXME: Maybe we ought to have an option that dumps a section with
7864 for (relsec
= section_headers
;
7865 relsec
< section_headers
+ elf_header
.e_shnum
;
7868 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7869 || relsec
->sh_info
>= elf_header
.e_shnum
7870 || section_headers
+ relsec
->sh_info
!= section
7871 || relsec
->sh_size
== 0
7872 || relsec
->sh_link
>= elf_header
.e_shnum
)
7875 printf (_(" Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7880 end
= start
+ num_bytes
;
7881 some_strings_shown
= FALSE
;
7885 while (!ISPRINT (* data
))
7892 printf (" [%6tx] %s\n", data
- start
, data
);
7894 printf (" [%6Ix] %s\n", (size_t) (data
- start
), data
);
7896 data
+= strlen (data
);
7897 some_strings_shown
= TRUE
;
7901 if (! some_strings_shown
)
7902 printf (_(" No strings found in this section."));
7912 dump_section_as_bytes (Elf_Internal_Shdr
*section
, FILE *file
)
7914 Elf_Internal_Shdr
*relsec
;
7915 bfd_size_type bytes
;
7917 unsigned char *data
;
7918 unsigned char *start
;
7920 bytes
= section
->sh_size
;
7922 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7924 printf (_("\nSection '%s' has no data to dump.\n"),
7925 SECTION_NAME (section
));
7929 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7931 addr
= section
->sh_addr
;
7933 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7938 /* If the section being dumped has relocations against it the user might
7939 be expecting these relocations to have been applied. Check for this
7940 case and issue a warning message in order to avoid confusion.
7941 FIXME: Maybe we ought to have an option that dumps a section with
7943 for (relsec
= section_headers
;
7944 relsec
< section_headers
+ elf_header
.e_shnum
;
7947 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
7948 || relsec
->sh_info
>= elf_header
.e_shnum
7949 || section_headers
+ relsec
->sh_info
!= section
7950 || relsec
->sh_size
== 0
7951 || relsec
->sh_link
>= elf_header
.e_shnum
)
7954 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7966 lbytes
= (bytes
> 16 ? 16 : bytes
);
7968 printf (" 0x%8.8lx ", (unsigned long) addr
);
7970 for (j
= 0; j
< 16; j
++)
7973 printf ("%2.2x", data
[j
]);
7981 for (j
= 0; j
< lbytes
; j
++)
7984 if (k
>= ' ' && k
< 0x7f)
8003 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
8004 DWARF debug sections. This is a target specific test. Note - we do not
8005 go through the whole including-target-headers-multiple-times route, (as
8006 we have already done with <elf/h8.h>) because this would become very
8007 messy and even then this function would have to contain target specific
8008 information (the names of the relocs instead of their numeric values).
8009 FIXME: This is not the correct way to solve this problem. The proper way
8010 is to have target specific reloc sizing and typing functions created by
8011 the reloc-macros.h header, in the same way that it already creates the
8012 reloc naming functions. */
8015 is_32bit_abs_reloc (unsigned int reloc_type
)
8017 switch (elf_header
.e_machine
)
8021 return reloc_type
== 1; /* R_386_32. */
8023 return reloc_type
== 1; /* R_68K_32. */
8025 return reloc_type
== 1; /* R_860_32. */
8027 return reloc_type
== 1; /* XXX Is this right ? */
8029 return reloc_type
== 1; /* R_ARC_32. */
8031 return reloc_type
== 2; /* R_ARM_ABS32 */
8034 return reloc_type
== 1;
8036 return reloc_type
== 0x12; /* R_byte4_data. */
8038 return reloc_type
== 3; /* R_CRIS_32. */
8041 return reloc_type
== 3; /* R_CR16_NUM32. */
8043 return reloc_type
== 15; /* R_CRX_NUM32. */
8045 return reloc_type
== 1;
8046 case EM_CYGNUS_D10V
:
8048 return reloc_type
== 6; /* R_D10V_32. */
8049 case EM_CYGNUS_D30V
:
8051 return reloc_type
== 12; /* R_D30V_32_NORMAL. */
8053 return reloc_type
== 3; /* R_DLX_RELOC_32. */
8054 case EM_CYGNUS_FR30
:
8056 return reloc_type
== 3; /* R_FR30_32. */
8060 return reloc_type
== 1; /* R_H8_DIR32. */
8062 return reloc_type
== 0x65; /* R_IA64_SECREL32LSB. */
8065 return reloc_type
== 2; /* R_IP2K_32. */
8067 return reloc_type
== 2; /* R_IQ2000_32. */
8070 return reloc_type
== 3; /* R_M32C_32. */
8072 return reloc_type
== 34; /* R_M32R_32_RELA. */
8074 return reloc_type
== 1; /* R_MCORE_ADDR32. */
8076 return reloc_type
== 4; /* R_MEP_32. */
8078 return reloc_type
== 2; /* R_MIPS_32. */
8080 return reloc_type
== 4; /* R_MMIX_32. */
8081 case EM_CYGNUS_MN10200
:
8083 return reloc_type
== 1; /* R_MN10200_32. */
8084 case EM_CYGNUS_MN10300
:
8086 return reloc_type
== 1; /* R_MN10300_32. */
8089 return reloc_type
== 1; /* R_MSP43_32. */
8091 return reloc_type
== 2; /* R_MT_32. */
8092 case EM_ALTERA_NIOS2
:
8094 return reloc_type
== 1; /* R_NIOS_32. */
8097 return reloc_type
== 1; /* R_OR32_32. */
8099 return reloc_type
== 1; /* R_PARISC_DIR32. */
8102 return reloc_type
== 1; /* R_PJ_DATA_DIR32. */
8104 return reloc_type
== 1; /* R_PPC64_ADDR32. */
8106 return reloc_type
== 1; /* R_PPC_ADDR32. */
8108 return reloc_type
== 1; /* R_I370_ADDR31. */
8111 return reloc_type
== 4; /* R_S390_32. */
8113 return reloc_type
== 8; /* R_SCORE_ABS32. */
8115 return reloc_type
== 1; /* R_SH_DIR32. */
8116 case EM_SPARC32PLUS
:
8119 return reloc_type
== 3 /* R_SPARC_32. */
8120 || reloc_type
== 23; /* R_SPARC_UA32. */
8122 return reloc_type
== 6; /* R_SPU_ADDR32 */
8123 case EM_CYGNUS_V850
:
8125 return reloc_type
== 6; /* R_V850_ABS32. */
8127 return reloc_type
== 1; /* R_VAX_32. */
8129 return reloc_type
== 10; /* R_X86_64_32. */
8131 return reloc_type
== 1; /* R_XSTROMY16_32. */
8134 return reloc_type
== 1; /* R_XTENSA_32. */
8137 error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
8138 elf_header
.e_machine
);
8143 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8144 a 32-bit pc-relative RELA relocation used in DWARF debug sections. */
8147 is_32bit_pcrel_reloc (unsigned int reloc_type
)
8149 switch (elf_header
.e_machine
)
8153 return reloc_type
== 2; /* R_386_PC32. */
8155 return reloc_type
== 4; /* R_68K_PC32. */
8157 return reloc_type
== 10; /* R_ALPHA_SREL32. */
8159 return reloc_type
== 3; /* R_ARM_REL32 */
8161 return reloc_type
== 9; /* R_PARISC_PCREL32. */
8163 return reloc_type
== 26; /* R_PPC_REL32. */
8165 return reloc_type
== 26; /* R_PPC64_REL32. */
8168 return reloc_type
== 5; /* R_390_PC32. */
8170 return reloc_type
== 2; /* R_SH_REL32. */
8171 case EM_SPARC32PLUS
:
8174 return reloc_type
== 6; /* R_SPARC_DISP32. */
8176 return reloc_type
== 13; /* R_SPU_REL32. */
8178 return reloc_type
== 2; /* R_X86_64_PC32. */
8181 return reloc_type
== 14; /* R_XTENSA_32_PCREL. */
8183 /* Do not abort or issue an error message here. Not all targets use
8184 pc-relative 32-bit relocs in their DWARF debug information and we
8185 have already tested for target coverage in is_32bit_abs_reloc. A
8186 more helpful warning message will be generated by
8187 debug_apply_relocations anyway, so just return. */
8192 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8193 a 64-bit absolute RELA relocation used in DWARF debug sections. */
8196 is_64bit_abs_reloc (unsigned int reloc_type
)
8198 switch (elf_header
.e_machine
)
8201 return reloc_type
== 2; /* R_ALPHA_REFQUAD. */
8203 return reloc_type
== 0x27; /* R_IA64_DIR64LSB. */
8205 return reloc_type
== 80; /* R_PARISC_DIR64. */
8207 return reloc_type
== 38; /* R_PPC64_ADDR64. */
8208 case EM_SPARC32PLUS
:
8211 return reloc_type
== 54; /* R_SPARC_UA64. */
8213 return reloc_type
== 1; /* R_X86_64_64. */
8216 return reloc_type
== 22; /* R_S390_64 */
8218 return reloc_type
== 18; /* R_MIPS_64 */
8224 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
8225 a 64-bit pc-relative RELA relocation used in DWARF debug sections. */
8228 is_64bit_pcrel_reloc (unsigned int reloc_type
)
8230 switch (elf_header
.e_machine
)
8233 return reloc_type
== 11; /* R_ALPHA_SREL64 */
8235 return reloc_type
== 0x4f; /* R_IA64_PCREL64LSB */
8237 return reloc_type
== 72; /* R_PARISC_PCREL64 */
8239 return reloc_type
== 44; /* R_PPC64_REL64 */
8240 case EM_SPARC32PLUS
:
8243 return reloc_type
== 46; /* R_SPARC_DISP64 */
8245 return reloc_type
== 24; /* R_X86_64_PC64 */
8248 return reloc_type
== 23; /* R_S390_PC64 */
8254 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
8255 a 16-bit absolute RELA relocation used in DWARF debug sections. */
8258 is_16bit_abs_reloc (unsigned int reloc_type
)
8260 switch (elf_header
.e_machine
)
8264 return reloc_type
== 4; /* R_AVR_16. */
8265 case EM_CYGNUS_D10V
:
8267 return reloc_type
== 3; /* R_D10V_16. */
8271 return reloc_type
== R_H8_DIR16
;
8274 return reloc_type
== 1; /* R_IP2K_16. */
8277 return reloc_type
== 1; /* R_M32C_16 */
8280 return reloc_type
== 5; /* R_MSP430_16_BYTE. */
8281 case EM_ALTERA_NIOS2
:
8283 return reloc_type
== 9; /* R_NIOS_16. */
8289 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
8290 relocation entries (possibly formerly used for SHT_GROUP sections). */
8293 is_none_reloc (unsigned int reloc_type
)
8295 switch (elf_header
.e_machine
)
8297 case EM_68K
: /* R_68K_NONE. */
8298 case EM_386
: /* R_386_NONE. */
8299 case EM_SPARC32PLUS
:
8301 case EM_SPARC
: /* R_SPARC_NONE. */
8302 case EM_MIPS
: /* R_MIPS_NONE. */
8303 case EM_PARISC
: /* R_PARISC_NONE. */
8304 case EM_ALPHA
: /* R_ALPHA_NONE. */
8305 case EM_PPC
: /* R_PPC_NONE. */
8306 case EM_PPC64
: /* R_PPC64_NONE. */
8307 case EM_ARM
: /* R_ARM_NONE. */
8308 case EM_IA_64
: /* R_IA64_NONE. */
8309 case EM_SH
: /* R_SH_NONE. */
8311 case EM_S390
: /* R_390_NONE. */
8312 case EM_CRIS
: /* R_CRIS_NONE. */
8313 case EM_X86_64
: /* R_X86_64_NONE. */
8314 case EM_MN10300
: /* R_MN10300_NONE. */
8315 case EM_M32R
: /* R_M32R_NONE. */
8316 return reloc_type
== 0;
8321 /* Uncompresses a section that was compressed using zlib, in place.
8322 This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
8325 uncompress_section_contents (unsigned char **buffer
, dwarf_size_type
*size
)
8328 /* These are just to quiet gcc. */
8333 dwarf_size_type compressed_size
= *size
;
8334 unsigned char * compressed_buffer
= *buffer
;
8335 dwarf_size_type uncompressed_size
;
8336 unsigned char * uncompressed_buffer
;
8339 dwarf_size_type header_size
= 12;
8341 /* Read the zlib header. In this case, it should be "ZLIB" followed
8342 by the uncompressed section size, 8 bytes in big-endian order. */
8343 if (compressed_size
< header_size
8344 || ! streq ((char *) compressed_buffer
, "ZLIB"))
8347 uncompressed_size
= compressed_buffer
[4]; uncompressed_size
<<= 8;
8348 uncompressed_size
+= compressed_buffer
[5]; uncompressed_size
<<= 8;
8349 uncompressed_size
+= compressed_buffer
[6]; uncompressed_size
<<= 8;
8350 uncompressed_size
+= compressed_buffer
[7]; uncompressed_size
<<= 8;
8351 uncompressed_size
+= compressed_buffer
[8]; uncompressed_size
<<= 8;
8352 uncompressed_size
+= compressed_buffer
[9]; uncompressed_size
<<= 8;
8353 uncompressed_size
+= compressed_buffer
[10]; uncompressed_size
<<= 8;
8354 uncompressed_size
+= compressed_buffer
[11];
8356 /* It is possible the section consists of several compressed
8357 buffers concatenated together, so we uncompress in a loop. */
8361 strm
.avail_in
= compressed_size
- header_size
;
8362 strm
.next_in
= (Bytef
*) compressed_buffer
+ header_size
;
8363 strm
.avail_out
= uncompressed_size
;
8364 uncompressed_buffer
= xmalloc (uncompressed_size
);
8366 rc
= inflateInit (& strm
);
8367 while (strm
.avail_in
> 0)
8371 strm
.next_out
= ((Bytef
*) uncompressed_buffer
8372 + (uncompressed_size
- strm
.avail_out
));
8373 rc
= inflate (&strm
, Z_FINISH
);
8374 if (rc
!= Z_STREAM_END
)
8376 rc
= inflateReset (& strm
);
8378 rc
= inflateEnd (& strm
);
8380 || strm
.avail_out
!= 0)
8383 free (compressed_buffer
);
8384 *buffer
= uncompressed_buffer
;
8385 *size
= uncompressed_size
;
8389 free (uncompressed_buffer
);
8391 #endif /* HAVE_ZLIB_H */
8394 /* Apply relocations to a debug section. */
8397 debug_apply_relocations (void *file
,
8398 Elf_Internal_Shdr
*section
,
8399 unsigned char *start
)
8401 Elf_Internal_Shdr
*relsec
;
8402 unsigned char *end
= start
+ section
->sh_size
;
8404 if (elf_header
.e_type
!= ET_REL
)
8407 /* Find the reloc section associated with the debug section. */
8408 for (relsec
= section_headers
;
8409 relsec
< section_headers
+ elf_header
.e_shnum
;
8412 bfd_boolean is_rela
;
8413 unsigned long num_relocs
;
8414 Elf_Internal_Rela
*relocs
, *rp
;
8415 Elf_Internal_Shdr
*symsec
;
8416 Elf_Internal_Sym
*symtab
;
8417 Elf_Internal_Sym
*sym
;
8419 if ((relsec
->sh_type
!= SHT_RELA
&& relsec
->sh_type
!= SHT_REL
)
8420 || relsec
->sh_info
>= elf_header
.e_shnum
8421 || section_headers
+ relsec
->sh_info
!= section
8422 || relsec
->sh_size
== 0
8423 || relsec
->sh_link
>= elf_header
.e_shnum
)
8426 is_rela
= relsec
->sh_type
== SHT_RELA
;
8430 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8431 & relocs
, & num_relocs
))
8436 if (!slurp_rel_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8437 & relocs
, & num_relocs
))
8441 /* SH uses RELA but uses in place value instead of the addend field. */
8442 if (elf_header
.e_machine
== EM_SH
)
8445 symsec
= section_headers
+ relsec
->sh_link
;
8446 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8448 for (rp
= relocs
; rp
< relocs
+ num_relocs
; ++rp
)
8451 unsigned int reloc_type
;
8452 unsigned int reloc_size
;
8453 unsigned char * loc
;
8455 reloc_type
= get_reloc_type (rp
->r_info
);
8457 if (is_none_reloc (reloc_type
))
8460 if (is_32bit_abs_reloc (reloc_type
)
8461 || is_32bit_pcrel_reloc (reloc_type
))
8463 else if (is_64bit_abs_reloc (reloc_type
)
8464 || is_64bit_pcrel_reloc (reloc_type
))
8466 else if (is_16bit_abs_reloc (reloc_type
))
8470 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
8471 reloc_type
, SECTION_NAME (section
));
8475 loc
= start
+ rp
->r_offset
;
8476 if ((loc
+ reloc_size
) > end
)
8478 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
8479 (unsigned long) rp
->r_offset
,
8480 SECTION_NAME (section
));
8484 sym
= symtab
+ get_reloc_symindex (rp
->r_info
);
8486 /* If the reloc has a symbol associated with it,
8487 make sure that it is of an appropriate type. */
8489 && ELF_ST_TYPE (sym
->st_info
) != STT_SECTION
8490 /* Relocations against symbols without type can happen.
8491 Gcc -feliminate-dwarf2-dups may generate symbols
8492 without type for debug info. */
8493 && ELF_ST_TYPE (sym
->st_info
) != STT_NOTYPE
8494 /* Relocations against object symbols can happen,
8495 eg when referencing a global array. For an
8496 example of this see the _clz.o binary in libgcc.a. */
8497 && ELF_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
8499 warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
8500 get_symbol_type (ELF_ST_TYPE (sym
->st_info
)),
8501 (long int)(rp
- relocs
),
8502 SECTION_NAME (relsec
));
8506 addend
= is_rela
? rp
->r_addend
: byte_get (loc
, reloc_size
);
8508 if (is_32bit_pcrel_reloc (reloc_type
)
8509 || is_64bit_pcrel_reloc (reloc_type
))
8511 /* On HPPA, all pc-relative relocations are biased by 8. */
8512 if (elf_header
.e_machine
== EM_PARISC
)
8514 byte_put (loc
, (addend
+ sym
->st_value
) - rp
->r_offset
,
8518 byte_put (loc
, addend
+ sym
->st_value
, reloc_size
);
8528 load_specific_debug_section (enum dwarf_section_display_enum debug
,
8529 Elf_Internal_Shdr
*sec
, void *file
)
8531 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8533 int section_is_compressed
;
8535 /* If it is already loaded, do nothing. */
8536 if (section
->start
!= NULL
)
8539 section_is_compressed
= section
->name
== section
->compressed_name
;
8541 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
8542 section
->address
= sec
->sh_addr
;
8543 section
->size
= sec
->sh_size
;
8544 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
8546 if (section
->start
== NULL
)
8549 if (section_is_compressed
)
8550 if (! uncompress_section_contents (§ion
->start
, §ion
->size
))
8553 if (debug_displays
[debug
].relocate
)
8554 debug_apply_relocations (file
, sec
, section
->start
);
8560 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
8562 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8563 Elf_Internal_Shdr
*sec
;
8565 /* Locate the debug section. */
8566 sec
= find_section (section
->uncompressed_name
);
8568 section
->name
= section
->uncompressed_name
;
8571 sec
= find_section (section
->compressed_name
);
8573 section
->name
= section
->compressed_name
;
8578 return load_specific_debug_section (debug
, sec
, file
);
8582 free_debug_section (enum dwarf_section_display_enum debug
)
8584 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
8586 if (section
->start
== NULL
)
8589 free ((char *) section
->start
);
8590 section
->start
= NULL
;
8591 section
->address
= 0;
8596 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
8598 char *name
= SECTION_NAME (section
);
8599 bfd_size_type length
;
8601 enum dwarf_section_display_enum i
;
8603 length
= section
->sh_size
;
8606 printf (_("\nSection '%s' has no debugging data.\n"), name
);
8610 if (const_strneq (name
, ".gnu.linkonce.wi."))
8611 name
= ".debug_info";
8613 /* See if we know how to display the contents of this section. */
8614 for (i
= 0; i
< max
; i
++)
8615 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
)
8616 || streq (debug_displays
[i
].section
.compressed_name
, name
))
8618 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
8619 int secondary
= (section
!= find_section (name
));
8622 free_debug_section (i
);
8624 if (streq (debug_displays
[i
].section
.uncompressed_name
, name
))
8625 sec
->name
= sec
->uncompressed_name
;
8627 sec
->name
= sec
->compressed_name
;
8628 if (load_specific_debug_section (i
, section
, file
))
8630 result
&= debug_displays
[i
].display (sec
, file
);
8632 if (secondary
|| (i
!= info
&& i
!= abbrev
))
8633 free_debug_section (i
);
8641 printf (_("Unrecognized debug section: %s\n"), name
);
8648 /* Set DUMP_SECTS for all sections where dumps were requested
8649 based on section name. */
8652 initialise_dumps_byname (void)
8654 struct dump_list_entry
*cur
;
8656 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8661 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8662 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8664 request_dump_bynumber (i
, cur
->type
);
8669 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8675 process_section_contents (FILE *file
)
8677 Elf_Internal_Shdr
*section
;
8683 initialise_dumps_byname ();
8685 for (i
= 0, section
= section_headers
;
8686 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8689 #ifdef SUPPORT_DISASSEMBLY
8690 if (dump_sects
[i
] & DISASS_DUMP
)
8691 disassemble_section (section
, file
);
8693 if (dump_sects
[i
] & HEX_DUMP
)
8694 dump_section_as_bytes (section
, file
);
8696 if (dump_sects
[i
] & DEBUG_DUMP
)
8697 display_debug_section (section
, file
);
8699 if (dump_sects
[i
] & STRING_DUMP
)
8700 dump_section_as_strings (section
, file
);
8703 /* Check to see if the user requested a
8704 dump of a section that does not exist. */
8705 while (i
++ < num_dump_sects
)
8707 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8711 process_mips_fpe_exception (int mask
)
8716 if (mask
& OEX_FPU_INEX
)
8717 fputs ("INEX", stdout
), first
= 0;
8718 if (mask
& OEX_FPU_UFLO
)
8719 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8720 if (mask
& OEX_FPU_OFLO
)
8721 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8722 if (mask
& OEX_FPU_DIV0
)
8723 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8724 if (mask
& OEX_FPU_INVAL
)
8725 printf ("%sINVAL", first
? "" : "|");
8728 fputs ("0", stdout
);
8731 /* ARM EABI attributes section. */
8736 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8739 } arm_attr_public_tag
;
8741 static const char *arm_attr_tag_CPU_arch
[] =
8742 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8744 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8745 static const char *arm_attr_tag_THUMB_ISA_use
[] =
8746 {"No", "Thumb-1", "Thumb-2"};
8747 static const char *arm_attr_tag_VFP_arch
[] =
8748 {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16"};
8749 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
8750 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
8751 static const char *arm_attr_tag_ABI_PCS_config
[] =
8752 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8753 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8754 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
8755 {"V6", "SB", "TLS", "Unused"};
8756 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
8757 {"Absolute", "PC-relative", "SB-relative", "None"};
8758 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
8759 {"Absolute", "PC-relative", "None"};
8760 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
8761 {"None", "direct", "GOT-indirect"};
8762 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
8763 {"None", "??? 1", "2", "??? 3", "4"};
8764 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8765 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
8766 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8767 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8768 static const char *arm_attr_tag_ABI_FP_number_model
[] =
8769 {"Unused", "Finite", "RTABI", "IEEE 754"};
8770 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8771 static const char *arm_attr_tag_ABI_align8_preserved
[] =
8772 {"No", "Yes, except leaf SP", "Yes"};
8773 static const char *arm_attr_tag_ABI_enum_size
[] =
8774 {"Unused", "small", "int", "forced to int"};
8775 static const char *arm_attr_tag_ABI_HardFP_use
[] =
8776 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8777 static const char *arm_attr_tag_ABI_VFP_args
[] =
8778 {"AAPCS", "VFP registers", "custom"};
8779 static const char *arm_attr_tag_ABI_WMMX_args
[] =
8780 {"AAPCS", "WMMX registers", "custom"};
8781 static const char *arm_attr_tag_ABI_optimization_goals
[] =
8782 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8783 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8784 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
8785 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8786 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8788 #define LOOKUP(id, name) \
8789 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8790 static arm_attr_public_tag arm_attr_public_tags
[] =
8792 {4, "CPU_raw_name", 1, NULL
},
8793 {5, "CPU_name", 1, NULL
},
8794 LOOKUP(6, CPU_arch
),
8795 {7, "CPU_arch_profile", 0, NULL
},
8796 LOOKUP(8, ARM_ISA_use
),
8797 LOOKUP(9, THUMB_ISA_use
),
8798 LOOKUP(10, VFP_arch
),
8799 LOOKUP(11, WMMX_arch
),
8800 LOOKUP(12, NEON_arch
),
8801 LOOKUP(13, ABI_PCS_config
),
8802 LOOKUP(14, ABI_PCS_R9_use
),
8803 LOOKUP(15, ABI_PCS_RW_data
),
8804 LOOKUP(16, ABI_PCS_RO_DATA
),
8805 LOOKUP(17, ABI_PCS_GOT_use
),
8806 LOOKUP(18, ABI_PCS_wchar_t
),
8807 LOOKUP(19, ABI_FP_rounding
),
8808 LOOKUP(20, ABI_FP_denormal
),
8809 LOOKUP(21, ABI_FP_exceptions
),
8810 LOOKUP(22, ABI_FP_user_exceptions
),
8811 LOOKUP(23, ABI_FP_number_model
),
8812 LOOKUP(24, ABI_align8_needed
),
8813 LOOKUP(25, ABI_align8_preserved
),
8814 LOOKUP(26, ABI_enum_size
),
8815 LOOKUP(27, ABI_HardFP_use
),
8816 LOOKUP(28, ABI_VFP_args
),
8817 LOOKUP(29, ABI_WMMX_args
),
8818 LOOKUP(30, ABI_optimization_goals
),
8819 LOOKUP(31, ABI_FP_optimization_goals
),
8820 {32, "compatibility", 0, NULL
}
8824 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8827 read_uleb128 (unsigned char *p
, unsigned int *plen
)
8841 val
|= ((unsigned int)c
& 0x7f) << shift
;
8850 static unsigned char *
8851 display_arm_attribute (unsigned char *p
)
8856 arm_attr_public_tag
*attr
;
8860 tag
= read_uleb128 (p
, &len
);
8863 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
8865 if (arm_attr_public_tags
[i
].tag
== tag
)
8867 attr
= &arm_attr_public_tags
[i
];
8874 printf (" Tag_%s: ", attr
->name
);
8880 case 7: /* Tag_CPU_arch_profile. */
8881 val
= read_uleb128 (p
, &len
);
8885 case 0: printf ("None\n"); break;
8886 case 'A': printf ("Application\n"); break;
8887 case 'R': printf ("Realtime\n"); break;
8888 case 'M': printf ("Microcontroller\n"); break;
8889 default: printf ("??? (%d)\n", val
); break;
8893 case 32: /* Tag_compatibility. */
8894 val
= read_uleb128 (p
, &len
);
8896 printf ("flag = %d, vendor = %s\n", val
, p
);
8897 p
+= strlen((char *)p
) + 1;
8911 assert (attr
->type
& 0x80);
8912 val
= read_uleb128 (p
, &len
);
8914 type
= attr
->type
& 0x7f;
8916 printf ("??? (%d)\n", val
);
8918 printf ("%s\n", attr
->table
[val
]);
8925 type
= 1; /* String. */
8927 type
= 2; /* uleb128. */
8928 printf (" Tag_unknown_%d: ", tag
);
8933 printf ("\"%s\"\n", p
);
8934 p
+= strlen((char *)p
) + 1;
8938 val
= read_uleb128 (p
, &len
);
8940 printf ("%d (0x%x)\n", val
, val
);
8946 static unsigned char *
8947 display_gnu_attribute (unsigned char * p
,
8948 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
8955 tag
= read_uleb128 (p
, &len
);
8958 /* Tag_compatibility is the only generic GNU attribute defined at
8962 val
= read_uleb128 (p
, &len
);
8964 printf ("flag = %d, vendor = %s\n", val
, p
);
8965 p
+= strlen ((char *) p
) + 1;
8969 if ((tag
& 2) == 0 && display_proc_gnu_attribute
)
8970 return display_proc_gnu_attribute (p
, tag
);
8973 type
= 1; /* String. */
8975 type
= 2; /* uleb128. */
8976 printf (" Tag_unknown_%d: ", tag
);
8980 printf ("\"%s\"\n", p
);
8981 p
+= strlen ((char *) p
) + 1;
8985 val
= read_uleb128 (p
, &len
);
8987 printf ("%d (0x%x)\n", val
, val
);
8993 static unsigned char *
8994 display_power_gnu_attribute (unsigned char *p
, int tag
)
9000 if (tag
== Tag_GNU_Power_ABI_FP
)
9002 val
= read_uleb128 (p
, &len
);
9004 printf (" Tag_GNU_Power_ABI_FP: ");
9009 printf ("Hard or soft float\n");
9012 printf ("Hard float\n");
9015 printf ("Soft float\n");
9018 printf ("Single-precision hard float\n");
9021 printf ("??? (%d)\n", val
);
9027 if (tag
== Tag_GNU_Power_ABI_Vector
)
9029 val
= read_uleb128 (p
, &len
);
9031 printf (" Tag_GNU_Power_ABI_Vector: ");
9038 printf ("Generic\n");
9041 printf ("AltiVec\n");
9047 printf ("??? (%d)\n", val
);
9053 if (tag
== Tag_GNU_Power_ABI_Struct_Return
)
9055 val
= read_uleb128 (p
, &len
);
9057 printf (" Tag_GNU_Power_ABI_Struct_Return: ");
9067 printf ("Memory\n");
9070 printf ("??? (%d)\n", val
);
9077 type
= 1; /* String. */
9079 type
= 2; /* uleb128. */
9080 printf (" Tag_unknown_%d: ", tag
);
9084 printf ("\"%s\"\n", p
);
9085 p
+= strlen ((char *) p
) + 1;
9089 val
= read_uleb128 (p
, &len
);
9091 printf ("%d (0x%x)\n", val
, val
);
9097 static unsigned char *
9098 display_mips_gnu_attribute (unsigned char *p
, int tag
)
9104 if (tag
== Tag_GNU_MIPS_ABI_FP
)
9106 val
= read_uleb128 (p
, &len
);
9108 printf (" Tag_GNU_MIPS_ABI_FP: ");
9113 printf ("Hard or soft float\n");
9116 printf ("Hard float (-mdouble-float)\n");
9119 printf ("Hard float (-msingle-float)\n");
9122 printf ("Soft float\n");
9125 printf ("64-bit float (-mips32r2 -mfp64)\n");
9128 printf ("??? (%d)\n", val
);
9135 type
= 1; /* String. */
9137 type
= 2; /* uleb128. */
9138 printf (" Tag_unknown_%d: ", tag
);
9142 printf ("\"%s\"\n", p
);
9143 p
+= strlen ((char *) p
) + 1;
9147 val
= read_uleb128 (p
, &len
);
9149 printf ("%d (0x%x)\n", val
, val
);
9156 process_attributes (FILE * file
,
9157 const char * public_name
,
9158 unsigned int proc_type
,
9159 unsigned char * (* display_pub_attribute
) (unsigned char *),
9160 unsigned char * (* display_proc_gnu_attribute
) (unsigned char *, int))
9162 Elf_Internal_Shdr
*sect
;
9163 unsigned char *contents
;
9166 bfd_vma section_len
;
9170 /* Find the section header so that we get the size. */
9171 for (i
= 0, sect
= section_headers
;
9172 i
< elf_header
.e_shnum
;
9175 if (sect
->sh_type
!= proc_type
&& sect
->sh_type
!= SHT_GNU_ATTRIBUTES
)
9178 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
9180 if (contents
== NULL
)
9186 len
= sect
->sh_size
- 1;
9192 bfd_boolean public_section
;
9193 bfd_boolean gnu_section
;
9195 section_len
= byte_get (p
, 4);
9198 if (section_len
> len
)
9200 printf (_("ERROR: Bad section length (%d > %d)\n"),
9201 (int) section_len
, (int) len
);
9206 printf ("Attribute Section: %s\n", p
);
9208 if (public_name
&& streq ((char *) p
, public_name
))
9209 public_section
= TRUE
;
9211 public_section
= FALSE
;
9213 if (streq ((char *) p
, "gnu"))
9216 gnu_section
= FALSE
;
9218 namelen
= strlen ((char *) p
) + 1;
9220 section_len
-= namelen
+ 4;
9222 while (section_len
> 0)
9228 size
= byte_get (p
, 4);
9229 if (size
> section_len
)
9231 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
9232 (int) size
, (int) section_len
);
9236 section_len
-= size
;
9243 printf ("File Attributes\n");
9246 printf ("Section Attributes:");
9249 printf ("Symbol Attributes:");
9255 val
= read_uleb128 (p
, &i
);
9259 printf (" %d", val
);
9264 printf ("Unknown tag: %d\n", tag
);
9265 public_section
= FALSE
;
9272 p
= display_pub_attribute (p
);
9274 else if (gnu_section
)
9277 p
= display_gnu_attribute (p
,
9278 display_proc_gnu_attribute
);
9282 /* ??? Do something sensible, like dump hex. */
9283 printf (" Unknown section contexts\n");
9290 printf (_("Unknown format '%c'\n"), *p
);
9298 process_arm_specific (FILE *file
)
9300 return process_attributes (file
, "aeabi", SHT_ARM_ATTRIBUTES
,
9301 display_arm_attribute
, NULL
);
9305 process_power_specific (FILE *file
)
9307 return process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9308 display_power_gnu_attribute
);
9311 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
9312 Print the Address, Access and Initial fields of an entry at VMA ADDR
9313 and return the VMA of the next entry. */
9316 print_mips_got_entry (unsigned char *data
, bfd_vma pltgot
, bfd_vma addr
)
9319 print_vma (addr
, LONG_HEX
);
9321 if (addr
< pltgot
+ 0xfff0)
9322 printf ("%6d(gp)", (int) (addr
- pltgot
- 0x7ff0));
9324 printf ("%10s", "");
9327 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9332 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9333 print_vma (entry
, LONG_HEX
);
9335 return addr
+ (is_32bit_elf
? 4 : 8);
9338 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
9339 PLTGOT. Print the Address and Initial fields of an entry at VMA
9340 ADDR and return the VMA of the next entry. */
9343 print_mips_pltgot_entry (unsigned char *data
, bfd_vma pltgot
, bfd_vma addr
)
9346 print_vma (addr
, LONG_HEX
);
9349 printf ("%*s", is_32bit_elf
? 8 : 16, "<unknown>");
9354 entry
= byte_get (data
+ addr
- pltgot
, is_32bit_elf
? 4 : 8);
9355 print_vma (entry
, LONG_HEX
);
9357 return addr
+ (is_32bit_elf
? 4 : 8);
9361 process_mips_specific (FILE *file
)
9363 Elf_Internal_Dyn
*entry
;
9364 size_t liblist_offset
= 0;
9365 size_t liblistno
= 0;
9366 size_t conflictsno
= 0;
9367 size_t options_offset
= 0;
9368 size_t conflicts_offset
= 0;
9369 size_t pltrelsz
= 0;
9372 bfd_vma mips_pltgot
= 0;
9374 bfd_vma local_gotno
= 0;
9376 bfd_vma symtabno
= 0;
9378 process_attributes (file
, NULL
, SHT_GNU_ATTRIBUTES
, NULL
,
9379 display_mips_gnu_attribute
);
9381 /* We have a lot of special sections. Thanks SGI! */
9382 if (dynamic_section
== NULL
)
9383 /* No information available. */
9386 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
9387 switch (entry
->d_tag
)
9389 case DT_MIPS_LIBLIST
:
9391 = offset_from_vma (file
, entry
->d_un
.d_val
,
9392 liblistno
* sizeof (Elf32_External_Lib
));
9394 case DT_MIPS_LIBLISTNO
:
9395 liblistno
= entry
->d_un
.d_val
;
9397 case DT_MIPS_OPTIONS
:
9398 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
9400 case DT_MIPS_CONFLICT
:
9402 = offset_from_vma (file
, entry
->d_un
.d_val
,
9403 conflictsno
* sizeof (Elf32_External_Conflict
));
9405 case DT_MIPS_CONFLICTNO
:
9406 conflictsno
= entry
->d_un
.d_val
;
9409 pltgot
= entry
->d_un
.d_ptr
;
9411 case DT_MIPS_LOCAL_GOTNO
:
9412 local_gotno
= entry
->d_un
.d_val
;
9414 case DT_MIPS_GOTSYM
:
9415 gotsym
= entry
->d_un
.d_val
;
9417 case DT_MIPS_SYMTABNO
:
9418 symtabno
= entry
->d_un
.d_val
;
9420 case DT_MIPS_PLTGOT
:
9421 mips_pltgot
= entry
->d_un
.d_ptr
;
9424 pltrel
= entry
->d_un
.d_val
;
9427 pltrelsz
= entry
->d_un
.d_val
;
9430 jmprel
= entry
->d_un
.d_ptr
;
9436 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9438 Elf32_External_Lib
*elib
;
9441 elib
= get_data (NULL
, file
, liblist_offset
,
9442 liblistno
, sizeof (Elf32_External_Lib
),
9446 printf ("\nSection '.liblist' contains %lu entries:\n",
9447 (unsigned long) liblistno
);
9448 fputs (" Library Time Stamp Checksum Version Flags\n",
9451 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9458 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9459 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9460 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9461 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9462 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9464 tmp
= gmtime (&time
);
9465 snprintf (timebuf
, sizeof (timebuf
),
9466 "%04u-%02u-%02uT%02u:%02u:%02u",
9467 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9468 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9470 printf ("%3lu: ", (unsigned long) cnt
);
9471 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
9472 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
9474 printf ("<corrupt: %9ld>", liblist
.l_name
);
9475 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9478 if (liblist
.l_flags
== 0)
9489 { " EXACT_MATCH", LL_EXACT_MATCH
},
9490 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9491 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9492 { " EXPORTS", LL_EXPORTS
},
9493 { " DELAY_LOAD", LL_DELAY_LOAD
},
9494 { " DELTA", LL_DELTA
}
9496 int flags
= liblist
.l_flags
;
9499 for (fcnt
= 0; fcnt
< ARRAY_SIZE (l_flags_vals
); ++fcnt
)
9500 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9502 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9503 flags
^= l_flags_vals
[fcnt
].bit
;
9506 printf (" %#x", (unsigned int) flags
);
9516 if (options_offset
!= 0)
9518 Elf_External_Options
*eopt
;
9519 Elf_Internal_Shdr
*sect
= section_headers
;
9520 Elf_Internal_Options
*iopt
;
9521 Elf_Internal_Options
*option
;
9525 /* Find the section header so that we get the size. */
9526 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9529 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
9533 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
9536 error (_("Out of memory\n"));
9543 while (offset
< sect
->sh_size
)
9545 Elf_External_Options
*eoption
;
9547 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9549 option
->kind
= BYTE_GET (eoption
->kind
);
9550 option
->size
= BYTE_GET (eoption
->size
);
9551 option
->section
= BYTE_GET (eoption
->section
);
9552 option
->info
= BYTE_GET (eoption
->info
);
9554 offset
+= option
->size
;
9560 printf (_("\nSection '%s' contains %d entries:\n"),
9561 SECTION_NAME (sect
), cnt
);
9569 switch (option
->kind
)
9572 /* This shouldn't happen. */
9573 printf (" NULL %d %lx", option
->section
, option
->info
);
9576 printf (" REGINFO ");
9577 if (elf_header
.e_machine
== EM_MIPS
)
9580 Elf32_External_RegInfo
*ereg
;
9581 Elf32_RegInfo reginfo
;
9583 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9584 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9585 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9586 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9587 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9588 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9589 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9591 printf ("GPR %08lx GP 0x%lx\n",
9593 (unsigned long) reginfo
.ri_gp_value
);
9594 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9595 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9596 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9601 Elf64_External_RegInfo
*ereg
;
9602 Elf64_Internal_RegInfo reginfo
;
9604 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9605 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9606 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9607 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9608 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9609 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9610 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9612 printf ("GPR %08lx GP 0x",
9613 reginfo
.ri_gprmask
);
9614 printf_vma (reginfo
.ri_gp_value
);
9617 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9618 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9619 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9623 case ODK_EXCEPTIONS
:
9624 fputs (" EXCEPTIONS fpe_min(", stdout
);
9625 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9626 fputs (") fpe_max(", stdout
);
9627 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9628 fputs (")", stdout
);
9630 if (option
->info
& OEX_PAGE0
)
9631 fputs (" PAGE0", stdout
);
9632 if (option
->info
& OEX_SMM
)
9633 fputs (" SMM", stdout
);
9634 if (option
->info
& OEX_FPDBUG
)
9635 fputs (" FPDBUG", stdout
);
9636 if (option
->info
& OEX_DISMISS
)
9637 fputs (" DISMISS", stdout
);
9640 fputs (" PAD ", stdout
);
9641 if (option
->info
& OPAD_PREFIX
)
9642 fputs (" PREFIX", stdout
);
9643 if (option
->info
& OPAD_POSTFIX
)
9644 fputs (" POSTFIX", stdout
);
9645 if (option
->info
& OPAD_SYMBOL
)
9646 fputs (" SYMBOL", stdout
);
9649 fputs (" HWPATCH ", stdout
);
9650 if (option
->info
& OHW_R4KEOP
)
9651 fputs (" R4KEOP", stdout
);
9652 if (option
->info
& OHW_R8KPFETCH
)
9653 fputs (" R8KPFETCH", stdout
);
9654 if (option
->info
& OHW_R5KEOP
)
9655 fputs (" R5KEOP", stdout
);
9656 if (option
->info
& OHW_R5KCVTL
)
9657 fputs (" R5KCVTL", stdout
);
9660 fputs (" FILL ", stdout
);
9661 /* XXX Print content of info word? */
9664 fputs (" TAGS ", stdout
);
9665 /* XXX Print content of info word? */
9668 fputs (" HWAND ", stdout
);
9669 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9670 fputs (" R4KEOP_CHECKED", stdout
);
9671 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9672 fputs (" R4KEOP_CLEAN", stdout
);
9675 fputs (" HWOR ", stdout
);
9676 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9677 fputs (" R4KEOP_CHECKED", stdout
);
9678 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9679 fputs (" R4KEOP_CLEAN", stdout
);
9682 printf (" GP_GROUP %#06lx self-contained %#06lx",
9683 option
->info
& OGP_GROUP
,
9684 (option
->info
& OGP_SELF
) >> 16);
9687 printf (" IDENT %#06lx self-contained %#06lx",
9688 option
->info
& OGP_GROUP
,
9689 (option
->info
& OGP_SELF
) >> 16);
9692 /* This shouldn't happen. */
9693 printf (" %3d ??? %d %lx",
9694 option
->kind
, option
->section
, option
->info
);
9698 len
= sizeof (*eopt
);
9699 while (len
< option
->size
)
9700 if (((char *) option
)[len
] >= ' '
9701 && ((char *) option
)[len
] < 0x7f)
9702 printf ("%c", ((char *) option
)[len
++]);
9704 printf ("\\%03o", ((char *) option
)[len
++]);
9706 fputs ("\n", stdout
);
9714 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9716 Elf32_Conflict
*iconf
;
9719 if (dynamic_symbols
== NULL
)
9721 error (_("conflict list found without a dynamic symbol table\n"));
9725 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
9728 error (_("Out of memory\n"));
9734 Elf32_External_Conflict
*econf32
;
9736 econf32
= get_data (NULL
, file
, conflicts_offset
,
9737 conflictsno
, sizeof (*econf32
), _("conflict"));
9741 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9742 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9748 Elf64_External_Conflict
*econf64
;
9750 econf64
= get_data (NULL
, file
, conflicts_offset
,
9751 conflictsno
, sizeof (*econf64
), _("conflict"));
9755 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9756 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9761 printf (_("\nSection '.conflict' contains %lu entries:\n"),
9762 (unsigned long) conflictsno
);
9763 puts (_(" Num: Index Value Name"));
9765 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9767 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9769 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9770 print_vma (psym
->st_value
, FULL_HEX
);
9772 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9773 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
9775 printf ("<corrupt: %14ld>", psym
->st_name
);
9782 if (pltgot
!= 0 && local_gotno
!= 0)
9784 bfd_vma entry
, local_end
, global_end
;
9786 unsigned char *data
;
9790 addr_size
= (is_32bit_elf
? 4 : 8);
9791 local_end
= pltgot
+ local_gotno
* addr_size
;
9792 global_end
= local_end
+ (symtabno
- gotsym
) * addr_size
;
9794 offset
= offset_from_vma (file
, pltgot
, global_end
- pltgot
);
9795 data
= get_data (NULL
, file
, offset
, global_end
- pltgot
, 1, _("GOT"));
9796 printf (_("\nPrimary GOT:\n"));
9797 printf (_(" Canonical gp value: "));
9798 print_vma (pltgot
+ 0x7ff0, LONG_HEX
);
9801 printf (_(" Reserved entries:\n"));
9802 printf (_(" %*s %10s %*s Purpose\n"),
9803 addr_size
* 2, "Address", "Access",
9804 addr_size
* 2, "Initial");
9805 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9806 printf (" Lazy resolver\n");
9808 && (byte_get (data
+ entry
- pltgot
, addr_size
)
9809 >> (addr_size
* 8 - 1)) != 0)
9811 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9812 printf (" Module pointer (GNU extension)\n");
9816 if (entry
< local_end
)
9818 printf (_(" Local entries:\n"));
9819 printf (_(" %*s %10s %*s\n"),
9820 addr_size
* 2, "Address", "Access",
9821 addr_size
* 2, "Initial");
9822 while (entry
< local_end
)
9824 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9830 if (gotsym
< symtabno
)
9834 printf (_(" Global entries:\n"));
9835 printf (_(" %*s %10s %*s %*s %-7s %3s %s\n"),
9836 addr_size
* 2, "Address", "Access",
9837 addr_size
* 2, "Initial",
9838 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
9839 sym_width
= (is_32bit_elf
? 80 : 160) - 28 - addr_size
* 6 - 1;
9840 for (i
= gotsym
; i
< symtabno
; i
++)
9842 Elf_Internal_Sym
*psym
;
9844 psym
= dynamic_symbols
+ i
;
9845 entry
= print_mips_got_entry (data
, pltgot
, entry
);
9847 print_vma (psym
->st_value
, LONG_HEX
);
9848 printf (" %-7s %3s ",
9849 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
9850 get_symbol_index_type (psym
->st_shndx
));
9851 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9852 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
9854 printf ("<corrupt: %14ld>", psym
->st_name
);
9864 if (mips_pltgot
!= 0 && jmprel
!= 0 && pltrel
!= 0 && pltrelsz
!= 0)
9867 size_t offset
, rel_offset
;
9868 unsigned long count
, i
;
9869 unsigned char *data
;
9870 int addr_size
, sym_width
;
9871 Elf_Internal_Rela
*rels
;
9873 rel_offset
= offset_from_vma (file
, jmprel
, pltrelsz
);
9874 if (pltrel
== DT_RELA
)
9876 if (!slurp_rela_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
9881 if (!slurp_rel_relocs (file
, rel_offset
, pltrelsz
, &rels
, &count
))
9885 entry
= mips_pltgot
;
9886 addr_size
= (is_32bit_elf
? 4 : 8);
9887 end
= mips_pltgot
+ (2 + count
) * addr_size
;
9889 offset
= offset_from_vma (file
, mips_pltgot
, end
- mips_pltgot
);
9890 data
= get_data (NULL
, file
, offset
, end
- mips_pltgot
, 1, _("PLT GOT"));
9891 printf (_("\nPLT GOT:\n\n"));
9892 printf (_(" Reserved entries:\n"));
9893 printf (_(" %*s %*s Purpose\n"),
9894 addr_size
* 2, "Address", addr_size
* 2, "Initial");
9895 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
9896 printf (" PLT lazy resolver\n");
9897 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
9898 printf (" Module pointer\n");
9901 printf (_(" Entries:\n"));
9902 printf (_(" %*s %*s %*s %-7s %3s %s\n"),
9903 addr_size
* 2, "Address",
9904 addr_size
* 2, "Initial",
9905 addr_size
* 2, "Sym.Val.", "Type", "Ndx", "Name");
9906 sym_width
= (is_32bit_elf
? 80 : 160) - 17 - addr_size
* 6 - 1;
9907 for (i
= 0; i
< count
; i
++)
9909 Elf_Internal_Sym
*psym
;
9911 psym
= dynamic_symbols
+ get_reloc_symindex (rels
[i
].r_info
);
9912 entry
= print_mips_pltgot_entry (data
, mips_pltgot
, entry
);
9914 print_vma (psym
->st_value
, LONG_HEX
);
9915 printf (" %-7s %3s ",
9916 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
9917 get_symbol_index_type (psym
->st_shndx
));
9918 if (VALID_DYNAMIC_NAME (psym
->st_name
))
9919 print_symbol (sym_width
, GET_DYNAMIC_NAME (psym
->st_name
));
9921 printf ("<corrupt: %14ld>", psym
->st_name
);
9935 process_gnu_liblist (FILE *file
)
9937 Elf_Internal_Shdr
*section
, *string_sec
;
9938 Elf32_External_Lib
*elib
;
9947 for (i
= 0, section
= section_headers
;
9948 i
< elf_header
.e_shnum
;
9951 switch (section
->sh_type
)
9953 case SHT_GNU_LIBLIST
:
9954 if (section
->sh_link
>= elf_header
.e_shnum
)
9957 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
9962 string_sec
= section_headers
+ section
->sh_link
;
9964 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
9965 string_sec
->sh_size
, _("liblist string table"));
9966 strtab_size
= string_sec
->sh_size
;
9969 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9975 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9976 SECTION_NAME (section
),
9977 (unsigned long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9979 puts (" Library Time Stamp Checksum Version Flags");
9981 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9989 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9990 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9991 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9992 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9993 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9995 tmp
= gmtime (&time
);
9996 snprintf (timebuf
, sizeof (timebuf
),
9997 "%04u-%02u-%02uT%02u:%02u:%02u",
9998 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9999 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10001 printf ("%3lu: ", (unsigned long) cnt
);
10003 printf ("%-20s", liblist
.l_name
< strtab_size
10004 ? strtab
+ liblist
.l_name
: "<corrupt>");
10006 printf ("%-20.20s", liblist
.l_name
< strtab_size
10007 ? strtab
+ liblist
.l_name
: "<corrupt>");
10008 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10009 liblist
.l_version
, liblist
.l_flags
);
10019 static const char *
10020 get_note_type (unsigned e_type
)
10022 static char buff
[64];
10024 if (elf_header
.e_type
== ET_CORE
)
10028 return _("NT_AUXV (auxiliary vector)");
10030 return _("NT_PRSTATUS (prstatus structure)");
10032 return _("NT_FPREGSET (floating point registers)");
10034 return _("NT_PRPSINFO (prpsinfo structure)");
10035 case NT_TASKSTRUCT
:
10036 return _("NT_TASKSTRUCT (task structure)");
10038 return _("NT_PRXFPREG (user_xfpregs structure)");
10040 return _("NT_PPC_VMX (ppc Altivec registers)");
10042 return _("NT_PPC_VSX (ppc VSX registers)");
10044 return _("NT_PSTATUS (pstatus structure)");
10046 return _("NT_FPREGS (floating point registers)");
10048 return _("NT_PSINFO (psinfo structure)");
10050 return _("NT_LWPSTATUS (lwpstatus_t structure)");
10052 return _("NT_LWPSINFO (lwpsinfo_t structure)");
10053 case NT_WIN32PSTATUS
:
10054 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10062 return _("NT_VERSION (version)");
10064 return _("NT_ARCH (architecture)");
10069 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10073 static const char *
10074 get_gnu_elf_note_type (unsigned e_type
)
10076 static char buff
[64];
10080 case NT_GNU_ABI_TAG
:
10081 return _("NT_GNU_ABI_TAG (ABI version tag)");
10083 return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
10084 case NT_GNU_BUILD_ID
:
10085 return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
10086 case NT_GNU_GOLD_VERSION
:
10087 return _("NT_GNU_GOLD_VERSION (gold version)");
10092 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10096 static const char *
10097 get_netbsd_elfcore_note_type (unsigned e_type
)
10099 static char buff
[64];
10101 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10103 /* NetBSD core "procinfo" structure. */
10104 return _("NetBSD procinfo structure");
10107 /* As of Jan 2002 there are no other machine-independent notes
10108 defined for NetBSD core files. If the note type is less
10109 than the start of the machine-dependent note types, we don't
10112 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10114 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
10118 switch (elf_header
.e_machine
)
10120 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10121 and PT_GETFPREGS == mach+2. */
10126 case EM_SPARC32PLUS
:
10130 case NT_NETBSDCORE_FIRSTMACH
+0:
10131 return _("PT_GETREGS (reg structure)");
10132 case NT_NETBSDCORE_FIRSTMACH
+2:
10133 return _("PT_GETFPREGS (fpreg structure)");
10139 /* On all other arch's, PT_GETREGS == mach+1 and
10140 PT_GETFPREGS == mach+3. */
10144 case NT_NETBSDCORE_FIRSTMACH
+1:
10145 return _("PT_GETREGS (reg structure)");
10146 case NT_NETBSDCORE_FIRSTMACH
+3:
10147 return _("PT_GETFPREGS (fpreg structure)");
10153 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
10154 e_type
- NT_NETBSDCORE_FIRSTMACH
);
10158 /* Note that by the ELF standard, the name field is already null byte
10159 terminated, and namesz includes the terminating null byte.
10160 I.E. the value of namesz for the name "FSF" is 4.
10162 If the value of namesz is zero, there is no name present. */
10164 process_note (Elf_Internal_Note
*pnote
)
10166 const char *name
= pnote
->namesz
? pnote
->namedata
: "(NONE)";
10169 if (pnote
->namesz
== 0)
10170 /* If there is no note name, then use the default set of
10171 note type strings. */
10172 nt
= get_note_type (pnote
->type
);
10174 else if (const_strneq (pnote
->namedata
, "GNU"))
10175 /* GNU-specific object file notes. */
10176 nt
= get_gnu_elf_note_type (pnote
->type
);
10178 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
10179 /* NetBSD-specific core file notes. */
10180 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10182 else if (strneq (pnote
->namedata
, "SPU/", 4))
10184 /* SPU-specific core file notes. */
10185 nt
= pnote
->namedata
+ 4;
10190 /* Don't recognize this note name; just use the default set of
10191 note type strings. */
10192 nt
= get_note_type (pnote
->type
);
10194 printf (" %s\t\t0x%08lx\t%s\n", name
, pnote
->descsz
, nt
);
10200 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
10202 Elf_External_Note
*pnotes
;
10203 Elf_External_Note
*external
;
10209 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
10215 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10216 (unsigned long) offset
, (unsigned long) length
);
10217 printf (_(" Owner\t\tData size\tDescription\n"));
10219 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10221 Elf_External_Note
*next
;
10222 Elf_Internal_Note inote
;
10225 inote
.type
= BYTE_GET (external
->type
);
10226 inote
.namesz
= BYTE_GET (external
->namesz
);
10227 inote
.namedata
= external
->name
;
10228 inote
.descsz
= BYTE_GET (external
->descsz
);
10229 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10230 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10232 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10234 if (((char *) next
) > (((char *) pnotes
) + length
))
10236 warn (_("corrupt note found at offset %lx into core notes\n"),
10237 (unsigned long) ((char *) external
- (char *) pnotes
));
10238 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
10239 inote
.type
, inote
.namesz
, inote
.descsz
);
10245 /* Verify that name is null terminated. It appears that at least
10246 one version of Linux (RedHat 6.0) generates corefiles that don't
10247 comply with the ELF spec by failing to include the null byte in
10249 if (inote
.namedata
[inote
.namesz
] != '\0')
10251 temp
= malloc (inote
.namesz
+ 1);
10255 error (_("Out of memory\n"));
10260 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10261 temp
[inote
.namesz
] = 0;
10263 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10264 inote
.namedata
= temp
;
10267 res
&= process_note (& inote
);
10282 process_corefile_note_segments (FILE *file
)
10284 Elf_Internal_Phdr
*segment
;
10288 if (! get_program_headers (file
))
10291 for (i
= 0, segment
= program_headers
;
10292 i
< elf_header
.e_phnum
;
10295 if (segment
->p_type
== PT_NOTE
)
10296 res
&= process_corefile_note_segment (file
,
10297 (bfd_vma
) segment
->p_offset
,
10298 (bfd_vma
) segment
->p_filesz
);
10305 process_note_sections (FILE *file
)
10307 Elf_Internal_Shdr
*section
;
10311 for (i
= 0, section
= section_headers
;
10312 i
< elf_header
.e_shnum
;
10314 if (section
->sh_type
== SHT_NOTE
)
10315 res
&= process_corefile_note_segment (file
,
10316 (bfd_vma
) section
->sh_offset
,
10317 (bfd_vma
) section
->sh_size
);
10323 process_notes (FILE *file
)
10325 /* If we have not been asked to display the notes then do nothing. */
10329 if (elf_header
.e_type
!= ET_CORE
)
10330 return process_note_sections (file
);
10332 /* No program headers means no NOTE segment. */
10333 if (elf_header
.e_phnum
> 0)
10334 return process_corefile_note_segments (file
);
10336 printf (_("No note segments present in the core file.\n"));
10341 process_arch_specific (FILE *file
)
10346 switch (elf_header
.e_machine
)
10349 return process_arm_specific (file
);
10351 case EM_MIPS_RS3_LE
:
10352 return process_mips_specific (file
);
10355 return process_power_specific (file
);
10364 get_file_header (FILE *file
)
10366 /* Read in the identity array. */
10367 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10370 /* Determine how to read the rest of the header. */
10371 switch (elf_header
.e_ident
[EI_DATA
])
10373 default: /* fall through */
10374 case ELFDATANONE
: /* fall through */
10376 byte_get
= byte_get_little_endian
;
10377 byte_put
= byte_put_little_endian
;
10380 byte_get
= byte_get_big_endian
;
10381 byte_put
= byte_put_big_endian
;
10385 /* For now we only support 32 bit and 64 bit ELF files. */
10386 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10388 /* Read in the rest of the header. */
10391 Elf32_External_Ehdr ehdr32
;
10393 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10396 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10397 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10398 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10399 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10400 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10401 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10402 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10403 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10404 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10405 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10406 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10407 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10408 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10412 Elf64_External_Ehdr ehdr64
;
10414 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10415 we will not be able to cope with the 64bit data found in
10416 64 ELF files. Detect this now and abort before we start
10417 overwriting things. */
10418 if (sizeof (bfd_vma
) < 8)
10420 error (_("This instance of readelf has been built without support for a\n\
10421 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10425 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10428 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10429 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10430 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10431 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
10432 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
10433 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
10434 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10435 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10436 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10437 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10438 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10439 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10440 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10443 if (elf_header
.e_shoff
)
10445 /* There may be some extensions in the first section header. Don't
10446 bomb if we can't read it. */
10448 get_32bit_section_headers (file
, 1);
10450 get_64bit_section_headers (file
, 1);
10456 /* Process one ELF object file according to the command line options.
10457 This file may actually be stored in an archive. The file is
10458 positioned at the start of the ELF object. */
10461 process_object (char *file_name
, FILE *file
)
10465 if (! get_file_header (file
))
10467 error (_("%s: Failed to read file header\n"), file_name
);
10471 /* Initialise per file variables. */
10472 for (i
= ARRAY_SIZE (version_info
); i
--;)
10473 version_info
[i
] = 0;
10475 for (i
= ARRAY_SIZE (dynamic_info
); i
--;)
10476 dynamic_info
[i
] = 0;
10478 /* Process the file. */
10480 printf (_("\nFile: %s\n"), file_name
);
10482 /* Initialise the dump_sects array from the cmdline_dump_sects array.
10483 Note we do this even if cmdline_dump_sects is empty because we
10484 must make sure that the dump_sets array is zeroed out before each
10485 object file is processed. */
10486 if (num_dump_sects
> num_cmdline_dump_sects
)
10487 memset (dump_sects
, 0, num_dump_sects
* sizeof (* dump_sects
));
10489 if (num_cmdline_dump_sects
> 0)
10491 if (num_dump_sects
== 0)
10492 /* A sneaky way of allocating the dump_sects array. */
10493 request_dump_bynumber (num_cmdline_dump_sects
, 0);
10495 assert (num_dump_sects
>= num_cmdline_dump_sects
);
10496 memcpy (dump_sects
, cmdline_dump_sects
,
10497 num_cmdline_dump_sects
* sizeof (* dump_sects
));
10500 if (! process_file_header ())
10503 if (! process_section_headers (file
))
10505 /* Without loaded section headers we cannot process lots of
10507 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10509 if (! do_using_dynamic
)
10510 do_syms
= do_reloc
= 0;
10513 if (! process_section_groups (file
))
10515 /* Without loaded section groups we cannot process unwind. */
10519 if (process_program_headers (file
))
10520 process_dynamic_section (file
);
10522 process_relocs (file
);
10524 process_unwind (file
);
10526 process_symbol_table (file
);
10528 process_syminfo (file
);
10530 process_version_sections (file
);
10532 process_section_contents (file
);
10534 process_notes (file
);
10536 process_gnu_liblist (file
);
10538 process_arch_specific (file
);
10540 if (program_headers
)
10542 free (program_headers
);
10543 program_headers
= NULL
;
10546 if (section_headers
)
10548 free (section_headers
);
10549 section_headers
= NULL
;
10554 free (string_table
);
10555 string_table
= NULL
;
10556 string_table_length
= 0;
10559 if (dynamic_strings
)
10561 free (dynamic_strings
);
10562 dynamic_strings
= NULL
;
10563 dynamic_strings_length
= 0;
10566 if (dynamic_symbols
)
10568 free (dynamic_symbols
);
10569 dynamic_symbols
= NULL
;
10570 num_dynamic_syms
= 0;
10573 if (dynamic_syminfo
)
10575 free (dynamic_syminfo
);
10576 dynamic_syminfo
= NULL
;
10579 if (section_headers_groups
)
10581 free (section_headers_groups
);
10582 section_headers_groups
= NULL
;
10585 if (section_groups
)
10587 struct group_list
*g
, *next
;
10589 for (i
= 0; i
< group_count
; i
++)
10591 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
10598 free (section_groups
);
10599 section_groups
= NULL
;
10602 free_debug_memory ();
10607 /* Process an ELF archive.
10608 On entry the file is positioned just after the ARMAG string. */
10611 process_archive (char *file_name
, FILE *file
)
10613 struct ar_hdr arhdr
;
10615 unsigned long size
;
10616 unsigned long index_num
= 0;
10617 unsigned long *index_array
= NULL
;
10618 char *sym_table
= NULL
;
10619 unsigned long sym_size
= 0;
10620 char *longnames
= NULL
;
10621 unsigned long longnames_size
= 0;
10622 size_t file_name_size
;
10627 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10628 if (got
!= sizeof arhdr
)
10633 error (_("%s: failed to read archive header\n"), file_name
);
10637 /* See if this is the archive symbol table. */
10638 if (const_strneq (arhdr
.ar_name
, "/ ")
10639 || const_strneq (arhdr
.ar_name
, "/SYM64/ "))
10641 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10642 size
= size
+ (size
& 1);
10644 if (do_archive_index
)
10647 /* A buffer used to hold numbers read in from an archive index.
10648 These are always 4 bytes long and stored in big-endian format. */
10649 #define SIZEOF_AR_INDEX_NUMBERS 4
10650 unsigned char integer_buffer
[SIZEOF_AR_INDEX_NUMBERS
];
10651 unsigned char * index_buffer
;
10653 /* Check the size of the archive index. */
10654 if (size
< SIZEOF_AR_INDEX_NUMBERS
)
10656 error (_("%s: the archive index is empty\n"), file_name
);
10660 /* Read the numer of entries in the archive index. */
10661 got
= fread (integer_buffer
, 1, sizeof integer_buffer
, file
);
10662 if (got
!= sizeof (integer_buffer
))
10664 error (_("%s: failed to read archive index\n"), file_name
);
10667 index_num
= byte_get_big_endian (integer_buffer
, sizeof integer_buffer
);
10668 size
-= SIZEOF_AR_INDEX_NUMBERS
;
10670 /* Read in the archive index. */
10671 if (size
< index_num
* SIZEOF_AR_INDEX_NUMBERS
)
10673 error (_("%s: the archive index is supposed to have %ld entries, but the size in the header is too small\n"),
10674 file_name
, index_num
);
10677 index_buffer
= malloc (index_num
* SIZEOF_AR_INDEX_NUMBERS
);
10678 if (index_buffer
== NULL
)
10680 error (_("Out of memory whilst trying to read archive symbol index\n"));
10683 got
= fread (index_buffer
, SIZEOF_AR_INDEX_NUMBERS
, index_num
, file
);
10684 if (got
!= index_num
)
10686 free (index_buffer
);
10687 error (_("%s: failed to read archive index\n"), file_name
);
10691 size
-= index_num
* SIZEOF_AR_INDEX_NUMBERS
;
10693 /* Convert the index numbers into the host's numeric format. */
10694 index_array
= malloc (index_num
* sizeof (* index_array
));
10695 if (index_array
== NULL
)
10697 free (index_buffer
);
10698 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
10702 for (i
= 0; i
< index_num
; i
++)
10703 index_array
[i
] = byte_get_big_endian ((unsigned char *)(index_buffer
+ (i
* SIZEOF_AR_INDEX_NUMBERS
)),
10704 SIZEOF_AR_INDEX_NUMBERS
);
10705 free (index_buffer
);
10707 /* The remaining space in the header is taken up by the symbol table. */
10710 error (_("%s: the archive has an index but no symbols\n"), file_name
);
10714 sym_table
= malloc (size
);
10716 if (sym_table
== NULL
)
10718 error (_("Out of memory whilst trying to read archive index symbol table\n"));
10722 got
= fread (sym_table
, 1, size
, file
);
10725 error (_("%s: failed to read archive index symbol table\n"), file_name
);
10732 if (fseek (file
, size
, SEEK_CUR
) != 0)
10734 error (_("%s: failed to skip archive symbol table\n"), file_name
);
10739 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10740 if (got
!= sizeof arhdr
)
10748 error (_("%s: failed to read archive header following archive index\n"), file_name
);
10753 else if (do_archive_index
)
10754 printf (_("%s has no archive index\n"), file_name
);
10756 if (const_strneq (arhdr
.ar_name
, "// "))
10758 /* This is the archive string table holding long member
10761 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10762 longnames
= malloc (longnames_size
);
10763 if (longnames
== NULL
)
10765 error (_("Out of memory reading long symbol names in archive\n"));
10770 if (fread (longnames
, longnames_size
, 1, file
) != 1)
10773 error (_("%s: failed to read long symbol name string table\n"), file_name
);
10778 if ((longnames_size
& 1) != 0)
10781 got
= fread (& arhdr
, 1, sizeof arhdr
, file
);
10782 if (got
!= sizeof arhdr
)
10788 error (_("%s: failed to read archive header following long symbol names\n"), file_name
);
10795 if (do_archive_index
)
10797 if (sym_table
== NULL
)
10798 error (_("%s: unable to dump the index as none was found\n"), file_name
);
10801 unsigned int i
, j
, k
, l
;
10803 unsigned long current_pos
;
10805 printf (_("Index of archive %s: (%ld entries, 0x%lx bytes in the symbol table)\n"),
10806 file_name
, index_num
, sym_size
);
10807 current_pos
= ftell (file
);
10809 for (i
= l
= 0; i
< index_num
; i
++)
10811 if ((i
== 0) || ((i
> 0) && (index_array
[i
] != index_array
[i
- 1])))
10813 if (fseek (file
, index_array
[i
], SEEK_SET
) != 0)
10815 error (_("%s: failed to seek to next file name\n"), file_name
);
10819 got
= fread (elf_name
, 1, 16, file
);
10822 error (_("%s: failed to read file name\n"), file_name
);
10827 if (elf_name
[0] == '/')
10829 /* We have a long name. */
10830 k
= j
= strtoul (elf_name
+ 1, NULL
, 10);
10831 while ((j
< longnames_size
) && (longnames
[j
] != '/'))
10833 longnames
[j
] = '\0';
10834 printf (_("Binary %s contains:\n"), longnames
+ k
);
10835 longnames
[j
] = '/';
10840 while ((elf_name
[j
] != '/') && (j
< 16))
10842 elf_name
[j
] = '\0';
10843 printf(_("Binary %s contains:\n"), elf_name
);
10848 error (_("%s: end of the symbol table reached before the end of the index\n"),
10852 printf ("\t%s\n", sym_table
+ l
);
10853 l
+= strlen (sym_table
+ l
) + 1;
10857 error (_("%s: symbols remain in the index symbol table, but without corresponding entries in the index table\n"),
10860 free (index_array
);
10861 index_array
= NULL
;
10864 if (fseek (file
, current_pos
, SEEK_SET
) != 0)
10866 error (_("%s: failed to seek back to start of object files in the archive\n"), file_name
);
10871 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
10872 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
10873 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
10874 && !do_section_groups
)
10875 return 0; /* Archive index only. */
10878 file_name_size
= strlen (file_name
);
10887 if (arhdr
.ar_name
[0] == '/')
10891 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
10892 if (off
>= longnames_size
)
10894 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
10899 name
= longnames
+ off
;
10900 nameend
= memchr (name
, '/', longnames_size
- off
);
10904 name
= arhdr
.ar_name
;
10905 nameend
= memchr (name
, '/', 16);
10908 if (nameend
== NULL
)
10910 error (_("%s: bad archive file name\n"), file_name
);
10915 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
10916 if (namealc
== NULL
)
10918 error (_("Out of memory\n"));
10923 memcpy (namealc
, file_name
, file_name_size
);
10924 namealc
[file_name_size
] = '(';
10925 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
10926 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
10927 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
10929 archive_file_offset
= ftell (file
);
10930 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
10932 ret
|= process_object (namealc
, file
);
10937 (archive_file_offset
10938 + archive_file_size
10939 + (archive_file_size
& 1)),
10942 error (_("%s: failed to seek to next archive header\n"), file_name
);
10947 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
10948 if (got
!= sizeof arhdr
)
10953 error (_("%s: failed to read archive header\n"), file_name
);
10960 if (index_array
!= NULL
)
10961 free (index_array
);
10962 if (sym_table
!= NULL
)
10964 if (longnames
!= NULL
)
10971 process_file (char *file_name
)
10974 struct stat statbuf
;
10975 char armag
[SARMAG
];
10978 if (stat (file_name
, &statbuf
) < 0)
10980 if (errno
== ENOENT
)
10981 error (_("'%s': No such file\n"), file_name
);
10983 error (_("Could not locate '%s'. System error message: %s\n"),
10984 file_name
, strerror (errno
));
10988 if (! S_ISREG (statbuf
.st_mode
))
10990 error (_("'%s' is not an ordinary file\n"), file_name
);
10994 file
= fopen (file_name
, "rb");
10997 error (_("Input file '%s' is not readable.\n"), file_name
);
11001 if (fread (armag
, SARMAG
, 1, file
) != 1)
11003 error (_("%s: Failed to read file's magic number\n"), file_name
);
11008 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
11009 ret
= process_archive (file_name
, file
);
11012 if (do_archive_index
)
11013 error (_("File %s is not an archive so its index cannot be displayed.\n"),
11017 archive_file_size
= archive_file_offset
= 0;
11018 ret
= process_object (file_name
, file
);
11026 #ifdef SUPPORT_DISASSEMBLY
11027 /* Needed by the i386 disassembler. For extra credit, someone could
11028 fix this so that we insert symbolic addresses here, esp for GOT/PLT
11032 print_address (unsigned int addr
, FILE *outfile
)
11034 fprintf (outfile
,"0x%8.8x", addr
);
11037 /* Needed by the i386 disassembler. */
11039 db_task_printsym (unsigned int addr
)
11041 print_address (addr
, stderr
);
11046 main (int argc
, char **argv
)
11050 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
11051 setlocale (LC_MESSAGES
, "");
11053 #if defined (HAVE_SETLOCALE)
11054 setlocale (LC_CTYPE
, "");
11056 bindtextdomain (PACKAGE
, LOCALEDIR
);
11057 textdomain (PACKAGE
);
11059 expandargv (&argc
, &argv
);
11061 parse_args (argc
, argv
);
11063 if (num_dump_sects
> 0)
11065 /* Make a copy of the dump_sects array. */
11066 cmdline_dump_sects
= malloc (num_dump_sects
* sizeof (* dump_sects
));
11067 if (cmdline_dump_sects
== NULL
)
11068 error (_("Out of memory allocating dump request table.\n"));
11071 memcpy (cmdline_dump_sects
, dump_sects
,
11072 num_dump_sects
* sizeof (* dump_sects
));
11073 num_cmdline_dump_sects
= num_dump_sects
;
11077 if (optind
< (argc
- 1))
11081 while (optind
< argc
)
11082 err
|= process_file (argv
[optind
++]);
11084 if (dump_sects
!= NULL
)
11086 if (cmdline_dump_sects
!= NULL
)
11087 free (cmdline_dump_sects
);