1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we belive that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
72 #include "elf/m68hc11.h"
73 #include "elf/mcore.h"
76 #include "elf/mn10200.h"
77 #include "elf/mn10300.h"
83 #include "elf/sparc.h"
86 #include "elf/x86-64.h"
87 #include "elf/xstormy16.h"
92 char * program_name = "readelf";
93 unsigned int dynamic_addr;
94 bfd_size_type dynamic_size;
95 unsigned int rela_addr;
96 unsigned int rela_size;
97 char * dynamic_strings;
99 unsigned long string_table_length;
100 unsigned long num_dynamic_syms;
101 Elf_Internal_Sym * dynamic_symbols;
102 Elf_Internal_Syminfo * dynamic_syminfo;
103 unsigned long dynamic_syminfo_offset;
104 unsigned int dynamic_syminfo_nent;
105 char program_interpreter [64];
106 int dynamic_info[DT_JMPREL + 1];
107 int version_info[16];
109 Elf_Internal_Ehdr elf_header;
110 Elf_Internal_Shdr * section_headers;
111 Elf_Internal_Dyn * dynamic_segment;
112 Elf_Internal_Shdr * symtab_shndx_hdr;
120 int do_using_dynamic;
128 int do_debug_abbrevs;
130 int do_debug_pubnames;
131 int do_debug_aranges;
133 int do_debug_frames_interp;
134 int do_debug_macinfo;
141 /* A dynamic array of flags indicating which sections require dumping. */
142 char * dump_sects = NULL;
143 unsigned int num_dump_sects = 0;
145 #define HEX_DUMP (1 << 0)
146 #define DISASS_DUMP (1 << 1)
147 #define DEBUG_DUMP (1 << 2)
149 /* How to rpint a vma value. */
150 typedef enum print_mode
162 /* Forward declarations for dumb compilers. */
163 static void print_vma PARAMS ((bfd_vma, print_mode));
164 static void print_symbol PARAMS ((int, const char *));
165 static bfd_vma (* byte_get) PARAMS ((unsigned char *, int));
166 static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int));
167 static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int));
168 static const char * get_mips_dynamic_type PARAMS ((unsigned long));
169 static const char * get_sparc64_dynamic_type PARAMS ((unsigned long));
170 static const char * get_ppc64_dynamic_type PARAMS ((unsigned long));
171 static const char * get_parisc_dynamic_type PARAMS ((unsigned long));
172 static const char * get_dynamic_type PARAMS ((unsigned long));
173 static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *));
174 static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rel **, unsigned long *));
175 static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int));
176 static char * get_file_type PARAMS ((unsigned));
177 static char * get_machine_name PARAMS ((unsigned));
178 static void decode_ARM_machine_flags PARAMS ((unsigned, char []));
179 static char * get_machine_flags PARAMS ((unsigned, unsigned));
180 static const char * get_mips_segment_type PARAMS ((unsigned long));
181 static const char * get_parisc_segment_type PARAMS ((unsigned long));
182 static const char * get_ia64_segment_type PARAMS ((unsigned long));
183 static const char * get_segment_type PARAMS ((unsigned long));
184 static const char * get_mips_section_type_name PARAMS ((unsigned int));
185 static const char * get_parisc_section_type_name PARAMS ((unsigned int));
186 static const char * get_ia64_section_type_name PARAMS ((unsigned int));
187 static const char * get_section_type_name PARAMS ((unsigned int));
188 static const char * get_symbol_binding PARAMS ((unsigned int));
189 static const char * get_symbol_type PARAMS ((unsigned int));
190 static const char * get_symbol_visibility PARAMS ((unsigned int));
191 static const char * get_symbol_index_type PARAMS ((unsigned int));
192 static const char * get_dynamic_flags PARAMS ((bfd_vma));
193 static void usage PARAMS ((void));
194 static void parse_args PARAMS ((int, char **));
195 static int process_file_header PARAMS ((void));
196 static int process_program_headers PARAMS ((FILE *));
197 static int process_section_headers PARAMS ((FILE *));
198 static int process_unwind PARAMS ((FILE *));
199 static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *));
200 static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *));
201 static int process_dynamic_segment PARAMS ((FILE *));
202 static int process_symbol_table PARAMS ((FILE *));
203 static int process_syminfo PARAMS ((FILE *));
204 static int process_section_contents PARAMS ((FILE *));
205 static void process_mips_fpe_exception PARAMS ((int));
206 static int process_mips_specific PARAMS ((FILE *));
207 static int process_file PARAMS ((char *));
208 static int process_relocs PARAMS ((FILE *));
209 static int process_version_sections PARAMS ((FILE *));
210 static char * get_ver_flags PARAMS ((unsigned int));
211 static int get_32bit_section_headers PARAMS ((FILE *, unsigned int));
212 static int get_64bit_section_headers PARAMS ((FILE *, unsigned int));
213 static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
214 static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
215 static int get_file_header PARAMS ((FILE *));
216 static Elf_Internal_Sym * get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
217 static Elf_Internal_Sym * get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *));
218 static const char * get_elf_section_flags PARAMS ((bfd_vma));
219 static int * get_dynamic_data PARAMS ((FILE *, unsigned int));
220 static int get_32bit_dynamic_segment PARAMS ((FILE *));
221 static int get_64bit_dynamic_segment PARAMS ((FILE *));
222 #ifdef SUPPORT_DISASSEMBLY
223 static int disassemble_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
225 static int dump_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
226 static int display_debug_section PARAMS ((Elf32_Internal_Shdr *, FILE *));
227 static int display_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
228 static int display_debug_not_supported PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
229 static int prescan_debug_info PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
230 static int display_debug_lines PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
231 static int display_debug_pubnames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
232 static int display_debug_abbrev PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
233 static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
234 static int display_debug_frames PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
235 static int display_debug_macinfo PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
236 static int display_debug_str PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
237 static int display_debug_loc PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
238 static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *));
239 static void load_debug_str PARAMS ((FILE *));
240 static void free_debug_str PARAMS ((void));
241 static const char * fetch_indirect_string PARAMS ((unsigned long));
242 static void load_debug_loc PARAMS ((FILE *));
243 static void free_debug_loc PARAMS ((void));
244 static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int));
245 static int process_extended_line_op PARAMS ((unsigned char *, int, int));
246 static void reset_state_machine PARAMS ((int));
247 static char * get_TAG_name PARAMS ((unsigned long));
248 static char * get_AT_name PARAMS ((unsigned long));
249 static char * get_FORM_name PARAMS ((unsigned long));
250 static void free_abbrevs PARAMS ((void));
251 static void add_abbrev PARAMS ((unsigned long, unsigned long, int));
252 static void add_abbrev_attr PARAMS ((unsigned long, unsigned long));
253 static unsigned char * read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
254 static unsigned char * read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long));
255 static unsigned char * display_block PARAMS ((unsigned char *, unsigned long));
256 static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long));
257 static void request_dump PARAMS ((unsigned int, int));
258 static const char * get_elf_class PARAMS ((unsigned int));
259 static const char * get_data_encoding PARAMS ((unsigned int));
260 static const char * get_osabi_name PARAMS ((unsigned int));
261 static int guess_is_rela PARAMS ((unsigned long));
262 static const char * get_note_type PARAMS ((unsigned int));
263 static const char * get_netbsd_elfcore_note_type PARAMS ((unsigned int));
264 static int process_note PARAMS ((Elf32_Internal_Note *));
265 static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma));
266 static int process_corefile_note_segments PARAMS ((FILE *));
267 static int process_corefile_contents PARAMS ((FILE *));
268 static int process_arch_specific PARAMS ((FILE *));
269 static int process_gnu_liblist PARAMS ((FILE *));
271 typedef int Elf32_Word;
279 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
280 ((X)->sh_name >= string_table_length \
281 ? "<corrupt>" : string_table + (X)->sh_name))
283 /* Given st_shndx I, map to section_headers index. */
284 #define SECTION_HEADER_INDEX(I) \
285 ((I) < SHN_LORESERVE \
287 : ((I) <= SHN_HIRESERVE \
289 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
291 /* Reverse of the above. */
292 #define SECTION_HEADER_NUM(N) \
293 ((N) < SHN_LORESERVE \
295 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
297 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
299 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
301 #define BYTE_GET(field) byte_get (field, sizeof (field))
303 /* If we can support a 64 bit data type then BFD64 should be defined
304 and sizeof (bfd_vma) == 8. In this case when translating from an
305 external 8 byte field to an internal field, we can assume that the
306 internal field is also 8 bytes wide and so we can extract all the data.
307 If, however, BFD64 is not defined, then we must assume that the
308 internal data structure only has 4 byte wide fields that are the
309 equivalent of the 8 byte wide external counterparts, and so we must
310 truncate the data. */
312 #define BYTE_GET8(field) byte_get (field, -8)
314 #define BYTE_GET8(field) byte_get (field, 8)
317 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
319 #define GET_ELF_SYMBOLS(file, section) \
320 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
321 : get_64bit_elf_symbols (file, section))
325 error VPARAMS ((const char *message, ...))
327 VA_OPEN (args, message);
328 VA_FIXEDARG (args, const char *, message);
330 fprintf (stderr, _("%s: Error: "), program_name);
331 vfprintf (stderr, message, args);
336 warn VPARAMS ((const char *message, ...))
338 VA_OPEN (args, message);
339 VA_FIXEDARG (args, const char *, message);
341 fprintf (stderr, _("%s: Warning: "), program_name);
342 vfprintf (stderr, message, args);
346 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
349 get_data (var, file, offset, size, reason)
361 if (fseek (file, offset, SEEK_SET))
363 error (_("Unable to seek to %x for %s\n"), offset, reason);
370 mvar = (PTR) malloc (size);
374 error (_("Out of memory allocating %d bytes for %s\n"),
380 if (fread (mvar, size, 1, file) != 1)
382 error (_("Unable to read in %d bytes of %s\n"), size, reason);
392 byte_get_little_endian (field, size)
393 unsigned char * field;
402 return ((unsigned int) (field [0]))
403 | (((unsigned int) (field [1])) << 8);
407 /* We want to extract data from an 8 byte wide field and
408 place it into a 4 byte wide field. Since this is a little
409 endian source we can just use the 4 byte extraction code. */
413 return ((unsigned long) (field [0]))
414 | (((unsigned long) (field [1])) << 8)
415 | (((unsigned long) (field [2])) << 16)
416 | (((unsigned long) (field [3])) << 24);
421 /* This is a special case, generated by the BYTE_GET8 macro.
422 It means that we are loading an 8 byte value from a field
423 in an external structure into an 8 byte value in a field
424 in an internal strcuture. */
425 return ((bfd_vma) (field [0]))
426 | (((bfd_vma) (field [1])) << 8)
427 | (((bfd_vma) (field [2])) << 16)
428 | (((bfd_vma) (field [3])) << 24)
429 | (((bfd_vma) (field [4])) << 32)
430 | (((bfd_vma) (field [5])) << 40)
431 | (((bfd_vma) (field [6])) << 48)
432 | (((bfd_vma) (field [7])) << 56);
435 error (_("Unhandled data length: %d\n"), size);
440 /* Print a VMA value. */
442 print_vma (vma, mode)
452 case FULL_HEX: printf ("0x"); /* drop through */
453 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
454 case PREFIX_HEX: printf ("0x"); /* drop through */
455 case HEX: printf ("%lx", (unsigned long) vma); break;
456 case DEC: printf ("%ld", (unsigned long) vma); break;
457 case DEC_5: printf ("%5ld", (long) vma); break;
458 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
479 #if BFD_HOST_64BIT_LONG
482 if (_bfd_int64_high (vma))
483 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
485 printf ("%lx", _bfd_int64_low (vma));
490 #if BFD_HOST_64BIT_LONG
493 if (_bfd_int64_high (vma))
495 printf ("++%ld", _bfd_int64_low (vma));
497 printf ("%ld", _bfd_int64_low (vma));
502 #if BFD_HOST_64BIT_LONG
503 printf ("%5ld", vma);
505 if (_bfd_int64_high (vma))
507 printf ("++%ld", _bfd_int64_low (vma));
509 printf ("%5ld", _bfd_int64_low (vma));
514 #if BFD_HOST_64BIT_LONG
517 if (_bfd_int64_high (vma))
519 printf ("++%lu", _bfd_int64_low (vma));
521 printf ("%lu", _bfd_int64_low (vma));
529 /* Display a symbol on stdout. If do_wide is not true then
530 format the symbol to be at most WIDTH characters,
531 truncating as necessary. If WIDTH is negative then
532 format the string to be exactly - WIDTH characters,
533 truncating or padding as necessary. */
536 print_symbol (width, symbol)
541 printf ("%s", symbol);
543 printf ("%-*.*s", width, width, symbol);
545 printf ("%-.*s", width, symbol);
549 byte_get_big_endian (field, size)
550 unsigned char * field;
559 return ((unsigned int) (field [1])) | (((int) (field [0])) << 8);
562 return ((unsigned long) (field [3]))
563 | (((unsigned long) (field [2])) << 8)
564 | (((unsigned long) (field [1])) << 16)
565 | (((unsigned long) (field [0])) << 24);
569 /* Although we are extracing data from an 8 byte wide field, we
570 are returning only 4 bytes of data. */
571 return ((unsigned long) (field [7]))
572 | (((unsigned long) (field [6])) << 8)
573 | (((unsigned long) (field [5])) << 16)
574 | (((unsigned long) (field [4])) << 24);
578 /* This is a special case, generated by the BYTE_GET8 macro.
579 It means that we are loading an 8 byte value from a field
580 in an external structure into an 8 byte value in a field
581 in an internal strcuture. */
582 return ((bfd_vma) (field [7]))
583 | (((bfd_vma) (field [6])) << 8)
584 | (((bfd_vma) (field [5])) << 16)
585 | (((bfd_vma) (field [4])) << 24)
586 | (((bfd_vma) (field [3])) << 32)
587 | (((bfd_vma) (field [2])) << 40)
588 | (((bfd_vma) (field [1])) << 48)
589 | (((bfd_vma) (field [0])) << 56);
593 error (_("Unhandled data length: %d\n"), size);
598 /* Guess the relocation size commonly used by the specific machines. */
601 guess_is_rela (e_machine)
602 unsigned long e_machine;
606 /* Targets that use REL relocations. */
622 /* Targets that use RELA relocations. */
637 case EM_CYGNUS_MN10200:
639 case EM_CYGNUS_MN10300:
679 warn (_("Don't know about relocations on this machine architecture\n"));
685 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
687 unsigned long rel_offset;
688 unsigned long rel_size;
689 Elf_Internal_Rela **relasp;
690 unsigned long *nrelasp;
692 Elf_Internal_Rela *relas;
693 unsigned long nrelas;
698 Elf32_External_Rela * erelas;
700 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
701 rel_size, _("relocs"));
705 nrelas = rel_size / sizeof (Elf32_External_Rela);
707 relas = (Elf_Internal_Rela *)
708 malloc (nrelas * sizeof (Elf_Internal_Rela));
712 error(_("out of memory parsing relocs"));
716 for (i = 0; i < nrelas; i++)
718 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
719 relas[i].r_info = BYTE_GET (erelas[i].r_info);
720 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
727 Elf64_External_Rela * erelas;
729 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
730 rel_size, _("relocs"));
734 nrelas = rel_size / sizeof (Elf64_External_Rela);
736 relas = (Elf_Internal_Rela *)
737 malloc (nrelas * sizeof (Elf_Internal_Rela));
741 error(_("out of memory parsing relocs"));
745 for (i = 0; i < nrelas; i++)
747 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
748 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
749 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
760 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
762 unsigned long rel_offset;
763 unsigned long rel_size;
764 Elf_Internal_Rel **relsp;
765 unsigned long *nrelsp;
767 Elf_Internal_Rel *rels;
773 Elf32_External_Rel * erels;
775 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
776 rel_size, _("relocs"));
780 nrels = rel_size / sizeof (Elf32_External_Rel);
782 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
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);
800 Elf64_External_Rel * erels;
802 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
803 rel_size, _("relocs"));
807 nrels = rel_size / sizeof (Elf64_External_Rel);
809 rels = (Elf_Internal_Rel *) malloc (nrels * sizeof (Elf_Internal_Rel));
813 error(_("out of memory parsing relocs"));
817 for (i = 0; i < nrels; i++)
819 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
820 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
830 /* Display the contents of the relocation data found at the specified offset. */
832 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
834 unsigned long rel_offset;
835 unsigned long rel_size;
836 Elf_Internal_Sym * symtab;
842 Elf_Internal_Rel * rels;
843 Elf_Internal_Rela * relas;
846 if (is_rela == UNKNOWN)
847 is_rela = guess_is_rela (elf_header.e_machine);
851 if (!slurp_rela_relocs (file, rel_offset, rel_size, &relas, &rel_size))
856 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
865 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
867 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
872 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
874 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
882 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
884 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
889 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
891 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
895 for (i = 0; i < rel_size; i++)
898 const char * rtype2 = NULL;
899 const char * rtype3 = NULL;
902 bfd_vma symtab_index;
904 bfd_vma type2 = (bfd_vma) NULL;
905 bfd_vma type3 = (bfd_vma) NULL;
909 offset = relas [i].r_offset;
910 info = relas [i].r_info;
914 offset = rels [i].r_offset;
915 info = rels [i].r_info;
920 type = ELF32_R_TYPE (info);
921 symtab_index = ELF32_R_SYM (info);
925 if (elf_header.e_machine == EM_MIPS)
927 type = ELF64_MIPS_R_TYPE (info);
928 type2 = ELF64_MIPS_R_TYPE2 (info);
929 type3 = ELF64_MIPS_R_TYPE3 (info);
931 else if (elf_header.e_machine == EM_SPARCV9)
932 type = ELF64_R_TYPE_ID (info);
934 type = ELF64_R_TYPE (info);
935 /* The #ifdef BFD64 below is to prevent a compile time warning.
936 We know that if we do not have a 64 bit data type that we
937 will never execute this code anyway. */
939 symtab_index = ELF64_R_SYM (info);
945 #ifdef _bfd_int64_low
946 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
948 printf ("%8.8lx %8.8lx ", offset, info);
953 #ifdef _bfd_int64_low
955 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
956 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
957 _bfd_int64_high (offset),
958 _bfd_int64_low (offset),
959 _bfd_int64_high (info),
960 _bfd_int64_low (info));
963 ? "%16.16lx %16.16lx "
964 : "%12.12lx %12.12lx ",
969 switch (elf_header.e_machine)
977 rtype = elf_m32r_reloc_type (type);
982 rtype = elf_i386_reloc_type (type);
987 rtype = elf_m68hc11_reloc_type (type);
991 rtype = elf_m68k_reloc_type (type);
995 rtype = elf_i960_reloc_type (type);
1000 rtype = elf_avr_reloc_type (type);
1003 case EM_OLD_SPARCV9:
1004 case EM_SPARC32PLUS:
1007 rtype = elf_sparc_reloc_type (type);
1011 case EM_CYGNUS_V850:
1012 rtype = v850_reloc_type (type);
1016 case EM_CYGNUS_D10V:
1017 rtype = elf_d10v_reloc_type (type);
1021 case EM_CYGNUS_D30V:
1022 rtype = elf_d30v_reloc_type (type);
1026 rtype = elf_dlx_reloc_type (type);
1030 rtype = elf_sh_reloc_type (type);
1034 case EM_CYGNUS_MN10300:
1035 rtype = elf_mn10300_reloc_type (type);
1039 case EM_CYGNUS_MN10200:
1040 rtype = elf_mn10200_reloc_type (type);
1044 case EM_CYGNUS_FR30:
1045 rtype = elf_fr30_reloc_type (type);
1049 rtype = elf_frv_reloc_type (type);
1053 rtype = elf_mcore_reloc_type (type);
1057 rtype = elf_mmix_reloc_type (type);
1062 rtype = elf_ppc_reloc_type (type);
1066 case EM_MIPS_RS3_LE:
1067 rtype = elf_mips_reloc_type (type);
1070 rtype2 = elf_mips_reloc_type (type2);
1071 rtype3 = elf_mips_reloc_type (type3);
1076 rtype = elf_alpha_reloc_type (type);
1080 rtype = elf_arm_reloc_type (type);
1084 rtype = elf_arc_reloc_type (type);
1088 rtype = elf_hppa_reloc_type (type);
1094 rtype = elf_h8_reloc_type (type);
1099 rtype = elf_or32_reloc_type (type);
1104 rtype = elf_pj_reloc_type (type);
1107 rtype = elf_ia64_reloc_type (type);
1111 rtype = elf_cris_reloc_type (type);
1115 rtype = elf_i860_reloc_type (type);
1119 rtype = elf_x86_64_reloc_type (type);
1123 rtype = i370_reloc_type (type);
1128 rtype = elf_s390_reloc_type (type);
1132 rtype = elf_xstormy16_reloc_type (type);
1136 rtype = elf_vax_reloc_type (type);
1141 rtype = elf_ip2k_reloc_type (type);
1146 #ifdef _bfd_int64_low
1147 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1149 printf (_("unrecognized: %-7lx"), type);
1152 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1156 if (symtab == NULL || symtab_index >= nsyms)
1157 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1160 Elf_Internal_Sym * psym;
1162 psym = symtab + symtab_index;
1165 print_vma (psym->st_value, LONG_HEX);
1166 printf (is_32bit_elf ? " " : " ");
1168 if (psym->st_name == 0)
1170 const char *sec_name = "<null>";
1173 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1175 bfd_vma sec_index = (bfd_vma) -1;
1177 if (psym->st_shndx < SHN_LORESERVE)
1178 sec_index = psym->st_shndx;
1179 else if (psym->st_shndx > SHN_LORESERVE)
1180 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1183 if (sec_index != (bfd_vma) -1)
1184 sec_name = SECTION_NAME (section_headers + sec_index);
1185 else if (psym->st_shndx == SHN_ABS)
1187 else if (psym->st_shndx == SHN_COMMON)
1188 sec_name = "COMMON";
1191 sprintf (name_buf, "<section 0x%x>",
1192 (unsigned int) psym->st_shndx);
1193 sec_name = name_buf;
1196 print_symbol (22, sec_name);
1198 else if (strtab == NULL)
1199 printf (_("<string table index %3ld>"), psym->st_name);
1201 print_symbol (22, strtab + psym->st_name);
1204 printf (" + %lx", (unsigned long) relas [i].r_addend);
1209 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1210 print_vma (relas[i].r_addend, LONG_HEX);
1213 if (elf_header.e_machine == EM_SPARCV9
1214 && !strcmp (rtype, "R_SPARC_OLO10"))
1215 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1219 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1221 printf (" Type2: ");
1224 #ifdef _bfd_int64_low
1225 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1227 printf (_("unrecognized: %-7lx"), type2);
1230 printf ("%-17.17s", rtype2);
1232 printf("\n Type3: ");
1235 #ifdef _bfd_int64_low
1236 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1238 printf (_("unrecognized: %-7lx"), type3);
1241 printf ("%-17.17s", rtype3);
1256 get_mips_dynamic_type (type)
1261 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1262 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1263 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1264 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1265 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1266 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1267 case DT_MIPS_MSYM: return "MIPS_MSYM";
1268 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1269 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1270 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1271 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1272 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1273 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1274 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1275 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1276 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1277 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1278 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1279 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1280 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1281 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1282 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1283 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1284 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1285 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1286 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1287 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1288 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1289 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1290 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1291 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1292 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1293 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1294 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1295 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1296 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1297 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1298 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1299 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1300 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1301 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1302 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1303 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1310 get_sparc64_dynamic_type (type)
1315 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1322 get_ppc64_dynamic_type (type)
1327 case DT_PPC64_GLINK: return "PPC64_GLINK";
1328 case DT_PPC64_OPD: return "PPC64_OPD";
1329 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1336 get_parisc_dynamic_type (type)
1341 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1342 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1343 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1344 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1345 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1346 case DT_HP_PREINIT: return "HP_PREINIT";
1347 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1348 case DT_HP_NEEDED: return "HP_NEEDED";
1349 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1350 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1351 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1352 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1353 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1360 get_dynamic_type (type)
1363 static char buff [32];
1367 case DT_NULL: return "NULL";
1368 case DT_NEEDED: return "NEEDED";
1369 case DT_PLTRELSZ: return "PLTRELSZ";
1370 case DT_PLTGOT: return "PLTGOT";
1371 case DT_HASH: return "HASH";
1372 case DT_STRTAB: return "STRTAB";
1373 case DT_SYMTAB: return "SYMTAB";
1374 case DT_RELA: return "RELA";
1375 case DT_RELASZ: return "RELASZ";
1376 case DT_RELAENT: return "RELAENT";
1377 case DT_STRSZ: return "STRSZ";
1378 case DT_SYMENT: return "SYMENT";
1379 case DT_INIT: return "INIT";
1380 case DT_FINI: return "FINI";
1381 case DT_SONAME: return "SONAME";
1382 case DT_RPATH: return "RPATH";
1383 case DT_SYMBOLIC: return "SYMBOLIC";
1384 case DT_REL: return "REL";
1385 case DT_RELSZ: return "RELSZ";
1386 case DT_RELENT: return "RELENT";
1387 case DT_PLTREL: return "PLTREL";
1388 case DT_DEBUG: return "DEBUG";
1389 case DT_TEXTREL: return "TEXTREL";
1390 case DT_JMPREL: return "JMPREL";
1391 case DT_BIND_NOW: return "BIND_NOW";
1392 case DT_INIT_ARRAY: return "INIT_ARRAY";
1393 case DT_FINI_ARRAY: return "FINI_ARRAY";
1394 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1395 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1396 case DT_RUNPATH: return "RUNPATH";
1397 case DT_FLAGS: return "FLAGS";
1399 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1400 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1402 case DT_CHECKSUM: return "CHECKSUM";
1403 case DT_PLTPADSZ: return "PLTPADSZ";
1404 case DT_MOVEENT: return "MOVEENT";
1405 case DT_MOVESZ: return "MOVESZ";
1406 case DT_FEATURE: return "FEATURE";
1407 case DT_POSFLAG_1: return "POSFLAG_1";
1408 case DT_SYMINSZ: return "SYMINSZ";
1409 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1411 case DT_ADDRRNGLO: return "ADDRRNGLO";
1412 case DT_CONFIG: return "CONFIG";
1413 case DT_DEPAUDIT: return "DEPAUDIT";
1414 case DT_AUDIT: return "AUDIT";
1415 case DT_PLTPAD: return "PLTPAD";
1416 case DT_MOVETAB: return "MOVETAB";
1417 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1419 case DT_VERSYM: return "VERSYM";
1421 case DT_RELACOUNT: return "RELACOUNT";
1422 case DT_RELCOUNT: return "RELCOUNT";
1423 case DT_FLAGS_1: return "FLAGS_1";
1424 case DT_VERDEF: return "VERDEF";
1425 case DT_VERDEFNUM: return "VERDEFNUM";
1426 case DT_VERNEED: return "VERNEED";
1427 case DT_VERNEEDNUM: return "VERNEEDNUM";
1429 case DT_AUXILIARY: return "AUXILIARY";
1430 case DT_USED: return "USED";
1431 case DT_FILTER: return "FILTER";
1433 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1434 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1435 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1436 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1437 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1440 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1442 const char * result;
1444 switch (elf_header.e_machine)
1447 case EM_MIPS_RS3_LE:
1448 result = get_mips_dynamic_type (type);
1451 result = get_sparc64_dynamic_type (type);
1454 result = get_ppc64_dynamic_type (type);
1464 sprintf (buff, _("Processor Specific: %lx"), type);
1466 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1468 const char * result;
1470 switch (elf_header.e_machine)
1473 result = get_parisc_dynamic_type (type);
1483 sprintf (buff, _("Operating System specific: %lx"), type);
1486 sprintf (buff, _("<unknown>: %lx"), type);
1493 get_file_type (e_type)
1496 static char buff [32];
1500 case ET_NONE: return _("NONE (None)");
1501 case ET_REL: return _("REL (Relocatable file)");
1502 case ET_EXEC: return _("EXEC (Executable file)");
1503 case ET_DYN: return _("DYN (Shared object file)");
1504 case ET_CORE: return _("CORE (Core file)");
1507 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1508 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1509 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1510 sprintf (buff, _("OS Specific: (%x)"), e_type);
1512 sprintf (buff, _("<unknown>: %x"), e_type);
1518 get_machine_name (e_machine)
1521 static char buff [64]; /* XXX */
1525 case EM_NONE: return _("None");
1526 case EM_M32: return "WE32100";
1527 case EM_SPARC: return "Sparc";
1528 case EM_386: return "Intel 80386";
1529 case EM_68K: return "MC68000";
1530 case EM_88K: return "MC88000";
1531 case EM_486: return "Intel 80486";
1532 case EM_860: return "Intel 80860";
1533 case EM_MIPS: return "MIPS R3000";
1534 case EM_S370: return "IBM System/370";
1535 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1536 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1537 case EM_PARISC: return "HPPA";
1538 case EM_PPC_OLD: return "Power PC (old)";
1539 case EM_SPARC32PLUS: return "Sparc v8+" ;
1540 case EM_960: return "Intel 90860";
1541 case EM_PPC: return "PowerPC";
1542 case EM_PPC64: return "PowerPC64";
1543 case EM_V800: return "NEC V800";
1544 case EM_FR20: return "Fujitsu FR20";
1545 case EM_RH32: return "TRW RH32";
1546 case EM_MCORE: return "MCORE";
1547 case EM_ARM: return "ARM";
1548 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1549 case EM_SH: return "Hitachi SH";
1550 case EM_SPARCV9: return "Sparc v9";
1551 case EM_TRICORE: return "Siemens Tricore";
1552 case EM_ARC: return "ARC";
1553 case EM_H8_300: return "Hitachi H8/300";
1554 case EM_H8_300H: return "Hitachi H8/300H";
1555 case EM_H8S: return "Hitachi H8S";
1556 case EM_H8_500: return "Hitachi H8/500";
1557 case EM_IA_64: return "Intel IA-64";
1558 case EM_MIPS_X: return "Stanford MIPS-X";
1559 case EM_COLDFIRE: return "Motorola Coldfire";
1560 case EM_68HC12: return "Motorola M68HC12";
1561 case EM_ALPHA: return "Alpha";
1562 case EM_CYGNUS_D10V:
1563 case EM_D10V: return "d10v";
1564 case EM_CYGNUS_D30V:
1565 case EM_D30V: return "d30v";
1566 case EM_CYGNUS_M32R:
1567 case EM_M32R: return "Mitsubishi M32r";
1568 case EM_CYGNUS_V850:
1569 case EM_V850: return "NEC v850";
1570 case EM_CYGNUS_MN10300:
1571 case EM_MN10300: return "mn10300";
1572 case EM_CYGNUS_MN10200:
1573 case EM_MN10200: return "mn10200";
1574 case EM_CYGNUS_FR30:
1575 case EM_FR30: return "Fujitsu FR30";
1576 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1578 case EM_PJ: return "picoJava";
1579 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1580 case EM_PCP: return "Siemens PCP";
1581 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1582 case EM_NDR1: return "Denso NDR1 microprocesspr";
1583 case EM_STARCORE: return "Motorola Star*Core processor";
1584 case EM_ME16: return "Toyota ME16 processor";
1585 case EM_ST100: return "STMicroelectronics ST100 processor";
1586 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1587 case EM_FX66: return "Siemens FX66 microcontroller";
1588 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1589 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1590 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1591 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1592 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1593 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1594 case EM_SVX: return "Silicon Graphics SVx";
1595 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1596 case EM_VAX: return "Digital VAX";
1598 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1599 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1600 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1601 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1602 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1603 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1604 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1605 case EM_PRISM: return "SiTera Prism";
1606 case EM_X86_64: return "Advanced Micro Devices X86-64";
1608 case EM_S390: return "IBM S/390";
1609 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1611 case EM_OR32: return "OpenRISC";
1612 case EM_DLX: return "OpenDLX";
1614 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1616 sprintf (buff, _("<unknown>: %x"), e_machine);
1622 decode_ARM_machine_flags (e_flags, buf)
1629 eabi = EF_ARM_EABI_VERSION (e_flags);
1630 e_flags &= ~ EF_ARM_EABIMASK;
1632 /* Handle "generic" ARM flags. */
1633 if (e_flags & EF_ARM_RELEXEC)
1635 strcat (buf, ", relocatable executable");
1636 e_flags &= ~ EF_ARM_RELEXEC;
1639 if (e_flags & EF_ARM_HASENTRY)
1641 strcat (buf, ", has entry point");
1642 e_flags &= ~ EF_ARM_HASENTRY;
1645 /* Now handle EABI specific flags. */
1649 strcat (buf, ", <unrecognized EABI>");
1654 case EF_ARM_EABI_VER1:
1655 strcat (buf, ", Version1 EABI");
1660 /* Process flags one bit at a time. */
1661 flag = e_flags & - e_flags;
1666 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1667 strcat (buf, ", sorted symbol tables");
1677 case EF_ARM_EABI_VER2:
1678 strcat (buf, ", Version2 EABI");
1683 /* Process flags one bit at a time. */
1684 flag = e_flags & - e_flags;
1689 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1690 strcat (buf, ", sorted symbol tables");
1693 case EF_ARM_DYNSYMSUSESEGIDX:
1694 strcat (buf, ", dynamic symbols use segment index");
1697 case EF_ARM_MAPSYMSFIRST:
1698 strcat (buf, ", mapping symbols precede others");
1708 case EF_ARM_EABI_UNKNOWN:
1709 strcat (buf, ", GNU EABI");
1714 /* Process flags one bit at a time. */
1715 flag = e_flags & - e_flags;
1720 case EF_ARM_INTERWORK:
1721 strcat (buf, ", interworking enabled");
1724 case EF_ARM_APCS_26:
1725 strcat (buf, ", uses APCS/26");
1728 case EF_ARM_APCS_FLOAT:
1729 strcat (buf, ", uses APCS/float");
1733 strcat (buf, ", position independent");
1737 strcat (buf, ", 8 bit structure alignment");
1740 case EF_ARM_NEW_ABI:
1741 strcat (buf, ", uses new ABI");
1744 case EF_ARM_OLD_ABI:
1745 strcat (buf, ", uses old ABI");
1748 case EF_ARM_SOFT_FLOAT:
1749 strcat (buf, ", software FP");
1760 strcat (buf,", <unknown>");
1764 get_machine_flags (e_flags, e_machine)
1768 static char buf [1024];
1780 decode_ARM_machine_flags (e_flags, buf);
1784 if (e_flags & EF_CPU32)
1785 strcat (buf, ", cpu32");
1786 if (e_flags & EF_M68000)
1787 strcat (buf, ", m68000");
1791 if (e_flags & EF_PPC_EMB)
1792 strcat (buf, ", emb");
1794 if (e_flags & EF_PPC_RELOCATABLE)
1795 strcat (buf, ", relocatable");
1797 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1798 strcat (buf, ", relocatable-lib");
1802 case EM_CYGNUS_V850:
1803 switch (e_flags & EF_V850_ARCH)
1806 strcat (buf, ", v850e");
1809 strcat (buf, ", v850");
1812 strcat (buf, ", unknown v850 architecture variant");
1818 case EM_CYGNUS_M32R:
1819 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1820 strcat (buf, ", m32r");
1825 case EM_MIPS_RS3_LE:
1826 if (e_flags & EF_MIPS_NOREORDER)
1827 strcat (buf, ", noreorder");
1829 if (e_flags & EF_MIPS_PIC)
1830 strcat (buf, ", pic");
1832 if (e_flags & EF_MIPS_CPIC)
1833 strcat (buf, ", cpic");
1835 if (e_flags & EF_MIPS_UCODE)
1836 strcat (buf, ", ugen_reserved");
1838 if (e_flags & EF_MIPS_ABI2)
1839 strcat (buf, ", abi2");
1841 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1842 strcat (buf, ", odk first");
1844 if (e_flags & EF_MIPS_32BITMODE)
1845 strcat (buf, ", 32bitmode");
1847 switch ((e_flags & EF_MIPS_MACH))
1849 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1850 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1851 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1852 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1853 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1854 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1855 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1856 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1857 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1859 /* We simply ignore the field in this case to avoid confusion:
1860 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1863 default: strcat (buf, ", unknown CPU"); break;
1866 switch ((e_flags & EF_MIPS_ABI))
1868 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1869 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1870 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1871 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1873 /* We simply ignore the field in this case to avoid confusion:
1874 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1875 This means it is likely to be an o32 file, but not for
1878 default: strcat (buf, ", unknown ABI"); break;
1881 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1882 strcat (buf, ", mdmx");
1884 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1885 strcat (buf, ", mips16");
1887 switch ((e_flags & EF_MIPS_ARCH))
1889 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1890 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1891 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1892 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1893 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1894 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1895 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1896 default: strcat (buf, ", unknown ISA"); break;
1902 if (e_flags & EF_SPARC_32PLUS)
1903 strcat (buf, ", v8+");
1905 if (e_flags & EF_SPARC_SUN_US1)
1906 strcat (buf, ", ultrasparcI");
1908 if (e_flags & EF_SPARC_SUN_US3)
1909 strcat (buf, ", ultrasparcIII");
1911 if (e_flags & EF_SPARC_HAL_R1)
1912 strcat (buf, ", halr1");
1914 if (e_flags & EF_SPARC_LEDATA)
1915 strcat (buf, ", ledata");
1917 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
1918 strcat (buf, ", tso");
1920 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
1921 strcat (buf, ", pso");
1923 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
1924 strcat (buf, ", rmo");
1928 switch (e_flags & EF_PARISC_ARCH)
1930 case EFA_PARISC_1_0:
1931 strcpy (buf, ", PA-RISC 1.0");
1933 case EFA_PARISC_1_1:
1934 strcpy (buf, ", PA-RISC 1.1");
1936 case EFA_PARISC_2_0:
1937 strcpy (buf, ", PA-RISC 2.0");
1942 if (e_flags & EF_PARISC_TRAPNIL)
1943 strcat (buf, ", trapnil");
1944 if (e_flags & EF_PARISC_EXT)
1945 strcat (buf, ", ext");
1946 if (e_flags & EF_PARISC_LSB)
1947 strcat (buf, ", lsb");
1948 if (e_flags & EF_PARISC_WIDE)
1949 strcat (buf, ", wide");
1950 if (e_flags & EF_PARISC_NO_KABP)
1951 strcat (buf, ", no kabp");
1952 if (e_flags & EF_PARISC_LAZYSWAP)
1953 strcat (buf, ", lazyswap");
1958 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
1959 strcat (buf, ", new calling convention");
1961 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
1962 strcat (buf, ", gnu calling convention");
1966 if ((e_flags & EF_IA_64_ABI64))
1967 strcat (buf, ", 64-bit");
1969 strcat (buf, ", 32-bit");
1970 if ((e_flags & EF_IA_64_REDUCEDFP))
1971 strcat (buf, ", reduced fp model");
1972 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
1973 strcat (buf, ", no function descriptors, constant gp");
1974 else if ((e_flags & EF_IA_64_CONS_GP))
1975 strcat (buf, ", constant gp");
1976 if ((e_flags & EF_IA_64_ABSOLUTE))
1977 strcat (buf, ", absolute");
1981 if ((e_flags & EF_VAX_NONPIC))
1982 strcat (buf, ", non-PIC");
1983 if ((e_flags & EF_VAX_DFLOAT))
1984 strcat (buf, ", D-Float");
1985 if ((e_flags & EF_VAX_GFLOAT))
1986 strcat (buf, ", G-Float");
1995 get_mips_segment_type (type)
2000 case PT_MIPS_REGINFO:
2002 case PT_MIPS_RTPROC:
2004 case PT_MIPS_OPTIONS:
2014 get_parisc_segment_type (type)
2019 case PT_HP_TLS: return "HP_TLS";
2020 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2021 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2022 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2023 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2024 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2025 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2026 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2027 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2028 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2029 case PT_HP_PARALLEL: return "HP_PARALLEL";
2030 case PT_HP_FASTBIND: return "HP_FASTBIND";
2031 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2032 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2041 get_ia64_segment_type (type)
2046 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2047 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2048 case PT_HP_TLS: return "HP_TLS";
2049 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2050 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2051 case PT_IA_64_HP_STACK: return "HP_STACK";
2060 get_segment_type (p_type)
2061 unsigned long p_type;
2063 static char buff [32];
2067 case PT_NULL: return "NULL";
2068 case PT_LOAD: return "LOAD";
2069 case PT_DYNAMIC: return "DYNAMIC";
2070 case PT_INTERP: return "INTERP";
2071 case PT_NOTE: return "NOTE";
2072 case PT_SHLIB: return "SHLIB";
2073 case PT_PHDR: return "PHDR";
2074 case PT_TLS: return "TLS";
2076 case PT_GNU_EH_FRAME:
2077 return "GNU_EH_FRAME";
2080 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2082 const char * result;
2084 switch (elf_header.e_machine)
2087 case EM_MIPS_RS3_LE:
2088 result = get_mips_segment_type (p_type);
2091 result = get_parisc_segment_type (p_type);
2094 result = get_ia64_segment_type (p_type);
2104 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2106 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2108 const char * result;
2110 switch (elf_header.e_machine)
2113 result = get_parisc_segment_type (p_type);
2116 result = get_ia64_segment_type (p_type);
2126 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2129 sprintf (buff, _("<unknown>: %lx"), p_type);
2136 get_mips_section_type_name (sh_type)
2137 unsigned int sh_type;
2141 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2142 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2143 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2144 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2145 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2146 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2147 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2148 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2149 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2150 case SHT_MIPS_RELD: return "MIPS_RELD";
2151 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2152 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2153 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2154 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2155 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2156 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2157 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2158 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2159 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2160 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2161 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2162 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2163 case SHT_MIPS_LINE: return "MIPS_LINE";
2164 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2165 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2166 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2167 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2168 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2169 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2170 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2171 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2172 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2173 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2174 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2175 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2176 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2177 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2178 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2179 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2187 get_parisc_section_type_name (sh_type)
2188 unsigned int sh_type;
2192 case SHT_PARISC_EXT: return "PARISC_EXT";
2193 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2194 case SHT_PARISC_DOC: return "PARISC_DOC";
2202 get_ia64_section_type_name (sh_type)
2203 unsigned int sh_type;
2207 case SHT_IA_64_EXT: return "IA_64_EXT";
2208 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2216 get_section_type_name (sh_type)
2217 unsigned int sh_type;
2219 static char buff [32];
2223 case SHT_NULL: return "NULL";
2224 case SHT_PROGBITS: return "PROGBITS";
2225 case SHT_SYMTAB: return "SYMTAB";
2226 case SHT_STRTAB: return "STRTAB";
2227 case SHT_RELA: return "RELA";
2228 case SHT_HASH: return "HASH";
2229 case SHT_DYNAMIC: return "DYNAMIC";
2230 case SHT_NOTE: return "NOTE";
2231 case SHT_NOBITS: return "NOBITS";
2232 case SHT_REL: return "REL";
2233 case SHT_SHLIB: return "SHLIB";
2234 case SHT_DYNSYM: return "DYNSYM";
2235 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2236 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2237 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2238 case SHT_GROUP: return "GROUP";
2239 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2240 case SHT_GNU_verdef: return "VERDEF";
2241 case SHT_GNU_verneed: return "VERNEED";
2242 case SHT_GNU_versym: return "VERSYM";
2243 case 0x6ffffff0: return "VERSYM";
2244 case 0x6ffffffc: return "VERDEF";
2245 case 0x7ffffffd: return "AUXILIARY";
2246 case 0x7fffffff: return "FILTER";
2247 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2250 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2252 const char * result;
2254 switch (elf_header.e_machine)
2257 case EM_MIPS_RS3_LE:
2258 result = get_mips_section_type_name (sh_type);
2261 result = get_parisc_section_type_name (sh_type);
2264 result = get_ia64_section_type_name (sh_type);
2274 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2276 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2277 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2278 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2279 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2281 sprintf (buff, _("<unknown>: %x"), sh_type);
2287 #define OPTION_DEBUG_DUMP 512
2289 struct option options [] =
2291 {"all", no_argument, 0, 'a'},
2292 {"file-header", no_argument, 0, 'h'},
2293 {"program-headers", no_argument, 0, 'l'},
2294 {"headers", no_argument, 0, 'e'},
2295 {"histogram", no_argument, 0, 'I'},
2296 {"segments", no_argument, 0, 'l'},
2297 {"sections", no_argument, 0, 'S'},
2298 {"section-headers", no_argument, 0, 'S'},
2299 {"symbols", no_argument, 0, 's'},
2300 {"syms", no_argument, 0, 's'},
2301 {"relocs", no_argument, 0, 'r'},
2302 {"notes", no_argument, 0, 'n'},
2303 {"dynamic", no_argument, 0, 'd'},
2304 {"arch-specific", no_argument, 0, 'A'},
2305 {"version-info", no_argument, 0, 'V'},
2306 {"use-dynamic", no_argument, 0, 'D'},
2307 {"hex-dump", required_argument, 0, 'x'},
2308 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2309 {"unwind", no_argument, 0, 'u'},
2310 #ifdef SUPPORT_DISASSEMBLY
2311 {"instruction-dump", required_argument, 0, 'i'},
2314 {"version", no_argument, 0, 'v'},
2315 {"wide", no_argument, 0, 'W'},
2316 {"help", no_argument, 0, 'H'},
2317 {0, no_argument, 0, 0}
2323 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2324 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2325 fprintf (stdout, _(" Options are:\n\
2326 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2327 -h --file-header Display the ELF file header\n\
2328 -l --program-headers Display the program headers\n\
2329 --segments An alias for --program-headers\n\
2330 -S --section-headers Display the sections' header\n\
2331 --sections An alias for --section-headers\n\
2332 -e --headers Equivalent to: -h -l -S\n\
2333 -s --syms Display the symbol table\n\
2334 --symbols An alias for --syms\n\
2335 -n --notes Display the core notes (if present)\n\
2336 -r --relocs Display the relocations (if present)\n\
2337 -u --unwind Display the unwind info (if present)\n\
2338 -d --dynamic Display the dynamic segment (if present)\n\
2339 -V --version-info Display the version sections (if present)\n\
2340 -A --arch-specific Display architecture specific information (if any).\n\
2341 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2342 -x --hex-dump=<number> Dump the contents of section <number>\n\
2343 -w[liaprmfFso] or\n\
2344 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2345 Display the contents of DWARF2 debug sections\n"));
2346 #ifdef SUPPORT_DISASSEMBLY
2347 fprintf (stdout, _("\
2348 -i --instruction-dump=<number>\n\
2349 Disassemble the contents of section <number>\n"));
2351 fprintf (stdout, _("\
2352 -I --histogram Display histogram of bucket list lengths\n\
2353 -W --wide Allow output width to exceed 80 characters\n\
2354 -H --help Display this information\n\
2355 -v --version Display the version number of readelf\n"));
2356 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2362 request_dump (section, type)
2363 unsigned int section;
2366 if (section >= num_dump_sects)
2368 char * new_dump_sects;
2370 new_dump_sects = (char *) calloc (section + 1, 1);
2372 if (new_dump_sects == NULL)
2373 error (_("Out of memory allocating dump request table."));
2376 /* Copy current flag settings. */
2377 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2381 dump_sects = new_dump_sects;
2382 num_dump_sects = section + 1;
2387 dump_sects [section] |= type;
2393 parse_args (argc, argv)
2402 while ((c = getopt_long
2403 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2439 do_using_dynamic ++;
2470 section = strtoul (optarg, & cp, 0);
2471 if (! * cp && section >= 0)
2473 request_dump (section, HEX_DUMP);
2483 unsigned int index = 0;
2487 while (optarg[index])
2488 switch (optarg[index++])
2497 do_debug_abbrevs = 1;
2507 do_debug_pubnames = 1;
2512 do_debug_aranges = 1;
2516 do_debug_frames_interp = 1;
2518 do_debug_frames = 1;
2523 do_debug_macinfo = 1;
2537 warn (_("Unrecognized debug option '%s'\n"), optarg);
2542 case OPTION_DEBUG_DUMP:
2548 static const char *debug_dump_opt[]
2549 = { "line", "info", "abbrev", "pubnames", "ranges",
2550 "macro", "frames", "frames-interp", "str", "loc", NULL };
2559 for (index = 0; debug_dump_opt[index]; index++)
2561 size_t len = strlen (debug_dump_opt[index]);
2563 if (strncmp (p, debug_dump_opt[index], len) == 0
2564 && (p[len] == ',' || p[len] == '\0'))
2573 do_debug_abbrevs = 1;
2584 do_debug_pubnames = 1;
2588 do_debug_aranges = 1;
2593 do_debug_frames_interp = 1;
2594 do_debug_frames = 1;
2598 do_debug_macinfo = 1;
2611 if (debug_dump_opt[index] == NULL)
2613 warn (_("Unrecognized debug option '%s'\n"), p);
2614 p = strchr (p, ',');
2624 #ifdef SUPPORT_DISASSEMBLY
2627 section = strtoul (optarg, & cp, 0);
2628 if (! * cp && section >= 0)
2630 request_dump (section, DISASS_DUMP);
2636 print_version (program_name);
2646 /* xgettext:c-format */
2647 error (_("Invalid option '-%c'\n"), c);
2654 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2655 && !do_segments && !do_header && !do_dump && !do_version
2656 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2660 warn (_("Nothing to do.\n"));
2666 get_elf_class (elf_class)
2667 unsigned int elf_class;
2669 static char buff [32];
2673 case ELFCLASSNONE: return _("none");
2674 case ELFCLASS32: return "ELF32";
2675 case ELFCLASS64: return "ELF64";
2677 sprintf (buff, _("<unknown: %x>"), elf_class);
2683 get_data_encoding (encoding)
2684 unsigned int encoding;
2686 static char buff [32];
2690 case ELFDATANONE: return _("none");
2691 case ELFDATA2LSB: return _("2's complement, little endian");
2692 case ELFDATA2MSB: return _("2's complement, big endian");
2694 sprintf (buff, _("<unknown: %x>"), encoding);
2700 get_osabi_name (osabi)
2703 static char buff [32];
2707 case ELFOSABI_NONE: return "UNIX - System V";
2708 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2709 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2710 case ELFOSABI_LINUX: return "UNIX - Linux";
2711 case ELFOSABI_HURD: return "GNU/Hurd";
2712 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2713 case ELFOSABI_AIX: return "UNIX - AIX";
2714 case ELFOSABI_IRIX: return "UNIX - IRIX";
2715 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2716 case ELFOSABI_TRU64: return "UNIX - TRU64";
2717 case ELFOSABI_MODESTO: return "Novell - Modesto";
2718 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2719 case ELFOSABI_STANDALONE: return _("Standalone App");
2720 case ELFOSABI_ARM: return "ARM";
2722 sprintf (buff, _("<unknown: %x>"), osabi);
2727 /* Decode the data held in 'elf_header'. */
2729 process_file_header ()
2731 if ( elf_header.e_ident [EI_MAG0] != ELFMAG0
2732 || elf_header.e_ident [EI_MAG1] != ELFMAG1
2733 || elf_header.e_ident [EI_MAG2] != ELFMAG2
2734 || elf_header.e_ident [EI_MAG3] != ELFMAG3)
2737 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2745 printf (_("ELF Header:\n"));
2746 printf (_(" Magic: "));
2747 for (i = 0; i < EI_NIDENT; i ++)
2748 printf ("%2.2x ", elf_header.e_ident [i]);
2750 printf (_(" Class: %s\n"),
2751 get_elf_class (elf_header.e_ident [EI_CLASS]));
2752 printf (_(" Data: %s\n"),
2753 get_data_encoding (elf_header.e_ident [EI_DATA]));
2754 printf (_(" Version: %d %s\n"),
2755 elf_header.e_ident [EI_VERSION],
2756 (elf_header.e_ident [EI_VERSION] == EV_CURRENT
2758 : (elf_header.e_ident [EI_VERSION] != EV_NONE
2761 printf (_(" OS/ABI: %s\n"),
2762 get_osabi_name (elf_header.e_ident [EI_OSABI]));
2763 printf (_(" ABI Version: %d\n"),
2764 elf_header.e_ident [EI_ABIVERSION]);
2765 printf (_(" Type: %s\n"),
2766 get_file_type (elf_header.e_type));
2767 printf (_(" Machine: %s\n"),
2768 get_machine_name (elf_header.e_machine));
2769 printf (_(" Version: 0x%lx\n"),
2770 (unsigned long) elf_header.e_version);
2772 printf (_(" Entry point address: "));
2773 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2774 printf (_("\n Start of program headers: "));
2775 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2776 printf (_(" (bytes into file)\n Start of section headers: "));
2777 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2778 printf (_(" (bytes into file)\n"));
2780 printf (_(" Flags: 0x%lx%s\n"),
2781 (unsigned long) elf_header.e_flags,
2782 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2783 printf (_(" Size of this header: %ld (bytes)\n"),
2784 (long) elf_header.e_ehsize);
2785 printf (_(" Size of program headers: %ld (bytes)\n"),
2786 (long) elf_header.e_phentsize);
2787 printf (_(" Number of program headers: %ld\n"),
2788 (long) elf_header.e_phnum);
2789 printf (_(" Size of section headers: %ld (bytes)\n"),
2790 (long) elf_header.e_shentsize);
2791 printf (_(" Number of section headers: %ld"),
2792 (long) elf_header.e_shnum);
2793 if (section_headers != NULL && elf_header.e_shnum == 0)
2794 printf (" (%ld)", (long) section_headers[0].sh_size);
2795 putc ('\n', stdout);
2796 printf (_(" Section header string table index: %ld"),
2797 (long) elf_header.e_shstrndx);
2798 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2799 printf (" (%ld)", (long) section_headers[0].sh_link);
2800 putc ('\n', stdout);
2803 if (section_headers != NULL)
2805 if (elf_header.e_shnum == 0)
2806 elf_header.e_shnum = section_headers[0].sh_size;
2807 if (elf_header.e_shstrndx == SHN_XINDEX)
2808 elf_header.e_shstrndx = section_headers[0].sh_link;
2809 free (section_headers);
2810 section_headers = NULL;
2818 get_32bit_program_headers (file, program_headers)
2820 Elf_Internal_Phdr * program_headers;
2822 Elf32_External_Phdr * phdrs;
2823 Elf32_External_Phdr * external;
2824 Elf32_Internal_Phdr * internal;
2827 phdrs = ((Elf32_External_Phdr *)
2828 get_data (NULL, file, elf_header.e_phoff,
2829 elf_header.e_phentsize * elf_header.e_phnum,
2830 _("program headers")));
2834 for (i = 0, internal = program_headers, external = phdrs;
2835 i < elf_header.e_phnum;
2836 i ++, internal ++, external ++)
2838 internal->p_type = BYTE_GET (external->p_type);
2839 internal->p_offset = BYTE_GET (external->p_offset);
2840 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2841 internal->p_paddr = BYTE_GET (external->p_paddr);
2842 internal->p_filesz = BYTE_GET (external->p_filesz);
2843 internal->p_memsz = BYTE_GET (external->p_memsz);
2844 internal->p_flags = BYTE_GET (external->p_flags);
2845 internal->p_align = BYTE_GET (external->p_align);
2854 get_64bit_program_headers (file, program_headers)
2856 Elf_Internal_Phdr * program_headers;
2858 Elf64_External_Phdr * phdrs;
2859 Elf64_External_Phdr * external;
2860 Elf64_Internal_Phdr * internal;
2863 phdrs = ((Elf64_External_Phdr *)
2864 get_data (NULL, file, elf_header.e_phoff,
2865 elf_header.e_phentsize * elf_header.e_phnum,
2866 _("program headers")));
2870 for (i = 0, internal = program_headers, external = phdrs;
2871 i < elf_header.e_phnum;
2872 i ++, internal ++, external ++)
2874 internal->p_type = BYTE_GET (external->p_type);
2875 internal->p_flags = BYTE_GET (external->p_flags);
2876 internal->p_offset = BYTE_GET8 (external->p_offset);
2877 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2878 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2879 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2880 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2881 internal->p_align = BYTE_GET8 (external->p_align);
2890 process_program_headers (file)
2893 Elf_Internal_Phdr * program_headers;
2894 Elf_Internal_Phdr * segment;
2897 if (elf_header.e_phnum == 0)
2900 printf (_("\nThere are no program headers in this file.\n"));
2904 if (do_segments && !do_header)
2906 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
2907 printf (_("Entry point "));
2908 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2909 printf (_("\nThere are %d program headers, starting at offset "),
2910 elf_header.e_phnum);
2911 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2915 program_headers = (Elf_Internal_Phdr *) malloc
2916 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
2918 if (program_headers == NULL)
2920 error (_("Out of memory\n"));
2925 i = get_32bit_program_headers (file, program_headers);
2927 i = get_64bit_program_headers (file, program_headers);
2931 free (program_headers);
2937 if (elf_header.e_phnum > 1)
2938 printf (_("\nProgram Headers:\n"));
2940 printf (_("\nProgram Headers:\n"));
2944 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2947 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2951 (_(" Type Offset VirtAddr PhysAddr\n"));
2953 (_(" FileSiz MemSiz Flags Align\n"));
2961 for (i = 0, segment = program_headers;
2962 i < elf_header.e_phnum;
2967 printf (" %-14.14s ", get_segment_type (segment->p_type));
2971 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2972 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
2973 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
2974 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
2975 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
2977 (segment->p_flags & PF_R ? 'R' : ' '),
2978 (segment->p_flags & PF_W ? 'W' : ' '),
2979 (segment->p_flags & PF_X ? 'E' : ' '));
2980 printf ("%#lx", (unsigned long) segment->p_align);
2984 if ((unsigned long) segment->p_offset == segment->p_offset)
2985 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
2988 print_vma (segment->p_offset, FULL_HEX);
2992 print_vma (segment->p_vaddr, FULL_HEX);
2994 print_vma (segment->p_paddr, FULL_HEX);
2997 if ((unsigned long) segment->p_filesz == segment->p_filesz)
2998 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3001 print_vma (segment->p_filesz, FULL_HEX);
3005 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3006 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3009 print_vma (segment->p_offset, FULL_HEX);
3013 (segment->p_flags & PF_R ? 'R' : ' '),
3014 (segment->p_flags & PF_W ? 'W' : ' '),
3015 (segment->p_flags & PF_X ? 'E' : ' '));
3017 if ((unsigned long) segment->p_align == segment->p_align)
3018 printf ("%#lx", (unsigned long) segment->p_align);
3021 print_vma (segment->p_align, PREFIX_HEX);
3026 print_vma (segment->p_offset, FULL_HEX);
3028 print_vma (segment->p_vaddr, FULL_HEX);
3030 print_vma (segment->p_paddr, FULL_HEX);
3032 print_vma (segment->p_filesz, FULL_HEX);
3034 print_vma (segment->p_memsz, FULL_HEX);
3036 (segment->p_flags & PF_R ? 'R' : ' '),
3037 (segment->p_flags & PF_W ? 'W' : ' '),
3038 (segment->p_flags & PF_X ? 'E' : ' '));
3039 print_vma (segment->p_align, HEX);
3043 switch (segment->p_type)
3047 loadaddr = (segment->p_vaddr & 0xfffff000)
3048 - (segment->p_offset & 0xfffff000);
3053 error (_("more than one dynamic segment\n"));
3055 dynamic_addr = segment->p_offset;
3056 dynamic_size = segment->p_filesz;
3060 if (fseek (file, (long) segment->p_offset, SEEK_SET))
3061 error (_("Unable to find program interpreter name\n"));
3064 program_interpreter[0] = 0;
3065 fscanf (file, "%63s", program_interpreter);
3068 printf (_("\n [Requesting program interpreter: %s]"),
3069 program_interpreter);
3075 putc ('\n', stdout);
3084 if (do_segments && section_headers != NULL)
3086 printf (_("\n Section to Segment mapping:\n"));
3087 printf (_(" Segment Sections...\n"));
3089 assert (string_table != NULL);
3091 for (i = 0; i < elf_header.e_phnum; i++)
3094 Elf_Internal_Shdr * section;
3096 segment = program_headers + i;
3097 section = section_headers;
3099 printf (" %2.2d ", i);
3101 for (j = 1; j < elf_header.e_shnum; j++, section ++)
3103 if (section->sh_size > 0
3104 /* Compare allocated sections by VMA, unallocated
3105 sections by file offset. */
3106 && (section->sh_flags & SHF_ALLOC
3107 ? (section->sh_addr >= segment->p_vaddr
3108 && section->sh_addr + section->sh_size
3109 <= segment->p_vaddr + segment->p_memsz)
3110 : ((bfd_vma) section->sh_offset >= segment->p_offset
3111 && (section->sh_offset + section->sh_size
3112 <= segment->p_offset + segment->p_filesz))))
3113 printf ("%s ", SECTION_NAME (section));
3120 free (program_headers);
3127 get_32bit_section_headers (file, num)
3131 Elf32_External_Shdr * shdrs;
3132 Elf32_Internal_Shdr * internal;
3135 shdrs = ((Elf32_External_Shdr *)
3136 get_data (NULL, file, elf_header.e_shoff,
3137 elf_header.e_shentsize * num,
3138 _("section headers")));
3142 section_headers = ((Elf_Internal_Shdr *)
3143 malloc (num * sizeof (Elf_Internal_Shdr)));
3145 if (section_headers == NULL)
3147 error (_("Out of memory\n"));
3151 for (i = 0, internal = section_headers;
3155 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3156 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3157 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3158 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3159 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3160 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3161 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3162 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3163 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3164 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3173 get_64bit_section_headers (file, num)
3177 Elf64_External_Shdr * shdrs;
3178 Elf64_Internal_Shdr * internal;
3181 shdrs = ((Elf64_External_Shdr *)
3182 get_data (NULL, file, elf_header.e_shoff,
3183 elf_header.e_shentsize * num,
3184 _("section headers")));
3188 section_headers = ((Elf_Internal_Shdr *)
3189 malloc (num * sizeof (Elf_Internal_Shdr)));
3191 if (section_headers == NULL)
3193 error (_("Out of memory\n"));
3197 for (i = 0, internal = section_headers;
3201 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3202 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3203 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3204 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3205 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3206 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3207 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3208 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3209 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3210 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3218 static Elf_Internal_Sym *
3219 get_32bit_elf_symbols (file, section)
3221 Elf_Internal_Shdr *section;
3223 unsigned long number;
3224 Elf32_External_Sym * esyms;
3225 Elf_External_Sym_Shndx *shndx;
3226 Elf_Internal_Sym * isyms;
3227 Elf_Internal_Sym * psym;
3230 esyms = ((Elf32_External_Sym *)
3231 get_data (NULL, file, section->sh_offset,
3232 section->sh_size, _("symbols")));
3237 if (symtab_shndx_hdr != NULL
3238 && (symtab_shndx_hdr->sh_link
3239 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3241 shndx = ((Elf_External_Sym_Shndx *)
3242 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3243 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3251 number = section->sh_size / section->sh_entsize;
3252 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3256 error (_("Out of memory\n"));
3263 for (j = 0, psym = isyms;
3267 psym->st_name = BYTE_GET (esyms[j].st_name);
3268 psym->st_value = BYTE_GET (esyms[j].st_value);
3269 psym->st_size = BYTE_GET (esyms[j].st_size);
3270 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3271 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3273 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3274 psym->st_info = BYTE_GET (esyms[j].st_info);
3275 psym->st_other = BYTE_GET (esyms[j].st_other);
3285 static Elf_Internal_Sym *
3286 get_64bit_elf_symbols (file, section)
3288 Elf_Internal_Shdr *section;
3290 unsigned long number;
3291 Elf64_External_Sym * esyms;
3292 Elf_External_Sym_Shndx *shndx;
3293 Elf_Internal_Sym * isyms;
3294 Elf_Internal_Sym * psym;
3297 esyms = ((Elf64_External_Sym *)
3298 get_data (NULL, file, section->sh_offset,
3299 section->sh_size, _("symbols")));
3304 if (symtab_shndx_hdr != NULL
3305 && (symtab_shndx_hdr->sh_link
3306 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3308 shndx = ((Elf_External_Sym_Shndx *)
3309 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3310 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3318 number = section->sh_size / section->sh_entsize;
3319 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3323 error (_("Out of memory\n"));
3330 for (j = 0, psym = isyms;
3334 psym->st_name = BYTE_GET (esyms[j].st_name);
3335 psym->st_info = BYTE_GET (esyms[j].st_info);
3336 psym->st_other = BYTE_GET (esyms[j].st_other);
3337 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3338 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3340 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3341 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3342 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3353 get_elf_section_flags (sh_flags)
3356 static char buff [32];
3364 flag = sh_flags & - sh_flags;
3369 case SHF_WRITE: strcat (buff, "W"); break;
3370 case SHF_ALLOC: strcat (buff, "A"); break;
3371 case SHF_EXECINSTR: strcat (buff, "X"); break;
3372 case SHF_MERGE: strcat (buff, "M"); break;
3373 case SHF_STRINGS: strcat (buff, "S"); break;
3374 case SHF_INFO_LINK: strcat (buff, "I"); break;
3375 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3376 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3377 case SHF_GROUP: strcat (buff, "G"); break;
3378 case SHF_TLS: strcat (buff, "T"); break;
3381 if (flag & SHF_MASKOS)
3384 sh_flags &= ~ SHF_MASKOS;
3386 else if (flag & SHF_MASKPROC)
3389 sh_flags &= ~ SHF_MASKPROC;
3401 process_section_headers (file)
3404 Elf_Internal_Shdr * section;
3407 section_headers = NULL;
3409 if (elf_header.e_shnum == 0)
3412 printf (_("\nThere are no sections in this file.\n"));
3417 if (do_sections && !do_header)
3418 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3419 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3423 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3426 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3429 /* Read in the string table, so that we have names to display. */
3430 section = SECTION_HEADER (elf_header.e_shstrndx);
3432 if (section->sh_size != 0)
3434 string_table = (char *) get_data (NULL, file, section->sh_offset,
3435 section->sh_size, _("string table"));
3437 string_table_length = section->sh_size;
3440 /* Scan the sections for the dynamic symbol table
3441 and dynamic string table and debug sections. */
3442 dynamic_symbols = NULL;
3443 dynamic_strings = NULL;
3444 dynamic_syminfo = NULL;
3445 symtab_shndx_hdr = NULL;
3447 for (i = 0, section = section_headers;
3448 i < elf_header.e_shnum;
3451 char * name = SECTION_NAME (section);
3453 if (section->sh_type == SHT_DYNSYM)
3455 if (dynamic_symbols != NULL)
3457 error (_("File contains multiple dynamic symbol tables\n"));
3461 num_dynamic_syms = section->sh_size / section->sh_entsize;
3462 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3464 else if (section->sh_type == SHT_STRTAB
3465 && strcmp (name, ".dynstr") == 0)
3467 if (dynamic_strings != NULL)
3469 error (_("File contains multiple dynamic string tables\n"));
3473 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3475 _("dynamic strings"));
3477 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3479 if (symtab_shndx_hdr != NULL)
3481 error (_("File contains multiple symtab shndx tables\n"));
3484 symtab_shndx_hdr = section;
3486 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3487 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3488 || do_debug_frames || do_debug_macinfo || do_debug_str
3490 && strncmp (name, ".debug_", 7) == 0)
3495 || (do_debug_info && (strcmp (name, "info") == 0))
3496 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3497 || (do_debug_lines && (strcmp (name, "line") == 0))
3498 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3499 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3500 || (do_debug_frames && (strcmp (name, "frame") == 0))
3501 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3502 || (do_debug_str && (strcmp (name, "str") == 0))
3503 || (do_debug_loc && (strcmp (name, "loc") == 0))
3505 request_dump (i, DEBUG_DUMP);
3507 /* linkonce section to be combined with .debug_info at link time. */
3508 else if ((do_debugging || do_debug_info)
3509 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3510 request_dump (i, DEBUG_DUMP);
3511 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3512 request_dump (i, DEBUG_DUMP);
3518 if (elf_header.e_shnum > 1)
3519 printf (_("\nSection Headers:\n"));
3521 printf (_("\nSection Header:\n"));
3525 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3528 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3531 printf (_(" [Nr] Name Type Address Offset\n"));
3532 printf (_(" Size EntSize Flags Link Info Align\n"));
3535 for (i = 0, section = section_headers;
3536 i < elf_header.e_shnum;
3539 printf (" [%2u] %-17.17s %-15.15s ",
3540 SECTION_HEADER_NUM (i),
3541 SECTION_NAME (section),
3542 get_section_type_name (section->sh_type));
3546 print_vma (section->sh_addr, LONG_HEX);
3548 printf ( " %6.6lx %6.6lx %2.2lx",
3549 (unsigned long) section->sh_offset,
3550 (unsigned long) section->sh_size,
3551 (unsigned long) section->sh_entsize);
3553 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3555 printf ("%2ld %3lx %2ld\n",
3556 (unsigned long) section->sh_link,
3557 (unsigned long) section->sh_info,
3558 (unsigned long) section->sh_addralign);
3562 print_vma (section->sh_addr, LONG_HEX);
3564 if ((long) section->sh_offset == section->sh_offset)
3565 printf (" %6.6lx", (unsigned long) section->sh_offset);
3569 print_vma (section->sh_offset, LONG_HEX);
3572 if ((unsigned long) section->sh_size == section->sh_size)
3573 printf (" %6.6lx", (unsigned long) section->sh_size);
3577 print_vma (section->sh_size, LONG_HEX);
3580 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3581 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3585 print_vma (section->sh_entsize, LONG_HEX);
3588 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3590 printf ("%2ld %3lx ",
3591 (unsigned long) section->sh_link,
3592 (unsigned long) section->sh_info);
3594 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3595 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3598 print_vma (section->sh_addralign, DEC);
3605 print_vma (section->sh_addr, LONG_HEX);
3606 if ((long) section->sh_offset == section->sh_offset)
3607 printf (" %8.8lx", (unsigned long) section->sh_offset);
3611 print_vma (section->sh_offset, LONG_HEX);
3614 print_vma (section->sh_size, LONG_HEX);
3616 print_vma (section->sh_entsize, LONG_HEX);
3618 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3620 printf (" %2ld %3lx %ld\n",
3621 (unsigned long) section->sh_link,
3622 (unsigned long) section->sh_info,
3623 (unsigned long) section->sh_addralign);
3627 printf (_("Key to Flags:\n\
3628 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3629 I (info), L (link order), G (group), x (unknown)\n\
3630 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3635 /* Process the reloc section. */
3637 process_relocs (file)
3640 unsigned long rel_size;
3641 unsigned long rel_offset;
3647 if (do_using_dynamic)
3649 int is_rela = FALSE;
3654 if (dynamic_info[DT_REL])
3656 rel_offset = dynamic_info[DT_REL];
3657 rel_size = dynamic_info[DT_RELSZ];
3660 else if (dynamic_info [DT_RELA])
3662 rel_offset = dynamic_info[DT_RELA];
3663 rel_size = dynamic_info[DT_RELASZ];
3666 else if (dynamic_info[DT_JMPREL])
3668 rel_offset = dynamic_info[DT_JMPREL];
3669 rel_size = dynamic_info[DT_PLTRELSZ];
3671 switch (dynamic_info[DT_PLTREL])
3688 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3689 rel_offset, rel_size);
3691 dump_relocations (file, rel_offset - loadaddr, rel_size,
3692 dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
3695 printf (_("\nThere are no dynamic relocations in this file.\n"));
3699 Elf32_Internal_Shdr * section;
3703 for (i = 0, section = section_headers;
3704 i < elf_header.e_shnum;
3707 if ( section->sh_type != SHT_RELA
3708 && section->sh_type != SHT_REL)
3711 rel_offset = section->sh_offset;
3712 rel_size = section->sh_size;
3716 Elf32_Internal_Shdr * strsec;
3717 Elf_Internal_Sym * symtab;
3720 unsigned long nsyms;
3722 printf (_("\nRelocation section "));
3724 if (string_table == NULL)
3725 printf ("%d", section->sh_name);
3727 printf (_("'%s'"), SECTION_NAME (section));
3729 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3730 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3735 if (section->sh_link)
3737 Elf32_Internal_Shdr * symsec;
3739 symsec = SECTION_HEADER (section->sh_link);
3740 nsyms = symsec->sh_size / symsec->sh_entsize;
3741 symtab = GET_ELF_SYMBOLS (file, symsec);
3746 strsec = SECTION_HEADER (symsec->sh_link);
3748 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3752 is_rela = section->sh_type == SHT_RELA;
3754 dump_relocations (file, rel_offset, rel_size,
3755 symtab, nsyms, strtab, is_rela);
3767 printf (_("\nThere are no relocations in this file.\n"));
3773 #include "unwind-ia64.h"
3775 /* An absolute address consists of a section and an offset. If the
3776 section is NULL, the offset itself is the address, otherwise, the
3777 address equals to LOAD_ADDRESS(section) + offset. */
3781 unsigned short section;
3787 struct unw_table_entry
3789 struct absaddr start;
3791 struct absaddr info;
3793 *table; /* Unwind table. */
3794 unsigned long table_len; /* Length of unwind table. */
3795 unsigned char * info; /* Unwind info. */
3796 unsigned long info_size; /* Size of unwind info. */
3797 bfd_vma info_addr; /* starting address of unwind info. */
3798 bfd_vma seg_base; /* Starting address of segment. */
3799 Elf_Internal_Sym * symtab; /* The symbol table. */
3800 unsigned long nsyms; /* Number of symbols. */
3801 char * strtab; /* The string table. */
3802 unsigned long strtab_size; /* Size of string table. */
3805 static void find_symbol_for_address PARAMS ((struct unw_aux_info *,
3806 struct absaddr, const char **,
3808 static void dump_ia64_unwind PARAMS ((struct unw_aux_info *));
3809 static int slurp_ia64_unwind_table PARAMS ((FILE *, struct unw_aux_info *,
3810 Elf32_Internal_Shdr *));
3813 find_symbol_for_address (aux, addr, symname, offset)
3814 struct unw_aux_info *aux;
3815 struct absaddr addr;
3816 const char **symname;
3819 bfd_vma dist = (bfd_vma) 0x100000;
3820 Elf_Internal_Sym *sym, *best = NULL;
3823 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3825 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3826 && sym->st_name != 0
3827 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3828 && addr.offset >= sym->st_value
3829 && addr.offset - sym->st_value < dist)
3832 dist = addr.offset - sym->st_value;
3839 *symname = (best->st_name >= aux->strtab_size
3840 ? "<corrupt>" : aux->strtab + best->st_name);
3845 *offset = addr.offset;
3849 dump_ia64_unwind (aux)
3850 struct unw_aux_info *aux;
3853 struct unw_table_entry * tp;
3856 addr_size = is_32bit_elf ? 4 : 8;
3858 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3862 const unsigned char * dp;
3863 const unsigned char * head;
3864 const char * procname;
3866 find_symbol_for_address (aux, tp->start, &procname, &offset);
3868 fputs ("\n<", stdout);
3872 fputs (procname, stdout);
3875 printf ("+%lx", (unsigned long) offset);
3878 fputs (">: [", stdout);
3879 print_vma (tp->start.offset, PREFIX_HEX);
3880 fputc ('-', stdout);
3881 print_vma (tp->end.offset, PREFIX_HEX);
3882 printf ("], info at +0x%lx\n",
3883 (unsigned long) (tp->info.offset - aux->seg_base));
3885 head = aux->info + (tp->info.offset - aux->info_addr);
3886 stamp = BYTE_GET8 ((unsigned char *) head);
3888 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
3889 (unsigned) UNW_VER (stamp),
3890 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
3891 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
3892 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
3893 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
3895 if (UNW_VER (stamp) != 1)
3897 printf ("\tUnknown version.\n");
3902 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
3903 dp = unw_decode (dp, in_body, & in_body);
3908 slurp_ia64_unwind_table (file, aux, sec)
3910 struct unw_aux_info *aux;
3911 Elf32_Internal_Shdr *sec;
3913 unsigned long size, addr_size, nrelas, i;
3914 Elf_Internal_Phdr *prog_hdrs, *seg;
3915 struct unw_table_entry *tep;
3916 Elf32_Internal_Shdr *relsec;
3917 Elf_Internal_Rela *rela, *rp;
3918 unsigned char *table, *tp;
3919 Elf_Internal_Sym *sym;
3920 const char *relname;
3923 addr_size = is_32bit_elf ? 4 : 8;
3925 /* First, find the starting address of the segment that includes
3928 if (elf_header.e_phnum)
3930 prog_hdrs = (Elf_Internal_Phdr *)
3931 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3934 result = get_32bit_program_headers (file, prog_hdrs);
3936 result = get_64bit_program_headers (file, prog_hdrs);
3944 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
3946 if (seg->p_type != PT_LOAD)
3949 if (sec->sh_addr >= seg->p_vaddr
3950 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
3952 aux->seg_base = seg->p_vaddr;
3960 /* Second, build the unwind table from the contents of the unwind section: */
3961 size = sec->sh_size;
3962 table = (char *) get_data (NULL, file, sec->sh_offset,
3963 size, _("unwind table"));
3967 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
3968 for (tp = table; tp < table + size; tp += 3 * addr_size, ++ tep)
3970 tep->start.section = SHN_UNDEF;
3971 tep->end.section = SHN_UNDEF;
3972 tep->info.section = SHN_UNDEF;
3975 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
3976 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
3977 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
3981 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
3982 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
3983 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
3985 tep->start.offset += aux->seg_base;
3986 tep->end.offset += aux->seg_base;
3987 tep->info.offset += aux->seg_base;
3991 /* Third, apply any relocations to the unwind table: */
3993 for (relsec = section_headers;
3994 relsec < section_headers + elf_header.e_shnum;
3997 if (relsec->sh_type != SHT_RELA
3998 || SECTION_HEADER (relsec->sh_info) != sec)
4001 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4005 for (rp = rela; rp < rela + nrelas; ++rp)
4009 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4010 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4012 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4014 warn (_("Skipping unexpected symbol type %u\n"),
4015 ELF32_ST_TYPE (sym->st_info));
4021 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4022 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4024 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4026 warn (_("Skipping unexpected symbol type %u\n"),
4027 ELF64_ST_TYPE (sym->st_info));
4032 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4034 warn (_("Skipping unexpected relocation type %s\n"), relname);
4038 i = rp->r_offset / (3 * addr_size);
4040 switch (rp->r_offset/addr_size % 3)
4043 aux->table[i].start.section = sym->st_shndx;
4044 aux->table[i].start.offset += rp->r_addend;
4047 aux->table[i].end.section = sym->st_shndx;
4048 aux->table[i].end.offset += rp->r_addend;
4051 aux->table[i].info.section = sym->st_shndx;
4052 aux->table[i].info.offset += rp->r_addend;
4062 aux->table_len = size / (3 * addr_size);
4067 process_unwind (file)
4070 Elf32_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4071 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4072 struct unw_aux_info aux;
4077 if (elf_header.e_machine != EM_IA_64)
4079 printf (_("\nThere are no unwind sections in this file.\n"));
4083 memset (& aux, 0, sizeof (aux));
4085 addr_size = is_32bit_elf ? 4 : 8;
4087 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4089 if (sec->sh_type == SHT_SYMTAB)
4091 aux.nsyms = sec->sh_size / sec->sh_entsize;
4092 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4094 strsec = SECTION_HEADER (sec->sh_link);
4095 aux.strtab_size = strsec->sh_size;
4096 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
4097 aux.strtab_size, _("string table"));
4099 else if (sec->sh_type == SHT_IA_64_UNWIND)
4104 printf (_("\nThere are no unwind sections in this file.\n"));
4106 while (unwcount-- > 0)
4111 for (i = unwstart, sec = section_headers + unwstart;
4112 i < elf_header.e_shnum; ++i, ++sec)
4113 if (sec->sh_type == SHT_IA_64_UNWIND)
4120 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4122 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
4125 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4126 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4127 suffix = SECTION_NAME (unwsec) + len;
4128 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4130 if (strncmp (SECTION_NAME (sec),
4131 ELF_STRING_ia64_unwind_info_once, len2) == 0
4132 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4137 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4138 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4139 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4140 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4142 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4144 suffix = SECTION_NAME (unwsec) + len;
4145 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4147 if (strncmp (SECTION_NAME (sec),
4148 ELF_STRING_ia64_unwind_info, len2) == 0
4149 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4153 if (i == elf_header.e_shnum)
4155 printf (_("\nCould not find unwind info section for "));
4157 if (string_table == NULL)
4158 printf ("%d", unwsec->sh_name);
4160 printf (_("'%s'"), SECTION_NAME (unwsec));
4164 aux.info_size = sec->sh_size;
4165 aux.info_addr = sec->sh_addr;
4166 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
4167 aux.info_size, _("unwind info"));
4169 printf (_("\nUnwind section "));
4171 if (string_table == NULL)
4172 printf ("%d", unwsec->sh_name);
4174 printf (_("'%s'"), SECTION_NAME (unwsec));
4176 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4177 (unsigned long) unwsec->sh_offset,
4178 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4180 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4182 if (aux.table_len > 0)
4183 dump_ia64_unwind (& aux);
4186 free ((char *) aux.table);
4188 free ((char *) aux.info);
4197 free ((char *) aux.strtab);
4203 dynamic_segment_mips_val (entry)
4204 Elf_Internal_Dyn * entry;
4206 switch (entry->d_tag)
4209 if (entry->d_un.d_val == 0)
4213 static const char * opts[] =
4215 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4216 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4217 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4218 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4223 for (cnt = 0; cnt < NUM_ELEM (opts); ++ cnt)
4224 if (entry->d_un.d_val & (1 << cnt))
4226 printf ("%s%s", first ? "" : " ", opts[cnt]);
4233 case DT_MIPS_IVERSION:
4234 if (dynamic_strings != NULL)
4235 printf ("Interface Version: %s\n",
4236 dynamic_strings + entry->d_un.d_val);
4238 printf ("%ld\n", (long) entry->d_un.d_ptr);
4241 case DT_MIPS_TIME_STAMP:
4246 time_t time = entry->d_un.d_val;
4247 tmp = gmtime (&time);
4248 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4249 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4250 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4251 printf ("Time Stamp: %s\n", timebuf);
4255 case DT_MIPS_RLD_VERSION:
4256 case DT_MIPS_LOCAL_GOTNO:
4257 case DT_MIPS_CONFLICTNO:
4258 case DT_MIPS_LIBLISTNO:
4259 case DT_MIPS_SYMTABNO:
4260 case DT_MIPS_UNREFEXTNO:
4261 case DT_MIPS_HIPAGENO:
4262 case DT_MIPS_DELTA_CLASS_NO:
4263 case DT_MIPS_DELTA_INSTANCE_NO:
4264 case DT_MIPS_DELTA_RELOC_NO:
4265 case DT_MIPS_DELTA_SYM_NO:
4266 case DT_MIPS_DELTA_CLASSSYM_NO:
4267 case DT_MIPS_COMPACT_SIZE:
4268 printf ("%ld\n", (long) entry->d_un.d_ptr);
4272 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4278 dynamic_segment_parisc_val (entry)
4279 Elf_Internal_Dyn * entry;
4281 switch (entry->d_tag)
4283 case DT_HP_DLD_FLAGS:
4292 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4293 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4294 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4295 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4296 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4297 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4298 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4299 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4300 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4301 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4302 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4306 bfd_vma val = entry->d_un.d_val;
4308 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4309 if (val & flags[cnt].bit)
4313 fputs (flags[cnt].str, stdout);
4315 val ^= flags[cnt].bit;
4318 if (val != 0 || first)
4322 print_vma (val, HEX);
4328 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4335 get_32bit_dynamic_segment (file)
4338 Elf32_External_Dyn * edyn;
4339 Elf_Internal_Dyn * entry;
4342 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4343 dynamic_size, _("dynamic segment"));
4347 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4348 how large this .dynamic is now. We can do this even before the byte
4349 swapping since the DT_NULL tag is recognizable. */
4351 while (*(Elf32_Word *) edyn [dynamic_size++].d_tag != DT_NULL)
4354 dynamic_segment = (Elf_Internal_Dyn *)
4355 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4357 if (dynamic_segment == NULL)
4359 error (_("Out of memory\n"));
4364 for (i = 0, entry = dynamic_segment;
4368 entry->d_tag = BYTE_GET (edyn [i].d_tag);
4369 entry->d_un.d_val = BYTE_GET (edyn [i].d_un.d_val);
4378 get_64bit_dynamic_segment (file)
4381 Elf64_External_Dyn * edyn;
4382 Elf_Internal_Dyn * entry;
4385 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4386 dynamic_size, _("dynamic segment"));
4390 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4391 how large this .dynamic is now. We can do this even before the byte
4392 swapping since the DT_NULL tag is recognizable. */
4394 while (*(bfd_vma *) edyn [dynamic_size ++].d_tag != DT_NULL)
4397 dynamic_segment = (Elf_Internal_Dyn *)
4398 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4400 if (dynamic_segment == NULL)
4402 error (_("Out of memory\n"));
4407 for (i = 0, entry = dynamic_segment;
4411 entry->d_tag = BYTE_GET8 (edyn [i].d_tag);
4412 entry->d_un.d_val = BYTE_GET8 (edyn [i].d_un.d_val);
4421 get_dynamic_flags (flags)
4424 static char buff [128];
4432 flag = flags & - flags;
4440 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4441 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4442 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4443 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4444 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4445 default: strcpy (p, "unknown"); break;
4448 p = strchr (p, '\0');
4453 /* Parse and display the contents of the dynamic segment. */
4455 process_dynamic_segment (file)
4458 Elf_Internal_Dyn * entry;
4461 if (dynamic_size == 0)
4464 printf (_("\nThere is no dynamic segment in this file.\n"));
4471 if (! get_32bit_dynamic_segment (file))
4474 else if (! get_64bit_dynamic_segment (file))
4477 /* Find the appropriate symbol table. */
4478 if (dynamic_symbols == NULL)
4480 for (i = 0, entry = dynamic_segment;
4484 Elf32_Internal_Shdr section;
4486 if (entry->d_tag != DT_SYMTAB)
4489 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4491 /* Since we do not know how big the symbol table is,
4492 we default to reading in the entire file (!) and
4493 processing that. This is overkill, I know, but it
4495 section.sh_offset = entry->d_un.d_val - loadaddr;
4497 if (fseek (file, 0, SEEK_END))
4498 error (_("Unable to seek to end of file!"));
4500 section.sh_size = ftell (file) - section.sh_offset;
4502 section.sh_entsize = sizeof (Elf32_External_Sym);
4504 section.sh_entsize = sizeof (Elf64_External_Sym);
4506 num_dynamic_syms = section.sh_size / section.sh_entsize;
4507 if (num_dynamic_syms < 1)
4509 error (_("Unable to determine the number of symbols to load\n"));
4513 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4517 /* Similarly find a string table. */
4518 if (dynamic_strings == NULL)
4520 for (i = 0, entry = dynamic_segment;
4524 unsigned long offset;
4527 if (entry->d_tag != DT_STRTAB)
4530 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4532 /* Since we do not know how big the string table is,
4533 we default to reading in the entire file (!) and
4534 processing that. This is overkill, I know, but it
4537 offset = entry->d_un.d_val - loadaddr;
4538 if (fseek (file, 0, SEEK_END))
4539 error (_("Unable to seek to end of file\n"));
4540 str_tab_len = ftell (file) - offset;
4542 if (str_tab_len < 1)
4545 (_("Unable to determine the length of the dynamic string table\n"));
4549 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4550 _("dynamic string table"));
4555 /* And find the syminfo section if available. */
4556 if (dynamic_syminfo == NULL)
4558 unsigned int syminsz = 0;
4560 for (i = 0, entry = dynamic_segment;
4564 if (entry->d_tag == DT_SYMINENT)
4566 /* Note: these braces are necessary to avoid a syntax
4567 error from the SunOS4 C compiler. */
4568 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4570 else if (entry->d_tag == DT_SYMINSZ)
4571 syminsz = entry->d_un.d_val;
4572 else if (entry->d_tag == DT_SYMINFO)
4573 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4576 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4578 Elf_External_Syminfo * extsyminfo;
4579 Elf_Internal_Syminfo * syminfo;
4581 /* There is a syminfo section. Read the data. */
4582 extsyminfo = ((Elf_External_Syminfo *)
4583 get_data (NULL, file, dynamic_syminfo_offset,
4584 syminsz, _("symbol information")));
4588 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4589 if (dynamic_syminfo == NULL)
4591 error (_("Out of memory\n"));
4595 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4596 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4599 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4600 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4607 if (do_dynamic && dynamic_addr)
4608 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
4609 dynamic_addr, (long) dynamic_size);
4611 printf (_(" Tag Type Name/Value\n"));
4613 for (i = 0, entry = dynamic_segment;
4622 print_vma (entry->d_tag, FULL_HEX);
4623 dtype = get_dynamic_type (entry->d_tag);
4624 printf (" (%s)%*s", dtype,
4625 ((is_32bit_elf ? 27 : 19)
4626 - (int) strlen (dtype)),
4630 switch (entry->d_tag)
4634 puts (get_dynamic_flags (entry->d_un.d_val));
4644 switch (entry->d_tag)
4647 printf (_("Auxiliary library"));
4651 printf (_("Filter library"));
4655 printf (_("Configuration file"));
4659 printf (_("Dependency audit library"));
4663 printf (_("Audit library"));
4667 if (dynamic_strings)
4668 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4672 print_vma (entry->d_un.d_val, PREFIX_HEX);
4681 printf (_("Flags:"));
4683 if (entry->d_un.d_val == 0)
4684 printf (_(" None\n"));
4687 unsigned long int val = entry->d_un.d_val;
4689 if (val & DTF_1_PARINIT)
4691 printf (" PARINIT");
4692 val ^= DTF_1_PARINIT;
4694 if (val & DTF_1_CONFEXP)
4696 printf (" CONFEXP");
4697 val ^= DTF_1_CONFEXP;
4700 printf (" %lx", val);
4709 printf (_("Flags:"));
4711 if (entry->d_un.d_val == 0)
4712 printf (_(" None\n"));
4715 unsigned long int val = entry->d_un.d_val;
4717 if (val & DF_P1_LAZYLOAD)
4719 printf (" LAZYLOAD");
4720 val ^= DF_P1_LAZYLOAD;
4722 if (val & DF_P1_GROUPPERM)
4724 printf (" GROUPPERM");
4725 val ^= DF_P1_GROUPPERM;
4728 printf (" %lx", val);
4737 printf (_("Flags:"));
4738 if (entry->d_un.d_val == 0)
4739 printf (_(" None\n"));
4742 unsigned long int val = entry->d_un.d_val;
4749 if (val & DF_1_GLOBAL)
4754 if (val & DF_1_GROUP)
4759 if (val & DF_1_NODELETE)
4761 printf (" NODELETE");
4762 val ^= DF_1_NODELETE;
4764 if (val & DF_1_LOADFLTR)
4766 printf (" LOADFLTR");
4767 val ^= DF_1_LOADFLTR;
4769 if (val & DF_1_INITFIRST)
4771 printf (" INITFIRST");
4772 val ^= DF_1_INITFIRST;
4774 if (val & DF_1_NOOPEN)
4779 if (val & DF_1_ORIGIN)
4784 if (val & DF_1_DIRECT)
4789 if (val & DF_1_TRANS)
4794 if (val & DF_1_INTERPOSE)
4796 printf (" INTERPOSE");
4797 val ^= DF_1_INTERPOSE;
4799 if (val & DF_1_NODEFLIB)
4801 printf (" NODEFLIB");
4802 val ^= DF_1_NODEFLIB;
4804 if (val & DF_1_NODUMP)
4809 if (val & DF_1_CONLFAT)
4811 printf (" CONLFAT");
4812 val ^= DF_1_CONLFAT;
4815 printf (" %lx", val);
4823 puts (get_dynamic_type (entry->d_un.d_val));
4843 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4849 if (dynamic_strings == NULL)
4852 name = dynamic_strings + entry->d_un.d_val;
4856 switch (entry->d_tag)
4859 printf (_("Shared library: [%s]"), name);
4861 if (strcmp (name, program_interpreter) == 0)
4862 printf (_(" program interpreter"));
4866 printf (_("Library soname: [%s]"), name);
4870 printf (_("Library rpath: [%s]"), name);
4874 printf (_("Library runpath: [%s]"), name);
4878 print_vma (entry->d_un.d_val, PREFIX_HEX);
4883 print_vma (entry->d_un.d_val, PREFIX_HEX);
4899 case DT_INIT_ARRAYSZ:
4900 case DT_FINI_ARRAYSZ:
4901 case DT_GNU_CONFLICTSZ:
4902 case DT_GNU_LIBLISTSZ:
4905 print_vma (entry->d_un.d_val, UNSIGNED);
4906 printf (" (bytes)\n");
4916 print_vma (entry->d_un.d_val, UNSIGNED);
4929 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
4933 name = dynamic_strings + entry->d_un.d_val;
4937 printf (_("Not needed object: [%s]\n"), name);
4942 print_vma (entry->d_un.d_val, PREFIX_HEX);
4948 /* The value of this entry is ignored. */
4953 case DT_GNU_PRELINKED:
4957 time_t time = entry->d_un.d_val;
4959 tmp = gmtime (&time);
4960 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
4961 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4962 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4968 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
4969 version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
4974 switch (elf_header.e_machine)
4977 case EM_MIPS_RS3_LE:
4978 dynamic_segment_mips_val (entry);
4981 dynamic_segment_parisc_val (entry);
4984 print_vma (entry->d_un.d_val, PREFIX_HEX);
4996 get_ver_flags (flags)
4999 static char buff [32];
5006 if (flags & VER_FLG_BASE)
5007 strcat (buff, "BASE ");
5009 if (flags & VER_FLG_WEAK)
5011 if (flags & VER_FLG_BASE)
5012 strcat (buff, "| ");
5014 strcat (buff, "WEAK ");
5017 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5018 strcat (buff, "| <unknown>");
5023 /* Display the contents of the version sections. */
5025 process_version_sections (file)
5028 Elf32_Internal_Shdr * section;
5035 for (i = 0, section = section_headers;
5036 i < elf_header.e_shnum;
5039 switch (section->sh_type)
5041 case SHT_GNU_verdef:
5043 Elf_External_Verdef * edefs;
5050 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5051 SECTION_NAME (section), section->sh_info);
5053 printf (_(" Addr: 0x"));
5054 printf_vma (section->sh_addr);
5055 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5056 (unsigned long) section->sh_offset, section->sh_link,
5057 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5059 edefs = ((Elf_External_Verdef *)
5060 get_data (NULL, file, section->sh_offset,
5062 _("version definition section")));
5066 for (idx = cnt = 0; cnt < section->sh_info; ++ cnt)
5069 Elf_External_Verdef * edef;
5070 Elf_Internal_Verdef ent;
5071 Elf_External_Verdaux * eaux;
5072 Elf_Internal_Verdaux aux;
5076 vstart = ((char *) edefs) + idx;
5078 edef = (Elf_External_Verdef *) vstart;
5080 ent.vd_version = BYTE_GET (edef->vd_version);
5081 ent.vd_flags = BYTE_GET (edef->vd_flags);
5082 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5083 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5084 ent.vd_hash = BYTE_GET (edef->vd_hash);
5085 ent.vd_aux = BYTE_GET (edef->vd_aux);
5086 ent.vd_next = BYTE_GET (edef->vd_next);
5088 printf (_(" %#06x: Rev: %d Flags: %s"),
5089 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5091 printf (_(" Index: %d Cnt: %d "),
5092 ent.vd_ndx, ent.vd_cnt);
5094 vstart += ent.vd_aux;
5096 eaux = (Elf_External_Verdaux *) vstart;
5098 aux.vda_name = BYTE_GET (eaux->vda_name);
5099 aux.vda_next = BYTE_GET (eaux->vda_next);
5101 if (dynamic_strings)
5102 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5104 printf (_("Name index: %ld\n"), aux.vda_name);
5106 isum = idx + ent.vd_aux;
5108 for (j = 1; j < ent.vd_cnt; j ++)
5110 isum += aux.vda_next;
5111 vstart += aux.vda_next;
5113 eaux = (Elf_External_Verdaux *) vstart;
5115 aux.vda_name = BYTE_GET (eaux->vda_name);
5116 aux.vda_next = BYTE_GET (eaux->vda_next);
5118 if (dynamic_strings)
5119 printf (_(" %#06x: Parent %d: %s\n"),
5120 isum, j, dynamic_strings + aux.vda_name);
5122 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5123 isum, j, aux.vda_name);
5133 case SHT_GNU_verneed:
5135 Elf_External_Verneed * eneed;
5141 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5142 SECTION_NAME (section), section->sh_info);
5144 printf (_(" Addr: 0x"));
5145 printf_vma (section->sh_addr);
5146 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5147 (unsigned long) section->sh_offset, section->sh_link,
5148 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5150 eneed = ((Elf_External_Verneed *)
5151 get_data (NULL, file, section->sh_offset,
5152 section->sh_size, _("version need section")));
5156 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5158 Elf_External_Verneed * entry;
5159 Elf_Internal_Verneed ent;
5164 vstart = ((char *) eneed) + idx;
5166 entry = (Elf_External_Verneed *) vstart;
5168 ent.vn_version = BYTE_GET (entry->vn_version);
5169 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5170 ent.vn_file = BYTE_GET (entry->vn_file);
5171 ent.vn_aux = BYTE_GET (entry->vn_aux);
5172 ent.vn_next = BYTE_GET (entry->vn_next);
5174 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5176 if (dynamic_strings)
5177 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5179 printf (_(" File: %lx"), ent.vn_file);
5181 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5183 vstart += ent.vn_aux;
5185 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5187 Elf_External_Vernaux * eaux;
5188 Elf_Internal_Vernaux aux;
5190 eaux = (Elf_External_Vernaux *) vstart;
5192 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5193 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5194 aux.vna_other = BYTE_GET (eaux->vna_other);
5195 aux.vna_name = BYTE_GET (eaux->vna_name);
5196 aux.vna_next = BYTE_GET (eaux->vna_next);
5198 if (dynamic_strings)
5199 printf (_(" %#06x: Name: %s"),
5200 isum, dynamic_strings + aux.vna_name);
5202 printf (_(" %#06x: Name index: %lx"),
5203 isum, aux.vna_name);
5205 printf (_(" Flags: %s Version: %d\n"),
5206 get_ver_flags (aux.vna_flags), aux.vna_other);
5208 isum += aux.vna_next;
5209 vstart += aux.vna_next;
5219 case SHT_GNU_versym:
5221 Elf32_Internal_Shdr * link_section;
5224 unsigned char * edata;
5225 unsigned short * data;
5227 Elf_Internal_Sym * symbols;
5228 Elf32_Internal_Shdr * string_sec;
5230 link_section = SECTION_HEADER (section->sh_link);
5231 total = section->sh_size / section->sh_entsize;
5235 symbols = GET_ELF_SYMBOLS (file, link_section);
5237 string_sec = SECTION_HEADER (link_section->sh_link);
5239 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5240 string_sec->sh_size,
5241 _("version string table"));
5245 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5246 SECTION_NAME (section), total);
5248 printf (_(" Addr: "));
5249 printf_vma (section->sh_addr);
5250 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5251 (unsigned long) section->sh_offset, section->sh_link,
5252 SECTION_NAME (link_section));
5256 get_data (NULL, file,
5257 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5258 total * sizeof (short), _("version symbol data")));
5265 data = (unsigned short *) malloc (total * sizeof (short));
5267 for (cnt = total; cnt --;)
5268 data [cnt] = byte_get (edata + cnt * sizeof (short),
5273 for (cnt = 0; cnt < total; cnt += 4)
5276 int check_def, check_need;
5279 printf (" %03x:", cnt);
5281 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5282 switch (data [cnt + j])
5285 fputs (_(" 0 (*local*) "), stdout);
5289 fputs (_(" 1 (*global*) "), stdout);
5293 nn = printf ("%4x%c", data [cnt + j] & 0x7fff,
5294 data [cnt + j] & 0x8000 ? 'h' : ' ');
5298 if (SECTION_HEADER (symbols [cnt + j].st_shndx)->sh_type
5301 if (symbols [cnt + j].st_shndx == SHN_UNDEF)
5308 && version_info [DT_VERSIONTAGIDX (DT_VERNEED)])
5310 Elf_Internal_Verneed ivn;
5311 unsigned long offset;
5313 offset = version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5318 Elf_Internal_Vernaux ivna;
5319 Elf_External_Verneed evn;
5320 Elf_External_Vernaux evna;
5321 unsigned long a_off;
5323 get_data (&evn, file, offset, sizeof (evn),
5326 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5327 ivn.vn_next = BYTE_GET (evn.vn_next);
5329 a_off = offset + ivn.vn_aux;
5333 get_data (&evna, file, a_off, sizeof (evna),
5334 _("version need aux (2)"));
5336 ivna.vna_next = BYTE_GET (evna.vna_next);
5337 ivna.vna_other = BYTE_GET (evna.vna_other);
5339 a_off += ivna.vna_next;
5341 while (ivna.vna_other != data [cnt + j]
5342 && ivna.vna_next != 0);
5344 if (ivna.vna_other == data [cnt + j])
5346 ivna.vna_name = BYTE_GET (evna.vna_name);
5348 name = strtab + ivna.vna_name;
5349 nn += printf ("(%s%-*s",
5351 12 - (int) strlen (name),
5357 offset += ivn.vn_next;
5359 while (ivn.vn_next);
5362 if (check_def && data [cnt + j] != 0x8001
5363 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5365 Elf_Internal_Verdef ivd;
5366 Elf_External_Verdef evd;
5367 unsigned long offset;
5369 offset = version_info
5370 [DT_VERSIONTAGIDX (DT_VERDEF)] - loadaddr;
5374 get_data (&evd, file, offset, sizeof (evd),
5377 ivd.vd_next = BYTE_GET (evd.vd_next);
5378 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5380 offset += ivd.vd_next;
5382 while (ivd.vd_ndx != (data [cnt + j] & 0x7fff)
5383 && ivd.vd_next != 0);
5385 if (ivd.vd_ndx == (data [cnt + j] & 0x7fff))
5387 Elf_External_Verdaux evda;
5388 Elf_Internal_Verdaux ivda;
5390 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5392 get_data (&evda, file,
5393 offset - ivd.vd_next + ivd.vd_aux,
5394 sizeof (evda), _("version def aux"));
5396 ivda.vda_name = BYTE_GET (evda.vda_name);
5398 name = strtab + ivda.vda_name;
5399 nn += printf ("(%s%-*s",
5401 12 - (int) strlen (name),
5407 printf ("%*c", 18 - nn, ' ');
5425 printf (_("\nNo version information found in this file.\n"));
5431 get_symbol_binding (binding)
5432 unsigned int binding;
5434 static char buff [32];
5438 case STB_LOCAL: return "LOCAL";
5439 case STB_GLOBAL: return "GLOBAL";
5440 case STB_WEAK: return "WEAK";
5442 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5443 sprintf (buff, _("<processor specific>: %d"), binding);
5444 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5445 sprintf (buff, _("<OS specific>: %d"), binding);
5447 sprintf (buff, _("<unknown>: %d"), binding);
5453 get_symbol_type (type)
5456 static char buff [32];
5460 case STT_NOTYPE: return "NOTYPE";
5461 case STT_OBJECT: return "OBJECT";
5462 case STT_FUNC: return "FUNC";
5463 case STT_SECTION: return "SECTION";
5464 case STT_FILE: return "FILE";
5465 case STT_COMMON: return "COMMON";
5466 case STT_TLS: return "TLS";
5468 if (type >= STT_LOPROC && type <= STT_HIPROC)
5470 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5471 return "THUMB_FUNC";
5473 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5476 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5477 return "PARISC_MILLI";
5479 sprintf (buff, _("<processor specific>: %d"), type);
5481 else if (type >= STT_LOOS && type <= STT_HIOS)
5483 if (elf_header.e_machine == EM_PARISC)
5485 if (type == STT_HP_OPAQUE)
5487 if (type == STT_HP_STUB)
5491 sprintf (buff, _("<OS specific>: %d"), type);
5494 sprintf (buff, _("<unknown>: %d"), type);
5500 get_symbol_visibility (visibility)
5501 unsigned int visibility;
5505 case STV_DEFAULT: return "DEFAULT";
5506 case STV_INTERNAL: return "INTERNAL";
5507 case STV_HIDDEN: return "HIDDEN";
5508 case STV_PROTECTED: return "PROTECTED";
5514 get_symbol_index_type (type)
5517 static char buff [32];
5521 case SHN_UNDEF: return "UND";
5522 case SHN_ABS: return "ABS";
5523 case SHN_COMMON: return "COM";
5525 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5526 sprintf (buff, "PRC[0x%04x]", type);
5527 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5528 sprintf (buff, "OS [0x%04x]", type);
5529 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5530 sprintf (buff, "RSV[0x%04x]", type);
5532 sprintf (buff, "0x%04x", type);
5540 get_dynamic_data (file, number)
5542 unsigned int number;
5544 unsigned char * e_data;
5547 e_data = (unsigned char *) malloc (number * 4);
5551 error (_("Out of memory\n"));
5555 if (fread (e_data, 4, number, file) != number)
5557 error (_("Unable to read in dynamic data\n"));
5561 i_data = (int *) malloc (number * sizeof (* i_data));
5565 error (_("Out of memory\n"));
5571 i_data [number] = byte_get (e_data + number * 4, 4);
5578 /* Dump the symbol table. */
5580 process_symbol_table (file)
5583 Elf32_Internal_Shdr * section;
5584 unsigned char nb [4];
5585 unsigned char nc [4];
5588 int * buckets = NULL;
5589 int * chains = NULL;
5591 if (! do_syms && !do_histogram)
5594 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5597 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5599 error (_("Unable to seek to start of dynamic information"));
5603 if (fread (nb, sizeof (nb), 1, file) != 1)
5605 error (_("Failed to read in number of buckets\n"));
5609 if (fread (nc, sizeof (nc), 1, file) != 1)
5611 error (_("Failed to read in number of chains\n"));
5615 nbuckets = byte_get (nb, 4);
5616 nchains = byte_get (nc, 4);
5618 buckets = get_dynamic_data (file, nbuckets);
5619 chains = get_dynamic_data (file, nchains);
5621 if (buckets == NULL || chains == NULL)
5626 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5631 printf (_("\nSymbol table for image:\n"));
5633 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5635 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5637 for (hn = 0; hn < nbuckets; hn++)
5642 for (si = buckets [hn]; si < nchains && si > 0; si = chains [si])
5644 Elf_Internal_Sym * psym;
5646 psym = dynamic_symbols + si;
5648 printf (" %3d %3d: ", si, hn);
5649 print_vma (psym->st_value, LONG_HEX);
5651 print_vma (psym->st_size, DEC_5);
5653 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5654 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5655 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5656 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5657 print_symbol (25, dynamic_strings + psym->st_name);
5662 else if (do_syms && !do_using_dynamic)
5666 for (i = 0, section = section_headers;
5667 i < elf_header.e_shnum;
5672 Elf_Internal_Sym * symtab;
5673 Elf_Internal_Sym * psym;
5676 if ( section->sh_type != SHT_SYMTAB
5677 && section->sh_type != SHT_DYNSYM)
5680 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5681 SECTION_NAME (section),
5682 (unsigned long) (section->sh_size / section->sh_entsize));
5684 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5686 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5688 symtab = GET_ELF_SYMBOLS (file, section);
5692 if (section->sh_link == elf_header.e_shstrndx)
5693 strtab = string_table;
5696 Elf32_Internal_Shdr * string_sec;
5698 string_sec = SECTION_HEADER (section->sh_link);
5700 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5701 string_sec->sh_size,
5705 for (si = 0, psym = symtab;
5706 si < section->sh_size / section->sh_entsize;
5709 printf ("%6d: ", si);
5710 print_vma (psym->st_value, LONG_HEX);
5712 print_vma (psym->st_size, DEC_5);
5713 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5714 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5715 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5716 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5717 print_symbol (25, strtab + psym->st_name);
5719 if (section->sh_type == SHT_DYNSYM &&
5720 version_info [DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5722 unsigned char data[2];
5723 unsigned short vers_data;
5724 unsigned long offset;
5728 offset = version_info [DT_VERSIONTAGIDX (DT_VERSYM)]
5731 get_data (&data, file, offset + si * sizeof (vers_data),
5732 sizeof (data), _("version data"));
5734 vers_data = byte_get (data, 2);
5736 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5739 check_def = (psym->st_shndx != SHN_UNDEF);
5741 if ((vers_data & 0x8000) || vers_data > 1)
5743 if (version_info [DT_VERSIONTAGIDX (DT_VERNEED)]
5744 && (is_nobits || ! check_def))
5746 Elf_External_Verneed evn;
5747 Elf_Internal_Verneed ivn;
5748 Elf_Internal_Vernaux ivna;
5750 /* We must test both. */
5751 offset = version_info
5752 [DT_VERSIONTAGIDX (DT_VERNEED)] - loadaddr;
5756 unsigned long vna_off;
5758 get_data (&evn, file, offset, sizeof (evn),
5761 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5762 ivn.vn_next = BYTE_GET (evn.vn_next);
5764 vna_off = offset + ivn.vn_aux;
5768 Elf_External_Vernaux evna;
5770 get_data (&evna, file, vna_off,
5772 _("version need aux (3)"));
5774 ivna.vna_other = BYTE_GET (evna.vna_other);
5775 ivna.vna_next = BYTE_GET (evna.vna_next);
5776 ivna.vna_name = BYTE_GET (evna.vna_name);
5778 vna_off += ivna.vna_next;
5780 while (ivna.vna_other != vers_data
5781 && ivna.vna_next != 0);
5783 if (ivna.vna_other == vers_data)
5786 offset += ivn.vn_next;
5788 while (ivn.vn_next != 0);
5790 if (ivna.vna_other == vers_data)
5793 strtab + ivna.vna_name, ivna.vna_other);
5796 else if (! is_nobits)
5797 error (_("bad dynamic symbol"));
5804 if (vers_data != 0x8001
5805 && version_info [DT_VERSIONTAGIDX (DT_VERDEF)])
5807 Elf_Internal_Verdef ivd;
5808 Elf_Internal_Verdaux ivda;
5809 Elf_External_Verdaux evda;
5810 unsigned long offset;
5813 version_info [DT_VERSIONTAGIDX (DT_VERDEF)]
5818 Elf_External_Verdef evd;
5820 get_data (&evd, file, offset, sizeof (evd),
5823 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5824 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5825 ivd.vd_next = BYTE_GET (evd.vd_next);
5827 offset += ivd.vd_next;
5829 while (ivd.vd_ndx != (vers_data & 0x7fff)
5830 && ivd.vd_next != 0);
5832 offset -= ivd.vd_next;
5833 offset += ivd.vd_aux;
5835 get_data (&evda, file, offset, sizeof (evda),
5836 _("version def aux"));
5838 ivda.vda_name = BYTE_GET (evda.vda_name);
5840 if (psym->st_name != ivda.vda_name)
5841 printf ((vers_data & 0x8000)
5843 strtab + ivda.vda_name);
5853 if (strtab != string_table)
5859 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5861 if (do_histogram && buckets != NULL)
5868 int nzero_counts = 0;
5871 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5873 printf (_(" Length Number %% of total Coverage\n"));
5875 lengths = (int *) calloc (nbuckets, sizeof (int));
5876 if (lengths == NULL)
5878 error (_("Out of memory"));
5881 for (hn = 0; hn < nbuckets; ++hn)
5886 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
5889 if (maxlength < ++lengths[hn])
5894 counts = (int *) calloc (maxlength + 1, sizeof (int));
5897 error (_("Out of memory"));
5901 for (hn = 0; hn < nbuckets; ++hn)
5902 ++ counts [lengths [hn]];
5906 printf (" 0 %-10d (%5.1f%%)\n",
5907 counts[0], (counts[0] * 100.0) / nbuckets);
5908 for (si = 1; si <= maxlength; ++si)
5910 nzero_counts += counts[si] * si;
5911 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
5912 si, counts[si], (counts[si] * 100.0) / nbuckets,
5913 (nzero_counts * 100.0) / nsyms);
5921 if (buckets != NULL)
5931 process_syminfo (file)
5932 FILE * file ATTRIBUTE_UNUSED;
5936 if (dynamic_syminfo == NULL
5938 /* No syminfo, this is ok. */
5941 /* There better should be a dynamic symbol section. */
5942 if (dynamic_symbols == NULL || dynamic_strings == NULL)
5946 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
5947 dynamic_syminfo_offset, dynamic_syminfo_nent);
5949 printf (_(" Num: Name BoundTo Flags\n"));
5950 for (i = 0; i < dynamic_syminfo_nent; ++i)
5952 unsigned short int flags = dynamic_syminfo[i].si_flags;
5954 printf ("%4d: ", i);
5955 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
5958 switch (dynamic_syminfo[i].si_boundto)
5960 case SYMINFO_BT_SELF:
5961 fputs ("SELF ", stdout);
5963 case SYMINFO_BT_PARENT:
5964 fputs ("PARENT ", stdout);
5967 if (dynamic_syminfo[i].si_boundto > 0
5968 && dynamic_syminfo[i].si_boundto < dynamic_size)
5970 print_symbol (10, dynamic_strings
5972 [dynamic_syminfo[i].si_boundto].d_un.d_val);
5976 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
5980 if (flags & SYMINFO_FLG_DIRECT)
5982 if (flags & SYMINFO_FLG_PASSTHRU)
5983 printf (" PASSTHRU");
5984 if (flags & SYMINFO_FLG_COPY)
5986 if (flags & SYMINFO_FLG_LAZYLOAD)
5987 printf (" LAZYLOAD");
5995 #ifdef SUPPORT_DISASSEMBLY
5997 disassemble_section (section, file)
5998 Elf32_Internal_Shdr * section;
6001 printf (_("\nAssembly dump of section %s\n"),
6002 SECTION_NAME (section));
6004 /* XXX -- to be done --- XXX */
6011 dump_section (section, file)
6012 Elf32_Internal_Shdr * section;
6015 bfd_size_type bytes;
6017 unsigned char * data;
6018 unsigned char * start;
6020 bytes = section->sh_size;
6024 printf (_("\nSection '%s' has no data to dump.\n"),
6025 SECTION_NAME (section));
6029 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6031 addr = section->sh_addr;
6033 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
6046 lbytes = (bytes > 16 ? 16 : bytes);
6048 printf (" 0x%8.8lx ", (unsigned long) addr);
6050 switch (elf_header.e_ident [EI_DATA])
6054 for (j = 15; j >= 0; j --)
6057 printf ("%2.2x", data [j]);
6067 for (j = 0; j < 16; j++)
6070 printf ("%2.2x", data [j]);
6080 for (j = 0; j < lbytes; j++)
6083 if (k >= ' ' && k < 0x80)
6102 static unsigned long int
6103 read_leb128 (data, length_return, sign)
6104 unsigned char * data;
6105 int * length_return;
6108 unsigned long int result = 0;
6109 unsigned int num_read = 0;
6118 result |= (byte & 0x7f) << shift;
6123 while (byte & 0x80);
6125 if (length_return != NULL)
6126 * length_return = num_read;
6128 if (sign && (shift < 32) && (byte & 0x40))
6129 result |= -1 << shift;
6134 typedef struct State_Machine_Registers
6136 unsigned long address;
6139 unsigned int column;
6143 /* This variable hold the number of the last entry seen
6144 in the File Table. */
6145 unsigned int last_file_entry;
6148 static SMR state_machine_regs;
6151 reset_state_machine (is_stmt)
6154 state_machine_regs.address = 0;
6155 state_machine_regs.file = 1;
6156 state_machine_regs.line = 1;
6157 state_machine_regs.column = 0;
6158 state_machine_regs.is_stmt = is_stmt;
6159 state_machine_regs.basic_block = 0;
6160 state_machine_regs.end_sequence = 0;
6161 state_machine_regs.last_file_entry = 0;
6164 /* Handled an extend line op. Returns true if this is the end
6167 process_extended_line_op (data, is_stmt, pointer_size)
6168 unsigned char * data;
6172 unsigned char op_code;
6175 unsigned char * name;
6178 len = read_leb128 (data, & bytes_read, 0);
6183 warn (_("badly formed extended line op encountered!\n"));
6188 op_code = * data ++;
6190 printf (_(" Extended opcode %d: "), op_code);
6194 case DW_LNE_end_sequence:
6195 printf (_("End of Sequence\n\n"));
6196 reset_state_machine (is_stmt);
6199 case DW_LNE_set_address:
6200 adr = byte_get (data, pointer_size);
6201 printf (_("set Address to 0x%lx\n"), adr);
6202 state_machine_regs.address = adr;
6205 case DW_LNE_define_file:
6206 printf (_(" define new File Table entry\n"));
6207 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6209 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6211 data += strlen ((char *) data) + 1;
6212 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6214 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6216 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6217 printf (_("%s\n\n"), name);
6221 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6228 /* Size of pointers in the .debug_line section. This information is not
6229 really present in that section. It's obtained before dumping the debug
6230 sections by doing some pre-scan of the .debug_info section. */
6231 static int debug_line_pointer_size = 4;
6234 display_debug_lines (section, start, file)
6235 Elf32_Internal_Shdr * section;
6236 unsigned char * start;
6237 FILE * file ATTRIBUTE_UNUSED;
6239 DWARF2_External_LineInfo * external;
6240 DWARF2_Internal_LineInfo info;
6241 unsigned char * standard_opcodes;
6242 unsigned char * data = start;
6243 unsigned char * end = start + section->sh_size;
6244 unsigned char * end_of_sequence;
6247 printf (_("\nDump of debug contents of section %s:\n\n"),
6248 SECTION_NAME (section));
6252 external = (DWARF2_External_LineInfo *) data;
6254 /* Check the length of the block. */
6255 info.li_length = BYTE_GET (external->li_length);
6257 if (info.li_length == 0xffffffff)
6259 warn (_("64-bit DWARF line info is not supported yet.\n"));
6263 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6266 (_("The line info appears to be corrupt - the section is too small\n"));
6270 /* Check its version number. */
6271 info.li_version = BYTE_GET (external->li_version);
6272 if (info.li_version != 2)
6274 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6278 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6279 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6280 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6281 info.li_line_base = BYTE_GET (external->li_line_base);
6282 info.li_line_range = BYTE_GET (external->li_line_range);
6283 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6285 /* Sign extend the line base field. */
6286 info.li_line_base <<= 24;
6287 info.li_line_base >>= 24;
6289 printf (_(" Length: %ld\n"), info.li_length);
6290 printf (_(" DWARF Version: %d\n"), info.li_version);
6291 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6292 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6293 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6294 printf (_(" Line Base: %d\n"), info.li_line_base);
6295 printf (_(" Line Range: %d\n"), info.li_line_range);
6296 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6298 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6300 reset_state_machine (info.li_default_is_stmt);
6302 /* Display the contents of the Opcodes table. */
6303 standard_opcodes = data + sizeof (* external);
6305 printf (_("\n Opcodes:\n"));
6307 for (i = 1; i < info.li_opcode_base; i++)
6308 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6310 /* Display the contents of the Directory table. */
6311 data = standard_opcodes + info.li_opcode_base - 1;
6314 printf (_("\n The Directory Table is empty.\n"));
6317 printf (_("\n The Directory Table:\n"));
6321 printf (_(" %s\n"), data);
6323 data += strlen ((char *) data) + 1;
6327 /* Skip the NUL at the end of the table. */
6330 /* Display the contents of the File Name table. */
6332 printf (_("\n The File Name Table is empty.\n"));
6335 printf (_("\n The File Name Table:\n"));
6336 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6340 unsigned char * name;
6343 printf (_(" %d\t"), ++ state_machine_regs.last_file_entry);
6346 data += strlen ((char *) data) + 1;
6348 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6350 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6352 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6354 printf (_("%s\n"), name);
6358 /* Skip the NUL at the end of the table. */
6361 /* Now display the statements. */
6362 printf (_("\n Line Number Statements:\n"));
6365 while (data < end_of_sequence)
6367 unsigned char op_code;
6371 op_code = * data ++;
6373 if (op_code >= info.li_opcode_base)
6375 op_code -= info.li_opcode_base;
6376 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6377 state_machine_regs.address += adv;
6378 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6379 op_code, adv, state_machine_regs.address);
6380 adv = (op_code % info.li_line_range) + info.li_line_base;
6381 state_machine_regs.line += adv;
6382 printf (_(" and Line by %d to %d\n"),
6383 adv, state_machine_regs.line);
6385 else switch (op_code)
6387 case DW_LNS_extended_op:
6388 data += process_extended_line_op (data, info.li_default_is_stmt,
6389 debug_line_pointer_size);
6393 printf (_(" Copy\n"));
6396 case DW_LNS_advance_pc:
6397 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6399 state_machine_regs.address += adv;
6400 printf (_(" Advance PC by %d to %lx\n"), adv,
6401 state_machine_regs.address);
6404 case DW_LNS_advance_line:
6405 adv = read_leb128 (data, & bytes_read, 1);
6407 state_machine_regs.line += adv;
6408 printf (_(" Advance Line by %d to %d\n"), adv,
6409 state_machine_regs.line);
6412 case DW_LNS_set_file:
6413 adv = read_leb128 (data, & bytes_read, 0);
6415 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6417 state_machine_regs.file = adv;
6420 case DW_LNS_set_column:
6421 adv = read_leb128 (data, & bytes_read, 0);
6423 printf (_(" Set column to %d\n"), adv);
6424 state_machine_regs.column = adv;
6427 case DW_LNS_negate_stmt:
6428 adv = state_machine_regs.is_stmt;
6430 printf (_(" Set is_stmt to %d\n"), adv);
6431 state_machine_regs.is_stmt = adv;
6434 case DW_LNS_set_basic_block:
6435 printf (_(" Set basic block\n"));
6436 state_machine_regs.basic_block = 1;
6439 case DW_LNS_const_add_pc:
6440 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6441 * info.li_min_insn_length);
6442 state_machine_regs.address += adv;
6443 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6444 state_machine_regs.address);
6447 case DW_LNS_fixed_advance_pc:
6448 adv = byte_get (data, 2);
6450 state_machine_regs.address += adv;
6451 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6452 adv, state_machine_regs.address);
6455 case DW_LNS_set_prologue_end:
6456 printf (_(" Set prologue_end to true\n"));
6459 case DW_LNS_set_epilogue_begin:
6460 printf (_(" Set epilogue_begin to true\n"));
6463 case DW_LNS_set_isa:
6464 adv = read_leb128 (data, & bytes_read, 0);
6466 printf (_(" Set ISA to %d\n"), adv);
6470 printf (_(" Unknown opcode %d with operands: "), op_code);
6473 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6475 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6476 i == 1 ? "" : ", ");
6491 display_debug_pubnames (section, start, file)
6492 Elf32_Internal_Shdr * section;
6493 unsigned char * start;
6494 FILE * file ATTRIBUTE_UNUSED;
6496 DWARF2_External_PubNames * external;
6497 DWARF2_Internal_PubNames pubnames;
6498 unsigned char * end;
6500 end = start + section->sh_size;
6502 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6506 unsigned char * data;
6507 unsigned long offset;
6509 external = (DWARF2_External_PubNames *) start;
6511 pubnames.pn_length = BYTE_GET (external->pn_length);
6512 pubnames.pn_version = BYTE_GET (external->pn_version);
6513 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6514 pubnames.pn_size = BYTE_GET (external->pn_size);
6516 data = start + sizeof (* external);
6517 start += pubnames.pn_length + sizeof (external->pn_length);
6519 if (pubnames.pn_length == 0xffffffff)
6521 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6525 if (pubnames.pn_version != 2)
6527 static int warned = 0;
6531 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6538 printf (_(" Length: %ld\n"),
6539 pubnames.pn_length);
6540 printf (_(" Version: %d\n"),
6541 pubnames.pn_version);
6542 printf (_(" Offset into .debug_info section: %ld\n"),
6543 pubnames.pn_offset);
6544 printf (_(" Size of area in .debug_info section: %ld\n"),
6547 printf (_("\n Offset\tName\n"));
6551 offset = byte_get (data, 4);
6556 printf (" %ld\t\t%s\n", offset, data);
6557 data += strlen ((char *) data) + 1;
6560 while (offset != 0);
6573 case DW_TAG_padding: return "DW_TAG_padding";
6574 case DW_TAG_array_type: return "DW_TAG_array_type";
6575 case DW_TAG_class_type: return "DW_TAG_class_type";
6576 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6577 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6578 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6579 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6580 case DW_TAG_label: return "DW_TAG_label";
6581 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6582 case DW_TAG_member: return "DW_TAG_member";
6583 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6584 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6585 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6586 case DW_TAG_string_type: return "DW_TAG_string_type";
6587 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6588 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6589 case DW_TAG_typedef: return "DW_TAG_typedef";
6590 case DW_TAG_union_type: return "DW_TAG_union_type";
6591 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6592 case DW_TAG_variant: return "DW_TAG_variant";
6593 case DW_TAG_common_block: return "DW_TAG_common_block";
6594 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6595 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6596 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6597 case DW_TAG_module: return "DW_TAG_module";
6598 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6599 case DW_TAG_set_type: return "DW_TAG_set_type";
6600 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6601 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6602 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6603 case DW_TAG_base_type: return "DW_TAG_base_type";
6604 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6605 case DW_TAG_const_type: return "DW_TAG_const_type";
6606 case DW_TAG_constant: return "DW_TAG_constant";
6607 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6608 case DW_TAG_file_type: return "DW_TAG_file_type";
6609 case DW_TAG_friend: return "DW_TAG_friend";
6610 case DW_TAG_namelist: return "DW_TAG_namelist";
6611 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6612 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6613 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6614 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6615 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6616 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6617 case DW_TAG_try_block: return "DW_TAG_try_block";
6618 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6619 case DW_TAG_variable: return "DW_TAG_variable";
6620 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6621 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6622 case DW_TAG_format_label: return "DW_TAG_format_label";
6623 case DW_TAG_function_template: return "DW_TAG_function_template";
6624 case DW_TAG_class_template: return "DW_TAG_class_template";
6625 /* DWARF 2.1 values. */
6626 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6627 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6628 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6629 case DW_TAG_namespace: return "DW_TAG_namespace";
6630 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6631 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6632 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6633 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6636 static char buffer [100];
6638 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6645 get_AT_name (attribute)
6646 unsigned long attribute;
6650 case DW_AT_sibling: return "DW_AT_sibling";
6651 case DW_AT_location: return "DW_AT_location";
6652 case DW_AT_name: return "DW_AT_name";
6653 case DW_AT_ordering: return "DW_AT_ordering";
6654 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6655 case DW_AT_byte_size: return "DW_AT_byte_size";
6656 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6657 case DW_AT_bit_size: return "DW_AT_bit_size";
6658 case DW_AT_element_list: return "DW_AT_element_list";
6659 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6660 case DW_AT_low_pc: return "DW_AT_low_pc";
6661 case DW_AT_high_pc: return "DW_AT_high_pc";
6662 case DW_AT_language: return "DW_AT_language";
6663 case DW_AT_member: return "DW_AT_member";
6664 case DW_AT_discr: return "DW_AT_discr";
6665 case DW_AT_discr_value: return "DW_AT_discr_value";
6666 case DW_AT_visibility: return "DW_AT_visibility";
6667 case DW_AT_import: return "DW_AT_import";
6668 case DW_AT_string_length: return "DW_AT_string_length";
6669 case DW_AT_common_reference: return "DW_AT_common_reference";
6670 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6671 case DW_AT_const_value: return "DW_AT_const_value";
6672 case DW_AT_containing_type: return "DW_AT_containing_type";
6673 case DW_AT_default_value: return "DW_AT_default_value";
6674 case DW_AT_inline: return "DW_AT_inline";
6675 case DW_AT_is_optional: return "DW_AT_is_optional";
6676 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6677 case DW_AT_producer: return "DW_AT_producer";
6678 case DW_AT_prototyped: return "DW_AT_prototyped";
6679 case DW_AT_return_addr: return "DW_AT_return_addr";
6680 case DW_AT_start_scope: return "DW_AT_start_scope";
6681 case DW_AT_stride_size: return "DW_AT_stride_size";
6682 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6683 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6684 case DW_AT_accessibility: return "DW_AT_accessibility";
6685 case DW_AT_address_class: return "DW_AT_address_class";
6686 case DW_AT_artificial: return "DW_AT_artificial";
6687 case DW_AT_base_types: return "DW_AT_base_types";
6688 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6689 case DW_AT_count: return "DW_AT_count";
6690 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6691 case DW_AT_decl_column: return "DW_AT_decl_column";
6692 case DW_AT_decl_file: return "DW_AT_decl_file";
6693 case DW_AT_decl_line: return "DW_AT_decl_line";
6694 case DW_AT_declaration: return "DW_AT_declaration";
6695 case DW_AT_discr_list: return "DW_AT_discr_list";
6696 case DW_AT_encoding: return "DW_AT_encoding";
6697 case DW_AT_external: return "DW_AT_external";
6698 case DW_AT_frame_base: return "DW_AT_frame_base";
6699 case DW_AT_friend: return "DW_AT_friend";
6700 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6701 case DW_AT_macro_info: return "DW_AT_macro_info";
6702 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6703 case DW_AT_priority: return "DW_AT_priority";
6704 case DW_AT_segment: return "DW_AT_segment";
6705 case DW_AT_specification: return "DW_AT_specification";
6706 case DW_AT_static_link: return "DW_AT_static_link";
6707 case DW_AT_type: return "DW_AT_type";
6708 case DW_AT_use_location: return "DW_AT_use_location";
6709 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6710 case DW_AT_virtuality: return "DW_AT_virtuality";
6711 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6712 /* DWARF 2.1 values. */
6713 case DW_AT_allocated: return "DW_AT_allocated";
6714 case DW_AT_associated: return "DW_AT_associated";
6715 case DW_AT_data_location: return "DW_AT_data_location";
6716 case DW_AT_stride: return "DW_AT_stride";
6717 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6718 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6719 case DW_AT_extension: return "DW_AT_extension";
6720 case DW_AT_ranges: return "DW_AT_ranges";
6721 case DW_AT_trampoline: return "DW_AT_trampoline";
6722 case DW_AT_call_column: return "DW_AT_call_column";
6723 case DW_AT_call_file: return "DW_AT_call_file";
6724 case DW_AT_call_line: return "DW_AT_call_line";
6725 /* SGI/MIPS extensions. */
6726 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6727 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6728 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6729 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6730 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6731 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
6732 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6733 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6734 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6735 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6736 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6737 /* GNU extensions. */
6738 case DW_AT_sf_names: return "DW_AT_sf_names";
6739 case DW_AT_src_info: return "DW_AT_src_info";
6740 case DW_AT_mac_info: return "DW_AT_mac_info";
6741 case DW_AT_src_coords: return "DW_AT_src_coords";
6742 case DW_AT_body_begin: return "DW_AT_body_begin";
6743 case DW_AT_body_end: return "DW_AT_body_end";
6744 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6747 static char buffer [100];
6749 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6756 get_FORM_name (form)
6761 case DW_FORM_addr: return "DW_FORM_addr";
6762 case DW_FORM_block2: return "DW_FORM_block2";
6763 case DW_FORM_block4: return "DW_FORM_block4";
6764 case DW_FORM_data2: return "DW_FORM_data2";
6765 case DW_FORM_data4: return "DW_FORM_data4";
6766 case DW_FORM_data8: return "DW_FORM_data8";
6767 case DW_FORM_string: return "DW_FORM_string";
6768 case DW_FORM_block: return "DW_FORM_block";
6769 case DW_FORM_block1: return "DW_FORM_block1";
6770 case DW_FORM_data1: return "DW_FORM_data1";
6771 case DW_FORM_flag: return "DW_FORM_flag";
6772 case DW_FORM_sdata: return "DW_FORM_sdata";
6773 case DW_FORM_strp: return "DW_FORM_strp";
6774 case DW_FORM_udata: return "DW_FORM_udata";
6775 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6776 case DW_FORM_ref1: return "DW_FORM_ref1";
6777 case DW_FORM_ref2: return "DW_FORM_ref2";
6778 case DW_FORM_ref4: return "DW_FORM_ref4";
6779 case DW_FORM_ref8: return "DW_FORM_ref8";
6780 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6781 case DW_FORM_indirect: return "DW_FORM_indirect";
6784 static char buffer [100];
6786 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6792 /* FIXME: There are better and more effiecint ways to handle
6793 these structures. For now though, I just want something that
6794 is simple to implement. */
6795 typedef struct abbrev_attr
6797 unsigned long attribute;
6799 struct abbrev_attr * next;
6803 typedef struct abbrev_entry
6805 unsigned long entry;
6808 struct abbrev_attr * first_attr;
6809 struct abbrev_attr * last_attr;
6810 struct abbrev_entry * next;
6814 static abbrev_entry * first_abbrev = NULL;
6815 static abbrev_entry * last_abbrev = NULL;
6818 free_abbrevs PARAMS ((void))
6820 abbrev_entry * abbrev;
6822 for (abbrev = first_abbrev; abbrev;)
6824 abbrev_entry * next = abbrev->next;
6827 for (attr = abbrev->first_attr; attr;)
6829 abbrev_attr * next = attr->next;
6839 last_abbrev = first_abbrev = NULL;
6843 add_abbrev (number, tag, children)
6844 unsigned long number;
6848 abbrev_entry * entry;
6850 entry = (abbrev_entry *) malloc (sizeof (* entry));
6856 entry->entry = number;
6858 entry->children = children;
6859 entry->first_attr = NULL;
6860 entry->last_attr = NULL;
6863 if (first_abbrev == NULL)
6864 first_abbrev = entry;
6866 last_abbrev->next = entry;
6868 last_abbrev = entry;
6872 add_abbrev_attr (attribute, form)
6873 unsigned long attribute;
6878 attr = (abbrev_attr *) malloc (sizeof (* attr));
6884 attr->attribute = attribute;
6888 if (last_abbrev->first_attr == NULL)
6889 last_abbrev->first_attr = attr;
6891 last_abbrev->last_attr->next = attr;
6893 last_abbrev->last_attr = attr;
6896 /* Processes the (partial) contents of a .debug_abbrev section.
6897 Returns NULL if the end of the section was encountered.
6898 Returns the address after the last byte read if the end of
6899 an abbreviation set was found. */
6901 static unsigned char *
6902 process_abbrev_section (start, end)
6903 unsigned char * start;
6904 unsigned char * end;
6906 if (first_abbrev != NULL)
6912 unsigned long entry;
6914 unsigned long attribute;
6917 entry = read_leb128 (start, & bytes_read, 0);
6918 start += bytes_read;
6920 /* A single zero is supposed to end the section according
6921 to the standard. If there's more, then signal that to
6924 return start == end ? NULL : start;
6926 tag = read_leb128 (start, & bytes_read, 0);
6927 start += bytes_read;
6929 children = * start ++;
6931 add_abbrev (entry, tag, children);
6937 attribute = read_leb128 (start, & bytes_read, 0);
6938 start += bytes_read;
6940 form = read_leb128 (start, & bytes_read, 0);
6941 start += bytes_read;
6944 add_abbrev_attr (attribute, form);
6946 while (attribute != 0);
6954 display_debug_macinfo (section, start, file)
6955 Elf32_Internal_Shdr * section;
6956 unsigned char * start;
6957 FILE * file ATTRIBUTE_UNUSED;
6959 unsigned char * end = start + section->sh_size;
6960 unsigned char * curr = start;
6961 unsigned int bytes_read;
6962 enum dwarf_macinfo_record_type op;
6964 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6968 unsigned int lineno;
6969 const char * string;
6976 case DW_MACINFO_start_file:
6978 unsigned int filenum;
6980 lineno = read_leb128 (curr, & bytes_read, 0);
6982 filenum = read_leb128 (curr, & bytes_read, 0);
6985 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
6989 case DW_MACINFO_end_file:
6990 printf (_(" DW_MACINFO_end_file\n"));
6993 case DW_MACINFO_define:
6994 lineno = read_leb128 (curr, & bytes_read, 0);
6997 curr += strlen (string) + 1;
6998 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7001 case DW_MACINFO_undef:
7002 lineno = read_leb128 (curr, & bytes_read, 0);
7005 curr += strlen (string) + 1;
7006 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7009 case DW_MACINFO_vendor_ext:
7011 unsigned int constant;
7013 constant = read_leb128 (curr, & bytes_read, 0);
7016 curr += strlen (string) + 1;
7017 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7028 display_debug_abbrev (section, start, file)
7029 Elf32_Internal_Shdr * section;
7030 unsigned char * start;
7031 FILE * file ATTRIBUTE_UNUSED;
7033 abbrev_entry * entry;
7034 unsigned char * end = start + section->sh_size;
7036 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7040 start = process_abbrev_section (start, end);
7042 if (first_abbrev == NULL)
7045 printf (_(" Number TAG\n"));
7047 for (entry = first_abbrev; entry; entry = entry->next)
7051 printf (_(" %ld %s [%s]\n"),
7053 get_TAG_name (entry->tag),
7054 entry->children ? _("has children") : _("no children"));
7056 for (attr = entry->first_attr; attr; attr = attr->next)
7058 printf (_(" %-18s %s\n"),
7059 get_AT_name (attr->attribute),
7060 get_FORM_name (attr->form));
7074 static unsigned char *
7075 display_block (data, length)
7076 unsigned char * data;
7077 unsigned long length;
7079 printf (_(" %lu byte block: "), length);
7082 printf ("%lx ", (unsigned long) byte_get (data ++, 1));
7088 decode_location_expression (data, pointer_size, length)
7089 unsigned char * data;
7090 unsigned int pointer_size;
7091 unsigned long length;
7095 unsigned long uvalue;
7096 unsigned char * end = data + length;
7105 printf ("DW_OP_addr: %lx",
7106 (unsigned long) byte_get (data, pointer_size));
7107 data += pointer_size;
7110 printf ("DW_OP_deref");
7113 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7116 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7119 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7123 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7127 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7131 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7135 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7136 (unsigned long) byte_get (data + 4, 4));
7140 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7141 (long) byte_get (data + 4, 4));
7145 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7149 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7153 printf ("DW_OP_dup");
7156 printf ("DW_OP_drop");
7159 printf ("DW_OP_over");
7162 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7165 printf ("DW_OP_swap");
7168 printf ("DW_OP_rot");
7171 printf ("DW_OP_xderef");
7174 printf ("DW_OP_abs");
7177 printf ("DW_OP_and");
7180 printf ("DW_OP_div");
7183 printf ("DW_OP_minus");
7186 printf ("DW_OP_mod");
7189 printf ("DW_OP_mul");
7192 printf ("DW_OP_neg");
7195 printf ("DW_OP_not");
7198 printf ("DW_OP_or");
7201 printf ("DW_OP_plus");
7203 case DW_OP_plus_uconst:
7204 printf ("DW_OP_plus_uconst: %lu",
7205 read_leb128 (data, &bytes_read, 0));
7209 printf ("DW_OP_shl");
7212 printf ("DW_OP_shr");
7215 printf ("DW_OP_shra");
7218 printf ("DW_OP_xor");
7221 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7225 printf ("DW_OP_eq");
7228 printf ("DW_OP_ge");
7231 printf ("DW_OP_gt");
7234 printf ("DW_OP_le");
7237 printf ("DW_OP_lt");
7240 printf ("DW_OP_ne");
7243 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7279 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7314 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7349 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7350 read_leb128 (data, &bytes_read, 1));
7355 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7359 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7363 uvalue = read_leb128 (data, &bytes_read, 0);
7365 printf ("DW_OP_bregx: %lu %ld", uvalue,
7366 read_leb128 (data, &bytes_read, 1));
7370 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7373 case DW_OP_deref_size:
7374 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7376 case DW_OP_xderef_size:
7377 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7380 printf ("DW_OP_nop");
7383 /* DWARF 3 extensions. */
7384 case DW_OP_push_object_address:
7385 printf ("DW_OP_push_object_address");
7388 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7392 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7395 case DW_OP_call_ref:
7396 printf ("DW_OP_call_ref");
7399 /* GNU extensions. */
7400 case DW_OP_GNU_push_tls_address:
7401 printf ("DW_OP_GNU_push_tls_address");
7405 if (op >= DW_OP_lo_user
7406 && op <= DW_OP_hi_user)
7407 printf (_("(User defined location op)"));
7409 printf (_("(Unknown location op)"));
7410 /* No way to tell where the next op is, so just bail. */
7414 /* Separate the ops. */
7419 static const char * debug_loc_contents;
7420 static bfd_vma debug_loc_size;
7423 load_debug_loc (file)
7426 Elf32_Internal_Shdr * sec;
7429 /* If it is already loaded, do nothing. */
7430 if (debug_loc_contents != NULL)
7433 /* Locate the .debug_loc section. */
7434 for (i = 0, sec = section_headers;
7435 i < elf_header.e_shnum;
7437 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7440 if (i == elf_header.e_shnum || sec->sh_size == 0)
7443 debug_loc_size = sec->sh_size;
7445 debug_loc_contents = ((char *)
7446 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7447 _("debug_loc section data")));
7453 if (debug_loc_contents == NULL)
7456 free ((char *) debug_loc_contents);
7457 debug_loc_contents = NULL;
7463 display_debug_loc (section, start, file)
7464 Elf32_Internal_Shdr * section;
7465 unsigned char * start;
7466 FILE * file ATTRIBUTE_UNUSED;
7468 unsigned char *section_end;
7469 unsigned long bytes;
7470 unsigned char *section_begin = start;
7473 addr = section->sh_addr;
7474 bytes = section->sh_size;
7475 section_end = start + bytes;
7479 printf (_("\nThe .debug_loc section is empty.\n"));
7483 printf (_("Contents of the .debug_loc section:\n\n"));
7484 printf (_("\n Offset Begin End Expression\n"));
7486 while (start < section_end)
7488 unsigned long begin;
7490 unsigned short length;
7491 unsigned long offset;
7493 offset = start - section_begin;
7497 /* Normally, the lists in the debug_loc section are related to a
7498 given compilation unit, and thus, we would use the
7499 pointer size of that compilation unit. However, since we are
7500 displaying it seperately here, we either have to store
7501 pointer sizes of all compilation units, or assume they don't
7502 change. We assume, like the debug_line display, that
7503 it doesn't change. */
7504 begin = byte_get (start, debug_line_pointer_size);
7505 start += debug_line_pointer_size;
7506 end = byte_get (start, debug_line_pointer_size);
7507 start += debug_line_pointer_size;
7509 if (begin == 0 && end == 0)
7515 length = byte_get (start, 2);
7518 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7519 decode_location_expression (start, debug_line_pointer_size, length);
7529 static const char * debug_str_contents;
7530 static bfd_vma debug_str_size;
7533 load_debug_str (file)
7536 Elf32_Internal_Shdr * sec;
7539 /* If it is already loaded, do nothing. */
7540 if (debug_str_contents != NULL)
7543 /* Locate the .debug_str section. */
7544 for (i = 0, sec = section_headers;
7545 i < elf_header.e_shnum;
7547 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7550 if (i == elf_header.e_shnum || sec->sh_size == 0)
7553 debug_str_size = sec->sh_size;
7555 debug_str_contents = ((char *)
7556 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7557 _("debug_str section data")));
7563 if (debug_str_contents == NULL)
7566 free ((char *) debug_str_contents);
7567 debug_str_contents = NULL;
7572 fetch_indirect_string (offset)
7573 unsigned long offset;
7575 if (debug_str_contents == NULL)
7576 return _("<no .debug_str section>");
7578 if (offset > debug_str_size)
7579 return _("<offset is too big>");
7581 return debug_str_contents + offset;
7585 display_debug_str (section, start, file)
7586 Elf32_Internal_Shdr * section;
7587 unsigned char * start;
7588 FILE * file ATTRIBUTE_UNUSED;
7590 unsigned long bytes;
7593 addr = section->sh_addr;
7594 bytes = section->sh_size;
7598 printf (_("\nThe .debug_str section is empty.\n"));
7602 printf (_("Contents of the .debug_str section:\n\n"));
7610 lbytes = (bytes > 16 ? 16 : bytes);
7612 printf (" 0x%8.8lx ", (unsigned long) addr);
7614 for (j = 0; j < 16; j++)
7617 printf ("%2.2x", start [j]);
7625 for (j = 0; j < lbytes; j++)
7628 if (k >= ' ' && k < 0x80)
7644 static unsigned char *
7645 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7646 unsigned long attribute;
7648 unsigned char * data;
7649 unsigned long cu_offset;
7650 unsigned long pointer_size;
7652 unsigned long uvalue = 0;
7653 unsigned char * block_start = NULL;
7661 case DW_FORM_ref_addr:
7663 uvalue = byte_get (data, pointer_size);
7664 data += pointer_size;
7668 uvalue = byte_get (data, /* offset_size */ 4);
7669 data += /* offset_size */ 4;
7675 uvalue = byte_get (data ++, 1);
7680 uvalue = byte_get (data, 2);
7686 uvalue = byte_get (data, 4);
7691 uvalue = read_leb128 (data, & bytes_read, 1);
7695 case DW_FORM_ref_udata:
7697 uvalue = read_leb128 (data, & bytes_read, 0);
7701 case DW_FORM_indirect:
7702 form = read_leb128 (data, & bytes_read, 0);
7704 printf (" %s", get_FORM_name (form));
7705 return read_and_display_attr_value (attribute, form, data, cu_offset,
7711 case DW_FORM_ref_addr:
7712 printf (" <#%lx>", uvalue);
7718 case DW_FORM_ref_udata:
7719 printf (" <%lx>", uvalue + cu_offset);
7723 printf (" %#lx", uvalue);
7731 printf (" %ld", uvalue);
7736 uvalue = byte_get (data, 4);
7737 printf (" %lx", uvalue);
7738 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7742 case DW_FORM_string:
7743 printf (" %s", data);
7744 data += strlen ((char *) data) + 1;
7748 uvalue = read_leb128 (data, & bytes_read, 0);
7749 block_start = data + bytes_read;
7750 data = display_block (block_start, uvalue);
7753 case DW_FORM_block1:
7754 uvalue = byte_get (data, 1);
7755 block_start = data + 1;
7756 data = display_block (block_start, uvalue);
7759 case DW_FORM_block2:
7760 uvalue = byte_get (data, 2);
7761 block_start = data + 2;
7762 data = display_block (block_start, uvalue);
7765 case DW_FORM_block4:
7766 uvalue = byte_get (data, 4);
7767 block_start = data + 4;
7768 data = display_block (block_start, uvalue);
7772 printf (_(" (indirect string, offset: 0x%lx): %s"),
7773 uvalue, fetch_indirect_string (uvalue));
7776 case DW_FORM_indirect:
7777 /* Handled above. */
7781 warn (_("Unrecognized form: %d\n"), form);
7785 /* For some attributes we can display futher information. */
7794 case DW_INL_not_inlined: printf (_("(not inlined)")); break;
7795 case DW_INL_inlined: printf (_("(inlined)")); break;
7796 case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break;
7797 case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break;
7798 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue); break;
7802 case DW_AT_language:
7805 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7806 case DW_LANG_C89: printf ("(ANSI C)"); break;
7807 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7808 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7809 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7810 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7811 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7812 case DW_LANG_Ada83: printf ("(Ada)"); break;
7813 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7814 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7815 /* DWARF 2.1 values. */
7816 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7817 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7818 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7819 /* MIPS extension. */
7820 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7821 default: printf ("(Unknown: %lx)", uvalue); break;
7825 case DW_AT_encoding:
7828 case DW_ATE_void: printf ("(void)"); break;
7829 case DW_ATE_address: printf ("(machine address)"); break;
7830 case DW_ATE_boolean: printf ("(boolean)"); break;
7831 case DW_ATE_complex_float: printf ("(complex float)"); break;
7832 case DW_ATE_float: printf ("(float)"); break;
7833 case DW_ATE_signed: printf ("(signed)"); break;
7834 case DW_ATE_signed_char: printf ("(signed char)"); break;
7835 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7836 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7837 /* DWARF 2.1 value. */
7838 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7840 if (uvalue >= DW_ATE_lo_user
7841 && uvalue <= DW_ATE_hi_user)
7842 printf ("(user defined type)");
7844 printf ("(unknown type)");
7849 case DW_AT_accessibility:
7852 case DW_ACCESS_public: printf ("(public)"); break;
7853 case DW_ACCESS_protected: printf ("(protected)"); break;
7854 case DW_ACCESS_private: printf ("(private)"); break;
7855 default: printf ("(unknown accessibility)"); break;
7859 case DW_AT_visibility:
7862 case DW_VIS_local: printf ("(local)"); break;
7863 case DW_VIS_exported: printf ("(exported)"); break;
7864 case DW_VIS_qualified: printf ("(qualified)"); break;
7865 default: printf ("(unknown visibility)"); break;
7869 case DW_AT_virtuality:
7872 case DW_VIRTUALITY_none: printf ("(none)"); break;
7873 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
7874 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
7875 default: printf ("(unknown virtuality)"); break;
7879 case DW_AT_identifier_case:
7882 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
7883 case DW_ID_up_case: printf ("(up_case)"); break;
7884 case DW_ID_down_case: printf ("(down_case)"); break;
7885 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
7886 default: printf ("(unknown case)"); break;
7890 case DW_AT_calling_convention:
7893 case DW_CC_normal: printf ("(normal)"); break;
7894 case DW_CC_program: printf ("(program)"); break;
7895 case DW_CC_nocall: printf ("(nocall)"); break;
7897 if (uvalue >= DW_CC_lo_user
7898 && uvalue <= DW_CC_hi_user)
7899 printf ("(user defined)");
7901 printf ("(unknown convention)");
7905 case DW_AT_ordering:
7908 case -1: printf ("(undefined)"); break;
7909 case 0: printf ("(row major)"); break;
7910 case 1: printf ("(column major)"); break;
7914 case DW_AT_frame_base:
7915 case DW_AT_location:
7916 case DW_AT_data_member_location:
7917 case DW_AT_vtable_elem_location:
7918 case DW_AT_allocated:
7919 case DW_AT_associated:
7920 case DW_AT_data_location:
7922 case DW_AT_upper_bound:
7923 case DW_AT_lower_bound:
7927 decode_location_expression (block_start, pointer_size, uvalue);
7930 else if (form == DW_FORM_data4)
7933 printf ("location list");
7945 static unsigned char *
7946 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
7947 unsigned long attribute;
7949 unsigned char * data;
7950 unsigned long cu_offset;
7951 unsigned long pointer_size;
7953 printf (" %-18s:", get_AT_name (attribute));
7954 data = read_and_display_attr_value (attribute, form, data, cu_offset,
7961 display_debug_info (section, start, file)
7962 Elf32_Internal_Shdr * section;
7963 unsigned char * start;
7966 unsigned char * end = start + section->sh_size;
7967 unsigned char * section_begin = start;
7969 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
7971 load_debug_str (file);
7972 load_debug_loc (file);
7976 DWARF2_External_CompUnit * external;
7977 DWARF2_Internal_CompUnit compunit;
7978 Elf32_Internal_Shdr * relsec;
7979 unsigned char * tags;
7982 unsigned long cu_offset;
7984 external = (DWARF2_External_CompUnit *) start;
7986 compunit.cu_length = BYTE_GET (external->cu_length);
7987 compunit.cu_version = BYTE_GET (external->cu_version);
7988 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
7989 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
7991 if (compunit.cu_length == 0xffffffff)
7993 warn (_("64-bit DWARF debug info is not supported yet.\n"));
7997 /* Check for RELA relocations in the
7998 abbrev_offset address, and apply them. */
7999 for (relsec = section_headers;
8000 relsec < section_headers + elf_header.e_shnum;
8003 unsigned long nrelas;
8004 Elf_Internal_Rela *rela, *rp;
8005 Elf32_Internal_Shdr *symsec;
8006 Elf_Internal_Sym *symtab;
8007 Elf_Internal_Sym *sym;
8009 if (relsec->sh_type != SHT_RELA
8010 || SECTION_HEADER (relsec->sh_info) != section
8011 || relsec->sh_size == 0)
8014 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8018 symsec = SECTION_HEADER (relsec->sh_link);
8019 symtab = GET_ELF_SYMBOLS (file, symsec);
8021 for (rp = rela; rp < rela + nrelas; ++rp)
8024 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
8030 sym = symtab + ELF32_R_SYM (rp->r_info);
8032 if (ELF32_R_SYM (rp->r_info) != 0
8033 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8035 warn (_("Skipping unexpected symbol type %u\n"),
8036 ELF32_ST_TYPE (sym->st_info));
8042 sym = symtab + ELF64_R_SYM (rp->r_info);
8044 if (ELF64_R_SYM (rp->r_info) != 0
8045 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8047 warn (_("Skipping unexpected symbol type %u\n"),
8048 ELF64_ST_TYPE (sym->st_info));
8053 compunit.cu_abbrev_offset = rp->r_addend;
8061 tags = start + sizeof (* external);
8062 cu_offset = start - section_begin;
8063 start += compunit.cu_length + sizeof (external->cu_length);
8065 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8066 printf (_(" Length: %ld\n"), compunit.cu_length);
8067 printf (_(" Version: %d\n"), compunit.cu_version);
8068 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8069 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8071 if (compunit.cu_version != 2)
8073 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8079 /* Read in the abbrevs used by this compilation unit. */
8081 Elf32_Internal_Shdr * sec;
8082 unsigned char * begin;
8084 /* Locate the .debug_abbrev section and process it. */
8085 for (i = 0, sec = section_headers;
8086 i < elf_header.e_shnum;
8088 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
8091 if (i == elf_header.e_shnum || sec->sh_size == 0)
8093 warn (_("Unable to locate .debug_abbrev section!\n"));
8097 begin = ((unsigned char *)
8098 get_data (NULL, file, sec->sh_offset, sec->sh_size,
8099 _("debug_abbrev section data")));
8103 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8104 begin + sec->sh_size);
8110 while (tags < start)
8113 unsigned long abbrev_number;
8114 abbrev_entry * entry;
8117 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8120 /* A null DIE marks the end of a list of children. */
8121 if (abbrev_number == 0)
8127 /* Scan through the abbreviation list until we reach the
8129 for (entry = first_abbrev;
8130 entry && entry->entry != abbrev_number;
8131 entry = entry->next)
8136 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8141 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8143 (unsigned long) (tags - section_begin - bytes_read),
8145 get_TAG_name (entry->tag));
8147 for (attr = entry->first_attr; attr; attr = attr->next)
8148 tags = read_and_display_attr (attr->attribute,
8151 compunit.cu_pointer_size);
8153 if (entry->children)
8167 display_debug_aranges (section, start, file)
8168 Elf32_Internal_Shdr * section;
8169 unsigned char * start;
8170 FILE * file ATTRIBUTE_UNUSED;
8172 unsigned char * end = start + section->sh_size;
8174 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8178 DWARF2_External_ARange * external;
8179 DWARF2_Internal_ARange arange;
8180 unsigned char * ranges;
8181 unsigned long length;
8182 unsigned long address;
8185 external = (DWARF2_External_ARange *) start;
8187 arange.ar_length = BYTE_GET (external->ar_length);
8188 arange.ar_version = BYTE_GET (external->ar_version);
8189 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
8190 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
8191 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
8193 if (arange.ar_length == 0xffffffff)
8195 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8199 if (arange.ar_version != 2)
8201 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8205 printf (_(" Length: %ld\n"), arange.ar_length);
8206 printf (_(" Version: %d\n"), arange.ar_version);
8207 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8208 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8209 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8211 printf (_("\n Address Length\n"));
8213 ranges = start + sizeof (* external);
8215 /* Must pad to an alignment boundary that is twice the pointer size. */
8216 excess = sizeof (* external) % (2 * arange.ar_pointer_size);
8218 ranges += (2 * arange.ar_pointer_size) - excess;
8222 address = byte_get (ranges, arange.ar_pointer_size);
8224 ranges += arange.ar_pointer_size;
8226 length = byte_get (ranges, arange.ar_pointer_size);
8228 ranges += arange.ar_pointer_size;
8230 /* A pair of zeros marks the end of the list. */
8231 if (address == 0 && length == 0)
8234 printf (" %8.8lx %lu\n", address, length);
8237 start += arange.ar_length + sizeof (external->ar_length);
8245 typedef struct Frame_Chunk
8247 struct Frame_Chunk * next;
8248 unsigned char * chunk_start;
8250 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8251 short int * col_type;
8253 char * augmentation;
8254 unsigned int code_factor;
8256 unsigned long pc_begin;
8257 unsigned long pc_range;
8261 unsigned char fde_encoding;
8265 /* A marker for a col_type that means this column was never referenced
8266 in the frame info. */
8267 #define DW_CFA_unreferenced (-1)
8269 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8270 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8271 static int size_of_encoded_value PARAMS ((int));
8274 frame_need_space (fc, reg)
8278 int prev = fc->ncols;
8280 if (reg < fc->ncols)
8283 fc->ncols = reg + 1;
8284 fc->col_type = (short int *) xrealloc (fc->col_type,
8285 fc->ncols * sizeof (short int));
8286 fc->col_offset = (int *) xrealloc (fc->col_offset,
8287 fc->ncols * sizeof (int));
8289 while (prev < fc->ncols)
8291 fc->col_type[prev] = DW_CFA_unreferenced;
8292 fc->col_offset[prev] = 0;
8298 frame_display_row (fc, need_col_headers, max_regs)
8300 int * need_col_headers;
8306 if (* max_regs < fc->ncols)
8307 * max_regs = fc->ncols;
8309 if (* need_col_headers)
8311 * need_col_headers = 0;
8313 printf (" LOC CFA ");
8315 for (r = 0; r < * max_regs; r++)
8316 if (fc->col_type[r] != DW_CFA_unreferenced)
8321 printf ("r%-4d", r);
8327 printf ("%08lx ", fc->pc_begin);
8328 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8329 printf ("%-8s ", tmp);
8331 for (r = 0; r < fc->ncols; r++)
8333 if (fc->col_type[r] != DW_CFA_unreferenced)
8335 switch (fc->col_type[r])
8337 case DW_CFA_undefined:
8340 case DW_CFA_same_value:
8344 sprintf (tmp, "c%+d", fc->col_offset[r]);
8346 case DW_CFA_register:
8347 sprintf (tmp, "r%d", fc->col_offset[r]);
8350 strcpy (tmp, "n/a");
8353 printf ("%-5s", tmp);
8360 size_of_encoded_value (encoding)
8363 switch (encoding & 0x7)
8366 case 0: return is_32bit_elf ? 4 : 8;
8373 #define GET(N) byte_get (start, N); start += N
8374 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8375 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8378 display_debug_frames (section, start, file)
8379 Elf32_Internal_Shdr * section;
8380 unsigned char * start;
8381 FILE * file ATTRIBUTE_UNUSED;
8383 unsigned char * end = start + section->sh_size;
8384 unsigned char * section_start = start;
8385 Frame_Chunk * chunks = 0;
8386 Frame_Chunk * remembered_state = 0;
8388 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8391 int addr_size = is_32bit_elf ? 4 : 8;
8393 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8397 unsigned char * saved_start;
8398 unsigned char * block_end;
8399 unsigned long length;
8400 unsigned long cie_id;
8403 int need_col_headers = 1;
8404 unsigned char * augmentation_data = NULL;
8405 unsigned long augmentation_data_len = 0;
8406 int encoded_ptr_size = addr_size;
8408 saved_start = start;
8409 length = byte_get (start, 4); start += 4;
8413 printf ("\n%08lx ZERO terminator\n\n",
8414 (unsigned long)(saved_start - section_start));
8418 if (length == 0xffffffff)
8420 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8424 block_end = saved_start + length + 4;
8425 cie_id = byte_get (start, 4); start += 4;
8427 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8431 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8432 memset (fc, 0, sizeof (Frame_Chunk));
8436 fc->chunk_start = saved_start;
8438 fc->col_type = (short int *) xmalloc (sizeof (short int));
8439 fc->col_offset = (int *) xmalloc (sizeof (int));
8440 frame_need_space (fc, max_regs-1);
8444 fc->augmentation = start;
8445 start = strchr (start, '\0') + 1;
8447 if (fc->augmentation[0] == 'z')
8449 fc->code_factor = LEB ();
8450 fc->data_factor = SLEB ();
8451 fc->ra = byte_get (start, 1); start += 1;
8452 augmentation_data_len = LEB ();
8453 augmentation_data = start;
8454 start += augmentation_data_len;
8456 else if (strcmp (fc->augmentation, "eh") == 0)
8459 fc->code_factor = LEB ();
8460 fc->data_factor = SLEB ();
8461 fc->ra = byte_get (start, 1); start += 1;
8465 fc->code_factor = LEB ();
8466 fc->data_factor = SLEB ();
8467 fc->ra = byte_get (start, 1); start += 1;
8471 if (do_debug_frames_interp)
8472 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8473 (unsigned long)(saved_start - section_start), length, cie_id,
8474 fc->augmentation, fc->code_factor, fc->data_factor,
8478 printf ("\n%08lx %08lx %08lx CIE\n",
8479 (unsigned long)(saved_start - section_start), length, cie_id);
8480 printf (" Version: %d\n", version);
8481 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8482 printf (" Code alignment factor: %u\n", fc->code_factor);
8483 printf (" Data alignment factor: %d\n", fc->data_factor);
8484 printf (" Return address column: %d\n", fc->ra);
8486 if (augmentation_data_len)
8489 printf (" Augmentation data: ");
8490 for (i = 0; i < augmentation_data_len; ++i)
8491 printf (" %02x", augmentation_data[i]);
8497 if (augmentation_data_len)
8499 unsigned char *p, *q;
8500 p = fc->augmentation + 1;
8501 q = augmentation_data;
8508 q += 1 + size_of_encoded_value (*q);
8510 fc->fde_encoding = *q++;
8516 if (fc->fde_encoding)
8517 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8520 frame_need_space (fc, fc->ra);
8524 unsigned char * look_for;
8525 static Frame_Chunk fde_fc;
8528 memset (fc, 0, sizeof (Frame_Chunk));
8530 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8532 for (cie = chunks; cie ; cie = cie->next)
8533 if (cie->chunk_start == look_for)
8538 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8539 cie_id, saved_start);
8542 fc->col_type = (short int *) xmalloc (sizeof (short int));
8543 fc->col_offset = (int *) xmalloc (sizeof (int));
8544 frame_need_space (fc, max_regs - 1);
8546 fc->augmentation = "";
8547 fc->fde_encoding = 0;
8551 fc->ncols = cie->ncols;
8552 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8553 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8554 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8555 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8556 fc->augmentation = cie->augmentation;
8557 fc->code_factor = cie->code_factor;
8558 fc->data_factor = cie->data_factor;
8559 fc->cfa_reg = cie->cfa_reg;
8560 fc->cfa_offset = cie->cfa_offset;
8562 frame_need_space (fc, max_regs-1);
8563 fc->fde_encoding = cie->fde_encoding;
8566 if (fc->fde_encoding)
8567 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8569 fc->pc_begin = byte_get (start, encoded_ptr_size);
8570 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8571 fc->pc_begin += section->sh_addr + (start - section_start);
8572 start += encoded_ptr_size;
8573 fc->pc_range = byte_get (start, encoded_ptr_size);
8574 start += encoded_ptr_size;
8576 if (cie->augmentation[0] == 'z')
8578 augmentation_data_len = LEB ();
8579 augmentation_data = start;
8580 start += augmentation_data_len;
8583 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8584 (unsigned long)(saved_start - section_start), length, cie_id,
8585 (unsigned long)(cie->chunk_start - section_start),
8586 fc->pc_begin, fc->pc_begin + fc->pc_range);
8587 if (! do_debug_frames_interp && augmentation_data_len)
8590 printf (" Augmentation data: ");
8591 for (i = 0; i < augmentation_data_len; ++i)
8592 printf (" %02x", augmentation_data[i]);
8598 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8599 about to interpret instructions for the chunk. */
8601 if (do_debug_frames_interp)
8603 /* Start by making a pass over the chunk, allocating storage
8604 and taking note of what registers are used. */
8605 unsigned char * tmp = start;
8607 while (start < block_end)
8617 /* Warning: if you add any more cases to this switch, be
8618 sure to add them to the corresponding switch below. */
8621 case DW_CFA_advance_loc:
8625 frame_need_space (fc, opa);
8626 fc->col_type[opa] = DW_CFA_undefined;
8628 case DW_CFA_restore:
8629 frame_need_space (fc, opa);
8630 fc->col_type[opa] = DW_CFA_undefined;
8632 case DW_CFA_set_loc:
8633 start += encoded_ptr_size;
8635 case DW_CFA_advance_loc1:
8638 case DW_CFA_advance_loc2:
8641 case DW_CFA_advance_loc4:
8644 case DW_CFA_offset_extended:
8645 reg = LEB (); LEB ();
8646 frame_need_space (fc, reg);
8647 fc->col_type[reg] = DW_CFA_undefined;
8649 case DW_CFA_restore_extended:
8651 frame_need_space (fc, reg);
8652 fc->col_type[reg] = DW_CFA_undefined;
8654 case DW_CFA_undefined:
8656 frame_need_space (fc, reg);
8657 fc->col_type[reg] = DW_CFA_undefined;
8659 case DW_CFA_same_value:
8661 frame_need_space (fc, reg);
8662 fc->col_type[reg] = DW_CFA_undefined;
8664 case DW_CFA_register:
8665 reg = LEB (); LEB ();
8666 frame_need_space (fc, reg);
8667 fc->col_type[reg] = DW_CFA_undefined;
8669 case DW_CFA_def_cfa:
8672 case DW_CFA_def_cfa_register:
8675 case DW_CFA_def_cfa_offset:
8678 case DW_CFA_offset_extended_sf:
8679 reg = LEB (); SLEB ();
8680 frame_need_space (fc, reg);
8681 fc->col_type[reg] = DW_CFA_undefined;
8683 case DW_CFA_def_cfa_sf:
8686 case DW_CFA_def_cfa_offset_sf:
8689 case DW_CFA_GNU_args_size:
8692 case DW_CFA_GNU_negative_offset_extended:
8693 reg = LEB (); LEB ();
8694 frame_need_space (fc, reg);
8695 fc->col_type[reg] = DW_CFA_undefined;
8704 /* Now we know what registers are used, make a second pass over
8705 the chunk, this time actually printing out the info. */
8707 while (start < block_end)
8710 unsigned long ul, reg, roffs;
8719 /* Warning: if you add any more cases to this switch, be
8720 sure to add them to the corresponding switch above. */
8723 case DW_CFA_advance_loc:
8724 if (do_debug_frames_interp)
8725 frame_display_row (fc, &need_col_headers, &max_regs);
8727 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8728 opa * fc->code_factor,
8729 fc->pc_begin + opa * fc->code_factor);
8730 fc->pc_begin += opa * fc->code_factor;
8735 if (! do_debug_frames_interp)
8736 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8737 opa, roffs * fc->data_factor);
8738 fc->col_type[opa] = DW_CFA_offset;
8739 fc->col_offset[opa] = roffs * fc->data_factor;
8742 case DW_CFA_restore:
8743 if (! do_debug_frames_interp)
8744 printf (" DW_CFA_restore: r%d\n", opa);
8745 fc->col_type[opa] = cie->col_type[opa];
8746 fc->col_offset[opa] = cie->col_offset[opa];
8749 case DW_CFA_set_loc:
8750 vma = byte_get (start, encoded_ptr_size);
8751 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8752 vma += section->sh_addr + (start - section_start);
8753 start += encoded_ptr_size;
8754 if (do_debug_frames_interp)
8755 frame_display_row (fc, &need_col_headers, &max_regs);
8757 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8761 case DW_CFA_advance_loc1:
8762 ofs = byte_get (start, 1); start += 1;
8763 if (do_debug_frames_interp)
8764 frame_display_row (fc, &need_col_headers, &max_regs);
8766 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8767 ofs * fc->code_factor,
8768 fc->pc_begin + ofs * fc->code_factor);
8769 fc->pc_begin += ofs * fc->code_factor;
8772 case DW_CFA_advance_loc2:
8773 ofs = byte_get (start, 2); start += 2;
8774 if (do_debug_frames_interp)
8775 frame_display_row (fc, &need_col_headers, &max_regs);
8777 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8778 ofs * fc->code_factor,
8779 fc->pc_begin + ofs * fc->code_factor);
8780 fc->pc_begin += ofs * fc->code_factor;
8783 case DW_CFA_advance_loc4:
8784 ofs = byte_get (start, 4); start += 4;
8785 if (do_debug_frames_interp)
8786 frame_display_row (fc, &need_col_headers, &max_regs);
8788 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8789 ofs * fc->code_factor,
8790 fc->pc_begin + ofs * fc->code_factor);
8791 fc->pc_begin += ofs * fc->code_factor;
8794 case DW_CFA_offset_extended:
8797 if (! do_debug_frames_interp)
8798 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8799 reg, roffs * fc->data_factor);
8800 fc->col_type[reg] = DW_CFA_offset;
8801 fc->col_offset[reg] = roffs * fc->data_factor;
8804 case DW_CFA_restore_extended:
8806 if (! do_debug_frames_interp)
8807 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8808 fc->col_type[reg] = cie->col_type[reg];
8809 fc->col_offset[reg] = cie->col_offset[reg];
8812 case DW_CFA_undefined:
8814 if (! do_debug_frames_interp)
8815 printf (" DW_CFA_undefined: r%ld\n", reg);
8816 fc->col_type[reg] = DW_CFA_undefined;
8817 fc->col_offset[reg] = 0;
8820 case DW_CFA_same_value:
8822 if (! do_debug_frames_interp)
8823 printf (" DW_CFA_same_value: r%ld\n", reg);
8824 fc->col_type[reg] = DW_CFA_same_value;
8825 fc->col_offset[reg] = 0;
8828 case DW_CFA_register:
8831 if (! do_debug_frames_interp)
8832 printf (" DW_CFA_register: r%ld\n", reg);
8833 fc->col_type[reg] = DW_CFA_register;
8834 fc->col_offset[reg] = roffs;
8837 case DW_CFA_remember_state:
8838 if (! do_debug_frames_interp)
8839 printf (" DW_CFA_remember_state\n");
8840 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8841 rs->ncols = fc->ncols;
8842 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8843 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8844 memcpy (rs->col_type, fc->col_type, rs->ncols);
8845 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8846 rs->next = remembered_state;
8847 remembered_state = rs;
8850 case DW_CFA_restore_state:
8851 if (! do_debug_frames_interp)
8852 printf (" DW_CFA_restore_state\n");
8853 rs = remembered_state;
8854 remembered_state = rs->next;
8855 frame_need_space (fc, rs->ncols-1);
8856 memcpy (fc->col_type, rs->col_type, rs->ncols);
8857 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8858 free (rs->col_type);
8859 free (rs->col_offset);
8863 case DW_CFA_def_cfa:
8864 fc->cfa_reg = LEB ();
8865 fc->cfa_offset = LEB ();
8866 if (! do_debug_frames_interp)
8867 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
8868 fc->cfa_reg, fc->cfa_offset);
8871 case DW_CFA_def_cfa_register:
8872 fc->cfa_reg = LEB ();
8873 if (! do_debug_frames_interp)
8874 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
8877 case DW_CFA_def_cfa_offset:
8878 fc->cfa_offset = LEB ();
8879 if (! do_debug_frames_interp)
8880 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
8884 if (! do_debug_frames_interp)
8885 printf (" DW_CFA_nop\n");
8888 case DW_CFA_offset_extended_sf:
8891 frame_need_space (fc, reg);
8892 if (! do_debug_frames_interp)
8893 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
8894 reg, l * fc->data_factor);
8895 fc->col_type[reg] = DW_CFA_offset;
8896 fc->col_offset[reg] = l * fc->data_factor;
8899 case DW_CFA_def_cfa_sf:
8900 fc->cfa_reg = LEB ();
8901 fc->cfa_offset = SLEB ();
8902 if (! do_debug_frames_interp)
8903 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
8904 fc->cfa_reg, fc->cfa_offset);
8907 case DW_CFA_def_cfa_offset_sf:
8908 fc->cfa_offset = SLEB ();
8909 if (! do_debug_frames_interp)
8910 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
8913 case DW_CFA_GNU_window_save:
8914 if (! do_debug_frames_interp)
8915 printf (" DW_CFA_GNU_window_save\n");
8918 case DW_CFA_GNU_args_size:
8920 if (! do_debug_frames_interp)
8921 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
8924 case DW_CFA_GNU_negative_offset_extended:
8927 frame_need_space (fc, reg);
8928 if (! do_debug_frames_interp)
8929 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
8930 reg, l * fc->data_factor);
8931 fc->col_type[reg] = DW_CFA_offset;
8932 fc->col_offset[reg] = l * fc->data_factor;
8935 /* FIXME: How do we handle these? */
8936 case DW_CFA_def_cfa_expression:
8937 fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
8941 case DW_CFA_expression:
8942 fprintf (stderr, "unsupported DW_CFA_expression\n");
8947 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
8952 if (do_debug_frames_interp)
8953 frame_display_row (fc, &need_col_headers, &max_regs);
8968 display_debug_not_supported (section, start, file)
8969 Elf32_Internal_Shdr * section;
8970 unsigned char * start ATTRIBUTE_UNUSED;
8971 FILE * file ATTRIBUTE_UNUSED;
8973 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
8974 SECTION_NAME (section));
8979 /* Pre-scan the .debug_info section to record the size of address.
8980 When dumping the .debug_line, we use that size information, assuming
8981 that all compilation units have the same address size. */
8983 prescan_debug_info (section, start, file)
8984 Elf32_Internal_Shdr * section ATTRIBUTE_UNUSED;
8985 unsigned char * start;
8986 FILE * file ATTRIBUTE_UNUSED;
8988 DWARF2_External_CompUnit * external;
8990 external = (DWARF2_External_CompUnit *) start;
8992 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
8996 /* A structure containing the name of a debug section and a pointer
8997 to a function that can decode it. The third field is a prescan
8998 function to be run over the section before displaying any of the
9002 const char * const name;
9003 int (* display) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
9004 int (* prescan) PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *));
9008 { ".debug_abbrev", display_debug_abbrev, NULL },
9009 { ".debug_aranges", display_debug_aranges, NULL },
9010 { ".debug_frame", display_debug_frames, NULL },
9011 { ".debug_info", display_debug_info, prescan_debug_info },
9012 { ".debug_line", display_debug_lines, NULL },
9013 { ".debug_pubnames", display_debug_pubnames, NULL },
9014 { ".eh_frame", display_debug_frames, NULL },
9015 { ".debug_macinfo", display_debug_macinfo, NULL },
9016 { ".debug_str", display_debug_str, NULL },
9017 { ".debug_loc", display_debug_loc, NULL },
9018 { ".debug_pubtypes", display_debug_not_supported, NULL },
9019 { ".debug_ranges", display_debug_not_supported, NULL },
9020 { ".debug_static_func", display_debug_not_supported, NULL },
9021 { ".debug_static_vars", display_debug_not_supported, NULL },
9022 { ".debug_types", display_debug_not_supported, NULL },
9023 { ".debug_weaknames", display_debug_not_supported, NULL }
9027 display_debug_section (section, file)
9028 Elf32_Internal_Shdr * section;
9031 char * name = SECTION_NAME (section);
9032 bfd_size_type length;
9033 unsigned char * start;
9036 length = section->sh_size;
9039 printf (_("\nSection '%s' has no debugging data.\n"), name);
9043 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
9044 _("debug section data"));
9048 /* See if we know how to display the contents of this section. */
9049 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9050 name = ".debug_info";
9052 for (i = NUM_ELEM (debug_displays); i--;)
9053 if (strcmp (debug_displays[i].name, name) == 0)
9055 debug_displays[i].display (section, start, file);
9060 printf (_("Unrecognized debug section: %s\n"), name);
9064 /* If we loaded in the abbrev section at some point,
9065 we must release it here. */
9072 process_section_contents (file)
9075 Elf32_Internal_Shdr * section;
9081 /* Pre-scan the debug sections to find some debug information not
9082 present in some of them. For the .debug_line, we must find out the
9083 size of address (specified in .debug_info and .debug_aranges). */
9084 for (i = 0, section = section_headers;
9085 i < elf_header.e_shnum && i < num_dump_sects;
9088 char * name = SECTION_NAME (section);
9091 if (section->sh_size == 0)
9094 /* See if there is some pre-scan operation for this section. */
9095 for (j = NUM_ELEM (debug_displays); j--;)
9096 if (strcmp (debug_displays[j].name, name) == 0)
9098 if (debug_displays[j].prescan != NULL)
9100 bfd_size_type length;
9101 unsigned char * start;
9103 length = section->sh_size;
9104 start = ((unsigned char *)
9105 get_data (NULL, file, section->sh_offset, length,
9106 _("debug section data")));
9110 debug_displays[j].prescan (section, start, file);
9118 for (i = 0, section = section_headers;
9119 i < elf_header.e_shnum && i < num_dump_sects;
9122 #ifdef SUPPORT_DISASSEMBLY
9123 if (dump_sects[i] & DISASS_DUMP)
9124 disassemble_section (section, file);
9126 if (dump_sects[i] & HEX_DUMP)
9127 dump_section (section, file);
9129 if (dump_sects[i] & DEBUG_DUMP)
9130 display_debug_section (section, file);
9133 if (i < num_dump_sects)
9134 warn (_("Some sections were not dumped because they do not exist!\n"));
9140 process_mips_fpe_exception (mask)
9146 if (mask & OEX_FPU_INEX)
9147 fputs ("INEX", stdout), first = 0;
9148 if (mask & OEX_FPU_UFLO)
9149 printf ("%sUFLO", first ? "" : "|"), first = 0;
9150 if (mask & OEX_FPU_OFLO)
9151 printf ("%sOFLO", first ? "" : "|"), first = 0;
9152 if (mask & OEX_FPU_DIV0)
9153 printf ("%sDIV0", first ? "" : "|"), first = 0;
9154 if (mask & OEX_FPU_INVAL)
9155 printf ("%sINVAL", first ? "" : "|");
9158 fputs ("0", stdout);
9162 process_mips_specific (file)
9165 Elf_Internal_Dyn * entry;
9166 size_t liblist_offset = 0;
9167 size_t liblistno = 0;
9168 size_t conflictsno = 0;
9169 size_t options_offset = 0;
9170 size_t conflicts_offset = 0;
9172 /* We have a lot of special sections. Thanks SGI! */
9173 if (dynamic_segment == NULL)
9174 /* No information available. */
9177 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9178 switch (entry->d_tag)
9180 case DT_MIPS_LIBLIST:
9181 liblist_offset = entry->d_un.d_val - loadaddr;
9183 case DT_MIPS_LIBLISTNO:
9184 liblistno = entry->d_un.d_val;
9186 case DT_MIPS_OPTIONS:
9187 options_offset = entry->d_un.d_val - loadaddr;
9189 case DT_MIPS_CONFLICT:
9190 conflicts_offset = entry->d_un.d_val - loadaddr;
9192 case DT_MIPS_CONFLICTNO:
9193 conflictsno = entry->d_un.d_val;
9199 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9201 Elf32_External_Lib * elib;
9204 elib = ((Elf32_External_Lib *)
9205 get_data (NULL, file, liblist_offset,
9206 liblistno * sizeof (Elf32_External_Lib),
9210 printf ("\nSection '.liblist' contains %lu entries:\n",
9211 (unsigned long) liblistno);
9212 fputs (" Library Time Stamp Checksum Version Flags\n",
9215 for (cnt = 0; cnt < liblistno; ++cnt)
9222 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9223 time = BYTE_GET (elib[cnt].l_time_stamp);
9224 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9225 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9226 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9228 tmp = gmtime (&time);
9229 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9230 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9231 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9233 printf ("%3lu: ", (unsigned long) cnt);
9234 print_symbol (20, dynamic_strings + liblist.l_name);
9235 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9238 if (liblist.l_flags == 0)
9249 { " EXACT_MATCH", LL_EXACT_MATCH },
9250 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9251 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9252 { " EXPORTS", LL_EXPORTS },
9253 { " DELAY_LOAD", LL_DELAY_LOAD },
9254 { " DELTA", LL_DELTA }
9256 int flags = liblist.l_flags;
9260 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9262 if ((flags & l_flags_vals[fcnt].bit) != 0)
9264 fputs (l_flags_vals[fcnt].name, stdout);
9265 flags ^= l_flags_vals[fcnt].bit;
9268 printf (" %#x", (unsigned int) flags);
9278 if (options_offset != 0)
9280 Elf_External_Options * eopt;
9281 Elf_Internal_Shdr * sect = section_headers;
9282 Elf_Internal_Options * iopt;
9283 Elf_Internal_Options * option;
9287 /* Find the section header so that we get the size. */
9288 while (sect->sh_type != SHT_MIPS_OPTIONS)
9291 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9292 sect->sh_size, _("options"));
9295 iopt = ((Elf_Internal_Options *)
9296 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (* iopt)));
9299 error (_("Out of memory"));
9306 while (offset < sect->sh_size)
9308 Elf_External_Options * eoption;
9310 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9312 option->kind = BYTE_GET (eoption->kind);
9313 option->size = BYTE_GET (eoption->size);
9314 option->section = BYTE_GET (eoption->section);
9315 option->info = BYTE_GET (eoption->info);
9317 offset += option->size;
9323 printf (_("\nSection '%s' contains %d entries:\n"),
9324 SECTION_NAME (sect), cnt);
9332 switch (option->kind)
9335 /* This shouldn't happen. */
9336 printf (" NULL %d %lx", option->section, option->info);
9339 printf (" REGINFO ");
9340 if (elf_header.e_machine == EM_MIPS)
9343 Elf32_External_RegInfo * ereg;
9344 Elf32_RegInfo reginfo;
9346 ereg = (Elf32_External_RegInfo *) (option + 1);
9347 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9348 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9349 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9350 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9351 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9352 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9354 printf ("GPR %08lx GP 0x%lx\n",
9356 (unsigned long) reginfo.ri_gp_value);
9357 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9358 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9359 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9364 Elf64_External_RegInfo * ereg;
9365 Elf64_Internal_RegInfo reginfo;
9367 ereg = (Elf64_External_RegInfo *) (option + 1);
9368 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9369 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9370 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9371 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9372 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9373 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9375 printf ("GPR %08lx GP 0x",
9376 reginfo.ri_gprmask);
9377 printf_vma (reginfo.ri_gp_value);
9380 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9381 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9382 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9386 case ODK_EXCEPTIONS:
9387 fputs (" EXCEPTIONS fpe_min(", stdout);
9388 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9389 fputs (") fpe_max(", stdout);
9390 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9391 fputs (")", stdout);
9393 if (option->info & OEX_PAGE0)
9394 fputs (" PAGE0", stdout);
9395 if (option->info & OEX_SMM)
9396 fputs (" SMM", stdout);
9397 if (option->info & OEX_FPDBUG)
9398 fputs (" FPDBUG", stdout);
9399 if (option->info & OEX_DISMISS)
9400 fputs (" DISMISS", stdout);
9403 fputs (" PAD ", stdout);
9404 if (option->info & OPAD_PREFIX)
9405 fputs (" PREFIX", stdout);
9406 if (option->info & OPAD_POSTFIX)
9407 fputs (" POSTFIX", stdout);
9408 if (option->info & OPAD_SYMBOL)
9409 fputs (" SYMBOL", stdout);
9412 fputs (" HWPATCH ", stdout);
9413 if (option->info & OHW_R4KEOP)
9414 fputs (" R4KEOP", stdout);
9415 if (option->info & OHW_R8KPFETCH)
9416 fputs (" R8KPFETCH", stdout);
9417 if (option->info & OHW_R5KEOP)
9418 fputs (" R5KEOP", stdout);
9419 if (option->info & OHW_R5KCVTL)
9420 fputs (" R5KCVTL", stdout);
9423 fputs (" FILL ", stdout);
9424 /* XXX Print content of info word? */
9427 fputs (" TAGS ", stdout);
9428 /* XXX Print content of info word? */
9431 fputs (" HWAND ", stdout);
9432 if (option->info & OHWA0_R4KEOP_CHECKED)
9433 fputs (" R4KEOP_CHECKED", stdout);
9434 if (option->info & OHWA0_R4KEOP_CLEAN)
9435 fputs (" R4KEOP_CLEAN", stdout);
9438 fputs (" HWOR ", stdout);
9439 if (option->info & OHWA0_R4KEOP_CHECKED)
9440 fputs (" R4KEOP_CHECKED", stdout);
9441 if (option->info & OHWA0_R4KEOP_CLEAN)
9442 fputs (" R4KEOP_CLEAN", stdout);
9445 printf (" GP_GROUP %#06lx self-contained %#06lx",
9446 option->info & OGP_GROUP,
9447 (option->info & OGP_SELF) >> 16);
9450 printf (" IDENT %#06lx self-contained %#06lx",
9451 option->info & OGP_GROUP,
9452 (option->info & OGP_SELF) >> 16);
9455 /* This shouldn't happen. */
9456 printf (" %3d ??? %d %lx",
9457 option->kind, option->section, option->info);
9461 len = sizeof (* eopt);
9462 while (len < option->size)
9463 if (((char *) option)[len] >= ' '
9464 && ((char *) option)[len] < 0x7f)
9465 printf ("%c", ((char *) option)[len++]);
9467 printf ("\\%03o", ((char *) option)[len++]);
9469 fputs ("\n", stdout);
9477 if (conflicts_offset != 0 && conflictsno != 0)
9479 Elf32_Conflict * iconf;
9482 if (dynamic_symbols == NULL)
9484 error (_("conflict list found without a dynamic symbol table"));
9488 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (* iconf));
9491 error (_("Out of memory"));
9497 Elf32_External_Conflict * econf32;
9499 econf32 = ((Elf32_External_Conflict *)
9500 get_data (NULL, file, conflicts_offset,
9501 conflictsno * sizeof (* econf32),
9506 for (cnt = 0; cnt < conflictsno; ++cnt)
9507 iconf[cnt] = BYTE_GET (econf32[cnt]);
9513 Elf64_External_Conflict * econf64;
9515 econf64 = ((Elf64_External_Conflict *)
9516 get_data (NULL, file, conflicts_offset,
9517 conflictsno * sizeof (* econf64),
9522 for (cnt = 0; cnt < conflictsno; ++cnt)
9523 iconf[cnt] = BYTE_GET (econf64[cnt]);
9528 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9529 (long) conflictsno);
9530 puts (_(" Num: Index Value Name"));
9532 for (cnt = 0; cnt < conflictsno; ++cnt)
9534 Elf_Internal_Sym * psym = & dynamic_symbols [iconf [cnt]];
9536 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf [cnt]);
9537 print_vma (psym->st_value, FULL_HEX);
9539 print_symbol (25, dynamic_strings + psym->st_name);
9550 process_gnu_liblist (file)
9553 Elf_Internal_Shdr * section, * string_sec;
9554 Elf32_External_Lib * elib;
9562 for (i = 0, section = section_headers;
9563 i < elf_header.e_shnum;
9566 switch (section->sh_type)
9568 case SHT_GNU_LIBLIST:
9569 elib = ((Elf32_External_Lib *)
9570 get_data (NULL, file, section->sh_offset, section->sh_size,
9575 string_sec = SECTION_HEADER (section->sh_link);
9577 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9578 string_sec->sh_size,
9579 _("liblist string table"));
9582 || section->sh_entsize != sizeof (Elf32_External_Lib))
9588 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9589 SECTION_NAME (section),
9590 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9592 puts (" Library Time Stamp Checksum Version Flags");
9594 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9602 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9603 time = BYTE_GET (elib[cnt].l_time_stamp);
9604 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9605 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9606 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9608 tmp = gmtime (&time);
9609 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9610 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9611 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9613 printf ("%3lu: ", (unsigned long) cnt);
9615 printf ("%-20s", strtab + liblist.l_name);
9617 printf ("%-20.20s", strtab + liblist.l_name);
9618 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9619 liblist.l_version, liblist.l_flags);
9630 get_note_type (e_type)
9633 static char buff[64];
9637 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9638 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9639 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9640 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9641 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9642 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9643 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9644 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9645 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9646 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9647 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9649 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9655 get_netbsd_elfcore_note_type (e_type)
9658 static char buff[64];
9660 if (e_type == NT_NETBSDCORE_PROCINFO)
9662 /* NetBSD core "procinfo" structure. */
9663 return _("NetBSD procinfo structure");
9666 /* As of Jan 2002 there are no other machine-independent notes
9667 defined for NetBSD core files. If the note type is less
9668 than the start of the machine-dependent note types, we don't
9671 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9673 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9677 switch (elf_header.e_machine)
9679 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9680 and PT_GETFPREGS == mach+2. */
9685 case EM_SPARC32PLUS:
9689 case NT_NETBSDCORE_FIRSTMACH+0:
9690 return _("PT_GETREGS (reg structure)");
9691 case NT_NETBSDCORE_FIRSTMACH+2:
9692 return _("PT_GETFPREGS (fpreg structure)");
9698 /* On all other arch's, PT_GETREGS == mach+1 and
9699 PT_GETFPREGS == mach+3. */
9703 case NT_NETBSDCORE_FIRSTMACH+1:
9704 return _("PT_GETREGS (reg structure)");
9705 case NT_NETBSDCORE_FIRSTMACH+3:
9706 return _("PT_GETFPREGS (fpreg structure)");
9712 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9716 /* Note that by the ELF standard, the name field is already null byte
9717 terminated, and namesz includes the terminating null byte.
9718 I.E. the value of namesz for the name "FSF" is 4.
9720 If the value of namesz is zero, there is no name present. */
9722 process_note (pnote)
9723 Elf32_Internal_Note * pnote;
9727 if (pnote->namesz == 0)
9729 /* If there is no note name, then use the default set of
9730 note type strings. */
9731 nt = get_note_type (pnote->type);
9733 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9735 /* NetBSD-specific core file notes. */
9736 nt = get_netbsd_elfcore_note_type (pnote->type);
9740 /* Don't recognize this note name; just use the default set of
9741 note type strings. */
9742 nt = get_note_type (pnote->type);
9745 printf (" %s\t\t0x%08lx\t%s\n",
9746 pnote->namesz ? pnote->namedata : "(NONE)",
9753 process_corefile_note_segment (file, offset, length)
9758 Elf_External_Note * pnotes;
9759 Elf_External_Note * external;
9765 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9772 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9773 (unsigned long) offset, (unsigned long) length);
9774 printf (_(" Owner\t\tData size\tDescription\n"));
9776 while (external < (Elf_External_Note *)((char *) pnotes + length))
9778 Elf_External_Note * next;
9779 Elf32_Internal_Note inote;
9782 inote.type = BYTE_GET (external->type);
9783 inote.namesz = BYTE_GET (external->namesz);
9784 inote.namedata = external->name;
9785 inote.descsz = BYTE_GET (external->descsz);
9786 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9787 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9789 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9791 if (((char *) next) > (((char *) pnotes) + length))
9793 warn (_("corrupt note found at offset %x into core notes\n"),
9794 ((char *) external) - ((char *) pnotes));
9795 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9796 inote.type, inote.namesz, inote.descsz);
9802 /* Verify that name is null terminated. It appears that at least
9803 one version of Linux (RedHat 6.0) generates corefiles that don't
9804 comply with the ELF spec by failing to include the null byte in
9806 if (inote.namedata[inote.namesz] != '\0')
9808 temp = malloc (inote.namesz + 1);
9812 error (_("Out of memory\n"));
9817 strncpy (temp, inote.namedata, inote.namesz);
9818 temp[inote.namesz] = 0;
9820 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9821 inote.namedata = temp;
9824 res &= process_note (& inote);
9839 process_corefile_note_segments (file)
9842 Elf_Internal_Phdr * program_headers;
9843 Elf_Internal_Phdr * segment;
9847 program_headers = (Elf_Internal_Phdr *) malloc
9848 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9850 if (program_headers == NULL)
9852 error (_("Out of memory\n"));
9857 i = get_32bit_program_headers (file, program_headers);
9859 i = get_64bit_program_headers (file, program_headers);
9863 free (program_headers);
9867 for (i = 0, segment = program_headers;
9868 i < elf_header.e_phnum;
9871 if (segment->p_type == PT_NOTE)
9872 res &= process_corefile_note_segment (file,
9873 (bfd_vma) segment->p_offset,
9874 (bfd_vma) segment->p_filesz);
9877 free (program_headers);
9883 process_corefile_contents (file)
9886 /* If we have not been asked to display the notes then do nothing. */
9890 /* If file is not a core file then exit. */
9891 if (elf_header.e_type != ET_CORE)
9894 /* No program headers means no NOTE segment. */
9895 if (elf_header.e_phnum == 0)
9897 printf (_("No note segments present in the core file.\n"));
9901 return process_corefile_note_segments (file);
9905 process_arch_specific (file)
9911 switch (elf_header.e_machine)
9914 case EM_MIPS_RS3_LE:
9915 return process_mips_specific (file);
9924 get_file_header (file)
9927 /* Read in the identity array. */
9928 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
9931 /* Determine how to read the rest of the header. */
9932 switch (elf_header.e_ident [EI_DATA])
9934 default: /* fall through */
9935 case ELFDATANONE: /* fall through */
9936 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
9937 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
9940 /* For now we only support 32 bit and 64 bit ELF files. */
9941 is_32bit_elf = (elf_header.e_ident [EI_CLASS] != ELFCLASS64);
9943 /* Read in the rest of the header. */
9946 Elf32_External_Ehdr ehdr32;
9948 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
9951 elf_header.e_type = BYTE_GET (ehdr32.e_type);
9952 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
9953 elf_header.e_version = BYTE_GET (ehdr32.e_version);
9954 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
9955 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
9956 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
9957 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
9958 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
9959 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
9960 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
9961 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
9962 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
9963 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
9967 Elf64_External_Ehdr ehdr64;
9969 /* If we have been compiled with sizeof (bfd_vma) == 4, then
9970 we will not be able to cope with the 64bit data found in
9971 64 ELF files. Detect this now and abort before we start
9972 overwritting things. */
9973 if (sizeof (bfd_vma) < 8)
9975 error (_("This instance of readelf has been built without support for a\n\
9976 64 bit data type and so it cannot read 64 bit ELF files.\n"));
9980 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
9983 elf_header.e_type = BYTE_GET (ehdr64.e_type);
9984 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
9985 elf_header.e_version = BYTE_GET (ehdr64.e_version);
9986 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
9987 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
9988 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
9989 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
9990 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
9991 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
9992 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
9993 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
9994 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
9995 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
9998 if (elf_header.e_shoff)
10000 /* There may be some extensions in the first section header. Don't
10001 bomb if we can't read it. */
10003 get_32bit_section_headers (file, 1);
10005 get_64bit_section_headers (file, 1);
10012 process_file (file_name)
10016 struct stat statbuf;
10019 if (stat (file_name, & statbuf) < 0)
10021 error (_("Cannot stat input file %s.\n"), file_name);
10025 file = fopen (file_name, "rb");
10028 error (_("Input file %s not found.\n"), file_name);
10032 if (! get_file_header (file))
10034 error (_("%s: Failed to read file header\n"), file_name);
10039 /* Initialise per file variables. */
10040 for (i = NUM_ELEM (version_info); i--;)
10041 version_info[i] = 0;
10043 for (i = NUM_ELEM (dynamic_info); i--;)
10044 dynamic_info[i] = 0;
10046 /* Process the file. */
10048 printf (_("\nFile: %s\n"), file_name);
10050 if (! process_file_header ())
10056 process_section_headers (file);
10058 process_program_headers (file);
10060 process_dynamic_segment (file);
10062 process_relocs (file);
10064 process_unwind (file);
10066 process_symbol_table (file);
10068 process_syminfo (file);
10070 process_version_sections (file);
10072 process_section_contents (file);
10074 process_corefile_contents (file);
10076 process_gnu_liblist (file);
10078 process_arch_specific (file);
10082 if (section_headers)
10084 free (section_headers);
10085 section_headers = NULL;
10090 free (string_table);
10091 string_table = NULL;
10092 string_table_length = 0;
10095 if (dynamic_strings)
10097 free (dynamic_strings);
10098 dynamic_strings = NULL;
10101 if (dynamic_symbols)
10103 free (dynamic_symbols);
10104 dynamic_symbols = NULL;
10105 num_dynamic_syms = 0;
10108 if (dynamic_syminfo)
10110 free (dynamic_syminfo);
10111 dynamic_syminfo = NULL;
10117 #ifdef SUPPORT_DISASSEMBLY
10118 /* Needed by the i386 disassembler. For extra credit, someone could
10119 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10123 print_address (unsigned int addr, FILE * outfile)
10125 fprintf (outfile,"0x%8.8x", addr);
10128 /* Needed by the i386 disassembler. */
10130 db_task_printsym (unsigned int addr)
10132 print_address (addr, stderr);
10136 int main PARAMS ((int, char **));
10145 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10146 setlocale (LC_MESSAGES, "");
10148 #if defined (HAVE_SETLOCALE)
10149 setlocale (LC_CTYPE, "");
10151 bindtextdomain (PACKAGE, LOCALEDIR);
10152 textdomain (PACKAGE);
10154 parse_args (argc, argv);
10156 if (optind < (argc - 1))
10160 while (optind < argc)
10161 err |= process_file (argv [optind ++]);
10163 if (dump_sects != NULL)