1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
5 Originally developed by Eric Youngdale <eric@andante.jic.com>
6 Modifications by Nick Clifton <nickc@redhat.com>
8 This file is part of GNU Binutils.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
25 /* The difference between readelf and objdump:
27 Both programs are capable of displaying the contents of ELF format files,
28 so why does the binutils project have two file dumpers ?
30 The reason is that objdump sees an ELF file through a BFD filter of the
31 world; if BFD has a bug where, say, it disagrees about a machine constant
32 in e_flags, then the odds are good that it will remain internally
33 consistent. The linker sees it the BFD way, objdump sees it the BFD way,
34 GAS sees it the BFD way. There was need for a tool to go find out what
35 the file actually says.
37 This is why the readelf program does not link against the BFD library - it
38 exists as an independent program to help verify the correct working of BFD.
40 There is also the case that readelf can provide more information about an
41 ELF file than is provided by objdump. In particular it can display DWARF
42 debugging information which (at the moment) objdump cannot. */
45 #include <sys/types.h>
57 # ifdef HAVE_SYS_PARAM_H
58 # include <sys/param.h>
62 # define PATH_MAX MAXPATHLEN
64 # define PATH_MAX 1024
70 /* Define BFD64 here, even if our default architecture is 32 bit ELF
71 as this will allow us to read in and parse 64bit and 32bit ELF files.
72 Only do this if we believe that the compiler can support a 64 bit
73 data type. For now we only rely on GCC being able to do this. */
79 #include "elf/common.h"
80 #include "elf/external.h"
81 #include "elf/internal.h"
84 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
85 we can obtain the H8 reloc numbers. We need these for the
86 get_reloc_size() function. We include h8.h again after defining
87 RELOC_MACROS_GEN_FUNC so that we get the naming function as well. */
92 /* Undo the effects of #including reloc-macros.h. */
94 #undef START_RELOC_NUMBERS
98 #undef END_RELOC_NUMBERS
99 #undef _RELOC_MACROS_H
101 /* The following headers use the elf/reloc-macros.h file to
102 automatically generate relocation recognition functions
103 such as elf_mips_reloc_type() */
105 #define RELOC_MACROS_GEN_FUNC
107 #include "elf/alpha.h"
111 #include "elf/bfin.h"
112 #include "elf/cris.h"
114 #include "elf/d10v.h"
115 #include "elf/d30v.h"
117 #include "elf/fr30.h"
120 #include "elf/hppa.h"
121 #include "elf/i386.h"
122 #include "elf/i370.h"
123 #include "elf/i860.h"
124 #include "elf/i960.h"
125 #include "elf/ia64.h"
126 #include "elf/ip2k.h"
127 #include "elf/iq2000.h"
128 #include "elf/m32c.h"
129 #include "elf/m32r.h"
130 #include "elf/m68k.h"
131 #include "elf/m68hc11.h"
132 #include "elf/mcore.h"
134 #include "elf/mips.h"
135 #include "elf/mmix.h"
136 #include "elf/mn10200.h"
137 #include "elf/mn10300.h"
139 #include "elf/msp430.h"
140 #include "elf/or32.h"
143 #include "elf/ppc64.h"
144 #include "elf/s390.h"
145 #include "elf/score.h"
147 #include "elf/sparc.h"
149 #include "elf/v850.h"
151 #include "elf/x86-64.h"
152 #include "elf/xstormy16.h"
153 #include "elf/xtensa.h"
159 #include "libiberty.h"
161 char *program_name
= "readelf";
162 static long archive_file_offset
;
163 static unsigned long archive_file_size
;
164 static unsigned long dynamic_addr
;
165 static bfd_size_type dynamic_size
;
166 static unsigned int dynamic_nent
;
167 static char *dynamic_strings
;
168 static unsigned long dynamic_strings_length
;
169 static char *string_table
;
170 static unsigned long string_table_length
;
171 static unsigned long num_dynamic_syms
;
172 static Elf_Internal_Sym
*dynamic_symbols
;
173 static Elf_Internal_Syminfo
*dynamic_syminfo
;
174 static unsigned long dynamic_syminfo_offset
;
175 static unsigned int dynamic_syminfo_nent
;
176 static char program_interpreter
[PATH_MAX
];
177 static bfd_vma dynamic_info
[DT_JMPREL
+ 1];
178 static bfd_vma dynamic_info_DT_GNU_HASH
;
179 static bfd_vma version_info
[16];
180 static Elf_Internal_Ehdr elf_header
;
181 static Elf_Internal_Shdr
*section_headers
;
182 static Elf_Internal_Phdr
*program_headers
;
183 static Elf_Internal_Dyn
*dynamic_section
;
184 static Elf_Internal_Shdr
*symtab_shndx_hdr
;
185 static int show_name
;
186 static int do_dynamic
;
189 static int do_sections
;
190 static int do_section_groups
;
191 static int do_section_details
;
192 static int do_segments
;
193 static int do_unwind
;
194 static int do_using_dynamic
;
195 static int do_header
;
197 static int do_version
;
199 static int do_histogram
;
200 static int do_debugging
;
203 static int is_32bit_elf
;
207 struct group_list
*next
;
208 unsigned int section_index
;
213 struct group_list
*root
;
214 unsigned int group_index
;
217 static size_t group_count
;
218 static struct group
*section_groups
;
219 static struct group
**section_headers_groups
;
221 /* A linked list of the section names for which dumps were requested
223 struct dump_list_entry
227 struct dump_list_entry
*next
;
229 static struct dump_list_entry
*dump_sects_byname
;
231 /* A dynamic array of flags indicating for which sections a hex dump
232 has been requested (via the -x switch) and/or a disassembly dump
233 (via the -i switch). */
234 char *cmdline_dump_sects
= NULL
;
235 unsigned num_cmdline_dump_sects
= 0;
237 /* A dynamic array of flags indicating for which sections a dump of
238 some kind has been requested. It is reset on a per-object file
239 basis and then initialised from the cmdline_dump_sects array,
240 the results of interpreting the -w switch, and the
241 dump_sects_byname list. */
242 char *dump_sects
= NULL
;
243 unsigned int num_dump_sects
= 0;
245 #define HEX_DUMP (1 << 0)
246 #define DISASS_DUMP (1 << 1)
247 #define DEBUG_DUMP (1 << 2)
249 /* How to print a vma value. */
250 typedef enum print_mode
262 static void (*byte_put
) (unsigned char *, bfd_vma
, int);
266 #define SECTION_NAME(X) \
267 ((X) == NULL ? "<none>" \
268 : string_table == NULL ? "<no-name>" \
269 : ((X)->sh_name >= string_table_length ? "<corrupt>" \
270 : string_table + (X)->sh_name))
272 /* Given st_shndx I, map to section_headers index. */
273 #define SECTION_HEADER_INDEX(I) \
274 ((I) < SHN_LORESERVE \
276 : ((I) <= SHN_HIRESERVE \
278 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
280 /* Reverse of the above. */
281 #define SECTION_HEADER_NUM(N) \
282 ((N) < SHN_LORESERVE \
284 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
286 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
288 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
290 #define BYTE_GET(field) byte_get (field, sizeof (field))
292 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
294 #define GET_ELF_SYMBOLS(file, section) \
295 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
296 : get_64bit_elf_symbols (file, section))
298 #define VALID_DYNAMIC_NAME(offset) ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
299 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
300 already been called and verified that the string exists. */
301 #define GET_DYNAMIC_NAME(offset) (dynamic_strings + offset)
303 /* This is just a bit of syntatic sugar. */
304 #define streq(a,b) (strcmp ((a), (b)) == 0)
305 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
306 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
309 get_data (void *var
, FILE *file
, long offset
, size_t size
, size_t nmemb
,
314 if (size
== 0 || nmemb
== 0)
317 if (fseek (file
, archive_file_offset
+ offset
, SEEK_SET
))
319 error (_("Unable to seek to 0x%lx for %s\n"),
320 archive_file_offset
+ offset
, reason
);
327 /* Check for overflow. */
328 if (nmemb
< (~(size_t) 0 - 1) / size
)
329 /* + 1 so that we can '\0' terminate invalid string table sections. */
330 mvar
= malloc (size
* nmemb
+ 1);
334 error (_("Out of memory allocating 0x%lx bytes for %s\n"),
335 (unsigned long)(size
* nmemb
), reason
);
339 ((char *) mvar
)[size
* nmemb
] = '\0';
342 if (fread (mvar
, size
, nmemb
, file
) != nmemb
)
344 error (_("Unable to read in 0x%lx bytes of %s\n"),
345 (unsigned long)(size
* nmemb
), reason
);
355 byte_put_little_endian (unsigned char *field
, bfd_vma value
, int size
)
360 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
361 field
[6] = ((value
>> 24) >> 24) & 0xff;
362 field
[5] = ((value
>> 24) >> 16) & 0xff;
363 field
[4] = ((value
>> 24) >> 8) & 0xff;
366 field
[3] = (value
>> 24) & 0xff;
367 field
[2] = (value
>> 16) & 0xff;
370 field
[1] = (value
>> 8) & 0xff;
373 field
[0] = value
& 0xff;
377 error (_("Unhandled data length: %d\n"), size
);
382 #if defined BFD64 && !BFD_HOST_64BIT_LONG
384 print_dec_vma (bfd_vma vma
, int is_signed
)
390 if (is_signed
&& (bfd_signed_vma
) vma
< 0)
399 *bufp
++ = '0' + vma
% 10;
411 print_hex_vma (bfd_vma vma
)
419 char digit
= '0' + (vma
& 0x0f);
421 digit
+= 'a' - '0' - 10;
434 /* Print a VMA value. */
436 print_vma (bfd_vma vma
, print_mode mode
)
445 return printf ("0x%8.8lx", (unsigned long) vma
);
448 return printf ("%8.8lx", (unsigned long) vma
);
452 return printf ("%5ld", (long) vma
);
456 return printf ("0x%lx", (unsigned long) vma
);
459 return printf ("%lx", (unsigned long) vma
);
462 return printf ("%ld", (unsigned long) vma
);
465 return printf ("%lu", (unsigned long) vma
);
488 #if BFD_HOST_64BIT_LONG
489 return nc
+ printf ("%lx", vma
);
491 return nc
+ print_hex_vma (vma
);
495 #if BFD_HOST_64BIT_LONG
496 return printf ("%ld", vma
);
498 return print_dec_vma (vma
, 1);
502 #if BFD_HOST_64BIT_LONG
504 return printf ("%5ld", vma
);
506 return printf ("%#lx", vma
);
509 return printf ("%5ld", _bfd_int64_low (vma
));
511 return print_hex_vma (vma
);
515 #if BFD_HOST_64BIT_LONG
516 return printf ("%lu", vma
);
518 return print_dec_vma (vma
, 0);
526 /* Display a symbol on stdout. If do_wide is not true then
527 format the symbol to be at most WIDTH characters,
528 truncating as necessary. If WIDTH is negative then
529 format the string to be exactly - WIDTH characters,
530 truncating or padding as necessary. */
533 print_symbol (int width
, const char *symbol
)
536 printf ("%s", symbol
);
538 printf ("%-*.*s", width
, width
, symbol
);
540 printf ("%-.*s", width
, symbol
);
544 byte_put_big_endian (unsigned char *field
, bfd_vma value
, int size
)
549 field
[7] = value
& 0xff;
550 field
[6] = (value
>> 8) & 0xff;
551 field
[5] = (value
>> 16) & 0xff;
552 field
[4] = (value
>> 24) & 0xff;
557 field
[3] = value
& 0xff;
558 field
[2] = (value
>> 8) & 0xff;
562 field
[1] = value
& 0xff;
566 field
[0] = value
& 0xff;
570 error (_("Unhandled data length: %d\n"), size
);
575 /* Return a pointer to section NAME, or NULL if no such section exists. */
577 static Elf_Internal_Shdr
*
578 find_section (const char *name
)
582 for (i
= 0; i
< elf_header
.e_shnum
; i
++)
583 if (streq (SECTION_NAME (section_headers
+ i
), name
))
584 return section_headers
+ i
;
589 /* Guess the relocation size commonly used by the specific machines. */
592 guess_is_rela (unsigned long e_machine
)
596 /* Targets that use REL relocations. */
612 /* Targets that use RELA relocations. */
616 case EM_ALTERA_NIOS2
:
640 case EM_CYGNUS_MN10200
:
642 case EM_CYGNUS_MN10300
:
683 warn (_("Don't know about relocations on this machine architecture\n"));
689 slurp_rela_relocs (FILE *file
,
690 unsigned long rel_offset
,
691 unsigned long rel_size
,
692 Elf_Internal_Rela
**relasp
,
693 unsigned long *nrelasp
)
695 Elf_Internal_Rela
*relas
;
696 unsigned long nrelas
;
701 Elf32_External_Rela
*erelas
;
703 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
707 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
709 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
714 error (_("out of memory parsing relocs"));
718 for (i
= 0; i
< nrelas
; i
++)
720 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
721 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
722 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
729 Elf64_External_Rela
*erelas
;
731 erelas
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
735 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
737 relas
= cmalloc (nrelas
, sizeof (Elf_Internal_Rela
));
742 error (_("out of memory parsing relocs"));
746 for (i
= 0; i
< nrelas
; i
++)
748 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
749 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
750 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
761 slurp_rel_relocs (FILE *file
,
762 unsigned long rel_offset
,
763 unsigned long rel_size
,
764 Elf_Internal_Rela
**relsp
,
765 unsigned long *nrelsp
)
767 Elf_Internal_Rela
*rels
;
773 Elf32_External_Rel
*erels
;
775 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
779 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
781 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
786 error (_("out of memory parsing relocs"));
790 for (i
= 0; i
< nrels
; i
++)
792 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
793 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
794 rels
[i
].r_addend
= 0;
801 Elf64_External_Rel
*erels
;
803 erels
= get_data (NULL
, file
, rel_offset
, 1, rel_size
, _("relocs"));
807 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
809 rels
= cmalloc (nrels
, sizeof (Elf_Internal_Rela
));
814 error (_("out of memory parsing relocs"));
818 for (i
= 0; i
< nrels
; i
++)
820 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
821 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
822 rels
[i
].r_addend
= 0;
832 /* Display the contents of the relocation data found at the specified
836 dump_relocations (FILE *file
,
837 unsigned long rel_offset
,
838 unsigned long rel_size
,
839 Elf_Internal_Sym
*symtab
,
842 unsigned long strtablen
,
846 Elf_Internal_Rela
*rels
;
849 if (is_rela
== UNKNOWN
)
850 is_rela
= guess_is_rela (elf_header
.e_machine
);
854 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
859 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
868 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
870 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
875 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
877 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
885 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
887 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
892 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
894 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
898 for (i
= 0; i
< rel_size
; i
++)
901 const char *rtype2
= NULL
;
902 const char *rtype3
= NULL
;
905 bfd_vma symtab_index
;
910 offset
= rels
[i
].r_offset
;
911 info
= rels
[i
].r_info
;
915 type
= ELF32_R_TYPE (info
);
916 symtab_index
= ELF32_R_SYM (info
);
920 /* The #ifdef BFD64 below is to prevent a compile time warning.
921 We know that if we do not have a 64 bit data type that we
922 will never execute this code anyway. */
924 if (elf_header
.e_machine
== EM_MIPS
)
926 /* In little-endian objects, r_info isn't really a 64-bit
927 little-endian value: it has a 32-bit little-endian
928 symbol index followed by four individual byte fields.
929 Reorder INFO accordingly. */
930 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
931 info
= (((info
& 0xffffffff) << 32)
932 | ((info
>> 56) & 0xff)
933 | ((info
>> 40) & 0xff00)
934 | ((info
>> 24) & 0xff0000)
935 | ((info
>> 8) & 0xff000000));
936 type
= ELF64_MIPS_R_TYPE (info
);
937 type2
= ELF64_MIPS_R_TYPE2 (info
);
938 type3
= ELF64_MIPS_R_TYPE3 (info
);
940 else if (elf_header
.e_machine
== EM_SPARCV9
)
941 type
= ELF64_R_TYPE_ID (info
);
943 type
= ELF64_R_TYPE (info
);
945 symtab_index
= ELF64_R_SYM (info
);
951 #ifdef _bfd_int64_low
952 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
954 printf ("%8.8lx %8.8lx ", offset
, info
);
959 #ifdef _bfd_int64_low
961 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
962 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
963 _bfd_int64_high (offset
),
964 _bfd_int64_low (offset
),
965 _bfd_int64_high (info
),
966 _bfd_int64_low (info
));
969 ? "%16.16lx %16.16lx "
970 : "%12.12lx %12.12lx ",
975 switch (elf_header
.e_machine
)
983 rtype
= elf_m32r_reloc_type (type
);
988 rtype
= elf_i386_reloc_type (type
);
993 rtype
= elf_m68hc11_reloc_type (type
);
997 rtype
= elf_m68k_reloc_type (type
);
1001 rtype
= elf_i960_reloc_type (type
);
1006 rtype
= elf_avr_reloc_type (type
);
1009 case EM_OLD_SPARCV9
:
1010 case EM_SPARC32PLUS
:
1013 rtype
= elf_sparc_reloc_type (type
);
1017 rtype
= elf_spu_reloc_type (type
);
1021 case EM_CYGNUS_V850
:
1022 rtype
= v850_reloc_type (type
);
1026 case EM_CYGNUS_D10V
:
1027 rtype
= elf_d10v_reloc_type (type
);
1031 case EM_CYGNUS_D30V
:
1032 rtype
= elf_d30v_reloc_type (type
);
1036 rtype
= elf_dlx_reloc_type (type
);
1040 rtype
= elf_sh_reloc_type (type
);
1044 case EM_CYGNUS_MN10300
:
1045 rtype
= elf_mn10300_reloc_type (type
);
1049 case EM_CYGNUS_MN10200
:
1050 rtype
= elf_mn10200_reloc_type (type
);
1054 case EM_CYGNUS_FR30
:
1055 rtype
= elf_fr30_reloc_type (type
);
1059 rtype
= elf_frv_reloc_type (type
);
1063 rtype
= elf_mcore_reloc_type (type
);
1067 rtype
= elf_mmix_reloc_type (type
);
1072 rtype
= elf_msp430_reloc_type (type
);
1076 rtype
= elf_ppc_reloc_type (type
);
1080 rtype
= elf_ppc64_reloc_type (type
);
1084 case EM_MIPS_RS3_LE
:
1085 rtype
= elf_mips_reloc_type (type
);
1088 rtype2
= elf_mips_reloc_type (type2
);
1089 rtype3
= elf_mips_reloc_type (type3
);
1094 rtype
= elf_alpha_reloc_type (type
);
1098 rtype
= elf_arm_reloc_type (type
);
1102 rtype
= elf_arc_reloc_type (type
);
1106 rtype
= elf_hppa_reloc_type (type
);
1112 rtype
= elf_h8_reloc_type (type
);
1117 rtype
= elf_or32_reloc_type (type
);
1122 rtype
= elf_pj_reloc_type (type
);
1125 rtype
= elf_ia64_reloc_type (type
);
1129 rtype
= elf_cris_reloc_type (type
);
1133 rtype
= elf_i860_reloc_type (type
);
1137 rtype
= elf_x86_64_reloc_type (type
);
1141 rtype
= i370_reloc_type (type
);
1146 rtype
= elf_s390_reloc_type (type
);
1150 rtype
= elf_score_reloc_type (type
);
1154 rtype
= elf_xstormy16_reloc_type (type
);
1158 rtype
= elf_crx_reloc_type (type
);
1162 rtype
= elf_vax_reloc_type (type
);
1167 rtype
= elf_ip2k_reloc_type (type
);
1171 rtype
= elf_iq2000_reloc_type (type
);
1176 rtype
= elf_xtensa_reloc_type (type
);
1180 rtype
= elf_m32c_reloc_type (type
);
1184 rtype
= elf_mt_reloc_type (type
);
1188 rtype
= elf_bfin_reloc_type (type
);
1192 rtype
= elf_mep_reloc_type (type
);
1197 #ifdef _bfd_int64_low
1198 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1200 printf (_("unrecognized: %-7lx"), type
);
1203 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1205 if (elf_header
.e_machine
== EM_ALPHA
1207 && streq (rtype
, "R_ALPHA_LITUSE")
1210 switch (rels
[i
].r_addend
)
1212 case LITUSE_ALPHA_ADDR
: rtype
= "ADDR"; break;
1213 case LITUSE_ALPHA_BASE
: rtype
= "BASE"; break;
1214 case LITUSE_ALPHA_BYTOFF
: rtype
= "BYTOFF"; break;
1215 case LITUSE_ALPHA_JSR
: rtype
= "JSR"; break;
1216 case LITUSE_ALPHA_TLSGD
: rtype
= "TLSGD"; break;
1217 case LITUSE_ALPHA_TLSLDM
: rtype
= "TLSLDM"; break;
1218 case LITUSE_ALPHA_JSRDIRECT
: rtype
= "JSRDIRECT"; break;
1219 default: rtype
= NULL
;
1222 printf (" (%s)", rtype
);
1226 printf (_("<unknown addend: %lx>"),
1227 (unsigned long) rels
[i
].r_addend
);
1230 else if (symtab_index
)
1232 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1233 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1236 Elf_Internal_Sym
*psym
;
1238 psym
= symtab
+ symtab_index
;
1241 print_vma (psym
->st_value
, LONG_HEX
);
1242 printf (is_32bit_elf
? " " : " ");
1244 if (psym
->st_name
== 0)
1246 const char *sec_name
= "<null>";
1249 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1251 bfd_vma sec_index
= (bfd_vma
) -1;
1253 if (psym
->st_shndx
< SHN_LORESERVE
)
1254 sec_index
= psym
->st_shndx
;
1255 else if (psym
->st_shndx
> SHN_HIRESERVE
)
1256 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1259 if (sec_index
!= (bfd_vma
) -1)
1260 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1261 else if (psym
->st_shndx
== SHN_ABS
)
1263 else if (psym
->st_shndx
== SHN_COMMON
)
1264 sec_name
= "COMMON";
1265 else if (elf_header
.e_machine
== EM_MIPS
1266 && psym
->st_shndx
== SHN_MIPS_SCOMMON
)
1267 sec_name
= "SCOMMON";
1268 else if (elf_header
.e_machine
== EM_MIPS
1269 && psym
->st_shndx
== SHN_MIPS_SUNDEFINED
)
1270 sec_name
= "SUNDEF";
1271 else if (elf_header
.e_machine
== EM_X86_64
1272 && psym
->st_shndx
== SHN_X86_64_LCOMMON
)
1273 sec_name
= "LARGE_COMMON";
1274 else if (elf_header
.e_machine
== EM_IA_64
1275 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
1276 && psym
->st_shndx
== SHN_IA_64_ANSI_COMMON
)
1277 sec_name
= "ANSI_COM";
1280 sprintf (name_buf
, "<section 0x%x>",
1281 (unsigned int) psym
->st_shndx
);
1282 sec_name
= name_buf
;
1285 print_symbol (22, sec_name
);
1287 else if (strtab
== NULL
)
1288 printf (_("<string table index: %3ld>"), psym
->st_name
);
1289 else if (psym
->st_name
>= strtablen
)
1290 printf (_("<corrupt string table index: %3ld>"), psym
->st_name
);
1292 print_symbol (22, strtab
+ psym
->st_name
);
1295 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1300 printf ("%*c", is_32bit_elf
?
1301 (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1302 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1305 if (elf_header
.e_machine
== EM_SPARCV9
1307 && streq (rtype
, "R_SPARC_OLO10"))
1308 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1312 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1314 printf (" Type2: ");
1317 #ifdef _bfd_int64_low
1318 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1320 printf (_("unrecognized: %-7lx"), type2
);
1323 printf ("%-17.17s", rtype2
);
1325 printf ("\n Type3: ");
1328 #ifdef _bfd_int64_low
1329 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1331 printf (_("unrecognized: %-7lx"), type3
);
1334 printf ("%-17.17s", rtype3
);
1346 get_mips_dynamic_type (unsigned long type
)
1350 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1351 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1352 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1353 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1354 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1355 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1356 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1357 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1358 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1359 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1360 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1361 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1362 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1363 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1364 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1365 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1366 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1367 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1368 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1369 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1370 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1371 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1372 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1373 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1374 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1375 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1376 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1377 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1378 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1379 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1380 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1381 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1382 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1383 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1384 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1385 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1386 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1387 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1388 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1389 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1390 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1391 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1392 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1399 get_sparc64_dynamic_type (unsigned long type
)
1403 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1410 get_ppc_dynamic_type (unsigned long type
)
1414 case DT_PPC_GOT
: return "PPC_GOT";
1421 get_ppc64_dynamic_type (unsigned long type
)
1425 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1426 case DT_PPC64_OPD
: return "PPC64_OPD";
1427 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1434 get_parisc_dynamic_type (unsigned long type
)
1438 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1439 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1440 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1441 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1442 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1443 case DT_HP_PREINIT
: return "HP_PREINIT";
1444 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1445 case DT_HP_NEEDED
: return "HP_NEEDED";
1446 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1447 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1448 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1449 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1450 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1451 case DT_HP_EPLTREL
: return "HP_GST_EPLTREL";
1452 case DT_HP_EPLTRELSZ
: return "HP_GST_EPLTRELSZ";
1453 case DT_HP_FILTERED
: return "HP_FILTERED";
1454 case DT_HP_FILTER_TLS
: return "HP_FILTER_TLS";
1455 case DT_HP_COMPAT_FILTERED
: return "HP_COMPAT_FILTERED";
1456 case DT_HP_LAZYLOAD
: return "HP_LAZYLOAD";
1457 case DT_HP_BIND_NOW_COUNT
: return "HP_BIND_NOW_COUNT";
1458 case DT_PLT
: return "PLT";
1459 case DT_PLT_SIZE
: return "PLT_SIZE";
1460 case DT_DLT
: return "DLT";
1461 case DT_DLT_SIZE
: return "DLT_SIZE";
1468 get_ia64_dynamic_type (unsigned long type
)
1472 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1479 get_alpha_dynamic_type (unsigned long type
)
1483 case DT_ALPHA_PLTRO
: return "ALPHA_PLTRO";
1490 get_score_dynamic_type (unsigned long type
)
1494 case DT_SCORE_BASE_ADDRESS
: return "SCORE_BASE_ADDRESS";
1495 case DT_SCORE_LOCAL_GOTNO
: return "SCORE_LOCAL_GOTNO";
1496 case DT_SCORE_SYMTABNO
: return "SCORE_SYMTABNO";
1497 case DT_SCORE_GOTSYM
: return "SCORE_GOTSYM";
1498 case DT_SCORE_UNREFEXTNO
: return "SCORE_UNREFEXTNO";
1499 case DT_SCORE_HIPAGENO
: return "SCORE_HIPAGENO";
1507 get_dynamic_type (unsigned long type
)
1509 static char buff
[64];
1513 case DT_NULL
: return "NULL";
1514 case DT_NEEDED
: return "NEEDED";
1515 case DT_PLTRELSZ
: return "PLTRELSZ";
1516 case DT_PLTGOT
: return "PLTGOT";
1517 case DT_HASH
: return "HASH";
1518 case DT_STRTAB
: return "STRTAB";
1519 case DT_SYMTAB
: return "SYMTAB";
1520 case DT_RELA
: return "RELA";
1521 case DT_RELASZ
: return "RELASZ";
1522 case DT_RELAENT
: return "RELAENT";
1523 case DT_STRSZ
: return "STRSZ";
1524 case DT_SYMENT
: return "SYMENT";
1525 case DT_INIT
: return "INIT";
1526 case DT_FINI
: return "FINI";
1527 case DT_SONAME
: return "SONAME";
1528 case DT_RPATH
: return "RPATH";
1529 case DT_SYMBOLIC
: return "SYMBOLIC";
1530 case DT_REL
: return "REL";
1531 case DT_RELSZ
: return "RELSZ";
1532 case DT_RELENT
: return "RELENT";
1533 case DT_PLTREL
: return "PLTREL";
1534 case DT_DEBUG
: return "DEBUG";
1535 case DT_TEXTREL
: return "TEXTREL";
1536 case DT_JMPREL
: return "JMPREL";
1537 case DT_BIND_NOW
: return "BIND_NOW";
1538 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1539 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1540 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1541 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1542 case DT_RUNPATH
: return "RUNPATH";
1543 case DT_FLAGS
: return "FLAGS";
1545 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1546 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1548 case DT_CHECKSUM
: return "CHECKSUM";
1549 case DT_PLTPADSZ
: return "PLTPADSZ";
1550 case DT_MOVEENT
: return "MOVEENT";
1551 case DT_MOVESZ
: return "MOVESZ";
1552 case DT_FEATURE
: return "FEATURE";
1553 case DT_POSFLAG_1
: return "POSFLAG_1";
1554 case DT_SYMINSZ
: return "SYMINSZ";
1555 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1557 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1558 case DT_CONFIG
: return "CONFIG";
1559 case DT_DEPAUDIT
: return "DEPAUDIT";
1560 case DT_AUDIT
: return "AUDIT";
1561 case DT_PLTPAD
: return "PLTPAD";
1562 case DT_MOVETAB
: return "MOVETAB";
1563 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1565 case DT_VERSYM
: return "VERSYM";
1567 case DT_TLSDESC_GOT
: return "TLSDESC_GOT";
1568 case DT_TLSDESC_PLT
: return "TLSDESC_PLT";
1569 case DT_RELACOUNT
: return "RELACOUNT";
1570 case DT_RELCOUNT
: return "RELCOUNT";
1571 case DT_FLAGS_1
: return "FLAGS_1";
1572 case DT_VERDEF
: return "VERDEF";
1573 case DT_VERDEFNUM
: return "VERDEFNUM";
1574 case DT_VERNEED
: return "VERNEED";
1575 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1577 case DT_AUXILIARY
: return "AUXILIARY";
1578 case DT_USED
: return "USED";
1579 case DT_FILTER
: return "FILTER";
1581 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1582 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1583 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1584 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1585 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1586 case DT_GNU_HASH
: return "GNU_HASH";
1589 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1593 switch (elf_header
.e_machine
)
1596 case EM_MIPS_RS3_LE
:
1597 result
= get_mips_dynamic_type (type
);
1600 result
= get_sparc64_dynamic_type (type
);
1603 result
= get_ppc_dynamic_type (type
);
1606 result
= get_ppc64_dynamic_type (type
);
1609 result
= get_ia64_dynamic_type (type
);
1612 result
= get_alpha_dynamic_type (type
);
1615 result
= get_score_dynamic_type (type
);
1625 snprintf (buff
, sizeof (buff
), _("Processor Specific: %lx"), type
);
1627 else if (((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1628 || (elf_header
.e_machine
== EM_PARISC
1629 && (type
>= OLD_DT_LOOS
) && (type
<= OLD_DT_HIOS
)))
1633 switch (elf_header
.e_machine
)
1636 result
= get_parisc_dynamic_type (type
);
1646 snprintf (buff
, sizeof (buff
), _("Operating System specific: %lx"),
1650 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), type
);
1657 get_file_type (unsigned e_type
)
1659 static char buff
[32];
1663 case ET_NONE
: return _("NONE (None)");
1664 case ET_REL
: return _("REL (Relocatable file)");
1665 case ET_EXEC
: return _("EXEC (Executable file)");
1666 case ET_DYN
: return _("DYN (Shared object file)");
1667 case ET_CORE
: return _("CORE (Core file)");
1670 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1671 snprintf (buff
, sizeof (buff
), _("Processor Specific: (%x)"), e_type
);
1672 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1673 snprintf (buff
, sizeof (buff
), _("OS Specific: (%x)"), e_type
);
1675 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_type
);
1681 get_machine_name (unsigned e_machine
)
1683 static char buff
[64]; /* XXX */
1687 case EM_NONE
: return _("None");
1688 case EM_M32
: return "WE32100";
1689 case EM_SPARC
: return "Sparc";
1690 case EM_SPU
: return "SPU";
1691 case EM_386
: return "Intel 80386";
1692 case EM_68K
: return "MC68000";
1693 case EM_88K
: return "MC88000";
1694 case EM_486
: return "Intel 80486";
1695 case EM_860
: return "Intel 80860";
1696 case EM_MIPS
: return "MIPS R3000";
1697 case EM_S370
: return "IBM System/370";
1698 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1699 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1700 case EM_PARISC
: return "HPPA";
1701 case EM_PPC_OLD
: return "Power PC (old)";
1702 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1703 case EM_960
: return "Intel 90860";
1704 case EM_PPC
: return "PowerPC";
1705 case EM_PPC64
: return "PowerPC64";
1706 case EM_V800
: return "NEC V800";
1707 case EM_FR20
: return "Fujitsu FR20";
1708 case EM_RH32
: return "TRW RH32";
1709 case EM_MCORE
: return "MCORE";
1710 case EM_ARM
: return "ARM";
1711 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1712 case EM_SH
: return "Renesas / SuperH SH";
1713 case EM_SPARCV9
: return "Sparc v9";
1714 case EM_TRICORE
: return "Siemens Tricore";
1715 case EM_ARC
: return "ARC";
1716 case EM_H8_300
: return "Renesas H8/300";
1717 case EM_H8_300H
: return "Renesas H8/300H";
1718 case EM_H8S
: return "Renesas H8S";
1719 case EM_H8_500
: return "Renesas H8/500";
1720 case EM_IA_64
: return "Intel IA-64";
1721 case EM_MIPS_X
: return "Stanford MIPS-X";
1722 case EM_COLDFIRE
: return "Motorola Coldfire";
1723 case EM_68HC12
: return "Motorola M68HC12";
1724 case EM_ALPHA
: return "Alpha";
1725 case EM_CYGNUS_D10V
:
1726 case EM_D10V
: return "d10v";
1727 case EM_CYGNUS_D30V
:
1728 case EM_D30V
: return "d30v";
1729 case EM_CYGNUS_M32R
:
1730 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1731 case EM_CYGNUS_V850
:
1732 case EM_V850
: return "NEC v850";
1733 case EM_CYGNUS_MN10300
:
1734 case EM_MN10300
: return "mn10300";
1735 case EM_CYGNUS_MN10200
:
1736 case EM_MN10200
: return "mn10200";
1737 case EM_CYGNUS_FR30
:
1738 case EM_FR30
: return "Fujitsu FR30";
1739 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1741 case EM_PJ
: return "picoJava";
1742 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1743 case EM_PCP
: return "Siemens PCP";
1744 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1745 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1746 case EM_STARCORE
: return "Motorola Star*Core processor";
1747 case EM_ME16
: return "Toyota ME16 processor";
1748 case EM_ST100
: return "STMicroelectronics ST100 processor";
1749 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1750 case EM_FX66
: return "Siemens FX66 microcontroller";
1751 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1752 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1753 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1754 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1755 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1756 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1757 case EM_SVX
: return "Silicon Graphics SVx";
1758 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1759 case EM_VAX
: return "Digital VAX";
1761 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1762 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1763 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1764 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1765 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1766 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1767 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1768 case EM_PRISM
: return "Vitesse Prism";
1769 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1771 case EM_S390
: return "IBM S/390";
1772 case EM_SCORE
: return "SUNPLUS S+Core";
1773 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1775 case EM_OR32
: return "OpenRISC";
1776 case EM_CRX
: return "National Semiconductor CRX microprocessor";
1777 case EM_DLX
: return "OpenDLX";
1779 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1780 case EM_IQ2000
: return "Vitesse IQ2000";
1782 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1783 case EM_M32C
: return "Renesas M32c";
1784 case EM_MT
: return "Morpho Techologies MT processor";
1785 case EM_BLACKFIN
: return "Analog Devices Blackfin";
1786 case EM_NIOS32
: return "Altera Nios";
1787 case EM_ALTERA_NIOS2
: return "Altera Nios II";
1788 case EM_XC16X
: return "Infineon Technologies xc16x";
1789 case EM_CYGNUS_MEP
: return "Toshiba MeP Media Engine";
1791 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), e_machine
);
1797 decode_ARM_machine_flags (unsigned e_flags
, char buf
[])
1802 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1803 e_flags
&= ~ EF_ARM_EABIMASK
;
1805 /* Handle "generic" ARM flags. */
1806 if (e_flags
& EF_ARM_RELEXEC
)
1808 strcat (buf
, ", relocatable executable");
1809 e_flags
&= ~ EF_ARM_RELEXEC
;
1812 if (e_flags
& EF_ARM_HASENTRY
)
1814 strcat (buf
, ", has entry point");
1815 e_flags
&= ~ EF_ARM_HASENTRY
;
1818 /* Now handle EABI specific flags. */
1822 strcat (buf
, ", <unrecognized EABI>");
1827 case EF_ARM_EABI_VER1
:
1828 strcat (buf
, ", Version1 EABI");
1833 /* Process flags one bit at a time. */
1834 flag
= e_flags
& - e_flags
;
1839 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1840 strcat (buf
, ", sorted symbol tables");
1850 case EF_ARM_EABI_VER2
:
1851 strcat (buf
, ", Version2 EABI");
1856 /* Process flags one bit at a time. */
1857 flag
= e_flags
& - e_flags
;
1862 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1863 strcat (buf
, ", sorted symbol tables");
1866 case EF_ARM_DYNSYMSUSESEGIDX
:
1867 strcat (buf
, ", dynamic symbols use segment index");
1870 case EF_ARM_MAPSYMSFIRST
:
1871 strcat (buf
, ", mapping symbols precede others");
1881 case EF_ARM_EABI_VER3
:
1882 strcat (buf
, ", Version3 EABI");
1885 case EF_ARM_EABI_VER4
:
1886 strcat (buf
, ", Version4 EABI");
1889 case EF_ARM_EABI_VER5
:
1890 strcat (buf
, ", Version5 EABI");
1896 /* Process flags one bit at a time. */
1897 flag
= e_flags
& - e_flags
;
1903 strcat (buf
, ", BE8");
1907 strcat (buf
, ", LE8");
1917 case EF_ARM_EABI_UNKNOWN
:
1918 strcat (buf
, ", GNU EABI");
1923 /* Process flags one bit at a time. */
1924 flag
= e_flags
& - e_flags
;
1929 case EF_ARM_INTERWORK
:
1930 strcat (buf
, ", interworking enabled");
1933 case EF_ARM_APCS_26
:
1934 strcat (buf
, ", uses APCS/26");
1937 case EF_ARM_APCS_FLOAT
:
1938 strcat (buf
, ", uses APCS/float");
1942 strcat (buf
, ", position independent");
1946 strcat (buf
, ", 8 bit structure alignment");
1949 case EF_ARM_NEW_ABI
:
1950 strcat (buf
, ", uses new ABI");
1953 case EF_ARM_OLD_ABI
:
1954 strcat (buf
, ", uses old ABI");
1957 case EF_ARM_SOFT_FLOAT
:
1958 strcat (buf
, ", software FP");
1961 case EF_ARM_VFP_FLOAT
:
1962 strcat (buf
, ", VFP");
1965 case EF_ARM_MAVERICK_FLOAT
:
1966 strcat (buf
, ", Maverick FP");
1977 strcat (buf
,", <unknown>");
1981 get_machine_flags (unsigned e_flags
, unsigned e_machine
)
1983 static char buf
[1024];
1995 decode_ARM_machine_flags (e_flags
, buf
);
1999 switch (e_flags
& EF_FRV_CPU_MASK
)
2001 case EF_FRV_CPU_GENERIC
:
2005 strcat (buf
, ", fr???");
2008 case EF_FRV_CPU_FR300
:
2009 strcat (buf
, ", fr300");
2012 case EF_FRV_CPU_FR400
:
2013 strcat (buf
, ", fr400");
2015 case EF_FRV_CPU_FR405
:
2016 strcat (buf
, ", fr405");
2019 case EF_FRV_CPU_FR450
:
2020 strcat (buf
, ", fr450");
2023 case EF_FRV_CPU_FR500
:
2024 strcat (buf
, ", fr500");
2026 case EF_FRV_CPU_FR550
:
2027 strcat (buf
, ", fr550");
2030 case EF_FRV_CPU_SIMPLE
:
2031 strcat (buf
, ", simple");
2033 case EF_FRV_CPU_TOMCAT
:
2034 strcat (buf
, ", tomcat");
2040 if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_M68000
)
2041 strcat (buf
, ", m68000");
2042 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_CPU32
)
2043 strcat (buf
, ", cpu32");
2044 else if ((e_flags
& EF_M68K_ARCH_MASK
) == EF_M68K_FIDO
)
2045 strcat (buf
, ", fido_a");
2048 char const *isa
= _("unknown");
2049 char const *mac
= _("unknown mac");
2050 char const *additional
= NULL
;
2052 switch (e_flags
& EF_M68K_CF_ISA_MASK
)
2054 case EF_M68K_CF_ISA_A_NODIV
:
2056 additional
= ", nodiv";
2058 case EF_M68K_CF_ISA_A
:
2061 case EF_M68K_CF_ISA_A_PLUS
:
2064 case EF_M68K_CF_ISA_B_NOUSP
:
2066 additional
= ", nousp";
2068 case EF_M68K_CF_ISA_B
:
2072 strcat (buf
, ", cf, isa ");
2075 strcat (buf
, additional
);
2076 if (e_flags
& EF_M68K_CF_FLOAT
)
2077 strcat (buf
, ", float");
2078 switch (e_flags
& EF_M68K_CF_MAC_MASK
)
2083 case EF_M68K_CF_MAC
:
2086 case EF_M68K_CF_EMAC
:
2099 if (e_flags
& EF_PPC_EMB
)
2100 strcat (buf
, ", emb");
2102 if (e_flags
& EF_PPC_RELOCATABLE
)
2103 strcat (buf
, ", relocatable");
2105 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2106 strcat (buf
, ", relocatable-lib");
2110 case EM_CYGNUS_V850
:
2111 switch (e_flags
& EF_V850_ARCH
)
2114 strcat (buf
, ", v850e1");
2117 strcat (buf
, ", v850e");
2120 strcat (buf
, ", v850");
2123 strcat (buf
, ", unknown v850 architecture variant");
2129 case EM_CYGNUS_M32R
:
2130 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2131 strcat (buf
, ", m32r");
2135 case EM_MIPS_RS3_LE
:
2136 if (e_flags
& EF_MIPS_NOREORDER
)
2137 strcat (buf
, ", noreorder");
2139 if (e_flags
& EF_MIPS_PIC
)
2140 strcat (buf
, ", pic");
2142 if (e_flags
& EF_MIPS_CPIC
)
2143 strcat (buf
, ", cpic");
2145 if (e_flags
& EF_MIPS_UCODE
)
2146 strcat (buf
, ", ugen_reserved");
2148 if (e_flags
& EF_MIPS_ABI2
)
2149 strcat (buf
, ", abi2");
2151 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2152 strcat (buf
, ", odk first");
2154 if (e_flags
& EF_MIPS_32BITMODE
)
2155 strcat (buf
, ", 32bitmode");
2157 switch ((e_flags
& EF_MIPS_MACH
))
2159 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2160 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2161 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2162 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2163 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2164 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2165 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2166 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2167 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2168 case E_MIPS_MACH_9000
: strcat (buf
, ", 9000"); break;
2170 /* We simply ignore the field in this case to avoid confusion:
2171 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2174 default: strcat (buf
, ", unknown CPU"); break;
2177 switch ((e_flags
& EF_MIPS_ABI
))
2179 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2180 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2181 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2182 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2184 /* We simply ignore the field in this case to avoid confusion:
2185 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2186 This means it is likely to be an o32 file, but not for
2189 default: strcat (buf
, ", unknown ABI"); break;
2192 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2193 strcat (buf
, ", mdmx");
2195 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2196 strcat (buf
, ", mips16");
2198 switch ((e_flags
& EF_MIPS_ARCH
))
2200 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2201 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2202 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2203 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2204 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2205 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2206 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2207 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2208 case E_MIPS_ARCH_64R2
: strcat (buf
, ", mips64r2"); break;
2209 default: strcat (buf
, ", unknown ISA"); break;
2215 switch ((e_flags
& EF_SH_MACH_MASK
))
2217 case EF_SH1
: strcat (buf
, ", sh1"); break;
2218 case EF_SH2
: strcat (buf
, ", sh2"); break;
2219 case EF_SH3
: strcat (buf
, ", sh3"); break;
2220 case EF_SH_DSP
: strcat (buf
, ", sh-dsp"); break;
2221 case EF_SH3_DSP
: strcat (buf
, ", sh3-dsp"); break;
2222 case EF_SH4AL_DSP
: strcat (buf
, ", sh4al-dsp"); break;
2223 case EF_SH3E
: strcat (buf
, ", sh3e"); break;
2224 case EF_SH4
: strcat (buf
, ", sh4"); break;
2225 case EF_SH5
: strcat (buf
, ", sh5"); break;
2226 case EF_SH2E
: strcat (buf
, ", sh2e"); break;
2227 case EF_SH4A
: strcat (buf
, ", sh4a"); break;
2228 case EF_SH2A
: strcat (buf
, ", sh2a"); break;
2229 case EF_SH4_NOFPU
: strcat (buf
, ", sh4-nofpu"); break;
2230 case EF_SH4A_NOFPU
: strcat (buf
, ", sh4a-nofpu"); break;
2231 case EF_SH2A_NOFPU
: strcat (buf
, ", sh2a-nofpu"); break;
2232 case EF_SH3_NOMMU
: strcat (buf
, ", sh3-nommu"); break;
2233 case EF_SH4_NOMMU_NOFPU
: strcat (buf
, ", sh4-nommu-nofpu"); break;
2234 case EF_SH2A_SH4_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
2235 case EF_SH2A_SH3_NOFPU
: strcat (buf
, ", sh2a-nofpu-or-sh3-nommu"); break;
2236 case EF_SH2A_SH4
: strcat (buf
, ", sh2a-or-sh4"); break;
2237 case EF_SH2A_SH3E
: strcat (buf
, ", sh2a-or-sh3e"); break;
2238 default: strcat (buf
, ", unknown ISA"); break;
2244 if (e_flags
& EF_SPARC_32PLUS
)
2245 strcat (buf
, ", v8+");
2247 if (e_flags
& EF_SPARC_SUN_US1
)
2248 strcat (buf
, ", ultrasparcI");
2250 if (e_flags
& EF_SPARC_SUN_US3
)
2251 strcat (buf
, ", ultrasparcIII");
2253 if (e_flags
& EF_SPARC_HAL_R1
)
2254 strcat (buf
, ", halr1");
2256 if (e_flags
& EF_SPARC_LEDATA
)
2257 strcat (buf
, ", ledata");
2259 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2260 strcat (buf
, ", tso");
2262 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2263 strcat (buf
, ", pso");
2265 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2266 strcat (buf
, ", rmo");
2270 switch (e_flags
& EF_PARISC_ARCH
)
2272 case EFA_PARISC_1_0
:
2273 strcpy (buf
, ", PA-RISC 1.0");
2275 case EFA_PARISC_1_1
:
2276 strcpy (buf
, ", PA-RISC 1.1");
2278 case EFA_PARISC_2_0
:
2279 strcpy (buf
, ", PA-RISC 2.0");
2284 if (e_flags
& EF_PARISC_TRAPNIL
)
2285 strcat (buf
, ", trapnil");
2286 if (e_flags
& EF_PARISC_EXT
)
2287 strcat (buf
, ", ext");
2288 if (e_flags
& EF_PARISC_LSB
)
2289 strcat (buf
, ", lsb");
2290 if (e_flags
& EF_PARISC_WIDE
)
2291 strcat (buf
, ", wide");
2292 if (e_flags
& EF_PARISC_NO_KABP
)
2293 strcat (buf
, ", no kabp");
2294 if (e_flags
& EF_PARISC_LAZYSWAP
)
2295 strcat (buf
, ", lazyswap");
2300 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2301 strcat (buf
, ", new calling convention");
2303 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2304 strcat (buf
, ", gnu calling convention");
2308 if ((e_flags
& EF_IA_64_ABI64
))
2309 strcat (buf
, ", 64-bit");
2311 strcat (buf
, ", 32-bit");
2312 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2313 strcat (buf
, ", reduced fp model");
2314 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2315 strcat (buf
, ", no function descriptors, constant gp");
2316 else if ((e_flags
& EF_IA_64_CONS_GP
))
2317 strcat (buf
, ", constant gp");
2318 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2319 strcat (buf
, ", absolute");
2323 if ((e_flags
& EF_VAX_NONPIC
))
2324 strcat (buf
, ", non-PIC");
2325 if ((e_flags
& EF_VAX_DFLOAT
))
2326 strcat (buf
, ", D-Float");
2327 if ((e_flags
& EF_VAX_GFLOAT
))
2328 strcat (buf
, ", G-Float");
2337 get_osabi_name (unsigned int osabi
)
2339 static char buff
[32];
2343 case ELFOSABI_NONE
: return "UNIX - System V";
2344 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2345 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2346 case ELFOSABI_LINUX
: return "UNIX - Linux";
2347 case ELFOSABI_HURD
: return "GNU/Hurd";
2348 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2349 case ELFOSABI_AIX
: return "UNIX - AIX";
2350 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2351 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2352 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2353 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2354 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2355 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2356 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2357 case ELFOSABI_AROS
: return "Amiga Research OS";
2358 case ELFOSABI_STANDALONE
: return _("Standalone App");
2359 case ELFOSABI_ARM
: return "ARM";
2361 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), osabi
);
2367 get_arm_segment_type (unsigned long type
)
2381 get_mips_segment_type (unsigned long type
)
2385 case PT_MIPS_REGINFO
:
2387 case PT_MIPS_RTPROC
:
2389 case PT_MIPS_OPTIONS
:
2399 get_parisc_segment_type (unsigned long type
)
2403 case PT_HP_TLS
: return "HP_TLS";
2404 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2405 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2406 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2407 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2408 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2409 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2410 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2411 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2412 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2413 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2414 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2415 case PT_HP_OPT_ANNOT
: return "HP_OPT_ANNOT";
2416 case PT_HP_HSL_ANNOT
: return "HP_HSL_ANNOT";
2417 case PT_HP_STACK
: return "HP_STACK";
2418 case PT_HP_CORE_UTSNAME
: return "HP_CORE_UTSNAME";
2419 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2420 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2421 case PT_PARISC_WEAKORDER
: return "PARISC_WEAKORDER";
2430 get_ia64_segment_type (unsigned long type
)
2434 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2435 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2436 case PT_HP_TLS
: return "HP_TLS";
2437 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2438 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2439 case PT_IA_64_HP_STACK
: return "HP_STACK";
2448 get_segment_type (unsigned long p_type
)
2450 static char buff
[32];
2454 case PT_NULL
: return "NULL";
2455 case PT_LOAD
: return "LOAD";
2456 case PT_DYNAMIC
: return "DYNAMIC";
2457 case PT_INTERP
: return "INTERP";
2458 case PT_NOTE
: return "NOTE";
2459 case PT_SHLIB
: return "SHLIB";
2460 case PT_PHDR
: return "PHDR";
2461 case PT_TLS
: return "TLS";
2463 case PT_GNU_EH_FRAME
:
2464 return "GNU_EH_FRAME";
2465 case PT_GNU_STACK
: return "GNU_STACK";
2466 case PT_GNU_RELRO
: return "GNU_RELRO";
2469 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2473 switch (elf_header
.e_machine
)
2476 result
= get_arm_segment_type (p_type
);
2479 case EM_MIPS_RS3_LE
:
2480 result
= get_mips_segment_type (p_type
);
2483 result
= get_parisc_segment_type (p_type
);
2486 result
= get_ia64_segment_type (p_type
);
2496 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2498 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2502 switch (elf_header
.e_machine
)
2505 result
= get_parisc_segment_type (p_type
);
2508 result
= get_ia64_segment_type (p_type
);
2518 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2521 snprintf (buff
, sizeof (buff
), _("<unknown>: %lx"), p_type
);
2528 get_mips_section_type_name (unsigned int sh_type
)
2532 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2533 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2534 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2535 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2536 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2537 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2538 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2539 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2540 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2541 case SHT_MIPS_RELD
: return "MIPS_RELD";
2542 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2543 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2544 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2545 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2546 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2547 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2548 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2549 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2550 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2551 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2552 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2553 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2554 case SHT_MIPS_LINE
: return "MIPS_LINE";
2555 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2556 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2557 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2558 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2559 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2560 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2561 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2562 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2563 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2564 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2565 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2566 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2567 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2568 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2569 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2570 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2578 get_parisc_section_type_name (unsigned int sh_type
)
2582 case SHT_PARISC_EXT
: return "PARISC_EXT";
2583 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2584 case SHT_PARISC_DOC
: return "PARISC_DOC";
2585 case SHT_PARISC_ANNOT
: return "PARISC_ANNOT";
2586 case SHT_PARISC_SYMEXTN
: return "PARISC_SYMEXTN";
2587 case SHT_PARISC_STUBS
: return "PARISC_STUBS";
2588 case SHT_PARISC_DLKM
: return "PARISC_DLKM";
2596 get_ia64_section_type_name (unsigned int sh_type
)
2598 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2599 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2600 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2604 case SHT_IA_64_EXT
: return "IA_64_EXT";
2605 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2606 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2614 get_x86_64_section_type_name (unsigned int sh_type
)
2618 case SHT_X86_64_UNWIND
: return "X86_64_UNWIND";
2626 get_arm_section_type_name (unsigned int sh_type
)
2632 case SHT_ARM_PREEMPTMAP
:
2633 return "ARM_PREEMPTMAP";
2634 case SHT_ARM_ATTRIBUTES
:
2635 return "ARM_ATTRIBUTES";
2643 get_section_type_name (unsigned int sh_type
)
2645 static char buff
[32];
2649 case SHT_NULL
: return "NULL";
2650 case SHT_PROGBITS
: return "PROGBITS";
2651 case SHT_SYMTAB
: return "SYMTAB";
2652 case SHT_STRTAB
: return "STRTAB";
2653 case SHT_RELA
: return "RELA";
2654 case SHT_HASH
: return "HASH";
2655 case SHT_DYNAMIC
: return "DYNAMIC";
2656 case SHT_NOTE
: return "NOTE";
2657 case SHT_NOBITS
: return "NOBITS";
2658 case SHT_REL
: return "REL";
2659 case SHT_SHLIB
: return "SHLIB";
2660 case SHT_DYNSYM
: return "DYNSYM";
2661 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2662 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2663 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2664 case SHT_GNU_HASH
: return "GNU_HASH";
2665 case SHT_GROUP
: return "GROUP";
2666 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2667 case SHT_GNU_verdef
: return "VERDEF";
2668 case SHT_GNU_verneed
: return "VERNEED";
2669 case SHT_GNU_versym
: return "VERSYM";
2670 case 0x6ffffff0: return "VERSYM";
2671 case 0x6ffffffc: return "VERDEF";
2672 case 0x7ffffffd: return "AUXILIARY";
2673 case 0x7fffffff: return "FILTER";
2674 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2677 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2681 switch (elf_header
.e_machine
)
2684 case EM_MIPS_RS3_LE
:
2685 result
= get_mips_section_type_name (sh_type
);
2688 result
= get_parisc_section_type_name (sh_type
);
2691 result
= get_ia64_section_type_name (sh_type
);
2694 result
= get_x86_64_section_type_name (sh_type
);
2697 result
= get_arm_section_type_name (sh_type
);
2707 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2709 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2710 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2711 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2712 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2714 snprintf (buff
, sizeof (buff
), _("<unknown>: %x"), sh_type
);
2720 #define OPTION_DEBUG_DUMP 512
2722 static struct option options
[] =
2724 {"all", no_argument
, 0, 'a'},
2725 {"file-header", no_argument
, 0, 'h'},
2726 {"program-headers", no_argument
, 0, 'l'},
2727 {"headers", no_argument
, 0, 'e'},
2728 {"histogram", no_argument
, 0, 'I'},
2729 {"segments", no_argument
, 0, 'l'},
2730 {"sections", no_argument
, 0, 'S'},
2731 {"section-headers", no_argument
, 0, 'S'},
2732 {"section-groups", no_argument
, 0, 'g'},
2733 {"section-details", no_argument
, 0, 't'},
2734 {"full-section-name",no_argument
, 0, 'N'},
2735 {"symbols", no_argument
, 0, 's'},
2736 {"syms", no_argument
, 0, 's'},
2737 {"relocs", no_argument
, 0, 'r'},
2738 {"notes", no_argument
, 0, 'n'},
2739 {"dynamic", no_argument
, 0, 'd'},
2740 {"arch-specific", no_argument
, 0, 'A'},
2741 {"version-info", no_argument
, 0, 'V'},
2742 {"use-dynamic", no_argument
, 0, 'D'},
2743 {"hex-dump", required_argument
, 0, 'x'},
2744 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2745 {"unwind", no_argument
, 0, 'u'},
2746 #ifdef SUPPORT_DISASSEMBLY
2747 {"instruction-dump", required_argument
, 0, 'i'},
2750 {"version", no_argument
, 0, 'v'},
2751 {"wide", no_argument
, 0, 'W'},
2752 {"help", no_argument
, 0, 'H'},
2753 {0, no_argument
, 0, 0}
2759 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2760 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2761 fprintf (stdout
, _(" Options are:\n\
2762 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2763 -h --file-header Display the ELF file header\n\
2764 -l --program-headers Display the program headers\n\
2765 --segments An alias for --program-headers\n\
2766 -S --section-headers Display the sections' header\n\
2767 --sections An alias for --section-headers\n\
2768 -g --section-groups Display the section groups\n\
2769 -t --section-details Display the section details\n\
2770 -e --headers Equivalent to: -h -l -S\n\
2771 -s --syms Display the symbol table\n\
2772 --symbols An alias for --syms\n\
2773 -n --notes Display the core notes (if present)\n\
2774 -r --relocs Display the relocations (if present)\n\
2775 -u --unwind Display the unwind info (if present)\n\
2776 -d --dynamic Display the dynamic section (if present)\n\
2777 -V --version-info Display the version sections (if present)\n\
2778 -A --arch-specific Display architecture specific information (if any).\n\
2779 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2780 -x --hex-dump=<number> Dump the contents of section <number>\n\
2781 -w[liaprmfFsoR] or\n\
2782 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]\n\
2783 Display the contents of DWARF2 debug sections\n"));
2784 #ifdef SUPPORT_DISASSEMBLY
2785 fprintf (stdout
, _("\
2786 -i --instruction-dump=<number>\n\
2787 Disassemble the contents of section <number>\n"));
2789 fprintf (stdout
, _("\
2790 -I --histogram Display histogram of bucket list lengths\n\
2791 -W --wide Allow output width to exceed 80 characters\n\
2792 @<file> Read options from <file>\n\
2793 -H --help Display this information\n\
2794 -v --version Display the version number of readelf\n"));
2795 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2800 /* Record the fact that the user wants the contents of section number
2801 SECTION to be displayed using the method(s) encoded as flags bits
2802 in TYPE. Note, TYPE can be zero if we are creating the array for
2806 request_dump (unsigned int section
, int type
)
2808 if (section
>= num_dump_sects
)
2810 char *new_dump_sects
;
2812 new_dump_sects
= calloc (section
+ 1, 1);
2814 if (new_dump_sects
== NULL
)
2815 error (_("Out of memory allocating dump request table."));
2818 /* Copy current flag settings. */
2819 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2823 dump_sects
= new_dump_sects
;
2824 num_dump_sects
= section
+ 1;
2829 dump_sects
[section
] |= type
;
2834 /* Request a dump by section name. */
2837 request_dump_byname (const char *section
, int type
)
2839 struct dump_list_entry
*new_request
;
2841 new_request
= malloc (sizeof (struct dump_list_entry
));
2843 error (_("Out of memory allocating dump request table."));
2845 new_request
->name
= strdup (section
);
2846 if (!new_request
->name
)
2847 error (_("Out of memory allocating dump request table."));
2849 new_request
->type
= type
;
2851 new_request
->next
= dump_sects_byname
;
2852 dump_sects_byname
= new_request
;
2856 parse_args (int argc
, char **argv
)
2863 while ((c
= getopt_long
2864 (argc
, argv
, "ersuahnldSDAINtgw::x:i:vVWH", options
, NULL
)) != EOF
)
2885 do_section_groups
++;
2893 do_section_groups
++;
2898 do_section_details
++;
2940 section
= strtoul (optarg
, & cp
, 0);
2941 if (! *cp
&& section
>= 0)
2942 request_dump (section
, HEX_DUMP
);
2944 request_dump_byname (optarg
, HEX_DUMP
);
2952 unsigned int index
= 0;
2956 while (optarg
[index
])
2957 switch (optarg
[index
++])
2966 do_debug_abbrevs
= 1;
2976 do_debug_pubnames
= 1;
2980 do_debug_aranges
= 1;
2984 do_debug_ranges
= 1;
2988 do_debug_frames_interp
= 1;
2990 do_debug_frames
= 1;
2995 do_debug_macinfo
= 1;
3009 warn (_("Unrecognized debug option '%s'\n"), optarg
);
3014 case OPTION_DEBUG_DUMP
:
3022 const char * option
;
3025 debug_dump_long_opts
;
3027 debug_dump_long_opts opts_table
[] =
3029 /* Please keep this table alpha- sorted. */
3030 { "Ranges", & do_debug_ranges
},
3031 { "abbrev", & do_debug_abbrevs
},
3032 { "aranges", & do_debug_aranges
},
3033 { "frames", & do_debug_frames
},
3034 { "frames-interp", & do_debug_frames_interp
},
3035 { "info", & do_debug_info
},
3036 { "line", & do_debug_lines
},
3037 { "loc", & do_debug_loc
},
3038 { "macro", & do_debug_macinfo
},
3039 { "pubnames", & do_debug_pubnames
},
3040 /* This entry is for compatability
3041 with earlier versions of readelf. */
3042 { "ranges", & do_debug_aranges
},
3043 { "str", & do_debug_str
},
3054 debug_dump_long_opts
* entry
;
3056 for (entry
= opts_table
; entry
->option
; entry
++)
3058 size_t len
= strlen (entry
->option
);
3060 if (strneq (p
, entry
->option
, len
)
3061 && (p
[len
] == ',' || p
[len
] == '\0'))
3063 * entry
->variable
= 1;
3065 /* The --debug-dump=frames-interp option also
3066 enables the --debug-dump=frames option. */
3067 if (do_debug_frames_interp
)
3068 do_debug_frames
= 1;
3075 if (entry
->option
== NULL
)
3077 warn (_("Unrecognized debug option '%s'\n"), p
);
3078 p
= strchr (p
, ',');
3088 #ifdef SUPPORT_DISASSEMBLY
3091 section
= strtoul (optarg
, & cp
, 0);
3092 if (! *cp
&& section
>= 0)
3094 request_dump (section
, DISASS_DUMP
);
3100 print_version (program_name
);
3109 #ifdef SUPPORT_DISASSEMBLY
3112 /* xgettext:c-format */
3113 error (_("Invalid option '-%c'\n"), c
);
3120 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
3121 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
3122 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
3123 && !do_section_groups
)
3127 warn (_("Nothing to do.\n"));
3133 get_elf_class (unsigned int elf_class
)
3135 static char buff
[32];
3139 case ELFCLASSNONE
: return _("none");
3140 case ELFCLASS32
: return "ELF32";
3141 case ELFCLASS64
: return "ELF64";
3143 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), elf_class
);
3149 get_data_encoding (unsigned int encoding
)
3151 static char buff
[32];
3155 case ELFDATANONE
: return _("none");
3156 case ELFDATA2LSB
: return _("2's complement, little endian");
3157 case ELFDATA2MSB
: return _("2's complement, big endian");
3159 snprintf (buff
, sizeof (buff
), _("<unknown: %x>"), encoding
);
3164 /* Decode the data held in 'elf_header'. */
3167 process_file_header (void)
3169 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
3170 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3171 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3172 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3175 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3183 printf (_("ELF Header:\n"));
3184 printf (_(" Magic: "));
3185 for (i
= 0; i
< EI_NIDENT
; i
++)
3186 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3188 printf (_(" Class: %s\n"),
3189 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3190 printf (_(" Data: %s\n"),
3191 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3192 printf (_(" Version: %d %s\n"),
3193 elf_header
.e_ident
[EI_VERSION
],
3194 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3196 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3199 printf (_(" OS/ABI: %s\n"),
3200 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3201 printf (_(" ABI Version: %d\n"),
3202 elf_header
.e_ident
[EI_ABIVERSION
]);
3203 printf (_(" Type: %s\n"),
3204 get_file_type (elf_header
.e_type
));
3205 printf (_(" Machine: %s\n"),
3206 get_machine_name (elf_header
.e_machine
));
3207 printf (_(" Version: 0x%lx\n"),
3208 (unsigned long) elf_header
.e_version
);
3210 printf (_(" Entry point address: "));
3211 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3212 printf (_("\n Start of program headers: "));
3213 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3214 printf (_(" (bytes into file)\n Start of section headers: "));
3215 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3216 printf (_(" (bytes into file)\n"));
3218 printf (_(" Flags: 0x%lx%s\n"),
3219 (unsigned long) elf_header
.e_flags
,
3220 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3221 printf (_(" Size of this header: %ld (bytes)\n"),
3222 (long) elf_header
.e_ehsize
);
3223 printf (_(" Size of program headers: %ld (bytes)\n"),
3224 (long) elf_header
.e_phentsize
);
3225 printf (_(" Number of program headers: %ld\n"),
3226 (long) elf_header
.e_phnum
);
3227 printf (_(" Size of section headers: %ld (bytes)\n"),
3228 (long) elf_header
.e_shentsize
);
3229 printf (_(" Number of section headers: %ld"),
3230 (long) elf_header
.e_shnum
);
3231 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3232 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3233 putc ('\n', stdout
);
3234 printf (_(" Section header string table index: %ld"),
3235 (long) elf_header
.e_shstrndx
);
3236 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3237 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3238 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3239 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3240 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3241 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3242 printf (" <corrupt: out of range>");
3243 putc ('\n', stdout
);
3246 if (section_headers
!= NULL
)
3248 if (elf_header
.e_shnum
== 0)
3249 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3250 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3251 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3252 else if (elf_header
.e_shstrndx
!= SHN_UNDEF
3253 && (elf_header
.e_shstrndx
>= elf_header
.e_shnum
3254 || (elf_header
.e_shstrndx
>= SHN_LORESERVE
3255 && elf_header
.e_shstrndx
<= SHN_HIRESERVE
)))
3256 elf_header
.e_shstrndx
= SHN_UNDEF
;
3257 free (section_headers
);
3258 section_headers
= NULL
;
3266 get_32bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3268 Elf32_External_Phdr
*phdrs
;
3269 Elf32_External_Phdr
*external
;
3270 Elf_Internal_Phdr
*internal
;
3273 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3274 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3275 _("program headers"));
3279 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3280 i
< elf_header
.e_phnum
;
3281 i
++, internal
++, external
++)
3283 internal
->p_type
= BYTE_GET (external
->p_type
);
3284 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3285 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3286 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3287 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3288 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3289 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3290 internal
->p_align
= BYTE_GET (external
->p_align
);
3299 get_64bit_program_headers (FILE *file
, Elf_Internal_Phdr
*program_headers
)
3301 Elf64_External_Phdr
*phdrs
;
3302 Elf64_External_Phdr
*external
;
3303 Elf_Internal_Phdr
*internal
;
3306 phdrs
= get_data (NULL
, file
, elf_header
.e_phoff
,
3307 elf_header
.e_phentsize
, elf_header
.e_phnum
,
3308 _("program headers"));
3312 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3313 i
< elf_header
.e_phnum
;
3314 i
++, internal
++, external
++)
3316 internal
->p_type
= BYTE_GET (external
->p_type
);
3317 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3318 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3319 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3320 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3321 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3322 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3323 internal
->p_align
= BYTE_GET (external
->p_align
);
3331 /* Returns 1 if the program headers were read into `program_headers'. */
3334 get_program_headers (FILE *file
)
3336 Elf_Internal_Phdr
*phdrs
;
3338 /* Check cache of prior read. */
3339 if (program_headers
!= NULL
)
3342 phdrs
= cmalloc (elf_header
.e_phnum
, sizeof (Elf_Internal_Phdr
));
3346 error (_("Out of memory\n"));
3351 ? get_32bit_program_headers (file
, phdrs
)
3352 : get_64bit_program_headers (file
, phdrs
))
3354 program_headers
= phdrs
;
3362 /* Returns 1 if the program headers were loaded. */
3365 process_program_headers (FILE *file
)
3367 Elf_Internal_Phdr
*segment
;
3370 if (elf_header
.e_phnum
== 0)
3373 printf (_("\nThere are no program headers in this file.\n"));
3377 if (do_segments
&& !do_header
)
3379 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3380 printf (_("Entry point "));
3381 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3382 printf (_("\nThere are %d program headers, starting at offset "),
3383 elf_header
.e_phnum
);
3384 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3388 if (! get_program_headers (file
))
3393 if (elf_header
.e_phnum
> 1)
3394 printf (_("\nProgram Headers:\n"));
3396 printf (_("\nProgram Headers:\n"));
3400 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3403 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3407 (_(" Type Offset VirtAddr PhysAddr\n"));
3409 (_(" FileSiz MemSiz Flags Align\n"));
3416 for (i
= 0, segment
= program_headers
;
3417 i
< elf_header
.e_phnum
;
3422 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3426 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3427 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3428 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3429 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3430 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3432 (segment
->p_flags
& PF_R
? 'R' : ' '),
3433 (segment
->p_flags
& PF_W
? 'W' : ' '),
3434 (segment
->p_flags
& PF_X
? 'E' : ' '));
3435 printf ("%#lx", (unsigned long) segment
->p_align
);
3439 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3440 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3443 print_vma (segment
->p_offset
, FULL_HEX
);
3447 print_vma (segment
->p_vaddr
, FULL_HEX
);
3449 print_vma (segment
->p_paddr
, FULL_HEX
);
3452 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3453 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3456 print_vma (segment
->p_filesz
, FULL_HEX
);
3460 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3461 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3464 print_vma (segment
->p_offset
, FULL_HEX
);
3468 (segment
->p_flags
& PF_R
? 'R' : ' '),
3469 (segment
->p_flags
& PF_W
? 'W' : ' '),
3470 (segment
->p_flags
& PF_X
? 'E' : ' '));
3472 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3473 printf ("%#lx", (unsigned long) segment
->p_align
);
3476 print_vma (segment
->p_align
, PREFIX_HEX
);
3481 print_vma (segment
->p_offset
, FULL_HEX
);
3483 print_vma (segment
->p_vaddr
, FULL_HEX
);
3485 print_vma (segment
->p_paddr
, FULL_HEX
);
3487 print_vma (segment
->p_filesz
, FULL_HEX
);
3489 print_vma (segment
->p_memsz
, FULL_HEX
);
3491 (segment
->p_flags
& PF_R
? 'R' : ' '),
3492 (segment
->p_flags
& PF_W
? 'W' : ' '),
3493 (segment
->p_flags
& PF_X
? 'E' : ' '));
3494 print_vma (segment
->p_align
, HEX
);
3498 switch (segment
->p_type
)
3502 error (_("more than one dynamic segment\n"));
3504 /* Try to locate the .dynamic section. If there is
3505 a section header table, we can easily locate it. */
3506 if (section_headers
!= NULL
)
3508 Elf_Internal_Shdr
*sec
;
3510 sec
= find_section (".dynamic");
3511 if (sec
== NULL
|| sec
->sh_size
== 0)
3513 error (_("no .dynamic section in the dynamic segment"));
3517 dynamic_addr
= sec
->sh_offset
;
3518 dynamic_size
= sec
->sh_size
;
3520 if (dynamic_addr
< segment
->p_offset
3521 || dynamic_addr
> segment
->p_offset
+ segment
->p_filesz
)
3522 warn (_("the .dynamic section is not contained within the dynamic segment"));
3523 else if (dynamic_addr
> segment
->p_offset
)
3524 warn (_("the .dynamic section is not the first section in the dynamic segment."));
3528 /* Otherwise, we can only assume that the .dynamic
3529 section is the first section in the DYNAMIC segment. */
3530 dynamic_addr
= segment
->p_offset
;
3531 dynamic_size
= segment
->p_filesz
;
3536 if (fseek (file
, archive_file_offset
+ (long) segment
->p_offset
,
3538 error (_("Unable to find program interpreter name\n"));
3542 int ret
= snprintf (fmt
, sizeof (fmt
), "%%%ds", PATH_MAX
);
3544 if (ret
>= (int) sizeof (fmt
) || ret
< 0)
3545 error (_("Internal error: failed to create format string to display program interpreter"));
3547 program_interpreter
[0] = 0;
3548 if (fscanf (file
, fmt
, program_interpreter
) <= 0)
3549 error (_("Unable to read program interpreter name\n"));
3552 printf (_("\n [Requesting program interpreter: %s]"),
3553 program_interpreter
);
3559 putc ('\n', stdout
);
3562 if (do_segments
&& section_headers
!= NULL
&& string_table
!= NULL
)
3564 printf (_("\n Section to Segment mapping:\n"));
3565 printf (_(" Segment Sections...\n"));
3567 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3570 Elf_Internal_Shdr
*section
;
3572 segment
= program_headers
+ i
;
3573 section
= section_headers
;
3575 printf (" %2.2d ", i
);
3577 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3579 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY(section
, segment
))
3580 printf ("%s ", SECTION_NAME (section
));
3591 /* Find the file offset corresponding to VMA by using the program headers. */
3594 offset_from_vma (FILE *file
, bfd_vma vma
, bfd_size_type size
)
3596 Elf_Internal_Phdr
*seg
;
3598 if (! get_program_headers (file
))
3600 warn (_("Cannot interpret virtual addresses without program headers.\n"));
3604 for (seg
= program_headers
;
3605 seg
< program_headers
+ elf_header
.e_phnum
;
3608 if (seg
->p_type
!= PT_LOAD
)
3611 if (vma
>= (seg
->p_vaddr
& -seg
->p_align
)
3612 && vma
+ size
<= seg
->p_vaddr
+ seg
->p_filesz
)
3613 return vma
- seg
->p_vaddr
+ seg
->p_offset
;
3616 warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
3623 get_32bit_section_headers (FILE *file
, unsigned int num
)
3625 Elf32_External_Shdr
*shdrs
;
3626 Elf_Internal_Shdr
*internal
;
3629 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3630 elf_header
.e_shentsize
, num
, _("section headers"));
3634 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3636 if (section_headers
== NULL
)
3638 error (_("Out of memory\n"));
3642 for (i
= 0, internal
= section_headers
;
3646 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3647 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3648 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3649 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3650 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3651 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3652 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3653 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3654 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3655 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3664 get_64bit_section_headers (FILE *file
, unsigned int num
)
3666 Elf64_External_Shdr
*shdrs
;
3667 Elf_Internal_Shdr
*internal
;
3670 shdrs
= get_data (NULL
, file
, elf_header
.e_shoff
,
3671 elf_header
.e_shentsize
, num
, _("section headers"));
3675 section_headers
= cmalloc (num
, sizeof (Elf_Internal_Shdr
));
3677 if (section_headers
== NULL
)
3679 error (_("Out of memory\n"));
3683 for (i
= 0, internal
= section_headers
;
3687 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3688 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3689 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3690 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3691 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3692 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3693 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3694 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3695 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3696 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3704 static Elf_Internal_Sym
*
3705 get_32bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3707 unsigned long number
;
3708 Elf32_External_Sym
*esyms
;
3709 Elf_External_Sym_Shndx
*shndx
;
3710 Elf_Internal_Sym
*isyms
;
3711 Elf_Internal_Sym
*psym
;
3714 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3720 if (symtab_shndx_hdr
!= NULL
3721 && (symtab_shndx_hdr
->sh_link
3722 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3724 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3725 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3733 number
= section
->sh_size
/ section
->sh_entsize
;
3734 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3738 error (_("Out of memory\n"));
3745 for (j
= 0, psym
= isyms
;
3749 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3750 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3751 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3752 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3753 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3755 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3756 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3757 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3767 static Elf_Internal_Sym
*
3768 get_64bit_elf_symbols (FILE *file
, Elf_Internal_Shdr
*section
)
3770 unsigned long number
;
3771 Elf64_External_Sym
*esyms
;
3772 Elf_External_Sym_Shndx
*shndx
;
3773 Elf_Internal_Sym
*isyms
;
3774 Elf_Internal_Sym
*psym
;
3777 esyms
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
3783 if (symtab_shndx_hdr
!= NULL
3784 && (symtab_shndx_hdr
->sh_link
3785 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3787 shndx
= get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3788 1, symtab_shndx_hdr
->sh_size
, _("symtab shndx"));
3796 number
= section
->sh_size
/ section
->sh_entsize
;
3797 isyms
= cmalloc (number
, sizeof (Elf_Internal_Sym
));
3801 error (_("Out of memory\n"));
3808 for (j
= 0, psym
= isyms
;
3812 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3813 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3814 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3815 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3816 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3818 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3819 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3820 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3831 get_elf_section_flags (bfd_vma sh_flags
)
3833 static char buff
[1024];
3835 int field_size
= is_32bit_elf
? 8 : 16;
3836 int index
, size
= sizeof (buff
) - (field_size
+ 4 + 1);
3837 bfd_vma os_flags
= 0;
3838 bfd_vma proc_flags
= 0;
3839 bfd_vma unknown_flags
= 0;
3853 { "LINK ORDER", 10 },
3854 { "OS NONCONF", 10 },
3859 if (do_section_details
)
3861 sprintf (buff
, "[%*.*lx]: ",
3862 field_size
, field_size
, (unsigned long) sh_flags
);
3863 p
+= field_size
+ 4;
3870 flag
= sh_flags
& - sh_flags
;
3873 if (do_section_details
)
3877 case SHF_WRITE
: index
= 0; break;
3878 case SHF_ALLOC
: index
= 1; break;
3879 case SHF_EXECINSTR
: index
= 2; break;
3880 case SHF_MERGE
: index
= 3; break;
3881 case SHF_STRINGS
: index
= 4; break;
3882 case SHF_INFO_LINK
: index
= 5; break;
3883 case SHF_LINK_ORDER
: index
= 6; break;
3884 case SHF_OS_NONCONFORMING
: index
= 7; break;
3885 case SHF_GROUP
: index
= 8; break;
3886 case SHF_TLS
: index
= 9; break;
3895 if (p
!= buff
+ field_size
+ 4)
3897 if (size
< (10 + 2))
3904 size
-= flags
[index
].len
;
3905 p
= stpcpy (p
, flags
[index
].str
);
3907 else if (flag
& SHF_MASKOS
)
3909 else if (flag
& SHF_MASKPROC
)
3912 unknown_flags
|= flag
;
3918 case SHF_WRITE
: *p
= 'W'; break;
3919 case SHF_ALLOC
: *p
= 'A'; break;
3920 case SHF_EXECINSTR
: *p
= 'X'; break;
3921 case SHF_MERGE
: *p
= 'M'; break;
3922 case SHF_STRINGS
: *p
= 'S'; break;
3923 case SHF_INFO_LINK
: *p
= 'I'; break;
3924 case SHF_LINK_ORDER
: *p
= 'L'; break;
3925 case SHF_OS_NONCONFORMING
: *p
= 'O'; break;
3926 case SHF_GROUP
: *p
= 'G'; break;
3927 case SHF_TLS
: *p
= 'T'; break;
3930 if (elf_header
.e_machine
== EM_X86_64
3931 && flag
== SHF_X86_64_LARGE
)
3933 else if (flag
& SHF_MASKOS
)
3936 sh_flags
&= ~ SHF_MASKOS
;
3938 else if (flag
& SHF_MASKPROC
)
3941 sh_flags
&= ~ SHF_MASKPROC
;
3951 if (do_section_details
)
3955 size
-= 5 + field_size
;
3956 if (p
!= buff
+ field_size
+ 4)
3964 sprintf (p
, "OS (%*.*lx)", field_size
, field_size
,
3965 (unsigned long) os_flags
);
3966 p
+= 5 + field_size
;
3970 size
-= 7 + field_size
;
3971 if (p
!= buff
+ field_size
+ 4)
3979 sprintf (p
, "PROC (%*.*lx)", field_size
, field_size
,
3980 (unsigned long) proc_flags
);
3981 p
+= 7 + field_size
;
3985 size
-= 10 + field_size
;
3986 if (p
!= buff
+ field_size
+ 4)
3994 sprintf (p
, "UNKNOWN (%*.*lx)", field_size
, field_size
,
3995 (unsigned long) unknown_flags
);
3996 p
+= 10 + field_size
;
4005 process_section_headers (FILE *file
)
4007 Elf_Internal_Shdr
*section
;
4010 section_headers
= NULL
;
4012 if (elf_header
.e_shnum
== 0)
4015 printf (_("\nThere are no sections in this file.\n"));
4020 if (do_sections
&& !do_header
)
4021 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
4022 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
4026 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
4029 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
4032 /* Read in the string table, so that we have names to display. */
4033 if (elf_header
.e_shstrndx
!= SHN_UNDEF
4034 && SECTION_HEADER_INDEX (elf_header
.e_shstrndx
) < elf_header
.e_shnum
)
4036 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
4038 if (section
->sh_size
!= 0)
4040 string_table
= get_data (NULL
, file
, section
->sh_offset
,
4041 1, section
->sh_size
, _("string table"));
4043 string_table_length
= string_table
!= NULL
? section
->sh_size
: 0;
4047 /* Scan the sections for the dynamic symbol table
4048 and dynamic string table and debug sections. */
4049 dynamic_symbols
= NULL
;
4050 dynamic_strings
= NULL
;
4051 dynamic_syminfo
= NULL
;
4052 symtab_shndx_hdr
= NULL
;
4054 eh_addr_size
= is_32bit_elf
? 4 : 8;
4055 switch (elf_header
.e_machine
)
4058 case EM_MIPS_RS3_LE
:
4059 /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
4060 FDE addresses. However, the ABI also has a semi-official ILP32
4061 variant for which the normal FDE address size rules apply.
4063 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
4064 section, where XX is the size of longs in bits. Unfortunately,
4065 earlier compilers provided no way of distinguishing ILP32 objects
4066 from LP64 objects, so if there's any doubt, we should assume that
4067 the official LP64 form is being used. */
4068 if ((elf_header
.e_flags
& EF_MIPS_ABI
) == E_MIPS_ABI_EABI64
4069 && find_section (".gcc_compiled_long32") == NULL
)
4075 switch (elf_header
.e_flags
& EF_H8_MACH
)
4077 case E_H8_MACH_H8300
:
4078 case E_H8_MACH_H8300HN
:
4079 case E_H8_MACH_H8300SN
:
4080 case E_H8_MACH_H8300SXN
:
4083 case E_H8_MACH_H8300H
:
4084 case E_H8_MACH_H8300S
:
4085 case E_H8_MACH_H8300SX
:
4091 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64) \
4094 size_t expected_entsize \
4095 = is_32bit_elf ? size32 : size64; \
4096 if (section->sh_entsize != expected_entsize) \
4097 error (_("Section %d has invalid sh_entsize %lx (expected %lx)\n"), \
4098 i, (unsigned long int) section->sh_entsize, \
4099 (unsigned long int) expected_entsize); \
4100 section->sh_entsize = expected_entsize; \
4103 #define CHECK_ENTSIZE(section, i, type) \
4104 CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type), \
4105 sizeof (Elf64_External_##type))
4107 for (i
= 0, section
= section_headers
;
4108 i
< elf_header
.e_shnum
;
4111 char *name
= SECTION_NAME (section
);
4113 if (section
->sh_type
== SHT_DYNSYM
)
4115 if (dynamic_symbols
!= NULL
)
4117 error (_("File contains multiple dynamic symbol tables\n"));
4121 CHECK_ENTSIZE (section
, i
, Sym
);
4122 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
4123 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
4125 else if (section
->sh_type
== SHT_STRTAB
4126 && streq (name
, ".dynstr"))
4128 if (dynamic_strings
!= NULL
)
4130 error (_("File contains multiple dynamic string tables\n"));
4134 dynamic_strings
= get_data (NULL
, file
, section
->sh_offset
,
4135 1, section
->sh_size
, _("dynamic strings"));
4136 dynamic_strings_length
= section
->sh_size
;
4138 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
4140 if (symtab_shndx_hdr
!= NULL
)
4142 error (_("File contains multiple symtab shndx tables\n"));
4145 symtab_shndx_hdr
= section
;
4147 else if (section
->sh_type
== SHT_SYMTAB
)
4148 CHECK_ENTSIZE (section
, i
, Sym
);
4149 else if (section
->sh_type
== SHT_GROUP
)
4150 CHECK_ENTSIZE_VALUES (section
, i
, GRP_ENTRY_SIZE
, GRP_ENTRY_SIZE
);
4151 else if (section
->sh_type
== SHT_REL
)
4152 CHECK_ENTSIZE (section
, i
, Rel
);
4153 else if (section
->sh_type
== SHT_RELA
)
4154 CHECK_ENTSIZE (section
, i
, Rela
);
4155 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
4156 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
4157 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
4158 || do_debug_loc
|| do_debug_ranges
)
4159 && const_strneq (name
, ".debug_"))
4164 || (do_debug_info
&& streq (name
, "info"))
4165 || (do_debug_abbrevs
&& streq (name
, "abbrev"))
4166 || (do_debug_lines
&& streq (name
, "line"))
4167 || (do_debug_pubnames
&& streq (name
, "pubnames"))
4168 || (do_debug_aranges
&& streq (name
, "aranges"))
4169 || (do_debug_ranges
&& streq (name
, "ranges"))
4170 || (do_debug_frames
&& streq (name
, "frame"))
4171 || (do_debug_macinfo
&& streq (name
, "macinfo"))
4172 || (do_debug_str
&& streq (name
, "str"))
4173 || (do_debug_loc
&& streq (name
, "loc"))
4175 request_dump (i
, DEBUG_DUMP
);
4177 /* linkonce section to be combined with .debug_info at link time. */
4178 else if ((do_debugging
|| do_debug_info
)
4179 && const_strneq (name
, ".gnu.linkonce.wi."))
4180 request_dump (i
, DEBUG_DUMP
);
4181 else if (do_debug_frames
&& streq (name
, ".eh_frame"))
4182 request_dump (i
, DEBUG_DUMP
);
4188 if (elf_header
.e_shnum
> 1)
4189 printf (_("\nSection Headers:\n"));
4191 printf (_("\nSection Header:\n"));
4195 if (do_section_details
)
4197 printf (_(" [Nr] Name\n"));
4198 printf (_(" Type Addr Off Size ES Lk Inf Al\n"));
4202 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
4206 if (do_section_details
)
4208 printf (_(" [Nr] Name\n"));
4209 printf (_(" Type Address Off Size ES Lk Inf Al\n"));
4213 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
4217 if (do_section_details
)
4219 printf (_(" [Nr] Name\n"));
4220 printf (_(" Type Address Offset Link\n"));
4221 printf (_(" Size EntSize Info Align\n"));
4225 printf (_(" [Nr] Name Type Address Offset\n"));
4226 printf (_(" Size EntSize Flags Link Info Align\n"));
4230 if (do_section_details
)
4231 printf (_(" Flags\n"));
4233 for (i
= 0, section
= section_headers
;
4234 i
< elf_header
.e_shnum
;
4237 if (do_section_details
)
4239 printf (" [%2u] %s\n",
4240 SECTION_HEADER_NUM (i
),
4241 SECTION_NAME (section
));
4242 if (is_32bit_elf
|| do_wide
)
4243 printf (" %-15.15s ",
4244 get_section_type_name (section
->sh_type
));
4247 printf (" [%2u] %-17.17s %-15.15s ",
4248 SECTION_HEADER_NUM (i
),
4249 SECTION_NAME (section
),
4250 get_section_type_name (section
->sh_type
));
4254 print_vma (section
->sh_addr
, LONG_HEX
);
4256 printf ( " %6.6lx %6.6lx %2.2lx",
4257 (unsigned long) section
->sh_offset
,
4258 (unsigned long) section
->sh_size
,
4259 (unsigned long) section
->sh_entsize
);
4261 if (do_section_details
)
4262 fputs (" ", stdout
);
4264 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4266 printf ("%2ld %3lu %2ld\n",
4267 (unsigned long) section
->sh_link
,
4268 (unsigned long) section
->sh_info
,
4269 (unsigned long) section
->sh_addralign
);
4273 print_vma (section
->sh_addr
, LONG_HEX
);
4275 if ((long) section
->sh_offset
== section
->sh_offset
)
4276 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
4280 print_vma (section
->sh_offset
, LONG_HEX
);
4283 if ((unsigned long) section
->sh_size
== section
->sh_size
)
4284 printf (" %6.6lx", (unsigned long) section
->sh_size
);
4288 print_vma (section
->sh_size
, LONG_HEX
);
4291 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
4292 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
4296 print_vma (section
->sh_entsize
, LONG_HEX
);
4299 if (do_section_details
)
4300 fputs (" ", stdout
);
4302 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4304 printf ("%2ld %3lu ",
4305 (unsigned long) section
->sh_link
,
4306 (unsigned long) section
->sh_info
);
4308 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
4309 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
4312 print_vma (section
->sh_addralign
, DEC
);
4316 else if (do_section_details
)
4318 printf (" %-15.15s ",
4319 get_section_type_name (section
->sh_type
));
4320 print_vma (section
->sh_addr
, LONG_HEX
);
4321 if ((long) section
->sh_offset
== section
->sh_offset
)
4322 printf (" %16.16lx", (unsigned long) section
->sh_offset
);
4326 print_vma (section
->sh_offset
, LONG_HEX
);
4328 printf (" %ld\n ", (unsigned long) section
->sh_link
);
4329 print_vma (section
->sh_size
, LONG_HEX
);
4331 print_vma (section
->sh_entsize
, LONG_HEX
);
4333 printf (" %-16lu %ld\n",
4334 (unsigned long) section
->sh_info
,
4335 (unsigned long) section
->sh_addralign
);
4340 print_vma (section
->sh_addr
, LONG_HEX
);
4341 if ((long) section
->sh_offset
== section
->sh_offset
)
4342 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
4346 print_vma (section
->sh_offset
, LONG_HEX
);
4349 print_vma (section
->sh_size
, LONG_HEX
);
4351 print_vma (section
->sh_entsize
, LONG_HEX
);
4353 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
4355 printf (" %2ld %3lu %ld\n",
4356 (unsigned long) section
->sh_link
,
4357 (unsigned long) section
->sh_info
,
4358 (unsigned long) section
->sh_addralign
);
4361 if (do_section_details
)
4362 printf (" %s\n", get_elf_section_flags (section
->sh_flags
));
4365 if (!do_section_details
)
4366 printf (_("Key to Flags:\n\
4367 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
4368 I (info), L (link order), G (group), x (unknown)\n\
4369 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
4375 get_group_flags (unsigned int flags
)
4377 static char buff
[32];
4384 snprintf (buff
, sizeof (buff
), _("[<unknown>: 0x%x]"), flags
);
4391 process_section_groups (FILE *file
)
4393 Elf_Internal_Shdr
*section
;
4395 struct group
*group
;
4396 Elf_Internal_Shdr
*symtab_sec
, *strtab_sec
;
4397 Elf_Internal_Sym
*symtab
;
4401 /* Don't process section groups unless needed. */
4402 if (!do_unwind
&& !do_section_groups
)
4405 if (elf_header
.e_shnum
== 0)
4407 if (do_section_groups
)
4408 printf (_("\nThere are no sections in this file.\n"));
4413 if (section_headers
== NULL
)
4415 error (_("Section headers are not available!\n"));
4419 section_headers_groups
= calloc (elf_header
.e_shnum
,
4420 sizeof (struct group
*));
4422 if (section_headers_groups
== NULL
)
4424 error (_("Out of memory\n"));
4428 /* Scan the sections for the group section. */
4430 for (i
= 0, section
= section_headers
;
4431 i
< elf_header
.e_shnum
;
4433 if (section
->sh_type
== SHT_GROUP
)
4436 if (group_count
== 0)
4438 if (do_section_groups
)
4439 printf (_("\nThere are no section groups in this file.\n"));
4444 section_groups
= calloc (group_count
, sizeof (struct group
));
4446 if (section_groups
== NULL
)
4448 error (_("Out of memory\n"));
4457 for (i
= 0, section
= section_headers
, group
= section_groups
;
4458 i
< elf_header
.e_shnum
;
4461 if (section
->sh_type
== SHT_GROUP
)
4463 char *name
= SECTION_NAME (section
);
4465 unsigned char *start
, *indices
;
4466 unsigned int entry
, j
, size
;
4467 Elf_Internal_Shdr
*sec
;
4468 Elf_Internal_Sym
*sym
;
4470 /* Get the symbol table. */
4471 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
4472 || ((sec
= SECTION_HEADER (section
->sh_link
))->sh_type
4475 error (_("Bad sh_link in group section `%s'\n"), name
);
4479 if (symtab_sec
!= sec
)
4484 symtab
= GET_ELF_SYMBOLS (file
, symtab_sec
);
4487 sym
= symtab
+ section
->sh_info
;
4489 if (ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
4491 bfd_vma sec_index
= SECTION_HEADER_INDEX (sym
->st_shndx
);
4494 error (_("Bad sh_info in group section `%s'\n"), name
);
4498 group_name
= SECTION_NAME (section_headers
+ sec_index
);
4507 /* Get the string table. */
4508 if (SECTION_HEADER_INDEX (symtab_sec
->sh_link
)
4509 >= elf_header
.e_shnum
)
4518 != (sec
= SECTION_HEADER (symtab_sec
->sh_link
)))
4523 strtab
= get_data (NULL
, file
, strtab_sec
->sh_offset
,
4524 1, strtab_sec
->sh_size
,
4526 strtab_size
= strtab
!= NULL
? strtab_sec
->sh_size
: 0;
4528 group_name
= sym
->st_name
< strtab_size
4529 ? strtab
+ sym
->st_name
: "<corrupt>";
4532 start
= get_data (NULL
, file
, section
->sh_offset
,
4533 1, section
->sh_size
, _("section data"));
4536 size
= (section
->sh_size
/ section
->sh_entsize
) - 1;
4537 entry
= byte_get (indices
, 4);
4540 if (do_section_groups
)
4542 printf ("\n%s group section [%5u] `%s' [%s] contains %u sections:\n",
4543 get_group_flags (entry
), i
, name
, group_name
, size
);
4545 printf (_(" [Index] Name\n"));
4548 group
->group_index
= i
;
4550 for (j
= 0; j
< size
; j
++)
4552 struct group_list
*g
;
4554 entry
= byte_get (indices
, 4);
4557 if (SECTION_HEADER_INDEX (entry
) >= elf_header
.e_shnum
)
4559 error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
4560 entry
, i
, elf_header
.e_shnum
- 1);
4563 else if (entry
>= SHN_LORESERVE
&& entry
<= SHN_HIRESERVE
)
4565 error (_("invalid section [%5u] in group section [%5u]\n"),
4570 if (section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4575 error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
4577 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4582 /* Intel C/C++ compiler may put section 0 in a
4583 section group. We just warn it the first time
4584 and ignore it afterwards. */
4585 static int warned
= 0;
4588 error (_("section 0 in group section [%5u]\n"),
4589 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]->group_index
);
4595 section_headers_groups
[SECTION_HEADER_INDEX (entry
)]
4598 if (do_section_groups
)
4600 sec
= SECTION_HEADER (entry
);
4601 printf (" [%5u] %s\n", entry
, SECTION_NAME (sec
));
4604 g
= xmalloc (sizeof (struct group_list
));
4605 g
->section_index
= entry
;
4606 g
->next
= group
->root
;
4630 } dynamic_relocations
[] =
4632 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
4633 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
4634 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
4637 /* Process the reloc section. */
4640 process_relocs (FILE *file
)
4642 unsigned long rel_size
;
4643 unsigned long rel_offset
;
4649 if (do_using_dynamic
)
4653 int has_dynamic_reloc
;
4656 has_dynamic_reloc
= 0;
4658 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
4660 is_rela
= dynamic_relocations
[i
].rela
;
4661 name
= dynamic_relocations
[i
].name
;
4662 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
4663 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
4665 has_dynamic_reloc
|= rel_size
;
4667 if (is_rela
== UNKNOWN
)
4669 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
4670 switch (dynamic_info
[DT_PLTREL
])
4684 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
4685 name
, rel_offset
, rel_size
);
4687 dump_relocations (file
,
4688 offset_from_vma (file
, rel_offset
, rel_size
),
4690 dynamic_symbols
, num_dynamic_syms
,
4691 dynamic_strings
, dynamic_strings_length
, is_rela
);
4695 if (! has_dynamic_reloc
)
4696 printf (_("\nThere are no dynamic relocations in this file.\n"));
4700 Elf_Internal_Shdr
*section
;
4704 for (i
= 0, section
= section_headers
;
4705 i
< elf_header
.e_shnum
;
4708 if ( section
->sh_type
!= SHT_RELA
4709 && section
->sh_type
!= SHT_REL
)
4712 rel_offset
= section
->sh_offset
;
4713 rel_size
= section
->sh_size
;
4717 Elf_Internal_Shdr
*strsec
;
4720 printf (_("\nRelocation section "));
4722 if (string_table
== NULL
)
4723 printf ("%d", section
->sh_name
);
4725 printf (_("'%s'"), SECTION_NAME (section
));
4727 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4728 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4730 is_rela
= section
->sh_type
== SHT_RELA
;
4732 if (section
->sh_link
4733 && SECTION_HEADER_INDEX (section
->sh_link
)
4734 < elf_header
.e_shnum
)
4736 Elf_Internal_Shdr
*symsec
;
4737 Elf_Internal_Sym
*symtab
;
4738 unsigned long nsyms
;
4739 unsigned long strtablen
= 0;
4740 char *strtab
= NULL
;
4742 symsec
= SECTION_HEADER (section
->sh_link
);
4743 if (symsec
->sh_type
!= SHT_SYMTAB
4744 && symsec
->sh_type
!= SHT_DYNSYM
)
4747 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4748 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4753 if (SECTION_HEADER_INDEX (symsec
->sh_link
)
4754 < elf_header
.e_shnum
)
4756 strsec
= SECTION_HEADER (symsec
->sh_link
);
4758 strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
4761 strtablen
= strtab
== NULL
? 0 : strsec
->sh_size
;
4764 dump_relocations (file
, rel_offset
, rel_size
,
4765 symtab
, nsyms
, strtab
, strtablen
, is_rela
);
4771 dump_relocations (file
, rel_offset
, rel_size
,
4772 NULL
, 0, NULL
, 0, is_rela
);
4779 printf (_("\nThere are no relocations in this file.\n"));
4785 /* Process the unwind section. */
4787 #include "unwind-ia64.h"
4789 /* An absolute address consists of a section and an offset. If the
4790 section is NULL, the offset itself is the address, otherwise, the
4791 address equals to LOAD_ADDRESS(section) + offset. */
4795 unsigned short section
;
4799 #define ABSADDR(a) \
4801 ? section_headers [(a).section].sh_addr + (a).offset \
4804 struct ia64_unw_aux_info
4806 struct ia64_unw_table_entry
4808 struct absaddr start
;
4810 struct absaddr info
;
4812 *table
; /* Unwind table. */
4813 unsigned long table_len
; /* Length of unwind table. */
4814 unsigned char *info
; /* Unwind info. */
4815 unsigned long info_size
; /* Size of unwind info. */
4816 bfd_vma info_addr
; /* starting address of unwind info. */
4817 bfd_vma seg_base
; /* Starting address of segment. */
4818 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4819 unsigned long nsyms
; /* Number of symbols. */
4820 char *strtab
; /* The string table. */
4821 unsigned long strtab_size
; /* Size of string table. */
4825 find_symbol_for_address (Elf_Internal_Sym
*symtab
,
4826 unsigned long nsyms
,
4828 unsigned long strtab_size
,
4829 struct absaddr addr
,
4830 const char **symname
,
4833 bfd_vma dist
= 0x100000;
4834 Elf_Internal_Sym
*sym
, *best
= NULL
;
4837 for (i
= 0, sym
= symtab
; i
< nsyms
; ++i
, ++sym
)
4839 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4840 && sym
->st_name
!= 0
4841 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4842 && addr
.offset
>= sym
->st_value
4843 && addr
.offset
- sym
->st_value
< dist
)
4846 dist
= addr
.offset
- sym
->st_value
;
4853 *symname
= (best
->st_name
>= strtab_size
4854 ? "<corrupt>" : strtab
+ best
->st_name
);
4859 *offset
= addr
.offset
;
4863 dump_ia64_unwind (struct ia64_unw_aux_info
*aux
)
4865 struct ia64_unw_table_entry
*tp
;
4868 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4872 const unsigned char *dp
;
4873 const unsigned char *head
;
4874 const char *procname
;
4876 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
4877 aux
->strtab_size
, tp
->start
, &procname
, &offset
);
4879 fputs ("\n<", stdout
);
4883 fputs (procname
, stdout
);
4886 printf ("+%lx", (unsigned long) offset
);
4889 fputs (">: [", stdout
);
4890 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4891 fputc ('-', stdout
);
4892 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4893 printf ("], info at +0x%lx\n",
4894 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4896 head
= aux
->info
+ (ABSADDR (tp
->info
) - aux
->info_addr
);
4897 stamp
= byte_get ((unsigned char *) head
, sizeof (stamp
));
4899 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4900 (unsigned) UNW_VER (stamp
),
4901 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4902 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4903 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4904 (unsigned long) (eh_addr_size
* UNW_LENGTH (stamp
)));
4906 if (UNW_VER (stamp
) != 1)
4908 printf ("\tUnknown version.\n");
4913 for (dp
= head
+ 8; dp
< head
+ 8 + eh_addr_size
* UNW_LENGTH (stamp
);)
4914 dp
= unw_decode (dp
, in_body
, & in_body
);
4919 slurp_ia64_unwind_table (FILE *file
,
4920 struct ia64_unw_aux_info
*aux
,
4921 Elf_Internal_Shdr
*sec
)
4923 unsigned long size
, nrelas
, i
;
4924 Elf_Internal_Phdr
*seg
;
4925 struct ia64_unw_table_entry
*tep
;
4926 Elf_Internal_Shdr
*relsec
;
4927 Elf_Internal_Rela
*rela
, *rp
;
4928 unsigned char *table
, *tp
;
4929 Elf_Internal_Sym
*sym
;
4930 const char *relname
;
4932 /* First, find the starting address of the segment that includes
4935 if (elf_header
.e_phnum
)
4937 if (! get_program_headers (file
))
4940 for (seg
= program_headers
;
4941 seg
< program_headers
+ elf_header
.e_phnum
;
4944 if (seg
->p_type
!= PT_LOAD
)
4947 if (sec
->sh_addr
>= seg
->p_vaddr
4948 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4950 aux
->seg_base
= seg
->p_vaddr
;
4956 /* Second, build the unwind table from the contents of the unwind section: */
4957 size
= sec
->sh_size
;
4958 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
4962 aux
->table
= xcmalloc (size
/ (3 * eh_addr_size
), sizeof (aux
->table
[0]));
4964 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * eh_addr_size
, ++tep
)
4966 tep
->start
.section
= SHN_UNDEF
;
4967 tep
->end
.section
= SHN_UNDEF
;
4968 tep
->info
.section
= SHN_UNDEF
;
4971 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4972 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4973 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4977 tep
->start
.offset
= BYTE_GET ((unsigned char *) tp
+ 0);
4978 tep
->end
.offset
= BYTE_GET ((unsigned char *) tp
+ 8);
4979 tep
->info
.offset
= BYTE_GET ((unsigned char *) tp
+ 16);
4981 tep
->start
.offset
+= aux
->seg_base
;
4982 tep
->end
.offset
+= aux
->seg_base
;
4983 tep
->info
.offset
+= aux
->seg_base
;
4987 /* Third, apply any relocations to the unwind table: */
4989 for (relsec
= section_headers
;
4990 relsec
< section_headers
+ elf_header
.e_shnum
;
4993 if (relsec
->sh_type
!= SHT_RELA
4994 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
4995 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4998 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5002 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5006 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5007 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5011 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5012 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5015 if (! const_strneq (relname
, "R_IA64_SEGREL"))
5017 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5021 i
= rp
->r_offset
/ (3 * eh_addr_size
);
5023 switch (rp
->r_offset
/eh_addr_size
% 3)
5026 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5027 aux
->table
[i
].start
.offset
+= rp
->r_addend
+ sym
->st_value
;
5030 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5031 aux
->table
[i
].end
.offset
+= rp
->r_addend
+ sym
->st_value
;
5034 aux
->table
[i
].info
.section
= sym
->st_shndx
;
5035 aux
->table
[i
].info
.offset
+= rp
->r_addend
+ sym
->st_value
;
5045 aux
->table_len
= size
/ (3 * eh_addr_size
);
5050 ia64_process_unwind (FILE *file
)
5052 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
5053 unsigned long i
, unwcount
= 0, unwstart
= 0;
5054 struct ia64_unw_aux_info aux
;
5056 memset (& aux
, 0, sizeof (aux
));
5058 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5060 if (sec
->sh_type
== SHT_SYMTAB
5061 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5063 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5064 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5066 strsec
= SECTION_HEADER (sec
->sh_link
);
5067 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5068 1, strsec
->sh_size
, _("string table"));
5069 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5071 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5076 printf (_("\nThere are no unwind sections in this file.\n"));
5078 while (unwcount
-- > 0)
5083 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
5084 i
< elf_header
.e_shnum
; ++i
, ++sec
)
5085 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
5092 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
5094 if ((unwsec
->sh_flags
& SHF_GROUP
) != 0)
5096 /* We need to find which section group it is in. */
5097 struct group_list
*g
= section_headers_groups
[i
]->root
;
5099 for (; g
!= NULL
; g
= g
->next
)
5101 sec
= SECTION_HEADER (g
->section_index
);
5103 if (streq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
))
5108 i
= elf_header
.e_shnum
;
5110 else if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
, len
))
5112 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO. */
5113 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
5114 suffix
= SECTION_NAME (unwsec
) + len
;
5115 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5117 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info_once
, len2
)
5118 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5123 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
5124 .IA_64.unwind or BAR -> .IA_64.unwind_info. */
5125 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
5126 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
5128 if (strneq (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
, len
))
5129 suffix
= SECTION_NAME (unwsec
) + len
;
5130 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
5132 if (strneq (SECTION_NAME (sec
), ELF_STRING_ia64_unwind_info
, len2
)
5133 && streq (SECTION_NAME (sec
) + len2
, suffix
))
5137 if (i
== elf_header
.e_shnum
)
5139 printf (_("\nCould not find unwind info section for "));
5141 if (string_table
== NULL
)
5142 printf ("%d", unwsec
->sh_name
);
5144 printf (_("'%s'"), SECTION_NAME (unwsec
));
5148 aux
.info_size
= sec
->sh_size
;
5149 aux
.info_addr
= sec
->sh_addr
;
5150 aux
.info
= get_data (NULL
, file
, sec
->sh_offset
, 1, aux
.info_size
,
5153 printf (_("\nUnwind section "));
5155 if (string_table
== NULL
)
5156 printf ("%d", unwsec
->sh_name
);
5158 printf (_("'%s'"), SECTION_NAME (unwsec
));
5160 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5161 (unsigned long) unwsec
->sh_offset
,
5162 (unsigned long) (unwsec
->sh_size
/ (3 * eh_addr_size
)));
5164 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
5166 if (aux
.table_len
> 0)
5167 dump_ia64_unwind (& aux
);
5170 free ((char *) aux
.table
);
5172 free ((char *) aux
.info
);
5181 free ((char *) aux
.strtab
);
5186 struct hppa_unw_aux_info
5188 struct hppa_unw_table_entry
5190 struct absaddr start
;
5192 unsigned int Cannot_unwind
:1; /* 0 */
5193 unsigned int Millicode
:1; /* 1 */
5194 unsigned int Millicode_save_sr0
:1; /* 2 */
5195 unsigned int Region_description
:2; /* 3..4 */
5196 unsigned int reserved1
:1; /* 5 */
5197 unsigned int Entry_SR
:1; /* 6 */
5198 unsigned int Entry_FR
:4; /* number saved */ /* 7..10 */
5199 unsigned int Entry_GR
:5; /* number saved */ /* 11..15 */
5200 unsigned int Args_stored
:1; /* 16 */
5201 unsigned int Variable_Frame
:1; /* 17 */
5202 unsigned int Separate_Package_Body
:1; /* 18 */
5203 unsigned int Frame_Extension_Millicode
:1; /* 19 */
5204 unsigned int Stack_Overflow_Check
:1; /* 20 */
5205 unsigned int Two_Instruction_SP_Increment
:1; /* 21 */
5206 unsigned int Ada_Region
:1; /* 22 */
5207 unsigned int cxx_info
:1; /* 23 */
5208 unsigned int cxx_try_catch
:1; /* 24 */
5209 unsigned int sched_entry_seq
:1; /* 25 */
5210 unsigned int reserved2
:1; /* 26 */
5211 unsigned int Save_SP
:1; /* 27 */
5212 unsigned int Save_RP
:1; /* 28 */
5213 unsigned int Save_MRP_in_frame
:1; /* 29 */
5214 unsigned int extn_ptr_defined
:1; /* 30 */
5215 unsigned int Cleanup_defined
:1; /* 31 */
5217 unsigned int MPE_XL_interrupt_marker
:1; /* 0 */
5218 unsigned int HP_UX_interrupt_marker
:1; /* 1 */
5219 unsigned int Large_frame
:1; /* 2 */
5220 unsigned int Pseudo_SP_Set
:1; /* 3 */
5221 unsigned int reserved4
:1; /* 4 */
5222 unsigned int Total_frame_size
:27; /* 5..31 */
5224 *table
; /* Unwind table. */
5225 unsigned long table_len
; /* Length of unwind table. */
5226 bfd_vma seg_base
; /* Starting address of segment. */
5227 Elf_Internal_Sym
*symtab
; /* The symbol table. */
5228 unsigned long nsyms
; /* Number of symbols. */
5229 char *strtab
; /* The string table. */
5230 unsigned long strtab_size
; /* Size of string table. */
5234 dump_hppa_unwind (struct hppa_unw_aux_info
*aux
)
5236 struct hppa_unw_table_entry
*tp
;
5238 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
5241 const char *procname
;
5243 find_symbol_for_address (aux
->symtab
, aux
->nsyms
, aux
->strtab
,
5244 aux
->strtab_size
, tp
->start
, &procname
,
5247 fputs ("\n<", stdout
);
5251 fputs (procname
, stdout
);
5254 printf ("+%lx", (unsigned long) offset
);
5257 fputs (">: [", stdout
);
5258 print_vma (tp
->start
.offset
, PREFIX_HEX
);
5259 fputc ('-', stdout
);
5260 print_vma (tp
->end
.offset
, PREFIX_HEX
);
5263 #define PF(_m) if (tp->_m) printf (#_m " ");
5264 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
5267 PF(Millicode_save_sr0
);
5268 /* PV(Region_description); */
5274 PF(Separate_Package_Body
);
5275 PF(Frame_Extension_Millicode
);
5276 PF(Stack_Overflow_Check
);
5277 PF(Two_Instruction_SP_Increment
);
5281 PF(sched_entry_seq
);
5284 PF(Save_MRP_in_frame
);
5285 PF(extn_ptr_defined
);
5286 PF(Cleanup_defined
);
5287 PF(MPE_XL_interrupt_marker
);
5288 PF(HP_UX_interrupt_marker
);
5291 PV(Total_frame_size
);
5300 slurp_hppa_unwind_table (FILE *file
,
5301 struct hppa_unw_aux_info
*aux
,
5302 Elf_Internal_Shdr
*sec
)
5304 unsigned long size
, unw_ent_size
, nentries
, nrelas
, i
;
5305 Elf_Internal_Phdr
*seg
;
5306 struct hppa_unw_table_entry
*tep
;
5307 Elf_Internal_Shdr
*relsec
;
5308 Elf_Internal_Rela
*rela
, *rp
;
5309 unsigned char *table
, *tp
;
5310 Elf_Internal_Sym
*sym
;
5311 const char *relname
;
5313 /* First, find the starting address of the segment that includes
5316 if (elf_header
.e_phnum
)
5318 if (! get_program_headers (file
))
5321 for (seg
= program_headers
;
5322 seg
< program_headers
+ elf_header
.e_phnum
;
5325 if (seg
->p_type
!= PT_LOAD
)
5328 if (sec
->sh_addr
>= seg
->p_vaddr
5329 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
5331 aux
->seg_base
= seg
->p_vaddr
;
5337 /* Second, build the unwind table from the contents of the unwind
5339 size
= sec
->sh_size
;
5340 table
= get_data (NULL
, file
, sec
->sh_offset
, 1, size
, _("unwind table"));
5345 nentries
= size
/ unw_ent_size
;
5346 size
= unw_ent_size
* nentries
;
5348 tep
= aux
->table
= xcmalloc (nentries
, sizeof (aux
->table
[0]));
5350 for (tp
= table
; tp
< table
+ size
; tp
+= unw_ent_size
, ++tep
)
5352 unsigned int tmp1
, tmp2
;
5354 tep
->start
.section
= SHN_UNDEF
;
5355 tep
->end
.section
= SHN_UNDEF
;
5357 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
5358 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
5359 tmp1
= byte_get ((unsigned char *) tp
+ 8, 4);
5360 tmp2
= byte_get ((unsigned char *) tp
+ 12, 4);
5362 tep
->start
.offset
+= aux
->seg_base
;
5363 tep
->end
.offset
+= aux
->seg_base
;
5365 tep
->Cannot_unwind
= (tmp1
>> 31) & 0x1;
5366 tep
->Millicode
= (tmp1
>> 30) & 0x1;
5367 tep
->Millicode_save_sr0
= (tmp1
>> 29) & 0x1;
5368 tep
->Region_description
= (tmp1
>> 27) & 0x3;
5369 tep
->reserved1
= (tmp1
>> 26) & 0x1;
5370 tep
->Entry_SR
= (tmp1
>> 25) & 0x1;
5371 tep
->Entry_FR
= (tmp1
>> 21) & 0xf;
5372 tep
->Entry_GR
= (tmp1
>> 16) & 0x1f;
5373 tep
->Args_stored
= (tmp1
>> 15) & 0x1;
5374 tep
->Variable_Frame
= (tmp1
>> 14) & 0x1;
5375 tep
->Separate_Package_Body
= (tmp1
>> 13) & 0x1;
5376 tep
->Frame_Extension_Millicode
= (tmp1
>> 12) & 0x1;
5377 tep
->Stack_Overflow_Check
= (tmp1
>> 11) & 0x1;
5378 tep
->Two_Instruction_SP_Increment
= (tmp1
>> 10) & 0x1;
5379 tep
->Ada_Region
= (tmp1
>> 9) & 0x1;
5380 tep
->cxx_info
= (tmp1
>> 8) & 0x1;
5381 tep
->cxx_try_catch
= (tmp1
>> 7) & 0x1;
5382 tep
->sched_entry_seq
= (tmp1
>> 6) & 0x1;
5383 tep
->reserved2
= (tmp1
>> 5) & 0x1;
5384 tep
->Save_SP
= (tmp1
>> 4) & 0x1;
5385 tep
->Save_RP
= (tmp1
>> 3) & 0x1;
5386 tep
->Save_MRP_in_frame
= (tmp1
>> 2) & 0x1;
5387 tep
->extn_ptr_defined
= (tmp1
>> 1) & 0x1;
5388 tep
->Cleanup_defined
= tmp1
& 0x1;
5390 tep
->MPE_XL_interrupt_marker
= (tmp2
>> 31) & 0x1;
5391 tep
->HP_UX_interrupt_marker
= (tmp2
>> 30) & 0x1;
5392 tep
->Large_frame
= (tmp2
>> 29) & 0x1;
5393 tep
->Pseudo_SP_Set
= (tmp2
>> 28) & 0x1;
5394 tep
->reserved4
= (tmp2
>> 27) & 0x1;
5395 tep
->Total_frame_size
= tmp2
& 0x7ffffff;
5399 /* Third, apply any relocations to the unwind table. */
5401 for (relsec
= section_headers
;
5402 relsec
< section_headers
+ elf_header
.e_shnum
;
5405 if (relsec
->sh_type
!= SHT_RELA
5406 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
5407 || SECTION_HEADER (relsec
->sh_info
) != sec
)
5410 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
5414 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
5418 relname
= elf_hppa_reloc_type (ELF32_R_TYPE (rp
->r_info
));
5419 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
5423 relname
= elf_hppa_reloc_type (ELF64_R_TYPE (rp
->r_info
));
5424 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
5427 /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64. */
5428 if (! const_strneq (relname
, "R_PARISC_SEGREL"))
5430 warn (_("Skipping unexpected relocation type %s\n"), relname
);
5434 i
= rp
->r_offset
/ unw_ent_size
;
5436 switch ((rp
->r_offset
% unw_ent_size
) / eh_addr_size
)
5439 aux
->table
[i
].start
.section
= sym
->st_shndx
;
5440 aux
->table
[i
].start
.offset
+= sym
->st_value
+ rp
->r_addend
;
5443 aux
->table
[i
].end
.section
= sym
->st_shndx
;
5444 aux
->table
[i
].end
.offset
+= sym
->st_value
+ rp
->r_addend
;
5454 aux
->table_len
= nentries
;
5460 hppa_process_unwind (FILE *file
)
5462 struct hppa_unw_aux_info aux
;
5463 Elf_Internal_Shdr
*unwsec
= NULL
;
5464 Elf_Internal_Shdr
*strsec
;
5465 Elf_Internal_Shdr
*sec
;
5468 memset (& aux
, 0, sizeof (aux
));
5470 if (string_table
== NULL
)
5473 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5475 if (sec
->sh_type
== SHT_SYMTAB
5476 && SECTION_HEADER_INDEX (sec
->sh_link
) < elf_header
.e_shnum
)
5478 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
5479 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
5481 strsec
= SECTION_HEADER (sec
->sh_link
);
5482 aux
.strtab
= get_data (NULL
, file
, strsec
->sh_offset
,
5483 1, strsec
->sh_size
, _("string table"));
5484 aux
.strtab_size
= aux
.strtab
!= NULL
? strsec
->sh_size
: 0;
5486 else if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5491 printf (_("\nThere are no unwind sections in this file.\n"));
5493 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
5495 if (streq (SECTION_NAME (sec
), ".PARISC.unwind"))
5497 printf (_("\nUnwind section "));
5498 printf (_("'%s'"), SECTION_NAME (sec
));
5500 printf (_(" at offset 0x%lx contains %lu entries:\n"),
5501 (unsigned long) sec
->sh_offset
,
5502 (unsigned long) (sec
->sh_size
/ (2 * eh_addr_size
+ 8)));
5504 slurp_hppa_unwind_table (file
, &aux
, sec
);
5505 if (aux
.table_len
> 0)
5506 dump_hppa_unwind (&aux
);
5509 free ((char *) aux
.table
);
5517 free ((char *) aux
.strtab
);
5523 process_unwind (FILE *file
)
5525 struct unwind_handler
{
5527 int (*handler
)(FILE *file
);
5529 { EM_IA_64
, ia64_process_unwind
},
5530 { EM_PARISC
, hppa_process_unwind
},
5538 for (i
= 0; handlers
[i
].handler
!= NULL
; i
++)
5539 if (elf_header
.e_machine
== handlers
[i
].machtype
)
5540 return handlers
[i
].handler (file
);
5542 printf (_("\nThere are no unwind sections in this file.\n"));
5547 dynamic_section_mips_val (Elf_Internal_Dyn
*entry
)
5549 switch (entry
->d_tag
)
5552 if (entry
->d_un
.d_val
== 0)
5556 static const char * opts
[] =
5558 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
5559 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
5560 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
5561 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
5566 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
5567 if (entry
->d_un
.d_val
& (1 << cnt
))
5569 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
5576 case DT_MIPS_IVERSION
:
5577 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
5578 printf ("Interface Version: %s\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
5580 printf ("<corrupt: %ld>\n", (long) entry
->d_un
.d_ptr
);
5583 case DT_MIPS_TIME_STAMP
:
5588 time_t time
= entry
->d_un
.d_val
;
5589 tmp
= gmtime (&time
);
5590 snprintf (timebuf
, sizeof (timebuf
), "%04u-%02u-%02uT%02u:%02u:%02u",
5591 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5592 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5593 printf ("Time Stamp: %s\n", timebuf
);
5597 case DT_MIPS_RLD_VERSION
:
5598 case DT_MIPS_LOCAL_GOTNO
:
5599 case DT_MIPS_CONFLICTNO
:
5600 case DT_MIPS_LIBLISTNO
:
5601 case DT_MIPS_SYMTABNO
:
5602 case DT_MIPS_UNREFEXTNO
:
5603 case DT_MIPS_HIPAGENO
:
5604 case DT_MIPS_DELTA_CLASS_NO
:
5605 case DT_MIPS_DELTA_INSTANCE_NO
:
5606 case DT_MIPS_DELTA_RELOC_NO
:
5607 case DT_MIPS_DELTA_SYM_NO
:
5608 case DT_MIPS_DELTA_CLASSSYM_NO
:
5609 case DT_MIPS_COMPACT_SIZE
:
5610 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
5614 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
5620 dynamic_section_parisc_val (Elf_Internal_Dyn
*entry
)
5622 switch (entry
->d_tag
)
5624 case DT_HP_DLD_FLAGS
:
5633 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
5634 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
5635 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
5636 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
5637 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
5638 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
5639 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
5640 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
5641 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
5642 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
5643 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" },
5644 { DT_HP_GST
, "HP_GST" },
5645 { DT_HP_SHLIB_FIXED
, "HP_SHLIB_FIXED" },
5646 { DT_HP_MERGE_SHLIB_SEG
, "HP_MERGE_SHLIB_SEG" },
5647 { DT_HP_NODELETE
, "HP_NODELETE" },
5648 { DT_HP_GROUP
, "HP_GROUP" },
5649 { DT_HP_PROTECT_LINKAGE_TABLE
, "HP_PROTECT_LINKAGE_TABLE" }
5653 bfd_vma val
= entry
->d_un
.d_val
;
5655 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
5656 if (val
& flags
[cnt
].bit
)
5660 fputs (flags
[cnt
].str
, stdout
);
5662 val
^= flags
[cnt
].bit
;
5665 if (val
!= 0 || first
)
5669 print_vma (val
, HEX
);
5675 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5682 dynamic_section_ia64_val (Elf_Internal_Dyn
*entry
)
5684 switch (entry
->d_tag
)
5686 case DT_IA_64_PLT_RESERVE
:
5687 /* First 3 slots reserved. */
5688 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5690 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
5694 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
5701 get_32bit_dynamic_section (FILE *file
)
5703 Elf32_External_Dyn
*edyn
, *ext
;
5704 Elf_Internal_Dyn
*entry
;
5706 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5707 _("dynamic section"));
5711 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5712 might not have the luxury of section headers. Look for the DT_NULL
5713 terminator to determine the number of entries. */
5714 for (ext
= edyn
, dynamic_nent
= 0;
5715 (char *) ext
< (char *) edyn
+ dynamic_size
;
5719 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5723 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5724 if (dynamic_section
== NULL
)
5726 error (_("Out of memory\n"));
5731 for (ext
= edyn
, entry
= dynamic_section
;
5732 entry
< dynamic_section
+ dynamic_nent
;
5735 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5736 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5745 get_64bit_dynamic_section (FILE *file
)
5747 Elf64_External_Dyn
*edyn
, *ext
;
5748 Elf_Internal_Dyn
*entry
;
5750 edyn
= get_data (NULL
, file
, dynamic_addr
, 1, dynamic_size
,
5751 _("dynamic section"));
5755 /* SGI's ELF has more than one section in the DYNAMIC segment, and we
5756 might not have the luxury of section headers. Look for the DT_NULL
5757 terminator to determine the number of entries. */
5758 for (ext
= edyn
, dynamic_nent
= 0;
5759 (char *) ext
< (char *) edyn
+ dynamic_size
;
5763 if (BYTE_GET (ext
->d_tag
) == DT_NULL
)
5767 dynamic_section
= cmalloc (dynamic_nent
, sizeof (*entry
));
5768 if (dynamic_section
== NULL
)
5770 error (_("Out of memory\n"));
5775 for (ext
= edyn
, entry
= dynamic_section
;
5776 entry
< dynamic_section
+ dynamic_nent
;
5779 entry
->d_tag
= BYTE_GET (ext
->d_tag
);
5780 entry
->d_un
.d_val
= BYTE_GET (ext
->d_un
.d_val
);
5789 print_dynamic_flags (bfd_vma flags
)
5797 flag
= flags
& - flags
;
5807 case DF_ORIGIN
: fputs ("ORIGIN", stdout
); break;
5808 case DF_SYMBOLIC
: fputs ("SYMBOLIC", stdout
); break;
5809 case DF_TEXTREL
: fputs ("TEXTREL", stdout
); break;
5810 case DF_BIND_NOW
: fputs ("BIND_NOW", stdout
); break;
5811 case DF_STATIC_TLS
: fputs ("STATIC_TLS", stdout
); break;
5812 default: fputs ("unknown", stdout
); break;
5818 /* Parse and display the contents of the dynamic section. */
5821 process_dynamic_section (FILE *file
)
5823 Elf_Internal_Dyn
*entry
;
5825 if (dynamic_size
== 0)
5828 printf (_("\nThere is no dynamic section in this file.\n"));
5835 if (! get_32bit_dynamic_section (file
))
5838 else if (! get_64bit_dynamic_section (file
))
5841 /* Find the appropriate symbol table. */
5842 if (dynamic_symbols
== NULL
)
5844 for (entry
= dynamic_section
;
5845 entry
< dynamic_section
+ dynamic_nent
;
5848 Elf_Internal_Shdr section
;
5850 if (entry
->d_tag
!= DT_SYMTAB
)
5853 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
5855 /* Since we do not know how big the symbol table is,
5856 we default to reading in the entire file (!) and
5857 processing that. This is overkill, I know, but it
5859 section
.sh_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5861 if (archive_file_offset
!= 0)
5862 section
.sh_size
= archive_file_size
- section
.sh_offset
;
5865 if (fseek (file
, 0, SEEK_END
))
5866 error (_("Unable to seek to end of file!"));
5868 section
.sh_size
= ftell (file
) - section
.sh_offset
;
5872 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
5874 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
5876 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
5877 if (num_dynamic_syms
< 1)
5879 error (_("Unable to determine the number of symbols to load\n"));
5883 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
5887 /* Similarly find a string table. */
5888 if (dynamic_strings
== NULL
)
5890 for (entry
= dynamic_section
;
5891 entry
< dynamic_section
+ dynamic_nent
;
5894 unsigned long offset
;
5897 if (entry
->d_tag
!= DT_STRTAB
)
5900 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
5902 /* Since we do not know how big the string table is,
5903 we default to reading in the entire file (!) and
5904 processing that. This is overkill, I know, but it
5907 offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
5909 if (archive_file_offset
!= 0)
5910 str_tab_len
= archive_file_size
- offset
;
5913 if (fseek (file
, 0, SEEK_END
))
5914 error (_("Unable to seek to end of file\n"));
5915 str_tab_len
= ftell (file
) - offset
;
5918 if (str_tab_len
< 1)
5921 (_("Unable to determine the length of the dynamic string table\n"));
5925 dynamic_strings
= get_data (NULL
, file
, offset
, 1, str_tab_len
,
5926 _("dynamic string table"));
5927 dynamic_strings_length
= str_tab_len
;
5932 /* And find the syminfo section if available. */
5933 if (dynamic_syminfo
== NULL
)
5935 unsigned long syminsz
= 0;
5937 for (entry
= dynamic_section
;
5938 entry
< dynamic_section
+ dynamic_nent
;
5941 if (entry
->d_tag
== DT_SYMINENT
)
5943 /* Note: these braces are necessary to avoid a syntax
5944 error from the SunOS4 C compiler. */
5945 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
5947 else if (entry
->d_tag
== DT_SYMINSZ
)
5948 syminsz
= entry
->d_un
.d_val
;
5949 else if (entry
->d_tag
== DT_SYMINFO
)
5950 dynamic_syminfo_offset
= offset_from_vma (file
, entry
->d_un
.d_val
,
5954 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
5956 Elf_External_Syminfo
*extsyminfo
, *extsym
;
5957 Elf_Internal_Syminfo
*syminfo
;
5959 /* There is a syminfo section. Read the data. */
5960 extsyminfo
= get_data (NULL
, file
, dynamic_syminfo_offset
, 1,
5961 syminsz
, _("symbol information"));
5965 dynamic_syminfo
= malloc (syminsz
);
5966 if (dynamic_syminfo
== NULL
)
5968 error (_("Out of memory\n"));
5972 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
5973 for (syminfo
= dynamic_syminfo
, extsym
= extsyminfo
;
5974 syminfo
< dynamic_syminfo
+ dynamic_syminfo_nent
;
5975 ++syminfo
, ++extsym
)
5977 syminfo
->si_boundto
= BYTE_GET (extsym
->si_boundto
);
5978 syminfo
->si_flags
= BYTE_GET (extsym
->si_flags
);
5985 if (do_dynamic
&& dynamic_addr
)
5986 printf (_("\nDynamic section at offset 0x%lx contains %u entries:\n"),
5987 dynamic_addr
, dynamic_nent
);
5989 printf (_(" Tag Type Name/Value\n"));
5991 for (entry
= dynamic_section
;
5992 entry
< dynamic_section
+ dynamic_nent
;
6000 print_vma (entry
->d_tag
, FULL_HEX
);
6001 dtype
= get_dynamic_type (entry
->d_tag
);
6002 printf (" (%s)%*s", dtype
,
6003 ((is_32bit_elf
? 27 : 19)
6004 - (int) strlen (dtype
)),
6008 switch (entry
->d_tag
)
6012 print_dynamic_flags (entry
->d_un
.d_val
);
6022 switch (entry
->d_tag
)
6025 printf (_("Auxiliary library"));
6029 printf (_("Filter library"));
6033 printf (_("Configuration file"));
6037 printf (_("Dependency audit library"));
6041 printf (_("Audit library"));
6045 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6046 printf (": [%s]\n", GET_DYNAMIC_NAME (entry
->d_un
.d_val
));
6050 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6059 printf (_("Flags:"));
6061 if (entry
->d_un
.d_val
== 0)
6062 printf (_(" None\n"));
6065 unsigned long int val
= entry
->d_un
.d_val
;
6067 if (val
& DTF_1_PARINIT
)
6069 printf (" PARINIT");
6070 val
^= DTF_1_PARINIT
;
6072 if (val
& DTF_1_CONFEXP
)
6074 printf (" CONFEXP");
6075 val
^= DTF_1_CONFEXP
;
6078 printf (" %lx", val
);
6087 printf (_("Flags:"));
6089 if (entry
->d_un
.d_val
== 0)
6090 printf (_(" None\n"));
6093 unsigned long int val
= entry
->d_un
.d_val
;
6095 if (val
& DF_P1_LAZYLOAD
)
6097 printf (" LAZYLOAD");
6098 val
^= DF_P1_LAZYLOAD
;
6100 if (val
& DF_P1_GROUPPERM
)
6102 printf (" GROUPPERM");
6103 val
^= DF_P1_GROUPPERM
;
6106 printf (" %lx", val
);
6115 printf (_("Flags:"));
6116 if (entry
->d_un
.d_val
== 0)
6117 printf (_(" None\n"));
6120 unsigned long int val
= entry
->d_un
.d_val
;
6127 if (val
& DF_1_GLOBAL
)
6132 if (val
& DF_1_GROUP
)
6137 if (val
& DF_1_NODELETE
)
6139 printf (" NODELETE");
6140 val
^= DF_1_NODELETE
;
6142 if (val
& DF_1_LOADFLTR
)
6144 printf (" LOADFLTR");
6145 val
^= DF_1_LOADFLTR
;
6147 if (val
& DF_1_INITFIRST
)
6149 printf (" INITFIRST");
6150 val
^= DF_1_INITFIRST
;
6152 if (val
& DF_1_NOOPEN
)
6157 if (val
& DF_1_ORIGIN
)
6162 if (val
& DF_1_DIRECT
)
6167 if (val
& DF_1_TRANS
)
6172 if (val
& DF_1_INTERPOSE
)
6174 printf (" INTERPOSE");
6175 val
^= DF_1_INTERPOSE
;
6177 if (val
& DF_1_NODEFLIB
)
6179 printf (" NODEFLIB");
6180 val
^= DF_1_NODEFLIB
;
6182 if (val
& DF_1_NODUMP
)
6187 if (val
& DF_1_CONLFAT
)
6189 printf (" CONLFAT");
6190 val
^= DF_1_CONLFAT
;
6193 printf (" %lx", val
);
6200 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6202 puts (get_dynamic_type (entry
->d_un
.d_val
));
6222 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6228 if (VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6229 name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6235 switch (entry
->d_tag
)
6238 printf (_("Shared library: [%s]"), name
);
6240 if (streq (name
, program_interpreter
))
6241 printf (_(" program interpreter"));
6245 printf (_("Library soname: [%s]"), name
);
6249 printf (_("Library rpath: [%s]"), name
);
6253 printf (_("Library runpath: [%s]"), name
);
6257 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6262 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6275 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
6279 case DT_INIT_ARRAYSZ
:
6280 case DT_FINI_ARRAYSZ
:
6281 case DT_GNU_CONFLICTSZ
:
6282 case DT_GNU_LIBLISTSZ
:
6285 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6286 printf (" (bytes)\n");
6296 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
6309 if (entry
->d_tag
== DT_USED
6310 && VALID_DYNAMIC_NAME (entry
->d_un
.d_val
))
6312 char *name
= GET_DYNAMIC_NAME (entry
->d_un
.d_val
);
6316 printf (_("Not needed object: [%s]\n"), name
);
6321 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6327 /* The value of this entry is ignored. */
6332 case DT_GNU_PRELINKED
:
6336 time_t time
= entry
->d_un
.d_val
;
6338 tmp
= gmtime (&time
);
6339 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
6340 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
6341 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
6347 dynamic_info_DT_GNU_HASH
= entry
->d_un
.d_val
;
6350 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6356 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
6357 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
6362 switch (elf_header
.e_machine
)
6365 case EM_MIPS_RS3_LE
:
6366 dynamic_section_mips_val (entry
);
6369 dynamic_section_parisc_val (entry
);
6372 dynamic_section_ia64_val (entry
);
6375 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
6387 get_ver_flags (unsigned int flags
)
6389 static char buff
[32];
6396 if (flags
& VER_FLG_BASE
)
6397 strcat (buff
, "BASE ");
6399 if (flags
& VER_FLG_WEAK
)
6401 if (flags
& VER_FLG_BASE
)
6402 strcat (buff
, "| ");
6404 strcat (buff
, "WEAK ");
6407 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
6408 strcat (buff
, "| <unknown>");
6413 /* Display the contents of the version sections. */
6415 process_version_sections (FILE *file
)
6417 Elf_Internal_Shdr
*section
;
6424 for (i
= 0, section
= section_headers
;
6425 i
< elf_header
.e_shnum
;
6428 switch (section
->sh_type
)
6430 case SHT_GNU_verdef
:
6432 Elf_External_Verdef
*edefs
;
6439 (_("\nVersion definition section '%s' contains %ld entries:\n"),
6440 SECTION_NAME (section
), section
->sh_info
);
6442 printf (_(" Addr: 0x"));
6443 printf_vma (section
->sh_addr
);
6444 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6445 (unsigned long) section
->sh_offset
, section
->sh_link
,
6446 SECTION_HEADER_INDEX (section
->sh_link
)
6447 < elf_header
.e_shnum
6448 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6451 edefs
= get_data (NULL
, file
, section
->sh_offset
, 1,
6453 _("version definition section"));
6457 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6460 Elf_External_Verdef
*edef
;
6461 Elf_Internal_Verdef ent
;
6462 Elf_External_Verdaux
*eaux
;
6463 Elf_Internal_Verdaux aux
;
6467 vstart
= ((char *) edefs
) + idx
;
6469 edef
= (Elf_External_Verdef
*) vstart
;
6471 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
6472 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
6473 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
6474 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
6475 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
6476 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
6477 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
6479 printf (_(" %#06x: Rev: %d Flags: %s"),
6480 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
6482 printf (_(" Index: %d Cnt: %d "),
6483 ent
.vd_ndx
, ent
.vd_cnt
);
6485 vstart
+= ent
.vd_aux
;
6487 eaux
= (Elf_External_Verdaux
*) vstart
;
6489 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6490 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6492 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6493 printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux
.vda_name
));
6495 printf (_("Name index: %ld\n"), aux
.vda_name
);
6497 isum
= idx
+ ent
.vd_aux
;
6499 for (j
= 1; j
< ent
.vd_cnt
; j
++)
6501 isum
+= aux
.vda_next
;
6502 vstart
+= aux
.vda_next
;
6504 eaux
= (Elf_External_Verdaux
*) vstart
;
6506 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
6507 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
6509 if (VALID_DYNAMIC_NAME (aux
.vda_name
))
6510 printf (_(" %#06x: Parent %d: %s\n"),
6511 isum
, j
, GET_DYNAMIC_NAME (aux
.vda_name
));
6513 printf (_(" %#06x: Parent %d, name index: %ld\n"),
6514 isum
, j
, aux
.vda_name
);
6524 case SHT_GNU_verneed
:
6526 Elf_External_Verneed
*eneed
;
6532 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
6533 SECTION_NAME (section
), section
->sh_info
);
6535 printf (_(" Addr: 0x"));
6536 printf_vma (section
->sh_addr
);
6537 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
6538 (unsigned long) section
->sh_offset
, section
->sh_link
,
6539 SECTION_HEADER_INDEX (section
->sh_link
)
6540 < elf_header
.e_shnum
6541 ? SECTION_NAME (SECTION_HEADER (section
->sh_link
))
6544 eneed
= get_data (NULL
, file
, section
->sh_offset
, 1,
6546 _("version need section"));
6550 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
6552 Elf_External_Verneed
*entry
;
6553 Elf_Internal_Verneed ent
;
6558 vstart
= ((char *) eneed
) + idx
;
6560 entry
= (Elf_External_Verneed
*) vstart
;
6562 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
6563 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
6564 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
6565 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
6566 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
6568 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
6570 if (VALID_DYNAMIC_NAME (ent
.vn_file
))
6571 printf (_(" File: %s"), GET_DYNAMIC_NAME (ent
.vn_file
));
6573 printf (_(" File: %lx"), ent
.vn_file
);
6575 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
6577 vstart
+= ent
.vn_aux
;
6579 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
6581 Elf_External_Vernaux
*eaux
;
6582 Elf_Internal_Vernaux aux
;
6584 eaux
= (Elf_External_Vernaux
*) vstart
;
6586 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
6587 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
6588 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
6589 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
6590 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
6592 if (VALID_DYNAMIC_NAME (aux
.vna_name
))
6593 printf (_(" %#06x: Name: %s"),
6594 isum
, GET_DYNAMIC_NAME (aux
.vna_name
));
6596 printf (_(" %#06x: Name index: %lx"),
6597 isum
, aux
.vna_name
);
6599 printf (_(" Flags: %s Version: %d\n"),
6600 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
6602 isum
+= aux
.vna_next
;
6603 vstart
+= aux
.vna_next
;
6613 case SHT_GNU_versym
:
6615 Elf_Internal_Shdr
*link_section
;
6618 unsigned char *edata
;
6619 unsigned short *data
;
6621 Elf_Internal_Sym
*symbols
;
6622 Elf_Internal_Shdr
*string_sec
;
6625 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
6628 link_section
= SECTION_HEADER (section
->sh_link
);
6629 total
= section
->sh_size
/ sizeof (Elf_External_Versym
);
6631 if (SECTION_HEADER_INDEX (link_section
->sh_link
)
6632 >= elf_header
.e_shnum
)
6637 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
6639 string_sec
= SECTION_HEADER (link_section
->sh_link
);
6641 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
6642 string_sec
->sh_size
, _("version string table"));
6646 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
6647 SECTION_NAME (section
), total
);
6649 printf (_(" Addr: "));
6650 printf_vma (section
->sh_addr
);
6651 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
6652 (unsigned long) section
->sh_offset
, section
->sh_link
,
6653 SECTION_NAME (link_section
));
6655 off
= offset_from_vma (file
,
6656 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
6657 total
* sizeof (short));
6658 edata
= get_data (NULL
, file
, off
, total
, sizeof (short),
6659 _("version symbol data"));
6666 data
= cmalloc (total
, sizeof (short));
6668 for (cnt
= total
; cnt
--;)
6669 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
6674 for (cnt
= 0; cnt
< total
; cnt
+= 4)
6677 int check_def
, check_need
;
6680 printf (" %03x:", cnt
);
6682 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
6683 switch (data
[cnt
+ j
])
6686 fputs (_(" 0 (*local*) "), stdout
);
6690 fputs (_(" 1 (*global*) "), stdout
);
6694 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
6695 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
6699 if (SECTION_HEADER_INDEX (symbols
[cnt
+ j
].st_shndx
)
6700 >= elf_header
.e_shnum
6701 || SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
6704 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
6711 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
6713 Elf_Internal_Verneed ivn
;
6714 unsigned long offset
;
6716 offset
= offset_from_vma
6717 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
6718 sizeof (Elf_External_Verneed
));
6722 Elf_Internal_Vernaux ivna
;
6723 Elf_External_Verneed evn
;
6724 Elf_External_Vernaux evna
;
6725 unsigned long a_off
;
6727 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
6730 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6731 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6733 a_off
= offset
+ ivn
.vn_aux
;
6737 get_data (&evna
, file
, a_off
, sizeof (evna
),
6738 1, _("version need aux (2)"));
6740 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6741 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6743 a_off
+= ivna
.vna_next
;
6745 while (ivna
.vna_other
!= data
[cnt
+ j
]
6746 && ivna
.vna_next
!= 0);
6748 if (ivna
.vna_other
== data
[cnt
+ j
])
6750 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6752 name
= strtab
+ ivna
.vna_name
;
6753 nn
+= printf ("(%s%-*s",
6755 12 - (int) strlen (name
),
6761 offset
+= ivn
.vn_next
;
6763 while (ivn
.vn_next
);
6766 if (check_def
&& data
[cnt
+ j
] != 0x8001
6767 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6769 Elf_Internal_Verdef ivd
;
6770 Elf_External_Verdef evd
;
6771 unsigned long offset
;
6773 offset
= offset_from_vma
6774 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
6779 get_data (&evd
, file
, offset
, sizeof (evd
), 1,
6782 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6783 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6785 offset
+= ivd
.vd_next
;
6787 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
6788 && ivd
.vd_next
!= 0);
6790 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
6792 Elf_External_Verdaux evda
;
6793 Elf_Internal_Verdaux ivda
;
6795 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6797 get_data (&evda
, file
,
6798 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
6800 _("version def aux"));
6802 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6804 name
= strtab
+ ivda
.vda_name
;
6805 nn
+= printf ("(%s%-*s",
6807 12 - (int) strlen (name
),
6813 printf ("%*c", 18 - nn
, ' ');
6831 printf (_("\nNo version information found in this file.\n"));
6837 get_symbol_binding (unsigned int binding
)
6839 static char buff
[32];
6843 case STB_LOCAL
: return "LOCAL";
6844 case STB_GLOBAL
: return "GLOBAL";
6845 case STB_WEAK
: return "WEAK";
6847 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
6848 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"),
6850 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
6851 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), binding
);
6853 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), binding
);
6859 get_symbol_type (unsigned int type
)
6861 static char buff
[32];
6865 case STT_NOTYPE
: return "NOTYPE";
6866 case STT_OBJECT
: return "OBJECT";
6867 case STT_FUNC
: return "FUNC";
6868 case STT_SECTION
: return "SECTION";
6869 case STT_FILE
: return "FILE";
6870 case STT_COMMON
: return "COMMON";
6871 case STT_TLS
: return "TLS";
6872 case STT_RELC
: return "RELC";
6873 case STT_SRELC
: return "SRELC";
6875 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
6877 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
6878 return "THUMB_FUNC";
6880 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
6883 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
6884 return "PARISC_MILLI";
6886 snprintf (buff
, sizeof (buff
), _("<processor specific>: %d"), type
);
6888 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
6890 if (elf_header
.e_machine
== EM_PARISC
)
6892 if (type
== STT_HP_OPAQUE
)
6894 if (type
== STT_HP_STUB
)
6898 snprintf (buff
, sizeof (buff
), _("<OS specific>: %d"), type
);
6901 snprintf (buff
, sizeof (buff
), _("<unknown>: %d"), type
);
6907 get_symbol_visibility (unsigned int visibility
)
6911 case STV_DEFAULT
: return "DEFAULT";
6912 case STV_INTERNAL
: return "INTERNAL";
6913 case STV_HIDDEN
: return "HIDDEN";
6914 case STV_PROTECTED
: return "PROTECTED";
6920 get_mips_symbol_other (unsigned int other
)
6924 case STO_OPTIONAL
: return "OPTIONAL";
6925 case STO_MIPS16
: return "MIPS16";
6926 default: return NULL
;
6931 get_symbol_other (unsigned int other
)
6933 const char * result
= NULL
;
6934 static char buff
[32];
6939 switch (elf_header
.e_machine
)
6942 result
= get_mips_symbol_other (other
);
6950 snprintf (buff
, sizeof buff
, _("<other>: %x"), other
);
6955 get_symbol_index_type (unsigned int type
)
6957 static char buff
[32];
6961 case SHN_UNDEF
: return "UND";
6962 case SHN_ABS
: return "ABS";
6963 case SHN_COMMON
: return "COM";
6965 if (type
== SHN_IA_64_ANSI_COMMON
6966 && elf_header
.e_machine
== EM_IA_64
6967 && elf_header
.e_ident
[EI_OSABI
] == ELFOSABI_HPUX
)
6969 else if (elf_header
.e_machine
== EM_X86_64
6970 && type
== SHN_X86_64_LCOMMON
)
6972 else if (type
== SHN_MIPS_SCOMMON
6973 && elf_header
.e_machine
== EM_MIPS
)
6975 else if (type
== SHN_MIPS_SUNDEFINED
6976 && elf_header
.e_machine
== EM_MIPS
)
6978 else if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
6979 sprintf (buff
, "PRC[0x%04x]", type
);
6980 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
6981 sprintf (buff
, "OS [0x%04x]", type
);
6982 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
6983 sprintf (buff
, "RSV[0x%04x]", type
);
6985 sprintf (buff
, "%3d", type
);
6993 get_dynamic_data (FILE *file
, unsigned int number
, unsigned int ent_size
)
6995 unsigned char *e_data
;
6998 e_data
= cmalloc (number
, ent_size
);
7002 error (_("Out of memory\n"));
7006 if (fread (e_data
, ent_size
, number
, file
) != number
)
7008 error (_("Unable to read in dynamic data\n"));
7012 i_data
= cmalloc (number
, sizeof (*i_data
));
7016 error (_("Out of memory\n"));
7022 i_data
[number
] = byte_get (e_data
+ number
* ent_size
, ent_size
);
7029 /* Dump the symbol table. */
7031 process_symbol_table (FILE *file
)
7033 Elf_Internal_Shdr
*section
;
7034 bfd_vma nbuckets
= 0;
7035 bfd_vma nchains
= 0;
7036 bfd_vma
*buckets
= NULL
;
7037 bfd_vma
*chains
= NULL
;
7038 bfd_vma ngnubuckets
= 0;
7039 bfd_vma
*gnubuckets
= NULL
;
7040 bfd_vma
*gnuchains
= NULL
;
7042 if (! do_syms
&& !do_histogram
)
7045 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
7048 unsigned char nb
[8];
7049 unsigned char nc
[8];
7050 int hash_ent_size
= 4;
7052 if ((elf_header
.e_machine
== EM_ALPHA
7053 || elf_header
.e_machine
== EM_S390
7054 || elf_header
.e_machine
== EM_S390_OLD
)
7055 && elf_header
.e_ident
[EI_CLASS
] == ELFCLASS64
)
7059 (archive_file_offset
7060 + offset_from_vma (file
, dynamic_info
[DT_HASH
],
7061 sizeof nb
+ sizeof nc
)),
7064 error (_("Unable to seek to start of dynamic information"));
7068 if (fread (nb
, hash_ent_size
, 1, file
) != 1)
7070 error (_("Failed to read in number of buckets\n"));
7074 if (fread (nc
, hash_ent_size
, 1, file
) != 1)
7076 error (_("Failed to read in number of chains\n"));
7080 nbuckets
= byte_get (nb
, hash_ent_size
);
7081 nchains
= byte_get (nc
, hash_ent_size
);
7083 buckets
= get_dynamic_data (file
, nbuckets
, hash_ent_size
);
7084 chains
= get_dynamic_data (file
, nchains
, hash_ent_size
);
7086 if (buckets
== NULL
|| chains
== NULL
)
7091 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
7096 printf (_("\nSymbol table for image:\n"));
7098 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7100 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
7102 for (hn
= 0; hn
< nbuckets
; hn
++)
7107 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
7109 Elf_Internal_Sym
*psym
;
7112 psym
= dynamic_symbols
+ si
;
7114 n
= print_vma (si
, DEC_5
);
7116 fputs (" " + n
, stdout
);
7117 printf (" %3lu: ", hn
);
7118 print_vma (psym
->st_value
, LONG_HEX
);
7120 print_vma (psym
->st_size
, DEC_5
);
7122 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7123 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7124 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7125 /* Check to see if any other bits in the st_other field are set.
7126 Note - displaying this information disrupts the layout of the
7127 table being generated, but for the moment this case is very rare. */
7128 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7129 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7130 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
7131 if (VALID_DYNAMIC_NAME (psym
->st_name
))
7132 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
7134 printf (" <corrupt: %14ld>", psym
->st_name
);
7139 else if (do_syms
&& !do_using_dynamic
)
7143 for (i
= 0, section
= section_headers
;
7144 i
< elf_header
.e_shnum
;
7148 char *strtab
= NULL
;
7149 unsigned long int strtab_size
= 0;
7150 Elf_Internal_Sym
*symtab
;
7151 Elf_Internal_Sym
*psym
;
7154 if ( section
->sh_type
!= SHT_SYMTAB
7155 && section
->sh_type
!= SHT_DYNSYM
)
7158 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
7159 SECTION_NAME (section
),
7160 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
7162 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7164 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
7166 symtab
= GET_ELF_SYMBOLS (file
, section
);
7170 if (section
->sh_link
== elf_header
.e_shstrndx
)
7172 strtab
= string_table
;
7173 strtab_size
= string_table_length
;
7175 else if (SECTION_HEADER_INDEX (section
->sh_link
) < elf_header
.e_shnum
)
7177 Elf_Internal_Shdr
*string_sec
;
7179 string_sec
= SECTION_HEADER (section
->sh_link
);
7181 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
,
7182 1, string_sec
->sh_size
, _("string table"));
7183 strtab_size
= strtab
!= NULL
? string_sec
->sh_size
: 0;
7186 for (si
= 0, psym
= symtab
;
7187 si
< section
->sh_size
/ section
->sh_entsize
;
7190 printf ("%6d: ", si
);
7191 print_vma (psym
->st_value
, LONG_HEX
);
7193 print_vma (psym
->st_size
, DEC_5
);
7194 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
7195 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
7196 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
7197 /* Check to see if any other bits in the st_other field are set.
7198 Note - displaying this information disrupts the layout of the
7199 table being generated, but for the moment this case is very rare. */
7200 if (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
))
7201 printf (" [%s] ", get_symbol_other (psym
->st_other
^ ELF_ST_VISIBILITY (psym
->st_other
)));
7202 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
7203 print_symbol (25, psym
->st_name
< strtab_size
7204 ? strtab
+ psym
->st_name
: "<corrupt>");
7206 if (section
->sh_type
== SHT_DYNSYM
&&
7207 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
7209 unsigned char data
[2];
7210 unsigned short vers_data
;
7211 unsigned long offset
;
7215 offset
= offset_from_vma
7216 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)],
7217 sizeof data
+ si
* sizeof (vers_data
));
7219 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
7220 sizeof (data
), 1, _("version data"));
7222 vers_data
= byte_get (data
, 2);
7224 is_nobits
= (SECTION_HEADER_INDEX (psym
->st_shndx
)
7225 < elf_header
.e_shnum
7226 && SECTION_HEADER (psym
->st_shndx
)->sh_type
7229 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
7231 if ((vers_data
& 0x8000) || vers_data
> 1)
7233 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
7234 && (is_nobits
|| ! check_def
))
7236 Elf_External_Verneed evn
;
7237 Elf_Internal_Verneed ivn
;
7238 Elf_Internal_Vernaux ivna
;
7240 /* We must test both. */
7241 offset
= offset_from_vma
7242 (file
, version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)],
7247 unsigned long vna_off
;
7249 get_data (&evn
, file
, offset
, sizeof (evn
), 1,
7252 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
7253 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
7255 vna_off
= offset
+ ivn
.vn_aux
;
7259 Elf_External_Vernaux evna
;
7261 get_data (&evna
, file
, vna_off
,
7263 _("version need aux (3)"));
7265 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
7266 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
7267 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
7269 vna_off
+= ivna
.vna_next
;
7271 while (ivna
.vna_other
!= vers_data
7272 && ivna
.vna_next
!= 0);
7274 if (ivna
.vna_other
== vers_data
)
7277 offset
+= ivn
.vn_next
;
7279 while (ivn
.vn_next
!= 0);
7281 if (ivna
.vna_other
== vers_data
)
7284 ivna
.vna_name
< strtab_size
7285 ? strtab
+ ivna
.vna_name
: "<corrupt>",
7289 else if (! is_nobits
)
7290 error (_("bad dynamic symbol"));
7297 if (vers_data
!= 0x8001
7298 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
7300 Elf_Internal_Verdef ivd
;
7301 Elf_Internal_Verdaux ivda
;
7302 Elf_External_Verdaux evda
;
7303 unsigned long offset
;
7305 offset
= offset_from_vma
7307 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)],
7308 sizeof (Elf_External_Verdef
));
7312 Elf_External_Verdef evd
;
7314 get_data (&evd
, file
, offset
, sizeof (evd
),
7315 1, _("version def"));
7317 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
7318 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
7319 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
7321 offset
+= ivd
.vd_next
;
7323 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
7324 && ivd
.vd_next
!= 0);
7326 offset
-= ivd
.vd_next
;
7327 offset
+= ivd
.vd_aux
;
7329 get_data (&evda
, file
, offset
, sizeof (evda
),
7330 1, _("version def aux"));
7332 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
7334 if (psym
->st_name
!= ivda
.vda_name
)
7335 printf ((vers_data
& 0x8000)
7337 ivda
.vda_name
< strtab_size
7338 ? strtab
+ ivda
.vda_name
: "<corrupt>");
7348 if (strtab
!= string_table
)
7354 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
7356 if (do_histogram
&& buckets
!= NULL
)
7358 unsigned long *lengths
;
7359 unsigned long *counts
;
7362 unsigned long maxlength
= 0;
7363 unsigned long nzero_counts
= 0;
7364 unsigned long nsyms
= 0;
7366 printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
7367 (unsigned long) nbuckets
);
7368 printf (_(" Length Number %% of total Coverage\n"));
7370 lengths
= calloc (nbuckets
, sizeof (*lengths
));
7371 if (lengths
== NULL
)
7373 error (_("Out of memory"));
7376 for (hn
= 0; hn
< nbuckets
; ++hn
)
7378 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
7381 if (maxlength
< ++lengths
[hn
])
7386 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7389 error (_("Out of memory"));
7393 for (hn
= 0; hn
< nbuckets
; ++hn
)
7394 ++counts
[lengths
[hn
]];
7399 printf (" 0 %-10lu (%5.1f%%)\n",
7400 counts
[0], (counts
[0] * 100.0) / nbuckets
);
7401 for (i
= 1; i
<= maxlength
; ++i
)
7403 nzero_counts
+= counts
[i
] * i
;
7404 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7405 i
, counts
[i
], (counts
[i
] * 100.0) / nbuckets
,
7406 (nzero_counts
* 100.0) / nsyms
);
7414 if (buckets
!= NULL
)
7420 if (do_histogram
&& dynamic_info_DT_GNU_HASH
)
7422 unsigned char nb
[16];
7423 bfd_vma i
, maxchain
= 0xffffffff, symidx
, bitmaskwords
;
7424 unsigned long *lengths
;
7425 unsigned long *counts
;
7427 unsigned long maxlength
= 0;
7428 unsigned long nzero_counts
= 0;
7429 unsigned long nsyms
= 0;
7430 bfd_vma buckets_vma
;
7433 (archive_file_offset
7434 + offset_from_vma (file
, dynamic_info_DT_GNU_HASH
,
7438 error (_("Unable to seek to start of dynamic information"));
7442 if (fread (nb
, 16, 1, file
) != 1)
7444 error (_("Failed to read in number of buckets\n"));
7448 ngnubuckets
= byte_get (nb
, 4);
7449 symidx
= byte_get (nb
+ 4, 4);
7450 bitmaskwords
= byte_get (nb
+ 8, 4);
7451 buckets_vma
= dynamic_info_DT_GNU_HASH
+ 16;
7453 buckets_vma
+= bitmaskwords
* 4;
7455 buckets_vma
+= bitmaskwords
* 8;
7458 (archive_file_offset
7459 + offset_from_vma (file
, buckets_vma
, 4)),
7462 error (_("Unable to seek to start of dynamic information"));
7466 gnubuckets
= get_dynamic_data (file
, ngnubuckets
, 4);
7468 if (gnubuckets
== NULL
)
7471 for (i
= 0; i
< ngnubuckets
; i
++)
7472 if (gnubuckets
[i
] != 0)
7474 if (gnubuckets
[i
] < symidx
)
7477 if (maxchain
== 0xffffffff || gnubuckets
[i
] > maxchain
)
7478 maxchain
= gnubuckets
[i
];
7481 if (maxchain
== 0xffffffff)
7487 (archive_file_offset
7488 + offset_from_vma (file
, buckets_vma
7489 + 4 * (ngnubuckets
+ maxchain
), 4)),
7492 error (_("Unable to seek to start of dynamic information"));
7498 if (fread (nb
, 4, 1, file
) != 1)
7500 error (_("Failed to determine last chain length\n"));
7504 if (maxchain
+ 1 == 0)
7509 while ((byte_get (nb
, 4) & 1) == 0);
7512 (archive_file_offset
7513 + offset_from_vma (file
, buckets_vma
+ 4 * ngnubuckets
, 4)),
7516 error (_("Unable to seek to start of dynamic information"));
7520 gnuchains
= get_dynamic_data (file
, maxchain
, 4);
7522 if (gnuchains
== NULL
)
7525 lengths
= calloc (ngnubuckets
, sizeof (*lengths
));
7526 if (lengths
== NULL
)
7528 error (_("Out of memory"));
7532 printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
7533 (unsigned long) ngnubuckets
);
7534 printf (_(" Length Number %% of total Coverage\n"));
7536 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7537 if (gnubuckets
[hn
] != 0)
7539 bfd_vma off
, length
= 1;
7541 for (off
= gnubuckets
[hn
] - symidx
;
7542 (gnuchains
[off
] & 1) == 0; ++off
)
7544 lengths
[hn
] = length
;
7545 if (length
> maxlength
)
7550 counts
= calloc (maxlength
+ 1, sizeof (*counts
));
7553 error (_("Out of memory"));
7557 for (hn
= 0; hn
< ngnubuckets
; ++hn
)
7558 ++counts
[lengths
[hn
]];
7560 if (ngnubuckets
> 0)
7563 printf (" 0 %-10lu (%5.1f%%)\n",
7564 counts
[0], (counts
[0] * 100.0) / ngnubuckets
);
7565 for (j
= 1; j
<= maxlength
; ++j
)
7567 nzero_counts
+= counts
[j
] * j
;
7568 printf ("%7lu %-10lu (%5.1f%%) %5.1f%%\n",
7569 j
, counts
[j
], (counts
[j
] * 100.0) / ngnubuckets
,
7570 (nzero_counts
* 100.0) / nsyms
);
7584 process_syminfo (FILE *file ATTRIBUTE_UNUSED
)
7588 if (dynamic_syminfo
== NULL
7590 /* No syminfo, this is ok. */
7593 /* There better should be a dynamic symbol section. */
7594 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
7598 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
7599 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
7601 printf (_(" Num: Name BoundTo Flags\n"));
7602 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
7604 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
7606 printf ("%4d: ", i
);
7607 if (VALID_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
))
7608 print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols
[i
].st_name
));
7610 printf ("<corrupt: %19ld>", dynamic_symbols
[i
].st_name
);
7613 switch (dynamic_syminfo
[i
].si_boundto
)
7615 case SYMINFO_BT_SELF
:
7616 fputs ("SELF ", stdout
);
7618 case SYMINFO_BT_PARENT
:
7619 fputs ("PARENT ", stdout
);
7622 if (dynamic_syminfo
[i
].si_boundto
> 0
7623 && dynamic_syminfo
[i
].si_boundto
< dynamic_nent
7624 && VALID_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
))
7626 print_symbol (10, GET_DYNAMIC_NAME (dynamic_section
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
7630 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
7634 if (flags
& SYMINFO_FLG_DIRECT
)
7636 if (flags
& SYMINFO_FLG_PASSTHRU
)
7637 printf (" PASSTHRU");
7638 if (flags
& SYMINFO_FLG_COPY
)
7640 if (flags
& SYMINFO_FLG_LAZYLOAD
)
7641 printf (" LAZYLOAD");
7649 #ifdef SUPPORT_DISASSEMBLY
7651 disassemble_section (Elf_Internal_Shdr
*section
, FILE *file
)
7653 printf (_("\nAssembly dump of section %s\n"),
7654 SECTION_NAME (section
));
7656 /* XXX -- to be done --- XXX */
7663 dump_section (Elf_Internal_Shdr
*section
, FILE *file
)
7665 Elf_Internal_Shdr
*relsec
;
7666 bfd_size_type bytes
;
7668 unsigned char *data
;
7669 unsigned char *start
;
7671 bytes
= section
->sh_size
;
7673 if (bytes
== 0 || section
->sh_type
== SHT_NOBITS
)
7675 printf (_("\nSection '%s' has no data to dump.\n"),
7676 SECTION_NAME (section
));
7680 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
7682 addr
= section
->sh_addr
;
7684 start
= get_data (NULL
, file
, section
->sh_offset
, 1, bytes
,
7689 /* If the section being dumped has relocations against it the user might
7690 be expecting these relocations to have been applied. Check for this
7691 case and issue a warning message in order to avoid confusion.
7692 FIXME: Maybe we ought to have an option that dumps a section with
7694 for (relsec
= section_headers
;
7695 relsec
< section_headers
+ elf_header
.e_shnum
;
7698 if (relsec
->sh_type
!= SHT_RELA
7699 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7700 || SECTION_HEADER (relsec
->sh_info
) != section
7701 || relsec
->sh_size
== 0
7702 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7705 printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
7717 lbytes
= (bytes
> 16 ? 16 : bytes
);
7719 printf (" 0x%8.8lx ", (unsigned long) addr
);
7721 for (j
= 0; j
< 16; j
++)
7724 printf ("%2.2x", data
[j
]);
7732 for (j
= 0; j
< lbytes
; j
++)
7735 if (k
>= ' ' && k
< 0x7f)
7754 /* Return the number of bytes affected by a given reloc.
7755 This information is architecture and reloc dependent.
7756 Returns 4 by default, although this is not always correct.
7757 It should return 0 if a decision cannot be made.
7758 FIXME: This is not the correct way to solve this problem.
7759 The proper way is to have target specific reloc sizing functions
7760 created by the reloc-macros.h header, in the same way that it
7761 already creates the reloc naming functions. */
7764 get_reloc_size (Elf_Internal_Rela
* reloc
)
7766 switch (elf_header
.e_machine
)
7772 switch (ELF32_R_TYPE (reloc
->r_info
))
7774 /* PR gas/3800 - without this information we do not correctly
7775 decode the debug information generated by the h8300 assembler. */
7782 /* FIXME: We need to extend this switch statement to cope with other
7783 architecture's relocs. (When those relocs are used against debug
7784 sections, and when their size is not 4). But see the multiple
7785 inclusions of <elf/h8.h> for an example of the hoops that we need
7786 to jump through in order to obtain the reloc numbers. */
7791 /* Apply addends of RELA relocations. */
7794 debug_apply_rela_addends (void *file
,
7795 Elf_Internal_Shdr
*section
,
7796 unsigned char *start
)
7798 Elf_Internal_Shdr
*relsec
;
7799 unsigned char *end
= start
+ section
->sh_size
;
7801 if (!is_relocatable
)
7804 for (relsec
= section_headers
;
7805 relsec
< section_headers
+ elf_header
.e_shnum
;
7808 unsigned long nrelas
;
7809 Elf_Internal_Rela
*rela
, *rp
;
7810 Elf_Internal_Shdr
*symsec
;
7811 Elf_Internal_Sym
*symtab
;
7812 Elf_Internal_Sym
*sym
;
7814 if (relsec
->sh_type
!= SHT_RELA
7815 || SECTION_HEADER_INDEX (relsec
->sh_info
) >= elf_header
.e_shnum
7816 || SECTION_HEADER (relsec
->sh_info
) != section
7817 || relsec
->sh_size
== 0
7818 || SECTION_HEADER_INDEX (relsec
->sh_link
) >= elf_header
.e_shnum
)
7821 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
7825 symsec
= SECTION_HEADER (relsec
->sh_link
);
7826 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
7828 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
7831 unsigned int reloc_size
;
7833 reloc_size
= get_reloc_size (rp
);
7834 if (reloc_size
== 0)
7836 warn (_("skipping relocation of unknown size against offset 0x%lx in section %s\n"),
7837 (unsigned long) rp
->r_offset
,
7838 SECTION_NAME (section
));
7842 loc
= start
+ rp
->r_offset
;
7843 if ((loc
+ reloc_size
) > end
)
7845 warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
7846 (unsigned long) rp
->r_offset
,
7847 SECTION_NAME (section
));
7853 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
7855 if (ELF32_R_SYM (rp
->r_info
) != 0
7856 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
7857 /* Relocations against symbols without type can happen.
7858 Gcc -feliminate-dwarf2-dups may generate symbols
7859 without type for debug info. */
7860 && ELF32_ST_TYPE (sym
->st_info
) != STT_NOTYPE
7861 /* Relocations against object symbols can happen,
7862 eg when referencing a global array. For an
7863 example of this see the _clz.o binary in libgcc.a. */
7864 && ELF32_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7866 warn (_("skipping unexpected symbol type %s in relocation in section .rela%s\n"),
7867 get_symbol_type (ELF32_ST_TYPE (sym
->st_info
)),
7868 SECTION_NAME (section
));
7874 /* In MIPS little-endian objects, r_info isn't really a
7875 64-bit little-endian value: it has a 32-bit little-endian
7876 symbol index followed by four individual byte fields.
7877 Reorder INFO accordingly. */
7878 if (elf_header
.e_machine
== EM_MIPS
7879 && elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
7880 rp
->r_info
= (((rp
->r_info
& 0xffffffff) << 32)
7881 | ((rp
->r_info
>> 56) & 0xff)
7882 | ((rp
->r_info
>> 40) & 0xff00)
7883 | ((rp
->r_info
>> 24) & 0xff0000)
7884 | ((rp
->r_info
>> 8) & 0xff000000));
7886 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
7888 if (ELF64_R_SYM (rp
->r_info
) != 0
7889 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
7890 && ELF64_ST_TYPE (sym
->st_info
) != STT_NOTYPE
7891 && ELF64_ST_TYPE (sym
->st_info
) != STT_OBJECT
)
7893 warn (_("skipping unexpected symbol type %s in relocation in section .rela.%s\n"),
7894 get_symbol_type (ELF64_ST_TYPE (sym
->st_info
)),
7895 SECTION_NAME (section
));
7900 byte_put (loc
, rp
->r_addend
, reloc_size
);
7911 load_debug_section (enum dwarf_section_display_enum debug
, void *file
)
7913 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7914 Elf_Internal_Shdr
*sec
;
7917 /* If it is already loaded, do nothing. */
7918 if (section
->start
!= NULL
)
7921 /* Locate the debug section. */
7922 sec
= find_section (section
->name
);
7926 snprintf (buf
, sizeof (buf
), _("%s section data"), section
->name
);
7927 section
->address
= sec
->sh_addr
;
7928 section
->size
= sec
->sh_size
;
7929 section
->start
= get_data (NULL
, file
, sec
->sh_offset
, 1,
7932 if (debug_displays
[debug
].relocate
)
7933 debug_apply_rela_addends (file
, sec
, section
->start
);
7935 return section
->start
!= NULL
;
7939 free_debug_section (enum dwarf_section_display_enum debug
)
7941 struct dwarf_section
*section
= &debug_displays
[debug
].section
;
7943 if (section
->start
== NULL
)
7946 free ((char *) section
->start
);
7947 section
->start
= NULL
;
7948 section
->address
= 0;
7953 display_debug_section (Elf_Internal_Shdr
*section
, FILE *file
)
7955 char *name
= SECTION_NAME (section
);
7956 bfd_size_type length
;
7958 enum dwarf_section_display_enum i
;
7960 length
= section
->sh_size
;
7963 printf (_("\nSection '%s' has no debugging data.\n"), name
);
7967 if (const_strneq (name
, ".gnu.linkonce.wi."))
7968 name
= ".debug_info";
7970 /* See if we know how to display the contents of this section. */
7971 for (i
= 0; i
< max
; i
++)
7972 if (streq (debug_displays
[i
].section
.name
, name
))
7974 struct dwarf_section
*sec
= &debug_displays
[i
].section
;
7976 if (load_debug_section (i
, file
))
7978 result
&= debug_displays
[i
].display (sec
, file
);
7980 if (i
!= info
&& i
!= abbrev
)
7981 free_debug_section (i
);
7989 printf (_("Unrecognized debug section: %s\n"), name
);
7996 /* Set DUMP_SECTS for all sections where dumps were requested
7997 based on section name. */
8000 initialise_dumps_byname (void)
8002 struct dump_list_entry
*cur
;
8004 for (cur
= dump_sects_byname
; cur
; cur
= cur
->next
)
8009 for (i
= 0, any
= 0; i
< elf_header
.e_shnum
; i
++)
8010 if (streq (SECTION_NAME (section_headers
+ i
), cur
->name
))
8012 request_dump (i
, cur
->type
);
8017 warn (_("Section '%s' was not dumped because it does not exist!\n"),
8023 process_section_contents (FILE *file
)
8025 Elf_Internal_Shdr
*section
;
8031 initialise_dumps_byname ();
8033 for (i
= 0, section
= section_headers
;
8034 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
8037 #ifdef SUPPORT_DISASSEMBLY
8038 if (dump_sects
[i
] & DISASS_DUMP
)
8039 disassemble_section (section
, file
);
8041 if (dump_sects
[i
] & HEX_DUMP
)
8042 dump_section (section
, file
);
8044 if (dump_sects
[i
] & DEBUG_DUMP
)
8045 display_debug_section (section
, file
);
8048 /* Check to see if the user requested a
8049 dump of a section that does not exist. */
8050 while (i
++ < num_dump_sects
)
8052 warn (_("Section %d was not dumped because it does not exist!\n"), i
);
8056 process_mips_fpe_exception (int mask
)
8061 if (mask
& OEX_FPU_INEX
)
8062 fputs ("INEX", stdout
), first
= 0;
8063 if (mask
& OEX_FPU_UFLO
)
8064 printf ("%sUFLO", first
? "" : "|"), first
= 0;
8065 if (mask
& OEX_FPU_OFLO
)
8066 printf ("%sOFLO", first
? "" : "|"), first
= 0;
8067 if (mask
& OEX_FPU_DIV0
)
8068 printf ("%sDIV0", first
? "" : "|"), first
= 0;
8069 if (mask
& OEX_FPU_INVAL
)
8070 printf ("%sINVAL", first
? "" : "|");
8073 fputs ("0", stdout
);
8076 /* ARM EABI attributes section. */
8081 /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup. */
8084 } arm_attr_public_tag
;
8086 static const char *arm_attr_tag_CPU_arch
[] =
8087 {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
8089 static const char *arm_attr_tag_ARM_ISA_use
[] = {"No", "Yes"};
8090 static const char *arm_attr_tag_THUMB_ISA_use
[] =
8091 {"No", "Thumb-1", "Thumb-2"};
8092 /* FIXME: VFPv3 encoding was extrapolated! */
8093 static const char *arm_attr_tag_VFP_arch
[] = {"No", "VFPv1", "VFPv2", "VFPv3"};
8094 static const char *arm_attr_tag_WMMX_arch
[] = {"No", "WMMXv1"};
8095 static const char *arm_attr_tag_NEON_arch
[] = {"No", "NEONv1"};
8096 static const char *arm_attr_tag_ABI_PCS_config
[] =
8097 {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
8098 "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
8099 static const char *arm_attr_tag_ABI_PCS_R9_use
[] =
8100 {"V6", "SB", "TLS", "Unused"};
8101 static const char *arm_attr_tag_ABI_PCS_RW_data
[] =
8102 {"Absolute", "PC-relative", "SB-relative", "None"};
8103 static const char *arm_attr_tag_ABI_PCS_RO_DATA
[] =
8104 {"Absolute", "PC-relative", "None"};
8105 static const char *arm_attr_tag_ABI_PCS_GOT_use
[] =
8106 {"None", "direct", "GOT-indirect"};
8107 static const char *arm_attr_tag_ABI_PCS_wchar_t
[] =
8108 {"None", "??? 1", "2", "??? 3", "4"};
8109 static const char *arm_attr_tag_ABI_FP_rounding
[] = {"Unused", "Needed"};
8110 static const char *arm_attr_tag_ABI_FP_denormal
[] = {"Unused", "Needed"};
8111 static const char *arm_attr_tag_ABI_FP_exceptions
[] = {"Unused", "Needed"};
8112 static const char *arm_attr_tag_ABI_FP_user_exceptions
[] = {"Unused", "Needed"};
8113 static const char *arm_attr_tag_ABI_FP_number_model
[] =
8114 {"Unused", "Finite", "RTABI", "IEEE 754"};
8115 static const char *arm_attr_tag_ABI_align8_needed
[] = {"No", "Yes", "4-byte"};
8116 static const char *arm_attr_tag_ABI_align8_preserved
[] =
8117 {"No", "Yes, except leaf SP", "Yes"};
8118 static const char *arm_attr_tag_ABI_enum_size
[] =
8119 {"Unused", "small", "int", "forced to int"};
8120 static const char *arm_attr_tag_ABI_HardFP_use
[] =
8121 {"As Tag_VFP_arch", "SP only", "DP only", "SP and DP"};
8122 static const char *arm_attr_tag_ABI_VFP_args
[] =
8123 {"AAPCS", "VFP registers", "custom"};
8124 static const char *arm_attr_tag_ABI_WMMX_args
[] =
8125 {"AAPCS", "WMMX registers", "custom"};
8126 static const char *arm_attr_tag_ABI_optimization_goals
[] =
8127 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8128 "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
8129 static const char *arm_attr_tag_ABI_FP_optimization_goals
[] =
8130 {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
8131 "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
8133 #define LOOKUP(id, name) \
8134 {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
8135 static arm_attr_public_tag arm_attr_public_tags
[] =
8137 {4, "CPU_raw_name", 1, NULL
},
8138 {5, "CPU_name", 1, NULL
},
8139 LOOKUP(6, CPU_arch
),
8140 {7, "CPU_arch_profile", 0, NULL
},
8141 LOOKUP(8, ARM_ISA_use
),
8142 LOOKUP(9, THUMB_ISA_use
),
8143 LOOKUP(10, VFP_arch
),
8144 LOOKUP(11, WMMX_arch
),
8145 LOOKUP(12, NEON_arch
),
8146 LOOKUP(13, ABI_PCS_config
),
8147 LOOKUP(14, ABI_PCS_R9_use
),
8148 LOOKUP(15, ABI_PCS_RW_data
),
8149 LOOKUP(16, ABI_PCS_RO_DATA
),
8150 LOOKUP(17, ABI_PCS_GOT_use
),
8151 LOOKUP(18, ABI_PCS_wchar_t
),
8152 LOOKUP(19, ABI_FP_rounding
),
8153 LOOKUP(20, ABI_FP_denormal
),
8154 LOOKUP(21, ABI_FP_exceptions
),
8155 LOOKUP(22, ABI_FP_user_exceptions
),
8156 LOOKUP(23, ABI_FP_number_model
),
8157 LOOKUP(24, ABI_align8_needed
),
8158 LOOKUP(25, ABI_align8_preserved
),
8159 LOOKUP(26, ABI_enum_size
),
8160 LOOKUP(27, ABI_HardFP_use
),
8161 LOOKUP(28, ABI_VFP_args
),
8162 LOOKUP(29, ABI_WMMX_args
),
8163 LOOKUP(30, ABI_optimization_goals
),
8164 LOOKUP(31, ABI_FP_optimization_goals
),
8165 {32, "compatibility", 0, NULL
}
8169 /* Read an unsigned LEB128 encoded value from p. Set *PLEN to the number of
8172 read_uleb128 (unsigned char *p
, unsigned int *plen
)
8186 val
|= ((unsigned int)c
& 0x7f) << shift
;
8195 static unsigned char *
8196 display_arm_attribute (unsigned char *p
)
8201 arm_attr_public_tag
*attr
;
8205 tag
= read_uleb128 (p
, &len
);
8208 for (i
= 0; i
< ARRAY_SIZE(arm_attr_public_tags
); i
++)
8210 if (arm_attr_public_tags
[i
].tag
== tag
)
8212 attr
= &arm_attr_public_tags
[i
];
8219 printf (" Tag_%s: ", attr
->name
);
8225 case 7: /* Tag_CPU_arch_profile. */
8226 val
= read_uleb128 (p
, &len
);
8230 case 0: printf ("None\n"); break;
8231 case 'A': printf ("Application\n"); break;
8232 case 'R': printf ("Realtime\n"); break;
8233 case 'M': printf ("Microcontroller\n"); break;
8234 default: printf ("??? (%d)\n", val
); break;
8238 case 32: /* Tag_compatibility. */
8239 val
= read_uleb128 (p
, &len
);
8241 printf ("flag = %d, vendor = %s\n", val
, p
);
8242 p
+= strlen((char *)p
) + 1;
8256 assert (attr
->type
& 0x80);
8257 val
= read_uleb128 (p
, &len
);
8259 type
= attr
->type
& 0x7f;
8261 printf ("??? (%d)\n", val
);
8263 printf ("%s\n", attr
->table
[val
]);
8270 type
= 1; /* String. */
8272 type
= 2; /* uleb128. */
8273 printf (" Tag_unknown_%d: ", tag
);
8278 printf ("\"%s\"\n", p
);
8279 p
+= strlen((char *)p
) + 1;
8283 val
= read_uleb128 (p
, &len
);
8285 printf ("%d (0x%x)\n", val
, val
);
8292 process_arm_specific (FILE *file
)
8294 Elf_Internal_Shdr
*sect
;
8295 unsigned char *contents
;
8298 bfd_vma section_len
;
8302 /* Find the section header so that we get the size. */
8303 for (i
= 0, sect
= section_headers
;
8304 i
< elf_header
.e_shnum
;
8307 if (sect
->sh_type
!= SHT_ARM_ATTRIBUTES
)
8310 contents
= get_data (NULL
, file
, sect
->sh_offset
, 1, sect
->sh_size
,
8318 len
= sect
->sh_size
- 1;
8323 bfd_boolean public_section
;
8325 section_len
= byte_get (p
, 4);
8327 if (section_len
> len
)
8329 printf (_("ERROR: Bad section length (%d > %d)\n"),
8330 (int)section_len
, (int)len
);
8334 printf ("Attribute Section: %s\n", p
);
8335 if (strcmp ((char *)p
, "aeabi") == 0)
8336 public_section
= TRUE
;
8338 public_section
= FALSE
;
8339 namelen
= strlen ((char *)p
) + 1;
8341 section_len
-= namelen
+ 4;
8342 while (section_len
> 0)
8347 size
= byte_get (p
, 4);
8348 if (size
> section_len
)
8350 printf (_("ERROR: Bad subsection length (%d > %d)\n"),
8351 (int)size
, (int)section_len
);
8354 section_len
-= size
;
8360 printf ("File Attributes\n");
8363 printf ("Section Attributes:");
8366 printf ("Symbol Attributes:");
8371 val
= read_uleb128 (p
, &i
);
8375 printf (" %d", val
);
8380 printf ("Unknown tag: %d\n", tag
);
8381 public_section
= FALSE
;
8387 p
= display_arm_attribute(p
);
8391 /* ??? Do something sensible, like dump hex. */
8392 printf (" Unknown section contexts\n");
8400 printf (_("Unknown format '%c'\n"), *p
);
8409 process_mips_specific (FILE *file
)
8411 Elf_Internal_Dyn
*entry
;
8412 size_t liblist_offset
= 0;
8413 size_t liblistno
= 0;
8414 size_t conflictsno
= 0;
8415 size_t options_offset
= 0;
8416 size_t conflicts_offset
= 0;
8418 /* We have a lot of special sections. Thanks SGI! */
8419 if (dynamic_section
== NULL
)
8420 /* No information available. */
8423 for (entry
= dynamic_section
; entry
->d_tag
!= DT_NULL
; ++entry
)
8424 switch (entry
->d_tag
)
8426 case DT_MIPS_LIBLIST
:
8428 = offset_from_vma (file
, entry
->d_un
.d_val
,
8429 liblistno
* sizeof (Elf32_External_Lib
));
8431 case DT_MIPS_LIBLISTNO
:
8432 liblistno
= entry
->d_un
.d_val
;
8434 case DT_MIPS_OPTIONS
:
8435 options_offset
= offset_from_vma (file
, entry
->d_un
.d_val
, 0);
8437 case DT_MIPS_CONFLICT
:
8439 = offset_from_vma (file
, entry
->d_un
.d_val
,
8440 conflictsno
* sizeof (Elf32_External_Conflict
));
8442 case DT_MIPS_CONFLICTNO
:
8443 conflictsno
= entry
->d_un
.d_val
;
8449 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
8451 Elf32_External_Lib
*elib
;
8454 elib
= get_data (NULL
, file
, liblist_offset
,
8455 liblistno
, sizeof (Elf32_External_Lib
),
8459 printf ("\nSection '.liblist' contains %lu entries:\n",
8460 (unsigned long) liblistno
);
8461 fputs (" Library Time Stamp Checksum Version Flags\n",
8464 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
8471 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8472 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8473 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8474 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8475 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8477 tmp
= gmtime (&time
);
8478 snprintf (timebuf
, sizeof (timebuf
),
8479 "%04u-%02u-%02uT%02u:%02u:%02u",
8480 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8481 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8483 printf ("%3lu: ", (unsigned long) cnt
);
8484 if (VALID_DYNAMIC_NAME (liblist
.l_name
))
8485 print_symbol (20, GET_DYNAMIC_NAME (liblist
.l_name
));
8487 printf ("<corrupt: %9ld>", liblist
.l_name
);
8488 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
8491 if (liblist
.l_flags
== 0)
8502 { " EXACT_MATCH", LL_EXACT_MATCH
},
8503 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
8504 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
8505 { " EXPORTS", LL_EXPORTS
},
8506 { " DELAY_LOAD", LL_DELAY_LOAD
},
8507 { " DELTA", LL_DELTA
}
8509 int flags
= liblist
.l_flags
;
8513 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
8515 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
8517 fputs (l_flags_vals
[fcnt
].name
, stdout
);
8518 flags
^= l_flags_vals
[fcnt
].bit
;
8521 printf (" %#x", (unsigned int) flags
);
8531 if (options_offset
!= 0)
8533 Elf_External_Options
*eopt
;
8534 Elf_Internal_Shdr
*sect
= section_headers
;
8535 Elf_Internal_Options
*iopt
;
8536 Elf_Internal_Options
*option
;
8540 /* Find the section header so that we get the size. */
8541 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
8544 eopt
= get_data (NULL
, file
, options_offset
, 1, sect
->sh_size
,
8548 iopt
= cmalloc ((sect
->sh_size
/ sizeof (eopt
)), sizeof (*iopt
));
8551 error (_("Out of memory"));
8558 while (offset
< sect
->sh_size
)
8560 Elf_External_Options
*eoption
;
8562 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
8564 option
->kind
= BYTE_GET (eoption
->kind
);
8565 option
->size
= BYTE_GET (eoption
->size
);
8566 option
->section
= BYTE_GET (eoption
->section
);
8567 option
->info
= BYTE_GET (eoption
->info
);
8569 offset
+= option
->size
;
8575 printf (_("\nSection '%s' contains %d entries:\n"),
8576 SECTION_NAME (sect
), cnt
);
8584 switch (option
->kind
)
8587 /* This shouldn't happen. */
8588 printf (" NULL %d %lx", option
->section
, option
->info
);
8591 printf (" REGINFO ");
8592 if (elf_header
.e_machine
== EM_MIPS
)
8595 Elf32_External_RegInfo
*ereg
;
8596 Elf32_RegInfo reginfo
;
8598 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
8599 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8600 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8601 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8602 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8603 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8604 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8606 printf ("GPR %08lx GP 0x%lx\n",
8608 (unsigned long) reginfo
.ri_gp_value
);
8609 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8610 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8611 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8616 Elf64_External_RegInfo
*ereg
;
8617 Elf64_Internal_RegInfo reginfo
;
8619 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
8620 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
8621 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
8622 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
8623 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
8624 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
8625 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
8627 printf ("GPR %08lx GP 0x",
8628 reginfo
.ri_gprmask
);
8629 printf_vma (reginfo
.ri_gp_value
);
8632 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
8633 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
8634 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
8638 case ODK_EXCEPTIONS
:
8639 fputs (" EXCEPTIONS fpe_min(", stdout
);
8640 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
8641 fputs (") fpe_max(", stdout
);
8642 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
8643 fputs (")", stdout
);
8645 if (option
->info
& OEX_PAGE0
)
8646 fputs (" PAGE0", stdout
);
8647 if (option
->info
& OEX_SMM
)
8648 fputs (" SMM", stdout
);
8649 if (option
->info
& OEX_FPDBUG
)
8650 fputs (" FPDBUG", stdout
);
8651 if (option
->info
& OEX_DISMISS
)
8652 fputs (" DISMISS", stdout
);
8655 fputs (" PAD ", stdout
);
8656 if (option
->info
& OPAD_PREFIX
)
8657 fputs (" PREFIX", stdout
);
8658 if (option
->info
& OPAD_POSTFIX
)
8659 fputs (" POSTFIX", stdout
);
8660 if (option
->info
& OPAD_SYMBOL
)
8661 fputs (" SYMBOL", stdout
);
8664 fputs (" HWPATCH ", stdout
);
8665 if (option
->info
& OHW_R4KEOP
)
8666 fputs (" R4KEOP", stdout
);
8667 if (option
->info
& OHW_R8KPFETCH
)
8668 fputs (" R8KPFETCH", stdout
);
8669 if (option
->info
& OHW_R5KEOP
)
8670 fputs (" R5KEOP", stdout
);
8671 if (option
->info
& OHW_R5KCVTL
)
8672 fputs (" R5KCVTL", stdout
);
8675 fputs (" FILL ", stdout
);
8676 /* XXX Print content of info word? */
8679 fputs (" TAGS ", stdout
);
8680 /* XXX Print content of info word? */
8683 fputs (" HWAND ", stdout
);
8684 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8685 fputs (" R4KEOP_CHECKED", stdout
);
8686 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8687 fputs (" R4KEOP_CLEAN", stdout
);
8690 fputs (" HWOR ", stdout
);
8691 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
8692 fputs (" R4KEOP_CHECKED", stdout
);
8693 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
8694 fputs (" R4KEOP_CLEAN", stdout
);
8697 printf (" GP_GROUP %#06lx self-contained %#06lx",
8698 option
->info
& OGP_GROUP
,
8699 (option
->info
& OGP_SELF
) >> 16);
8702 printf (" IDENT %#06lx self-contained %#06lx",
8703 option
->info
& OGP_GROUP
,
8704 (option
->info
& OGP_SELF
) >> 16);
8707 /* This shouldn't happen. */
8708 printf (" %3d ??? %d %lx",
8709 option
->kind
, option
->section
, option
->info
);
8713 len
= sizeof (*eopt
);
8714 while (len
< option
->size
)
8715 if (((char *) option
)[len
] >= ' '
8716 && ((char *) option
)[len
] < 0x7f)
8717 printf ("%c", ((char *) option
)[len
++]);
8719 printf ("\\%03o", ((char *) option
)[len
++]);
8721 fputs ("\n", stdout
);
8729 if (conflicts_offset
!= 0 && conflictsno
!= 0)
8731 Elf32_Conflict
*iconf
;
8734 if (dynamic_symbols
== NULL
)
8736 error (_("conflict list found without a dynamic symbol table"));
8740 iconf
= cmalloc (conflictsno
, sizeof (*iconf
));
8743 error (_("Out of memory"));
8749 Elf32_External_Conflict
*econf32
;
8751 econf32
= get_data (NULL
, file
, conflicts_offset
,
8752 conflictsno
, sizeof (*econf32
), _("conflict"));
8756 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8757 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
8763 Elf64_External_Conflict
*econf64
;
8765 econf64
= get_data (NULL
, file
, conflicts_offset
,
8766 conflictsno
, sizeof (*econf64
), _("conflict"));
8770 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8771 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
8776 printf (_("\nSection '.conflict' contains %lu entries:\n"),
8777 (unsigned long) conflictsno
);
8778 puts (_(" Num: Index Value Name"));
8780 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
8782 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
8784 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
8785 print_vma (psym
->st_value
, FULL_HEX
);
8787 if (VALID_DYNAMIC_NAME (psym
->st_name
))
8788 print_symbol (25, GET_DYNAMIC_NAME (psym
->st_name
));
8790 printf ("<corrupt: %14ld>", psym
->st_name
);
8801 process_gnu_liblist (FILE *file
)
8803 Elf_Internal_Shdr
*section
, *string_sec
;
8804 Elf32_External_Lib
*elib
;
8813 for (i
= 0, section
= section_headers
;
8814 i
< elf_header
.e_shnum
;
8817 switch (section
->sh_type
)
8819 case SHT_GNU_LIBLIST
:
8820 if (SECTION_HEADER_INDEX (section
->sh_link
) >= elf_header
.e_shnum
)
8823 elib
= get_data (NULL
, file
, section
->sh_offset
, 1, section
->sh_size
,
8828 string_sec
= SECTION_HEADER (section
->sh_link
);
8830 strtab
= get_data (NULL
, file
, string_sec
->sh_offset
, 1,
8831 string_sec
->sh_size
, _("liblist string table"));
8832 strtab_size
= string_sec
->sh_size
;
8835 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
8841 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
8842 SECTION_NAME (section
),
8843 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
8845 puts (" Library Time Stamp Checksum Version Flags");
8847 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
8855 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
8856 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
8857 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
8858 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
8859 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
8861 tmp
= gmtime (&time
);
8862 snprintf (timebuf
, sizeof (timebuf
),
8863 "%04u-%02u-%02uT%02u:%02u:%02u",
8864 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
8865 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
8867 printf ("%3lu: ", (unsigned long) cnt
);
8869 printf ("%-20s", liblist
.l_name
< strtab_size
8870 ? strtab
+ liblist
.l_name
: "<corrupt>");
8872 printf ("%-20.20s", liblist
.l_name
< strtab_size
8873 ? strtab
+ liblist
.l_name
: "<corrupt>");
8874 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
8875 liblist
.l_version
, liblist
.l_flags
);
8886 get_note_type (unsigned e_type
)
8888 static char buff
[64];
8890 if (elf_header
.e_type
== ET_CORE
)
8894 return _("NT_AUXV (auxiliary vector)");
8896 return _("NT_PRSTATUS (prstatus structure)");
8898 return _("NT_FPREGSET (floating point registers)");
8900 return _("NT_PRPSINFO (prpsinfo structure)");
8902 return _("NT_TASKSTRUCT (task structure)");
8904 return _("NT_PRXFPREG (user_xfpregs structure)");
8906 return _("NT_PSTATUS (pstatus structure)");
8908 return _("NT_FPREGS (floating point registers)");
8910 return _("NT_PSINFO (psinfo structure)");
8912 return _("NT_LWPSTATUS (lwpstatus_t structure)");
8914 return _("NT_LWPSINFO (lwpsinfo_t structure)");
8915 case NT_WIN32PSTATUS
:
8916 return _("NT_WIN32PSTATUS (win32_pstatus structure)");
8924 return _("NT_VERSION (version)");
8926 return _("NT_ARCH (architecture)");
8931 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8936 get_netbsd_elfcore_note_type (unsigned e_type
)
8938 static char buff
[64];
8940 if (e_type
== NT_NETBSDCORE_PROCINFO
)
8942 /* NetBSD core "procinfo" structure. */
8943 return _("NetBSD procinfo structure");
8946 /* As of Jan 2002 there are no other machine-independent notes
8947 defined for NetBSD core files. If the note type is less
8948 than the start of the machine-dependent note types, we don't
8951 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
8953 snprintf (buff
, sizeof (buff
), _("Unknown note type: (0x%08x)"), e_type
);
8957 switch (elf_header
.e_machine
)
8959 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
8960 and PT_GETFPREGS == mach+2. */
8965 case EM_SPARC32PLUS
:
8969 case NT_NETBSDCORE_FIRSTMACH
+0:
8970 return _("PT_GETREGS (reg structure)");
8971 case NT_NETBSDCORE_FIRSTMACH
+2:
8972 return _("PT_GETFPREGS (fpreg structure)");
8978 /* On all other arch's, PT_GETREGS == mach+1 and
8979 PT_GETFPREGS == mach+3. */
8983 case NT_NETBSDCORE_FIRSTMACH
+1:
8984 return _("PT_GETREGS (reg structure)");
8985 case NT_NETBSDCORE_FIRSTMACH
+3:
8986 return _("PT_GETFPREGS (fpreg structure)");
8992 snprintf (buff
, sizeof (buff
), _("PT_FIRSTMACH+%d"),
8993 e_type
- NT_NETBSDCORE_FIRSTMACH
);
8997 /* Note that by the ELF standard, the name field is already null byte
8998 terminated, and namesz includes the terminating null byte.
8999 I.E. the value of namesz for the name "FSF" is 4.
9001 If the value of namesz is zero, there is no name present. */
9003 process_note (Elf_Internal_Note
*pnote
)
9007 if (pnote
->namesz
== 0)
9008 /* If there is no note name, then use the default set of
9009 note type strings. */
9010 nt
= get_note_type (pnote
->type
);
9012 else if (const_strneq (pnote
->namedata
, "NetBSD-CORE"))
9013 /* NetBSD-specific core file notes. */
9014 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9017 /* Don't recognize this note name; just use the default set of
9018 note type strings. */
9019 nt
= get_note_type (pnote
->type
);
9021 printf (" %s\t\t0x%08lx\t%s\n",
9022 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9029 process_corefile_note_segment (FILE *file
, bfd_vma offset
, bfd_vma length
)
9031 Elf_External_Note
*pnotes
;
9032 Elf_External_Note
*external
;
9038 pnotes
= get_data (NULL
, file
, offset
, 1, length
, _("notes"));
9044 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9045 (unsigned long) offset
, (unsigned long) length
);
9046 printf (_(" Owner\t\tData size\tDescription\n"));
9048 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9050 Elf_External_Note
*next
;
9051 Elf_Internal_Note inote
;
9054 inote
.type
= BYTE_GET (external
->type
);
9055 inote
.namesz
= BYTE_GET (external
->namesz
);
9056 inote
.namedata
= external
->name
;
9057 inote
.descsz
= BYTE_GET (external
->descsz
);
9058 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9059 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9061 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9063 if (((char *) next
) > (((char *) pnotes
) + length
))
9065 warn (_("corrupt note found at offset %lx into core notes\n"),
9066 (long)((char *)external
- (char *)pnotes
));
9067 warn (_(" type: %lx, namesize: %08lx, descsize: %08lx\n"),
9068 inote
.type
, inote
.namesz
, inote
.descsz
);
9074 /* Verify that name is null terminated. It appears that at least
9075 one version of Linux (RedHat 6.0) generates corefiles that don't
9076 comply with the ELF spec by failing to include the null byte in
9078 if (inote
.namedata
[inote
.namesz
] != '\0')
9080 temp
= malloc (inote
.namesz
+ 1);
9084 error (_("Out of memory\n"));
9089 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9090 temp
[inote
.namesz
] = 0;
9092 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9093 inote
.namedata
= temp
;
9096 res
&= process_note (& inote
);
9111 process_corefile_note_segments (FILE *file
)
9113 Elf_Internal_Phdr
*segment
;
9117 if (! get_program_headers (file
))
9120 for (i
= 0, segment
= program_headers
;
9121 i
< elf_header
.e_phnum
;
9124 if (segment
->p_type
== PT_NOTE
)
9125 res
&= process_corefile_note_segment (file
,
9126 (bfd_vma
) segment
->p_offset
,
9127 (bfd_vma
) segment
->p_filesz
);
9134 process_note_sections (FILE *file
)
9136 Elf_Internal_Shdr
*section
;
9140 for (i
= 0, section
= section_headers
;
9141 i
< elf_header
.e_shnum
;
9143 if (section
->sh_type
== SHT_NOTE
)
9144 res
&= process_corefile_note_segment (file
,
9145 (bfd_vma
) section
->sh_offset
,
9146 (bfd_vma
) section
->sh_size
);
9152 process_notes (FILE *file
)
9154 /* If we have not been asked to display the notes then do nothing. */
9158 if (elf_header
.e_type
!= ET_CORE
)
9159 return process_note_sections (file
);
9161 /* No program headers means no NOTE segment. */
9162 if (elf_header
.e_phnum
> 0)
9163 return process_corefile_note_segments (file
);
9165 printf (_("No note segments present in the core file.\n"));
9170 process_arch_specific (FILE *file
)
9175 switch (elf_header
.e_machine
)
9178 return process_arm_specific (file
);
9180 case EM_MIPS_RS3_LE
:
9181 return process_mips_specific (file
);
9190 get_file_header (FILE *file
)
9192 /* Read in the identity array. */
9193 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
9196 /* Determine how to read the rest of the header. */
9197 switch (elf_header
.e_ident
[EI_DATA
])
9199 default: /* fall through */
9200 case ELFDATANONE
: /* fall through */
9202 byte_get
= byte_get_little_endian
;
9203 byte_put
= byte_put_little_endian
;
9206 byte_get
= byte_get_big_endian
;
9207 byte_put
= byte_put_big_endian
;
9211 /* For now we only support 32 bit and 64 bit ELF files. */
9212 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
9214 /* Read in the rest of the header. */
9217 Elf32_External_Ehdr ehdr32
;
9219 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
9222 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
9223 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
9224 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
9225 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
9226 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
9227 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
9228 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
9229 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
9230 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
9231 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
9232 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
9233 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
9234 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
9238 Elf64_External_Ehdr ehdr64
;
9240 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9241 we will not be able to cope with the 64bit data found in
9242 64 ELF files. Detect this now and abort before we start
9243 overwriting things. */
9244 if (sizeof (bfd_vma
) < 8)
9246 error (_("This instance of readelf has been built without support for a\n\
9247 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9251 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
9254 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
9255 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
9256 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
9257 elf_header
.e_entry
= BYTE_GET (ehdr64
.e_entry
);
9258 elf_header
.e_phoff
= BYTE_GET (ehdr64
.e_phoff
);
9259 elf_header
.e_shoff
= BYTE_GET (ehdr64
.e_shoff
);
9260 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
9261 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
9262 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
9263 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
9264 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
9265 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
9266 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
9269 if (elf_header
.e_shoff
)
9271 /* There may be some extensions in the first section header. Don't
9272 bomb if we can't read it. */
9274 get_32bit_section_headers (file
, 1);
9276 get_64bit_section_headers (file
, 1);
9279 is_relocatable
= elf_header
.e_type
== ET_REL
;
9284 /* Process one ELF object file according to the command line options.
9285 This file may actually be stored in an archive. The file is
9286 positioned at the start of the ELF object. */
9289 process_object (char *file_name
, FILE *file
)
9293 if (! get_file_header (file
))
9295 error (_("%s: Failed to read file header\n"), file_name
);
9299 /* Initialise per file variables. */
9300 for (i
= NUM_ELEM (version_info
); i
--;)
9301 version_info
[i
] = 0;
9303 for (i
= NUM_ELEM (dynamic_info
); i
--;)
9304 dynamic_info
[i
] = 0;
9306 /* Process the file. */
9308 printf (_("\nFile: %s\n"), file_name
);
9310 /* Initialise the dump_sects array from the cmdline_dump_sects array.
9311 Note we do this even if cmdline_dump_sects is empty because we
9312 must make sure that the dump_sets array is zeroed out before each
9313 object file is processed. */
9314 if (num_dump_sects
> num_cmdline_dump_sects
)
9315 memset (dump_sects
, 0, num_dump_sects
);
9317 if (num_cmdline_dump_sects
> 0)
9319 if (num_dump_sects
== 0)
9320 /* A sneaky way of allocating the dump_sects array. */
9321 request_dump (num_cmdline_dump_sects
, 0);
9323 assert (num_dump_sects
>= num_cmdline_dump_sects
);
9324 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
9327 if (! process_file_header ())
9330 if (! process_section_headers (file
))
9332 /* Without loaded section headers we cannot process lots of
9334 do_unwind
= do_version
= do_dump
= do_arch
= 0;
9336 if (! do_using_dynamic
)
9337 do_syms
= do_reloc
= 0;
9340 if (! process_section_groups (file
))
9342 /* Without loaded section groups we cannot process unwind. */
9346 if (process_program_headers (file
))
9347 process_dynamic_section (file
);
9349 process_relocs (file
);
9351 process_unwind (file
);
9353 process_symbol_table (file
);
9355 process_syminfo (file
);
9357 process_version_sections (file
);
9359 process_section_contents (file
);
9361 process_notes (file
);
9363 process_gnu_liblist (file
);
9365 process_arch_specific (file
);
9367 if (program_headers
)
9369 free (program_headers
);
9370 program_headers
= NULL
;
9373 if (section_headers
)
9375 free (section_headers
);
9376 section_headers
= NULL
;
9381 free (string_table
);
9382 string_table
= NULL
;
9383 string_table_length
= 0;
9386 if (dynamic_strings
)
9388 free (dynamic_strings
);
9389 dynamic_strings
= NULL
;
9390 dynamic_strings_length
= 0;
9393 if (dynamic_symbols
)
9395 free (dynamic_symbols
);
9396 dynamic_symbols
= NULL
;
9397 num_dynamic_syms
= 0;
9400 if (dynamic_syminfo
)
9402 free (dynamic_syminfo
);
9403 dynamic_syminfo
= NULL
;
9406 if (section_headers_groups
)
9408 free (section_headers_groups
);
9409 section_headers_groups
= NULL
;
9414 struct group_list
*g
, *next
;
9416 for (i
= 0; i
< group_count
; i
++)
9418 for (g
= section_groups
[i
].root
; g
!= NULL
; g
= next
)
9425 free (section_groups
);
9426 section_groups
= NULL
;
9429 free_debug_memory ();
9434 /* Process an ELF archive. The file is positioned just after the
9438 process_archive (char *file_name
, FILE *file
)
9440 struct ar_hdr arhdr
;
9443 char *longnames
= NULL
;
9444 unsigned long longnames_size
= 0;
9445 size_t file_name_size
;
9450 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9451 if (got
!= sizeof arhdr
)
9456 error (_("%s: failed to read archive header\n"), file_name
);
9460 if (const_strneq (arhdr
.ar_name
, "/ "))
9462 /* This is the archive symbol table. Skip it.
9463 FIXME: We should have an option to dump it. */
9464 size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9465 if (fseek (file
, size
+ (size
& 1), SEEK_CUR
) != 0)
9467 error (_("%s: failed to skip archive symbol table\n"), file_name
);
9471 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9472 if (got
!= sizeof arhdr
)
9477 error (_("%s: failed to read archive header\n"), file_name
);
9482 if (const_strneq (arhdr
.ar_name
, "// "))
9484 /* This is the archive string table holding long member
9487 longnames_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9489 longnames
= malloc (longnames_size
);
9490 if (longnames
== NULL
)
9492 error (_("Out of memory\n"));
9496 if (fread (longnames
, longnames_size
, 1, file
) != 1)
9499 error (_("%s: failed to read string table\n"), file_name
);
9503 if ((longnames_size
& 1) != 0)
9506 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9507 if (got
!= sizeof arhdr
)
9514 error (_("%s: failed to read archive header\n"), file_name
);
9519 file_name_size
= strlen (file_name
);
9528 if (arhdr
.ar_name
[0] == '/')
9532 off
= strtoul (arhdr
.ar_name
+ 1, NULL
, 10);
9533 if (off
>= longnames_size
)
9535 error (_("%s: invalid archive string table offset %lu\n"), file_name
, off
);
9540 name
= longnames
+ off
;
9541 nameend
= memchr (name
, '/', longnames_size
- off
);
9545 name
= arhdr
.ar_name
;
9546 nameend
= memchr (name
, '/', 16);
9549 if (nameend
== NULL
)
9551 error (_("%s: bad archive file name\n"), file_name
);
9556 namealc
= malloc (file_name_size
+ (nameend
- name
) + 3);
9557 if (namealc
== NULL
)
9559 error (_("Out of memory\n"));
9564 memcpy (namealc
, file_name
, file_name_size
);
9565 namealc
[file_name_size
] = '(';
9566 memcpy (namealc
+ file_name_size
+ 1, name
, nameend
- name
);
9567 namealc
[file_name_size
+ 1 + (nameend
- name
)] = ')';
9568 namealc
[file_name_size
+ 2 + (nameend
- name
)] = '\0';
9570 archive_file_offset
= ftell (file
);
9571 archive_file_size
= strtoul (arhdr
.ar_size
, NULL
, 10);
9573 ret
|= process_object (namealc
, file
);
9578 (archive_file_offset
9580 + (archive_file_size
& 1)),
9583 error (_("%s: failed to seek to next archive header\n"), file_name
);
9588 got
= fread (&arhdr
, 1, sizeof arhdr
, file
);
9589 if (got
!= sizeof arhdr
)
9594 error (_("%s: failed to read archive header\n"), file_name
);
9607 process_file (char *file_name
)
9610 struct stat statbuf
;
9614 if (stat (file_name
, &statbuf
) < 0)
9616 if (errno
== ENOENT
)
9617 error (_("'%s': No such file\n"), file_name
);
9619 error (_("Could not locate '%s'. System error message: %s\n"),
9620 file_name
, strerror (errno
));
9624 if (! S_ISREG (statbuf
.st_mode
))
9626 error (_("'%s' is not an ordinary file\n"), file_name
);
9630 file
= fopen (file_name
, "rb");
9633 error (_("Input file '%s' is not readable.\n"), file_name
);
9637 if (fread (armag
, SARMAG
, 1, file
) != 1)
9639 error (_("%s: Failed to read file header\n"), file_name
);
9644 if (memcmp (armag
, ARMAG
, SARMAG
) == 0)
9645 ret
= process_archive (file_name
, file
);
9649 archive_file_size
= archive_file_offset
= 0;
9650 ret
= process_object (file_name
, file
);
9658 #ifdef SUPPORT_DISASSEMBLY
9659 /* Needed by the i386 disassembler. For extra credit, someone could
9660 fix this so that we insert symbolic addresses here, esp for GOT/PLT
9664 print_address (unsigned int addr
, FILE *outfile
)
9666 fprintf (outfile
,"0x%8.8x", addr
);
9669 /* Needed by the i386 disassembler. */
9671 db_task_printsym (unsigned int addr
)
9673 print_address (addr
, stderr
);
9678 main (int argc
, char **argv
)
9682 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
9683 setlocale (LC_MESSAGES
, "");
9685 #if defined (HAVE_SETLOCALE)
9686 setlocale (LC_CTYPE
, "");
9688 bindtextdomain (PACKAGE
, LOCALEDIR
);
9689 textdomain (PACKAGE
);
9691 expandargv (&argc
, &argv
);
9693 parse_args (argc
, argv
);
9695 if (num_dump_sects
> 0)
9697 /* Make a copy of the dump_sects array. */
9698 cmdline_dump_sects
= malloc (num_dump_sects
);
9699 if (cmdline_dump_sects
== NULL
)
9700 error (_("Out of memory allocating dump request table."));
9703 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
9704 num_cmdline_dump_sects
= num_dump_sects
;
9708 if (optind
< (argc
- 1))
9712 while (optind
< argc
)
9713 err
|= process_file (argv
[optind
++]);
9715 if (dump_sects
!= NULL
)
9717 if (cmdline_dump_sects
!= NULL
)
9718 free (cmdline_dump_sects
);