1 /* readelf.c -- display contents of an ELF format file
2 Copyright (C) 1998, 1999 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@cygnus.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
31 /* Define BFD64 here, even if our default architecture is 32 bit ELF
32 as this will allow us to read in and parse 64bit and 32bit ELF files.
33 Only do this if we belive that the compiler can support a 64 bit
34 data type. For now we only rely on GCC being able to do this. */
40 #include "elf/common.h"
41 #include "elf/external.h"
42 #include "elf/internal.h"
43 #include "elf/dwarf2.h"
45 /* The following headers use the elf/reloc-macros.h file to
46 automatically generate relocation recognition functions
47 such as elf_mips_reloc_type() */
49 #define RELOC_MACROS_GEN_FUNC
55 #include "elf/alpha.h"
58 #include "elf/sparc.h"
63 #include "elf/mn10200.h"
64 #include "elf/mn10300.h"
68 #include "elf/mcore.h"
75 #ifdef ANSI_PROTOTYPES
81 char * program_name
= "readelf";
82 unsigned int dynamic_addr
;
83 bfd_size_type dynamic_size
;
84 unsigned int rela_addr
;
85 unsigned int rela_size
;
86 char * dynamic_strings
;
88 unsigned long num_dynamic_syms
;
89 Elf_Internal_Sym
* dynamic_symbols
;
90 Elf_Internal_Syminfo
* dynamic_syminfo
;
91 unsigned long dynamic_syminfo_offset
;
92 unsigned int dynamic_syminfo_nent
;
93 char program_interpreter
[64];
94 int dynamic_info
[DT_JMPREL
+ 1];
97 Elf_Internal_Ehdr elf_header
;
98 Elf_Internal_Shdr
* section_headers
;
99 Elf_Internal_Dyn
* dynamic_segment
;
106 int do_using_dynamic
;
113 int do_debug_abbrevs
;
115 int do_debug_pubnames
;
116 int do_debug_aranges
;
121 /* A dynamic array of flags indicating which sections require dumping. */
122 char * dump_sects
= NULL
;
123 unsigned int num_dump_sects
= 0;
125 #define HEX_DUMP (1 << 0)
126 #define DISASS_DUMP (1 << 1)
127 #define DEBUG_DUMP (1 << 2)
129 /* How to rpint a vma value. */
130 typedef enum print_mode
142 /* Forward declarations for dumb compilers. */
143 static void print_vma
PARAMS ((bfd_vma
, print_mode
));
144 static bfd_vma (* byte_get
) PARAMS ((unsigned char *, int));
145 static bfd_vma byte_get_little_endian
PARAMS ((unsigned char *, int));
146 static bfd_vma byte_get_big_endian
PARAMS ((unsigned char *, int));
147 static const char * get_mips_dynamic_type
PARAMS ((unsigned long));
148 static const char * get_sparc64_dynamic_type
PARAMS ((unsigned long));
149 static const char * get_parisc_dynamic_type
PARAMS ((unsigned long));
150 static const char * get_dynamic_type
PARAMS ((unsigned long));
151 static int dump_relocations
PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*, unsigned long, char *, int));
152 static char * get_file_type
PARAMS ((unsigned));
153 static char * get_machine_name
PARAMS ((unsigned));
154 static char * get_machine_flags
PARAMS ((unsigned, unsigned));
155 static const char * get_mips_segment_type
PARAMS ((unsigned long));
156 static const char * get_parisc_segment_type
PARAMS ((unsigned long));
157 static const char * get_segment_type
PARAMS ((unsigned long));
158 static const char * get_mips_section_type_name
PARAMS ((unsigned int));
159 static const char * get_parisc_section_type_name
PARAMS ((unsigned int));
160 static const char * get_section_type_name
PARAMS ((unsigned int));
161 static char * get_symbol_binding
PARAMS ((unsigned int));
162 static char * get_symbol_type
PARAMS ((unsigned int));
163 static void usage
PARAMS ((void));
164 static void parse_args
PARAMS ((int, char **));
165 static int process_file_header
PARAMS ((void));
166 static int process_program_headers
PARAMS ((FILE *));
167 static int process_section_headers
PARAMS ((FILE *));
168 static void dynamic_segment_mips_val
PARAMS ((Elf_Internal_Dyn
*));
169 static void dynamic_segment_parisc_val
PARAMS ((Elf_Internal_Dyn
*));
170 static int process_dynamic_segment
PARAMS ((FILE *));
171 static int process_symbol_table
PARAMS ((FILE *));
172 static int process_section_contents
PARAMS ((FILE *));
173 static void process_file
PARAMS ((char *));
174 static int process_relocs
PARAMS ((FILE *));
175 static int process_version_sections
PARAMS ((FILE *));
176 static char * get_ver_flags
PARAMS ((unsigned int));
177 static char * get_symbol_index_type
PARAMS ((unsigned int));
178 static int get_32bit_section_headers
PARAMS ((FILE *));
179 static int get_64bit_section_headers
PARAMS ((FILE *));
180 static int get_32bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
181 static int get_64bit_program_headers
PARAMS ((FILE *, Elf_Internal_Phdr
*));
182 static int get_file_header
PARAMS ((FILE *));
183 static Elf_Internal_Sym
* get_32bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
184 static Elf_Internal_Sym
* get_64bit_elf_symbols
PARAMS ((FILE *, unsigned long, unsigned long));
185 static int * get_dynamic_data
PARAMS ((FILE *, unsigned int));
186 static int get_32bit_dynamic_segment
PARAMS ((FILE *));
187 static int get_64bit_dynamic_segment
PARAMS ((FILE *));
188 #ifdef SUPPORT_DISASSEMBLY
189 static int disassemble_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
191 static int dump_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
192 static int display_debug_section
PARAMS ((Elf32_Internal_Shdr
*, FILE *));
193 static int display_debug_info
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
194 static int display_debug_not_supported
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
195 static int display_debug_lines
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
196 static int display_debug_abbrev
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
197 static int display_debug_aranges
PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
198 static unsigned char * process_abbrev_section
PARAMS ((unsigned char *, unsigned char *));
199 static unsigned long read_leb128
PARAMS ((unsigned char *, int *, int));
200 static int process_extended_line_op
PARAMS ((unsigned char *, int, int));
201 static void reset_state_machine
PARAMS ((int));
202 static char * get_TAG_name
PARAMS ((unsigned long));
203 static char * get_AT_name
PARAMS ((unsigned long));
204 static char * get_FORM_name
PARAMS ((unsigned long));
205 static void free_abbrevs
PARAMS ((void));
206 static void add_abbrev
PARAMS ((unsigned long, unsigned long, int));
207 static void add_abbrev_attr
PARAMS ((unsigned long, unsigned long));
208 static unsigned char * read_and_display_attr
PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long));
209 static unsigned char * display_block
PARAMS ((unsigned char *, unsigned long));
210 static void decode_location_expression
PARAMS ((unsigned char *, unsigned int));
211 static void request_dump
PARAMS ((unsigned int, char));
212 static const char * get_elf_class
PARAMS ((unsigned char));
213 static const char * get_data_encoding
PARAMS ((unsigned char));
214 static const char * get_osabi_name
PARAMS ((unsigned char));
215 static int guess_is_rela
PARAMS ((unsigned long));
216 static char * get_note_type
PARAMS ((unsigned int));
217 static int process_note
PARAMS ((Elf32_Internal_Note
*));
218 static int process_corefile_note_segment
PARAMS ((FILE *, bfd_vma
, bfd_vma
));
219 static int process_corefile_note_segments
PARAMS ((FILE *));
220 static int process_corefile_contents
PARAMS ((FILE *));
222 typedef int Elf32_Word
;
230 #define SECTION_NAME(X) (string_table + (X)->sh_name)
232 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
234 #define BYTE_GET(field) byte_get (field, sizeof (field))
236 /* If we can support a 64 bit data type then BFD64 should be defined
237 and sizeof (bfd_vma) == 8. In this case when translating from an
238 external 8 byte field to an internal field, we can assume that the
239 internal field is also 8 bytes wide and so we can extact all the data.
240 If, however, BFD64 is not defined, then we must assume that the
241 internal data structure only has 4 byte wide fields that are the
242 equivalent of the 8 byte wide external counterparts, and so we must
243 truncate the data. */
245 #define BYTE_GET8(field) byte_get (field, -8)
247 #define BYTE_GET8(field) byte_get (field, 8)
250 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
252 #define GET_DATA_ALLOC(offset, size, var, type, reason) \
253 if (fseek (file, offset, SEEK_SET)) \
255 error (_("Unable to seek to start of %s at %x\n"), reason, offset); \
259 var = (type) malloc (size); \
263 error (_("Out of memory allocating %d bytes for %s\n"), size, reason); \
267 if (fread (var, size, 1, file) != 1) \
269 error (_("Unable to read in %d bytes of %s\n"), size, reason); \
276 #define GET_DATA(offset, var, reason) \
277 if (fseek (file, offset, SEEK_SET)) \
279 error (_("Unable to seek to %x for %s\n"), offset, reason); \
282 else if (fread (& var, sizeof (var), 1, file) != 1) \
284 error (_("Unable to read data at %x for %s\n"), offset, reason); \
288 #define GET_ELF_SYMBOLS(file, offset, size) \
289 (is_32bit_elf ? get_32bit_elf_symbols (file, offset, size) \
290 : get_64bit_elf_symbols (file, offset, size))
293 #ifdef ANSI_PROTOTYPES
295 error (const char * message
, ...)
299 fprintf (stderr
, _("%s: Error: "), program_name
);
300 va_start (args
, message
);
301 vfprintf (stderr
, message
, args
);
307 warn (const char * message
, ...)
311 fprintf (stderr
, _("%s: Warning: "), program_name
);
312 va_start (args
, message
);
313 vfprintf (stderr
, message
, args
);
325 fprintf (stderr
, _("%s: Error: "), program_name
);
327 message
= va_arg (args
, char *);
328 vfprintf (stderr
, message
, args
);
340 fprintf (stderr
, _("%s: Warning: "), program_name
);
342 message
= va_arg (args
, char *);
343 vfprintf (stderr
, message
, args
);
350 byte_get_little_endian (field
, size
)
351 unsigned char * field
;
360 return ((unsigned int) (field
[0]))
361 | (((unsigned int) (field
[1])) << 8);
364 /* We want to extract data from an 8 byte wide field and
365 place it into a 4 byte wide field. Since this is a little
366 endian source we can juts use the 4 byte extraction code. */
369 return ((unsigned long) (field
[0]))
370 | (((unsigned long) (field
[1])) << 8)
371 | (((unsigned long) (field
[2])) << 16)
372 | (((unsigned long) (field
[3])) << 24);
376 /* This is a special case, generated by the BYTE_GET8 macro.
377 It means that we are loading an 8 byte value from a field
378 in an external structure into an 8 byte value in a field
379 in an internal strcuture. */
380 return ((bfd_vma
) (field
[0]))
381 | (((bfd_vma
) (field
[1])) << 8)
382 | (((bfd_vma
) (field
[2])) << 16)
383 | (((bfd_vma
) (field
[3])) << 24)
384 | (((bfd_vma
) (field
[4])) << 32)
385 | (((bfd_vma
) (field
[5])) << 40)
386 | (((bfd_vma
) (field
[6])) << 48)
387 | (((bfd_vma
) (field
[7])) << 56);
390 error (_("Unhandled data length: %d\n"), size
);
395 /* Print a VMA value. */
397 print_vma (vma
, mode
)
407 case FULL_HEX
: printf ("0x"); /* drop through */
408 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
409 case PREFIX_HEX
: printf ("0x"); /* drop through */
410 case HEX
: printf ("%lx", (unsigned long) vma
); break;
411 case DEC
: printf ("%ld", (unsigned long) vma
); break;
412 case DEC_5
: printf ("%5ld", (long) vma
); break;
413 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
434 #if BFD_HOST_64BIT_LONG
437 if (_bfd_int64_high (vma
))
438 printf ("%lx%lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
440 printf ("%lx", _bfd_int64_low (vma
));
445 if (_bfd_int64_high (vma
))
447 printf ("++%ld", _bfd_int64_low (vma
));
449 printf ("%ld", _bfd_int64_low (vma
));
453 if (_bfd_int64_high (vma
))
455 printf ("++%ld", _bfd_int64_low (vma
));
457 printf ("%5ld", _bfd_int64_low (vma
));
461 if (_bfd_int64_high (vma
))
463 printf ("++%lu", _bfd_int64_low (vma
));
465 printf ("%lu", _bfd_int64_low (vma
));
473 byte_get_big_endian (field
, size
)
474 unsigned char * field
;
483 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
486 return ((unsigned long) (field
[3]))
487 | (((unsigned long) (field
[2])) << 8)
488 | (((unsigned long) (field
[1])) << 16)
489 | (((unsigned long) (field
[0])) << 24);
492 /* Although we are extracing data from an 8 byte wide field, we
493 are returning only 4 bytes of data. */
494 return ((unsigned long) (field
[7]))
495 | (((unsigned long) (field
[6])) << 8)
496 | (((unsigned long) (field
[5])) << 16)
497 | (((unsigned long) (field
[4])) << 24);
501 /* This is a special case, generated by the BYTE_GET8 macro.
502 It means that we are loading an 8 byte value from a field
503 in an external structure into an 8 byte value in a field
504 in an internal strcuture. */
505 return ((bfd_vma
) (field
[7]))
506 | (((bfd_vma
) (field
[6])) << 8)
507 | (((bfd_vma
) (field
[5])) << 16)
508 | (((bfd_vma
) (field
[4])) << 24)
509 | (((bfd_vma
) (field
[3])) << 32)
510 | (((bfd_vma
) (field
[2])) << 40)
511 | (((bfd_vma
) (field
[1])) << 48)
512 | (((bfd_vma
) (field
[0])) << 56);
516 error (_("Unhandled data length: %d\n"), size
);
522 /* Guess the relocation sized based on the sized commonly used by the specific machine. */
524 guess_is_rela (e_machine
)
525 unsigned long e_machine
;
529 /* Targets that use REL relocations. */
540 /* Targets that use RELA relocations. */
548 case EM_CYGNUS_MN10200
:
549 case EM_CYGNUS_MN10300
:
557 warn (_("Don't know about relocations on this machine architecture\n"));
562 /* Display the contents of the relocation data found at the specified offset. */
564 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
566 unsigned long rel_offset
;
567 unsigned long rel_size
;
568 Elf_Internal_Sym
* symtab
;
574 Elf_Internal_Rel
* rels
;
575 Elf_Internal_Rela
* relas
;
578 if (is_rela
== UNKNOWN
)
579 is_rela
= guess_is_rela (elf_header
.e_machine
);
585 Elf32_External_Rela
* erelas
;
587 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
588 Elf32_External_Rela
*, "relocs");
590 rel_size
= rel_size
/ sizeof (Elf32_External_Rela
);
592 relas
= (Elf_Internal_Rela
*)
593 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
597 error(_("out of memory parsing relocs"));
601 for (i
= 0; i
< rel_size
; i
++)
603 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
604 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
605 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
610 rels
= (Elf_Internal_Rel
*) relas
;
614 Elf64_External_Rela
* erelas
;
616 GET_DATA_ALLOC (rel_offset
, rel_size
, erelas
,
617 Elf64_External_Rela
*, "relocs");
619 rel_size
= rel_size
/ sizeof (Elf64_External_Rela
);
621 relas
= (Elf_Internal_Rela
*)
622 malloc (rel_size
* sizeof (Elf_Internal_Rela
));
626 error(_("out of memory parsing relocs"));
630 for (i
= 0; i
< rel_size
; i
++)
632 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
633 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
634 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
639 rels
= (Elf_Internal_Rel
*) relas
;
646 Elf32_External_Rel
* erels
;
648 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
649 Elf32_External_Rel
*, "relocs");
651 rel_size
= rel_size
/ sizeof (Elf32_External_Rel
);
653 rels
= (Elf_Internal_Rel
*)
654 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
658 error(_("out of memory parsing relocs"));
662 for (i
= 0; i
< rel_size
; i
++)
664 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
665 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
670 relas
= (Elf_Internal_Rela
*) rels
;
674 Elf64_External_Rel
* erels
;
676 GET_DATA_ALLOC (rel_offset
, rel_size
, erels
,
677 Elf64_External_Rel
*, "relocs");
679 rel_size
= rel_size
/ sizeof (Elf64_External_Rel
);
681 rels
= (Elf_Internal_Rel
*)
682 malloc (rel_size
* sizeof (Elf_Internal_Rel
));
686 error(_("out of memory parsing relocs"));
690 for (i
= 0; i
< rel_size
; i
++)
692 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
693 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
698 relas
= (Elf_Internal_Rela
*) rels
;
704 (_(" Offset Info Type Symbol's Value Symbol's Name Addend\n"));
707 (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
709 for (i
= 0; i
< rel_size
; i
++)
714 bfd_vma symtab_index
;
719 offset
= relas
[i
].r_offset
;
720 info
= relas
[i
].r_info
;
724 offset
= rels
[i
].r_offset
;
725 info
= rels
[i
].r_info
;
730 type
= ELF32_R_TYPE (info
);
731 symtab_index
= ELF32_R_SYM (info
);
735 if (elf_header
.e_machine
== EM_SPARCV9
)
736 type
= ELF64_R_TYPE_ID (info
);
738 type
= ELF64_R_TYPE (info
);
739 /* The #ifdef BFD64 below is to prevent a compile time warning.
740 We know that if we do not have a 64 bit data type that we
741 will never execute this code anyway. */
743 symtab_index
= ELF64_R_SYM (info
);
747 #ifdef _bfd_int64_low
748 printf (" %8.8lx %5.5lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
750 printf (" %8.8lx %5.5lx ", offset
, info
);
753 switch (elf_header
.e_machine
)
760 rtype
= elf_m32r_reloc_type (type
);
765 rtype
= elf_i386_reloc_type (type
);
769 rtype
= elf_m68k_reloc_type (type
);
773 rtype
= elf_i960_reloc_type (type
);
780 rtype
= elf_sparc_reloc_type (type
);
784 rtype
= v850_reloc_type (type
);
788 rtype
= elf_d10v_reloc_type (type
);
792 rtype
= elf_d30v_reloc_type (type
);
796 rtype
= elf_sh_reloc_type (type
);
799 case EM_CYGNUS_MN10300
:
800 rtype
= elf_mn10300_reloc_type (type
);
803 case EM_CYGNUS_MN10200
:
804 rtype
= elf_mn10200_reloc_type (type
);
808 rtype
= elf_fr30_reloc_type (type
);
812 rtype
= elf_mcore_reloc_type (type
);
816 rtype
= elf_ppc_reloc_type (type
);
821 rtype
= elf_mips_reloc_type (type
);
825 rtype
= elf_alpha_reloc_type (type
);
829 rtype
= elf_arm_reloc_type (type
);
833 rtype
= elf_arc_reloc_type (type
);
837 rtype
= elf_hppa_reloc_type (type
);
841 rtype
= elf_pj_reloc_type (type
);
846 #ifdef _bfd_int64_low
847 printf (_("unrecognised: %-7lx"), _bfd_int64_low (type
));
849 printf (_("unrecognised: %-7lx"), type
);
852 printf ("%-21.21s", rtype
);
858 if (symtab_index
>= nsyms
)
859 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
862 Elf_Internal_Sym
* psym
;
864 psym
= symtab
+ symtab_index
;
867 print_vma (psym
->st_value
, LONG_HEX
);
870 if (psym
->st_name
== 0)
872 SECTION_NAME (section_headers
+ psym
->st_shndx
));
873 else if (strtab
== NULL
)
874 printf (_("<string table index %3ld>"), psym
->st_name
);
876 printf ("%-25.25s", strtab
+ psym
->st_name
);
879 printf (" + %lx", (unsigned long) relas
[i
].r_addend
);
885 printf ("%*c", is_32bit_elf
? 34 : 26, ' ');
886 print_vma (relas
[i
].r_addend
, LONG_HEX
);
889 if (elf_header
.e_machine
== EM_SPARCV9
890 && !strcmp (rtype
, "R_SPARC_OLO10"))
891 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
902 get_mips_dynamic_type (type
)
907 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
908 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
909 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
910 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
911 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
912 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
913 case DT_MIPS_MSYM
: return "MIPS_MSYM";
914 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
915 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
916 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
917 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
918 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
919 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
920 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
921 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
922 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
923 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
924 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
925 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
926 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
927 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
928 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
929 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
930 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
931 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
932 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
933 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
934 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
935 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
936 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
937 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
938 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
939 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
940 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
941 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
942 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
943 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
944 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
945 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
946 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
947 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
948 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
949 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
956 get_sparc64_dynamic_type (type
)
961 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
968 get_parisc_dynamic_type (type
)
973 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
974 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
975 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
976 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
977 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
978 case DT_HP_PREINIT
: return "HP_PREINIT";
979 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
980 case DT_HP_NEEDED
: return "HP_NEEDED";
981 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
982 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
983 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
984 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
985 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
992 get_dynamic_type (type
)
995 static char buff
[32];
999 case DT_NULL
: return "NULL";
1000 case DT_NEEDED
: return "NEEDED";
1001 case DT_PLTRELSZ
: return "PLTRELSZ";
1002 case DT_PLTGOT
: return "PLTGOT";
1003 case DT_HASH
: return "HASH";
1004 case DT_STRTAB
: return "STRTAB";
1005 case DT_SYMTAB
: return "SYMTAB";
1006 case DT_RELA
: return "RELA";
1007 case DT_RELASZ
: return "RELASZ";
1008 case DT_RELAENT
: return "RELAENT";
1009 case DT_STRSZ
: return "STRSZ";
1010 case DT_SYMENT
: return "SYMENT";
1011 case DT_INIT
: return "INIT";
1012 case DT_FINI
: return "FINI";
1013 case DT_SONAME
: return "SONAME";
1014 case DT_RPATH
: return "RPATH";
1015 case DT_SYMBOLIC
: return "SYMBOLIC";
1016 case DT_REL
: return "REL";
1017 case DT_RELSZ
: return "RELSZ";
1018 case DT_RELENT
: return "RELENT";
1019 case DT_PLTREL
: return "PLTREL";
1020 case DT_DEBUG
: return "DEBUG";
1021 case DT_TEXTREL
: return "TEXTREL";
1022 case DT_JMPREL
: return "JMPREL";
1023 case DT_BIND_NOW
: return "BIND_NOW";
1024 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1025 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1026 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1027 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1029 case DT_PLTPADSZ
: return "PLTPADSZ";
1030 case DT_MOVEENT
: return "MOVEENT";
1031 case DT_MOVESZ
: return "MOVESZ";
1032 case DT_FEATURE_1
: return "FEATURE_1";
1033 case DT_POSFLAG_1
: return "POSFLAG_1";
1034 case DT_SYMINSZ
: return "SYMINSZ";
1035 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1037 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1038 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1040 case DT_VERSYM
: return "VERSYM";
1042 case DT_RELACOUNT
: return "RELACOUNT";
1043 case DT_RELCOUNT
: return "RELCOUNT";
1044 case DT_FLAGS_1
: return "FLAGS_1";
1045 case DT_VERDEF
: return "VERDEF";
1046 case DT_VERDEFNUM
: return "VERDEFNUM";
1047 case DT_VERNEED
: return "VERNEED";
1048 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1050 case DT_AUXILIARY
: return "AUXILARY";
1051 case DT_USED
: return "USED";
1052 case DT_FILTER
: return "FILTER";
1055 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1057 const char * result
;
1059 switch (elf_header
.e_machine
)
1062 case EM_MIPS_RS4_BE
:
1063 result
= get_mips_dynamic_type (type
);
1066 result
= get_sparc64_dynamic_type (type
);
1076 sprintf (buff
, _("Processor Specific: %lx"), type
);
1078 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1080 const char * result
;
1082 switch (elf_header
.e_machine
)
1085 result
= get_parisc_dynamic_type (type
);
1095 sprintf (buff
, _("Operating System specific: %lx"), type
);
1098 sprintf (buff
, _("<unknown>: %lx"), type
);
1105 get_file_type (e_type
)
1108 static char buff
[32];
1112 case ET_NONE
: return _("NONE (None)");
1113 case ET_REL
: return _("REL (Relocatable file)");
1114 case ET_EXEC
: return _("EXEC (Executable file)");
1115 case ET_DYN
: return _("DYN (Shared object file)");
1116 case ET_CORE
: return _("CORE (Core file)");
1119 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1120 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1121 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1122 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1124 sprintf (buff
, _("<unknown>: %x"), e_type
);
1130 get_machine_name (e_machine
)
1133 static char buff
[32];
1137 case EM_NONE
: return _("None");
1138 case EM_M32
: return "WE32100";
1139 case EM_SPARC
: return "Sparc";
1140 case EM_386
: return "Intel 80386";
1141 case EM_68K
: return "MC68000";
1142 case EM_88K
: return "MC88000";
1143 case EM_486
: return "Intel 80486";
1144 case EM_860
: return "Intel 80860";
1145 case EM_MIPS
: return "MIPS R3000 big-endian";
1146 case EM_S370
: return "Amdahl";
1147 case EM_MIPS_RS4_BE
: return "MIPS R4000 big-endian";
1148 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1149 case EM_PARISC
: return "HPPA";
1150 case EM_PPC_OLD
: return "Power PC (old)";
1151 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1152 case EM_960
: return "Intel 90860";
1153 case EM_PPC
: return "PowerPC";
1154 case EM_V800
: return "NEC V800";
1155 case EM_FR20
: return "Fujitsu FR20";
1156 case EM_RH32
: return "TRW RH32";
1157 case EM_MCORE
: return "MCORE";
1158 case EM_ARM
: return "ARM";
1159 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1160 case EM_SH
: return "Hitachi SH";
1161 case EM_SPARCV9
: return "Sparc v9";
1162 case EM_TRICORE
: return "Siemens Tricore";
1163 case EM_ARC
: return "Argonaut RISC Core";
1164 case EM_H8_300
: return "Hitachi H8/300";
1165 case EM_H8_300H
: return "Hitachi H8/300H";
1166 case EM_H8S
: return "Hitachi H8S";
1167 case EM_H8_500
: return "Hitachi H8/500";
1168 case EM_IA_64
: return "Intel IA-64";
1169 case EM_MIPS_X
: return "Stanford MIPS-X";
1170 case EM_COLDFIRE
: return "Motorola Coldfire";
1171 case EM_68HC12
: return "Motorola M68HC12";
1172 case EM_ALPHA
: return "Alpha";
1173 case EM_CYGNUS_D10V
: return "d10v";
1174 case EM_CYGNUS_D30V
: return "d30v";
1175 case EM_CYGNUS_ARC
: return "Arc";
1176 case EM_CYGNUS_M32R
: return "Mitsubishi M32r";
1177 case EM_CYGNUS_V850
: return "NEC v850";
1178 case EM_CYGNUS_MN10300
: return "mn10300";
1179 case EM_CYGNUS_MN10200
: return "mn10200";
1180 case EM_CYGNUS_FR30
: return "Fujitsu FR30";
1181 case EM_PJ
: return "picoJava";
1183 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1189 get_machine_flags (e_flags
, e_machine
)
1193 static char buf
[1024];
1204 if (e_flags
& EF_CPU32
)
1205 strcat (buf
, ", cpu32");
1209 if (e_flags
& EF_PPC_EMB
)
1210 strcat (buf
, ", emb");
1212 if (e_flags
& EF_PPC_RELOCATABLE
)
1213 strcat (buf
, ", relocatable");
1215 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1216 strcat (buf
, ", relocatable-lib");
1219 case EM_CYGNUS_V850
:
1220 switch (e_flags
& EF_V850_ARCH
)
1223 strcat (buf
, ", v850e");
1226 strcat (buf
, ", v850ea");
1229 strcat (buf
, ", v850");
1232 strcat (buf
, ", unknown v850 architecture variant");
1237 case EM_CYGNUS_M32R
:
1238 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1239 strcat (buf
, ", m32r");
1244 case EM_MIPS_RS4_BE
:
1245 if (e_flags
& EF_MIPS_NOREORDER
)
1246 strcat (buf
, ", noreorder");
1248 if (e_flags
& EF_MIPS_PIC
)
1249 strcat (buf
, ", pic");
1251 if (e_flags
& EF_MIPS_CPIC
)
1252 strcat (buf
, ", cpic");
1254 if (e_flags
& EF_MIPS_ABI2
)
1255 strcat (buf
, ", abi2");
1257 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_1
)
1258 strcat (buf
, ", mips1");
1260 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_2
)
1261 strcat (buf
, ", mips2");
1263 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_3
)
1264 strcat (buf
, ", mips3");
1266 if ((e_flags
& EF_MIPS_ARCH
) == E_MIPS_ARCH_4
)
1267 strcat (buf
, ", mips4");
1271 if (e_flags
& EF_SPARC_32PLUS
)
1272 strcat (buf
, ", v8+");
1274 if (e_flags
& EF_SPARC_SUN_US1
)
1275 strcat (buf
, ", ultrasparcI");
1277 if (e_flags
& EF_SPARC_SUN_US3
)
1278 strcat (buf
, ", ultrasparcIII");
1280 if (e_flags
& EF_SPARC_HAL_R1
)
1281 strcat (buf
, ", halr1");
1283 if (e_flags
& EF_SPARC_LEDATA
)
1284 strcat (buf
, ", ledata");
1286 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
1287 strcat (buf
, ", tso");
1289 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
1290 strcat (buf
, ", pso");
1292 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
1293 strcat (buf
, ", rmo");
1297 switch (e_flags
& EF_PARISC_ARCH
)
1299 case EFA_PARISC_1_0
:
1300 strcpy (buf
, ", PA-RISC 1.0");
1302 case EFA_PARISC_1_1
:
1303 strcpy (buf
, ", PA-RISC 1.1");
1305 case EFA_PARISC_2_0
:
1306 strcpy (buf
, ", PA-RISC 2.0");
1311 if (e_flags
& EF_PARISC_TRAPNIL
)
1312 strcat (buf
, ", trapnil");
1313 if (e_flags
& EF_PARISC_EXT
)
1314 strcat (buf
, ", ext");
1315 if (e_flags
& EF_PARISC_LSB
)
1316 strcat (buf
, ", lsb");
1317 if (e_flags
& EF_PARISC_WIDE
)
1318 strcat (buf
, ", wide");
1319 if (e_flags
& EF_PARISC_NO_KABP
)
1320 strcat (buf
, ", no kabp");
1321 if (e_flags
& EF_PARISC_LAZYSWAP
)
1322 strcat (buf
, ", lazyswap");
1326 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
1327 strcat (buf
, ", new calling convention");
1329 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
1330 strcat (buf
, ", gnu calling convention");
1339 get_mips_segment_type (type
)
1344 case PT_MIPS_REGINFO
:
1346 case PT_MIPS_RTPROC
:
1348 case PT_MIPS_OPTIONS
:
1358 get_parisc_segment_type (type
)
1363 case PT_HP_TLS
: return "HP_TLS";
1364 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
1365 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
1366 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
1367 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
1368 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
1369 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
1370 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
1371 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
1372 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
1373 case PT_HP_PARALLEL
: return "HP_PARALLEL";
1374 case PT_HP_FASTBIND
: return "HP_FASTBIND";
1375 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
1376 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
1385 get_segment_type (p_type
)
1386 unsigned long p_type
;
1388 static char buff
[32];
1392 case PT_NULL
: return "NULL";
1393 case PT_LOAD
: return "LOAD";
1394 case PT_DYNAMIC
: return "DYNAMIC";
1395 case PT_INTERP
: return "INTERP";
1396 case PT_NOTE
: return "NOTE";
1397 case PT_SHLIB
: return "SHLIB";
1398 case PT_PHDR
: return "PHDR";
1401 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
1403 const char * result
;
1405 switch (elf_header
.e_machine
)
1408 case EM_MIPS_RS4_BE
:
1409 result
= get_mips_segment_type (p_type
);
1412 result
= get_parisc_segment_type (p_type
);
1422 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
1424 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
1426 const char * result
;
1428 switch (elf_header
.e_machine
)
1431 result
= get_parisc_segment_type (p_type
);
1441 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
1444 sprintf (buff
, _("<unknown>: %lx"), p_type
);
1451 get_mips_section_type_name (sh_type
)
1452 unsigned int sh_type
;
1456 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1457 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
1458 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1459 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
1460 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
1461 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
1462 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
1463 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
1464 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
1465 case SHT_MIPS_RELD
: return "MIPS_RELD";
1466 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
1467 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
1468 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1469 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
1470 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
1471 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
1472 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
1473 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
1474 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
1475 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
1476 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
1477 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
1478 case SHT_MIPS_LINE
: return "MIPS_LINE";
1479 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
1480 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
1481 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
1482 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
1483 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
1484 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
1485 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1486 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
1487 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
1488 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
1489 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
1490 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
1491 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
1492 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
1493 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
1494 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
1502 get_parisc_section_type_name (sh_type
)
1503 unsigned int sh_type
;
1507 case SHT_PARISC_EXT
: return "PARISC_EXT";
1508 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
1509 case SHT_PARISC_DOC
: return "PARISC_DOC";
1517 get_section_type_name (sh_type
)
1518 unsigned int sh_type
;
1520 static char buff
[32];
1524 case SHT_NULL
: return "NULL";
1525 case SHT_PROGBITS
: return "PROGBITS";
1526 case SHT_SYMTAB
: return "SYMTAB";
1527 case SHT_STRTAB
: return "STRTAB";
1528 case SHT_RELA
: return "RELA";
1529 case SHT_HASH
: return "HASH";
1530 case SHT_DYNAMIC
: return "DYNAMIC";
1531 case SHT_NOTE
: return "NOTE";
1532 case SHT_NOBITS
: return "NOBITS";
1533 case SHT_REL
: return "REL";
1534 case SHT_SHLIB
: return "SHLIB";
1535 case SHT_DYNSYM
: return "DYNSYM";
1536 case SHT_GNU_verdef
: return "VERDEF";
1537 case SHT_GNU_verneed
: return "VERNEED";
1538 case SHT_GNU_versym
: return "VERSYM";
1539 case 0x6ffffff0: return "VERSYM";
1540 case 0x6ffffffc: return "VERDEF";
1541 case 0x7ffffffd: return "AUXILIARY";
1542 case 0x7fffffff: return "FILTER";
1545 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
1547 const char * result
;
1549 switch (elf_header
.e_machine
)
1552 case EM_MIPS_RS4_BE
:
1553 result
= get_mips_section_type_name (sh_type
);
1556 result
= get_parisc_section_type_name (sh_type
);
1566 sprintf (buff
, "SHT_LOPROC+%x", sh_type
- SHT_LOPROC
);
1568 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
1569 sprintf (buff
, "SHT_LOOS+%x", sh_type
- SHT_LOOS
);
1570 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
1571 sprintf (buff
, "SHT_LOUSER+%x", sh_type
- SHT_LOUSER
);
1573 sprintf (buff
, _("<unknown>: %x"), sh_type
);
1579 struct option options
[] =
1581 {"all", no_argument
, 0, 'a'},
1582 {"file-header", no_argument
, 0, 'h'},
1583 {"program-headers", no_argument
, 0, 'l'},
1584 {"headers", no_argument
, 0, 'e'},
1585 {"histogram", no_argument
, 0, 'I'},
1586 {"segments", no_argument
, 0, 'l'},
1587 {"sections", no_argument
, 0, 'S'},
1588 {"section-headers", no_argument
, 0, 'S'},
1589 {"symbols", no_argument
, 0, 's'},
1590 {"syms", no_argument
, 0, 's'},
1591 {"relocs", no_argument
, 0, 'r'},
1592 {"notes", no_argument
, 0, 'n'},
1593 {"dynamic", no_argument
, 0, 'd'},
1594 {"arch-specific", no_argument
, 0, 'A'},
1595 {"version-info", no_argument
, 0, 'V'},
1596 {"use-dynamic", no_argument
, 0, 'D'},
1597 {"hex-dump", required_argument
, 0, 'x'},
1598 {"debug-dump", optional_argument
, 0, 'w'},
1599 #ifdef SUPPORT_DISASSEMBLY
1600 {"instruction-dump", required_argument
, 0, 'i'},
1603 {"version", no_argument
, 0, 'v'},
1604 {"help", no_argument
, 0, 'H'},
1605 {0, no_argument
, 0, 0}
1611 fprintf (stdout
, _("Usage: readelf {options} elf-file(s)\n"));
1612 fprintf (stdout
, _(" Options are:\n"));
1613 fprintf (stdout
, _(" -a or --all Equivalent to: -h -l -S -s -r -d -V -A -I\n"));
1614 fprintf (stdout
, _(" -h or --file-header Display the ELF file header\n"));
1615 fprintf (stdout
, _(" -l or --program-headers or --segments\n"));
1616 fprintf (stdout
, _(" Display the program headers\n"));
1617 fprintf (stdout
, _(" -S or --section-headers or --sections\n"));
1618 fprintf (stdout
, _(" Display the sections' header\n"));
1619 fprintf (stdout
, _(" -e or --headers Equivalent to: -h -l -S\n"));
1620 fprintf (stdout
, _(" -s or --syms or --symbols Display the symbol table\n"));
1621 fprintf (stdout
, _(" -n or --notes Display the core notes (if present)\n"));
1622 fprintf (stdout
, _(" -r or --relocs Display the relocations (if present)\n"));
1623 fprintf (stdout
, _(" -d or --dynamic Display the dynamic segment (if present)\n"));
1624 fprintf (stdout
, _(" -V or --version-info Display the version sections (if present)\n"));
1625 fprintf (stdout
, _(" -A or --arch-specific Display architecture specific information (if any).\n"));
1626 fprintf (stdout
, _(" -D or --use-dynamic Use the dynamic section info when displaying symbols\n"));
1627 fprintf (stdout
, _(" -x <number> or --hex-dump=<number>\n"));
1628 fprintf (stdout
, _(" Dump the contents of section <number>\n"));
1629 fprintf (stdout
, _(" -w[liapr] or --debug-dump[=line,=info,=abbrev,=pubnames,=ranges]\n"));
1630 fprintf (stdout
, _(" Display the contents of DWARF2 debug sections\n"));
1631 #ifdef SUPPORT_DISASSEMBLY
1632 fprintf (stdout
, _(" -i <number> or --instruction-dump=<number>\n"));
1633 fprintf (stdout
, _(" Disassemble the contents of section <number>\n"));
1635 fprintf (stdout
, _(" -I or --histogram Display histogram of bucket list lengths\n"));
1636 fprintf (stdout
, _(" -v or --version Display the version number of readelf\n"));
1637 fprintf (stdout
, _(" -H or --help Display this information\n"));
1638 fprintf (stdout
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
1644 request_dump (section
, type
)
1645 unsigned int section
;
1648 if (section
>= num_dump_sects
)
1650 char * new_dump_sects
;
1652 new_dump_sects
= (char *) calloc (section
+ 1, 1);
1654 if (new_dump_sects
== NULL
)
1655 error (_("Out of memory allocating dump request table."));
1658 /* Copy current flag settings. */
1659 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
1663 dump_sects
= new_dump_sects
;
1664 num_dump_sects
= section
+ 1;
1669 dump_sects
[section
] |= type
;
1675 parse_args (argc
, argv
)
1684 while ((c
= getopt_long
1685 (argc
, argv
, "ersahnldSDAIw::x:i:vV", options
, NULL
)) != EOF
)
1720 do_using_dynamic
++;
1748 section
= strtoul (optarg
, & cp
, 0);
1749 if (! * cp
&& section
>= 0)
1751 request_dump (section
, HEX_DUMP
);
1771 do_debug_abbrevs
= 1;
1781 do_debug_pubnames
= 1;
1786 do_debug_aranges
= 1;
1790 warn (_("Unrecognised debug option '%s'\n"), optarg
);
1795 #ifdef SUPPORT_DISASSEMBLY
1798 section
= strtoul (optarg
, & cp
, 0);
1799 if (! * cp
&& section
>= 0)
1801 request_dump (section
, DISASS_DUMP
);
1807 print_version (program_name
);
1814 /* xgettext:c-format */
1815 error (_("Invalid option '-%c'\n"), c
);
1822 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_sections
1823 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
1824 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
1828 warn (_("Nothing to do.\n"));
1834 get_elf_class (elf_class
)
1835 unsigned char elf_class
;
1837 static char buff
[32];
1841 case ELFCLASSNONE
: return _("none");
1842 case ELFCLASS32
: return _("ELF32");
1843 case ELFCLASS64
: return _("ELF64");
1845 sprintf (buff
, _("<unknown: %x>"), elf_class
);
1851 get_data_encoding (encoding
)
1852 unsigned char encoding
;
1854 static char buff
[32];
1858 case ELFDATANONE
: return _("none");
1859 case ELFDATA2LSB
: return _("2's complement, little endian");
1860 case ELFDATA2MSB
: return _("2's complement, big endian");
1862 sprintf (buff
, _("<unknown: %x>"), encoding
);
1868 get_osabi_name (osabi
)
1869 unsigned char osabi
;
1871 static char buff
[32];
1875 case ELFOSABI_SYSV
: return _("UNIX - System V");
1876 case ELFOSABI_HPUX
: return _("UNIX - HP-UX");
1877 case ELFOSABI_STANDALONE
: return _("Standalone App");
1879 sprintf (buff
, _("<unknown: %x>"), osabi
);
1884 /* Decode the data held in 'elf_header'. */
1886 process_file_header ()
1888 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
1889 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
1890 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
1891 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
1894 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
1902 printf (_("ELF Header:\n"));
1903 printf (_(" Magic: "));
1904 for (i
= 0; i
< EI_NIDENT
; i
++)
1905 printf ("%2.2x ", elf_header
.e_ident
[i
]);
1907 printf (_(" Class: %s\n"),
1908 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
1909 printf (_(" Data: %s\n"),
1910 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
1911 printf (_(" Version: %d %s\n"),
1912 elf_header
.e_ident
[EI_VERSION
],
1913 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
1915 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
1918 printf (_(" OS/ABI: %s\n"),
1919 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
1920 printf (_(" ABI Version: %d\n"),
1921 elf_header
.e_ident
[EI_ABIVERSION
]);
1922 printf (_(" Type: %s\n"),
1923 get_file_type (elf_header
.e_type
));
1924 printf (_(" Machine: %s\n"),
1925 get_machine_name (elf_header
.e_machine
));
1926 printf (_(" Version: 0x%lx\n"),
1927 (unsigned long) elf_header
.e_version
);
1929 printf (_(" Entry point address: "));
1930 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
1931 printf (_("\n Start of program headers: "));
1932 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
1933 printf (_(" (bytes into file)\n Start of section headers: "));
1934 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
1935 printf (_(" (bytes into file)\n"));
1937 printf (_(" Flags: 0x%lx%s\n"),
1938 (unsigned long) elf_header
.e_flags
,
1939 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
1940 printf (_(" Size of this header: %ld (bytes)\n"),
1941 (long) elf_header
.e_ehsize
);
1942 printf (_(" Size of program headers: %ld (bytes)\n"),
1943 (long) elf_header
.e_phentsize
);
1944 printf (_(" Number of program headers: %ld\n"),
1945 (long) elf_header
.e_phnum
);
1946 printf (_(" Size of section headers: %ld (bytes)\n"),
1947 (long) elf_header
.e_shentsize
);
1948 printf (_(" Number of section headers: %ld\n"),
1949 (long) elf_header
.e_shnum
);
1950 printf (_(" Section header string table index: %ld\n"),
1951 (long) elf_header
.e_shstrndx
);
1959 get_32bit_program_headers (file
, program_headers
)
1961 Elf_Internal_Phdr
* program_headers
;
1963 Elf32_External_Phdr
* phdrs
;
1964 Elf32_External_Phdr
* external
;
1965 Elf32_Internal_Phdr
* internal
;
1968 GET_DATA_ALLOC (elf_header
.e_phoff
,
1969 elf_header
.e_phentsize
* elf_header
.e_phnum
,
1970 phdrs
, Elf32_External_Phdr
*, "program headers");
1972 for (i
= 0, internal
= program_headers
, external
= phdrs
;
1973 i
< elf_header
.e_phnum
;
1974 i
++, internal
++, external
++)
1976 internal
->p_type
= BYTE_GET (external
->p_type
);
1977 internal
->p_offset
= BYTE_GET (external
->p_offset
);
1978 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
1979 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
1980 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
1981 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
1982 internal
->p_flags
= BYTE_GET (external
->p_flags
);
1983 internal
->p_align
= BYTE_GET (external
->p_align
);
1992 get_64bit_program_headers (file
, program_headers
)
1994 Elf_Internal_Phdr
* program_headers
;
1996 Elf64_External_Phdr
* phdrs
;
1997 Elf64_External_Phdr
* external
;
1998 Elf64_Internal_Phdr
* internal
;
2001 GET_DATA_ALLOC (elf_header
.e_phoff
,
2002 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2003 phdrs
, Elf64_External_Phdr
*, "program headers");
2005 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2006 i
< elf_header
.e_phnum
;
2007 i
++, internal
++, external
++)
2009 internal
->p_type
= BYTE_GET (external
->p_type
);
2010 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2011 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2012 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2013 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2014 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2015 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2016 internal
->p_align
= BYTE_GET8 (external
->p_align
);
2025 process_program_headers (file
)
2028 Elf_Internal_Phdr
* program_headers
;
2029 Elf_Internal_Phdr
* segment
;
2032 if (elf_header
.e_phnum
== 0)
2035 printf (_("\nThere are no program headers in this file.\n"));
2039 if (do_segments
&& !do_header
)
2041 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
2042 printf (_("Entry point "));
2043 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2044 printf (_("\nThere are %d program headers, starting at offset "),
2045 elf_header
.e_phnum
);
2046 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2050 program_headers
= (Elf_Internal_Phdr
*) malloc
2051 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
2053 if (program_headers
== NULL
)
2055 error (_("Out of memory\n"));
2060 i
= get_32bit_program_headers (file
, program_headers
);
2062 i
= get_64bit_program_headers (file
, program_headers
);
2066 free (program_headers
);
2073 (_("\nProgram Header%s:\n"), elf_header
.e_phnum
> 1 ? "s" : "");
2077 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
2081 (_(" Type Offset VirtAddr PhysAddr\n"));
2083 (_(" FileSiz MemSiz Flags Align\n"));
2091 for (i
= 0, segment
= program_headers
;
2092 i
< elf_header
.e_phnum
;
2097 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
2101 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
2102 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
2103 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
2104 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
2105 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
2107 (segment
->p_flags
& PF_R
? 'R' : ' '),
2108 (segment
->p_flags
& PF_W
? 'W' : ' '),
2109 (segment
->p_flags
& PF_X
? 'E' : ' '));
2110 printf ("%#lx", (unsigned long) segment
->p_align
);
2114 print_vma (segment
->p_offset
, FULL_HEX
);
2116 print_vma (segment
->p_vaddr
, FULL_HEX
);
2118 print_vma (segment
->p_paddr
, FULL_HEX
);
2120 print_vma (segment
->p_filesz
, FULL_HEX
);
2122 print_vma (segment
->p_memsz
, FULL_HEX
);
2124 (segment
->p_flags
& PF_R
? 'R' : ' '),
2125 (segment
->p_flags
& PF_W
? 'W' : ' '),
2126 (segment
->p_flags
& PF_X
? 'E' : ' '));
2127 print_vma (segment
->p_align
, HEX
);
2131 switch (segment
->p_type
)
2135 loadaddr
= (segment
->p_vaddr
& 0xfffff000)
2136 - (segment
->p_offset
& 0xfffff000);
2141 error (_("more than one dynamic segment\n"));
2143 dynamic_addr
= segment
->p_offset
;
2144 dynamic_size
= segment
->p_filesz
;
2148 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
2149 error (_("Unable to find program interpreter name\n"));
2152 program_interpreter
[0] = 0;
2153 fscanf (file
, "%63s", program_interpreter
);
2156 printf (_("\n [Requesting program interpreter: %s]"),
2157 program_interpreter
);
2163 putc ('\n', stdout
);
2172 if (do_segments
&& section_headers
!= NULL
)
2174 printf (_("\n Section to Segment mapping:\n"));
2175 printf (_(" Segment Sections...\n"));
2177 assert (string_table
!= NULL
);
2179 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
2182 Elf_Internal_Shdr
* section
;
2184 segment
= program_headers
+ i
;
2185 section
= section_headers
;
2187 printf (" %2.2d ", i
);
2189 for (j
= 0; j
< elf_header
.e_shnum
; j
++, section
++)
2191 if (section
->sh_size
> 0
2192 /* Compare allocated sections by VMA, unallocated
2193 sections by file offset. */
2194 && (section
->sh_flags
& SHF_ALLOC
2195 ? (section
->sh_addr
>= segment
->p_vaddr
2196 && section
->sh_addr
+ section
->sh_size
2197 <= segment
->p_vaddr
+ segment
->p_memsz
)
2198 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
2199 && (section
->sh_offset
+ section
->sh_size
2200 <= segment
->p_offset
+ segment
->p_filesz
))))
2201 printf ("%s ", SECTION_NAME (section
));
2208 free (program_headers
);
2215 get_32bit_section_headers (file
)
2218 Elf32_External_Shdr
* shdrs
;
2219 Elf32_Internal_Shdr
* internal
;
2222 GET_DATA_ALLOC (elf_header
.e_shoff
,
2223 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2224 shdrs
, Elf32_External_Shdr
*, "section headers");
2226 section_headers
= (Elf_Internal_Shdr
*) malloc
2227 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2229 if (section_headers
== NULL
)
2231 error (_("Out of memory\n"));
2235 for (i
= 0, internal
= section_headers
;
2236 i
< elf_header
.e_shnum
;
2239 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2240 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2241 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
2242 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
2243 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2244 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
2245 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2246 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2247 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2248 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
2257 get_64bit_section_headers (file
)
2260 Elf64_External_Shdr
* shdrs
;
2261 Elf64_Internal_Shdr
* internal
;
2264 GET_DATA_ALLOC (elf_header
.e_shoff
,
2265 elf_header
.e_shentsize
* elf_header
.e_shnum
,
2266 shdrs
, Elf64_External_Shdr
*, "section headers");
2268 section_headers
= (Elf_Internal_Shdr
*) malloc
2269 (elf_header
.e_shnum
* sizeof (Elf_Internal_Shdr
));
2271 if (section_headers
== NULL
)
2273 error (_("Out of memory\n"));
2277 for (i
= 0, internal
= section_headers
;
2278 i
< elf_header
.e_shnum
;
2281 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
2282 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
2283 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
2284 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
2285 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
2286 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
2287 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
2288 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
2289 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
2290 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
2298 static Elf_Internal_Sym
*
2299 get_32bit_elf_symbols (file
, offset
, number
)
2301 unsigned long offset
;
2302 unsigned long number
;
2304 Elf32_External_Sym
* esyms
;
2305 Elf_Internal_Sym
* isyms
;
2306 Elf_Internal_Sym
* psym
;
2309 GET_DATA_ALLOC (offset
, number
* sizeof (Elf32_External_Sym
),
2310 esyms
, Elf32_External_Sym
*, "symbols");
2312 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2316 error (_("Out of memory\n"));
2322 for (j
= 0, psym
= isyms
;
2326 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2327 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
2328 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
2329 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2330 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2331 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2339 static Elf_Internal_Sym
*
2340 get_64bit_elf_symbols (file
, offset
, number
)
2342 unsigned long offset
;
2343 unsigned long number
;
2345 Elf64_External_Sym
* esyms
;
2346 Elf_Internal_Sym
* isyms
;
2347 Elf_Internal_Sym
* psym
;
2350 GET_DATA_ALLOC (offset
, number
* sizeof (Elf64_External_Sym
),
2351 esyms
, Elf64_External_Sym
*, "symbols");
2353 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
2357 error (_("Out of memory\n"));
2363 for (j
= 0, psym
= isyms
;
2367 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
2368 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
2369 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
2370 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
2371 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
2372 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
2381 process_section_headers (file
)
2384 Elf_Internal_Shdr
* section
;
2387 section_headers
= NULL
;
2389 if (elf_header
.e_shnum
== 0)
2392 printf (_("\nThere are no sections in this file.\n"));
2397 if (do_sections
&& !do_header
)
2398 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
2399 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
2403 if (! get_32bit_section_headers (file
))
2406 else if (! get_64bit_section_headers (file
))
2409 /* Read in the string table, so that we have names to display. */
2410 section
= section_headers
+ elf_header
.e_shstrndx
;
2412 if (section
->sh_size
!= 0)
2414 unsigned long string_table_offset
;
2416 string_table_offset
= section
->sh_offset
;
2418 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2419 string_table
, char *, "string table");
2422 /* Scan the sections for the dynamic symbol table
2423 and dynamic string table and debug sections. */
2424 dynamic_symbols
= NULL
;
2425 dynamic_strings
= NULL
;
2426 dynamic_syminfo
= NULL
;
2428 for (i
= 0, section
= section_headers
;
2429 i
< elf_header
.e_shnum
;
2432 char * name
= SECTION_NAME (section
);
2434 if (section
->sh_type
== SHT_DYNSYM
)
2436 if (dynamic_symbols
!= NULL
)
2438 error (_("File contains multiple dynamic symbol tables\n"));
2442 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
2444 GET_ELF_SYMBOLS (file
, section
->sh_offset
, num_dynamic_syms
);
2446 else if (section
->sh_type
== SHT_STRTAB
2447 && strcmp (name
, ".dynstr") == 0)
2449 if (dynamic_strings
!= NULL
)
2451 error (_("File contains multiple dynamic string tables\n"));
2455 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
2456 dynamic_strings
, char *, "dynamic strings");
2458 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
2459 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
)
2460 && strncmp (name
, ".debug_", 7) == 0)
2465 || (do_debug_info
&& (strcmp (name
, "info") == 0))
2466 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
2467 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
2468 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
2469 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
2471 request_dump (i
, DEBUG_DUMP
);
2478 printf (_("\nSection Header%s:\n"), elf_header
.e_shnum
> 1 ? "s" : "");
2481 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
2484 printf (_(" [Nr] Name Type Address Offset\n"));
2485 printf (_(" Size EntSize Flags Link Info Align\n"));
2488 for (i
= 0, section
= section_headers
;
2489 i
< elf_header
.e_shnum
;
2492 printf (" [%2d] %-17.17s %-15.15s ",
2494 SECTION_NAME (section
),
2495 get_section_type_name (section
->sh_type
));
2499 print_vma (section
->sh_addr
, LONG_HEX
);
2501 printf ( " %6.6lx %6.6lx %2.2lx",
2502 (unsigned long) section
->sh_offset
,
2503 (unsigned long) section
->sh_size
,
2504 (unsigned long) section
->sh_entsize
);
2506 printf (" %c%c%c %2ld %3lx %ld\n",
2507 (section
->sh_flags
& SHF_WRITE
? 'W' : ' '),
2508 (section
->sh_flags
& SHF_ALLOC
? 'A' : ' '),
2509 (section
->sh_flags
& SHF_EXECINSTR
? 'X' : ' '),
2510 (unsigned long) section
->sh_link
,
2511 (unsigned long) section
->sh_info
,
2512 (unsigned long) section
->sh_addralign
);
2517 print_vma (section
->sh_addr
, LONG_HEX
);
2518 printf (" %8.8lx", section
->sh_offset
);
2520 print_vma (section
->sh_size
, LONG_HEX
);
2522 print_vma (section
->sh_entsize
, LONG_HEX
);
2525 (section
->sh_flags
& SHF_WRITE
? 'W' : ' '),
2526 (section
->sh_flags
& SHF_ALLOC
? 'A' : ' '),
2527 (section
->sh_flags
& SHF_EXECINSTR
? 'X' : ' '));
2529 printf (" %2ld %3lx %ld\n",
2530 (unsigned long) section
->sh_link
,
2531 (unsigned long) section
->sh_info
,
2532 (unsigned long) section
->sh_addralign
);
2539 /* Process the reloc section. */
2541 process_relocs (file
)
2544 unsigned long rel_size
;
2545 unsigned long rel_offset
;
2551 if (do_using_dynamic
)
2553 int is_rela
= FALSE
;
2558 if (dynamic_info
[DT_REL
])
2560 rel_offset
= dynamic_info
[DT_REL
];
2561 rel_size
= dynamic_info
[DT_RELSZ
];
2564 else if (dynamic_info
[DT_RELA
])
2566 rel_offset
= dynamic_info
[DT_RELA
];
2567 rel_size
= dynamic_info
[DT_RELASZ
];
2570 else if (dynamic_info
[DT_JMPREL
])
2572 rel_offset
= dynamic_info
[DT_JMPREL
];
2573 rel_size
= dynamic_info
[DT_PLTRELSZ
];
2575 switch (dynamic_info
[DT_PLTREL
])
2592 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
2593 rel_offset
, rel_size
);
2595 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
2596 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
, is_rela
);
2599 printf (_("\nThere are no dynamic relocations in this file.\n"));
2603 Elf32_Internal_Shdr
* section
;
2607 for (i
= 0, section
= section_headers
;
2608 i
< elf_header
.e_shnum
;
2611 if ( section
->sh_type
!= SHT_RELA
2612 && section
->sh_type
!= SHT_REL
)
2615 rel_offset
= section
->sh_offset
;
2616 rel_size
= section
->sh_size
;
2620 Elf32_Internal_Shdr
* strsec
;
2621 Elf32_Internal_Shdr
* symsec
;
2622 Elf_Internal_Sym
* symtab
;
2625 unsigned long nsyms
;
2627 printf (_("\nRelocation section "));
2629 if (string_table
== NULL
)
2630 printf ("%d", section
->sh_name
);
2632 printf ("'%s'", SECTION_NAME (section
));
2634 printf (_(" at offset 0x%lx contains %lu entries:\n"),
2635 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
2637 symsec
= section_headers
+ section
->sh_link
;
2639 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
2640 symtab
= GET_ELF_SYMBOLS (file
, symsec
->sh_offset
, nsyms
);
2645 strsec
= section_headers
+ symsec
->sh_link
;
2647 GET_DATA_ALLOC (strsec
->sh_offset
, strsec
->sh_size
, strtab
,
2648 char *, "string table");
2650 is_rela
= section
->sh_type
== SHT_RELA
;
2652 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
);
2662 printf (_("\nThere are no relocations in this file.\n"));
2670 dynamic_segment_mips_val (entry
)
2671 Elf_Internal_Dyn
* entry
;
2673 switch (entry
->d_tag
)
2676 if (entry
->d_un
.d_val
== 0)
2680 static const char * opts
[] =
2682 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
2683 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
2684 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
2685 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
2690 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++ cnt
)
2691 if (entry
->d_un
.d_val
& (1 << cnt
))
2693 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
2700 case DT_MIPS_IVERSION
:
2701 if (dynamic_strings
!= NULL
)
2702 printf ("Interface Version: %s\n",
2703 dynamic_strings
+ entry
->d_un
.d_val
);
2705 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2708 case DT_MIPS_TIME_STAMP
:
2711 time_t time
= entry
->d_un
.d_val
;
2712 strftime (timebuf
, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time
));
2713 printf ("Time Stamp: %s\n", timebuf
);
2717 case DT_MIPS_RLD_VERSION
:
2718 case DT_MIPS_LOCAL_GOTNO
:
2719 case DT_MIPS_CONFLICTNO
:
2720 case DT_MIPS_LIBLISTNO
:
2721 case DT_MIPS_SYMTABNO
:
2722 case DT_MIPS_UNREFEXTNO
:
2723 case DT_MIPS_HIPAGENO
:
2724 case DT_MIPS_DELTA_CLASS_NO
:
2725 case DT_MIPS_DELTA_INSTANCE_NO
:
2726 case DT_MIPS_DELTA_RELOC_NO
:
2727 case DT_MIPS_DELTA_SYM_NO
:
2728 case DT_MIPS_DELTA_CLASSSYM_NO
:
2729 case DT_MIPS_COMPACT_SIZE
:
2730 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
2734 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
2740 dynamic_segment_parisc_val (entry
)
2741 Elf_Internal_Dyn
* entry
;
2743 switch (entry
->d_tag
)
2745 case DT_HP_DLD_FLAGS
:
2754 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
2755 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
2756 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
2757 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
2758 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
2759 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
2760 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
2761 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
2762 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
2763 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
2764 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
2768 bfd_vma val
= entry
->d_un
.d_val
;
2770 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
2771 if (val
& flags
[cnt
].bit
)
2775 fputs (flags
[cnt
].str
, stdout
);
2777 val
^= flags
[cnt
].bit
;
2780 if (val
!= 0 || first
)
2784 print_vma (val
, HEX
);
2790 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
2796 get_32bit_dynamic_segment (file
)
2799 Elf32_External_Dyn
* edyn
;
2800 Elf_Internal_Dyn
* entry
;
2803 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
2804 edyn
, Elf32_External_Dyn
*, "dynamic segment");
2806 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2807 how large this .dynamic is now. We can do this even before the byte
2808 swapping since the DT_NULL tag is recognizable. */
2810 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
2813 dynamic_segment
= (Elf_Internal_Dyn
*)
2814 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
2816 if (dynamic_segment
== NULL
)
2818 error (_("Out of memory\n"));
2823 for (i
= 0, entry
= dynamic_segment
;
2827 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
2828 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
2837 get_64bit_dynamic_segment (file
)
2840 Elf64_External_Dyn
* edyn
;
2841 Elf_Internal_Dyn
* entry
;
2844 GET_DATA_ALLOC (dynamic_addr
, dynamic_size
,
2845 edyn
, Elf64_External_Dyn
*, "dynamic segment");
2847 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
2848 how large this .dynamic is now. We can do this even before the byte
2849 swapping since the DT_NULL tag is recognizable. */
2851 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
2854 dynamic_segment
= (Elf_Internal_Dyn
*)
2855 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
2857 if (dynamic_segment
== NULL
)
2859 error (_("Out of memory\n"));
2864 for (i
= 0, entry
= dynamic_segment
;
2868 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
2869 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
2877 /* Parse and display the contents of the dynamic segment. */
2879 process_dynamic_segment (file
)
2882 Elf_Internal_Dyn
* entry
;
2885 if (dynamic_size
== 0)
2888 printf (_("\nThere is no dynamic segment in this file.\n"));
2895 if (! get_32bit_dynamic_segment (file
))
2898 else if (! get_64bit_dynamic_segment (file
))
2901 /* Find the appropriate symbol table. */
2902 if (dynamic_symbols
== NULL
)
2904 for (i
= 0, entry
= dynamic_segment
;
2908 unsigned long offset
;
2910 if (entry
->d_tag
!= DT_SYMTAB
)
2913 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
2915 /* Since we do not know how big the symbol table is,
2916 we default to reading in the entire file (!) and
2917 processing that. This is overkill, I know, but it
2919 offset
= entry
->d_un
.d_val
- loadaddr
;
2921 if (fseek (file
, 0, SEEK_END
))
2922 error (_("Unable to seek to end of file!"));
2925 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf32_External_Sym
);
2927 num_dynamic_syms
= (ftell (file
) - offset
) / sizeof (Elf64_External_Sym
);
2929 if (num_dynamic_syms
< 1)
2931 error (_("Unable to determine the number of symbols to load\n"));
2935 dynamic_symbols
= GET_ELF_SYMBOLS (file
, offset
, num_dynamic_syms
);
2939 /* Similarly find a string table. */
2940 if (dynamic_strings
== NULL
)
2942 for (i
= 0, entry
= dynamic_segment
;
2946 unsigned long offset
;
2949 if (entry
->d_tag
!= DT_STRTAB
)
2952 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
2954 /* Since we do not know how big the string table is,
2955 we default to reading in the entire file (!) and
2956 processing that. This is overkill, I know, but it
2959 offset
= entry
->d_un
.d_val
- loadaddr
;
2960 if (fseek (file
, 0, SEEK_END
))
2961 error (_("Unable to seek to end of file\n"));
2962 str_tab_len
= ftell (file
) - offset
;
2964 if (str_tab_len
< 1)
2967 (_("Unable to determine the length of the dynamic string table\n"));
2971 GET_DATA_ALLOC (offset
, str_tab_len
, dynamic_strings
, char *,
2972 "dynamic string table");
2978 /* And find the syminfo section if available. */
2979 if (dynamic_syminfo
== NULL
)
2981 unsigned int syminsz
= 0;
2983 for (i
= 0, entry
= dynamic_segment
;
2987 if (entry
->d_tag
== DT_SYMINENT
)
2989 /* Note: these braces are necessary to avoid a syntax
2990 error from the SunOS4 C compiler. */
2991 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
2993 else if (entry
->d_tag
== DT_SYMINSZ
)
2994 syminsz
= entry
->d_un
.d_val
;
2995 else if (entry
->d_tag
== DT_SYMINFO
)
2996 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
2999 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
3001 Elf_External_Syminfo
* extsyminfo
;
3002 Elf_Internal_Syminfo
* syminfo
;
3004 /* There is a syminfo section. Read the data. */
3005 GET_DATA_ALLOC (dynamic_syminfo_offset
, syminsz
, extsyminfo
,
3006 Elf_External_Syminfo
*, "symbol information");
3008 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
3009 if (dynamic_syminfo
== NULL
)
3011 error (_("Out of memory\n"));
3015 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
3016 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
3019 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
3020 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
3027 if (do_dynamic
&& dynamic_addr
)
3028 printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
3029 dynamic_addr
, (long) dynamic_size
);
3031 printf (_(" Tag Type Name/Value\n"));
3033 for (i
= 0, entry
= dynamic_segment
;
3040 print_vma (entry
->d_tag
, FULL_HEX
);
3042 get_dynamic_type (entry
->d_tag
),
3043 (is_32bit_elf
? 27 : 19) - strlen (get_dynamic_type (entry
->d_tag
)),
3047 switch (entry
->d_tag
)
3053 if (entry
->d_tag
== DT_AUXILIARY
)
3054 printf (_("Auxiliary library"));
3056 printf (_("Filter library"));
3058 if (dynamic_strings
)
3059 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
3063 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3072 printf (_("Flags:"));
3073 if (entry
->d_un
.d_val
== 0)
3074 printf (_(" None\n"));
3077 unsigned long int val
= entry
->d_un
.d_val
;
3078 if (val
& DTF_1_PARINIT
)
3080 printf (" PARINIT");
3081 val
^= DTF_1_PARINIT
;
3084 printf (" %lx", val
);
3093 printf (_("Flags:"));
3094 if (entry
->d_un
.d_val
== 0)
3095 printf (_(" None\n"));
3098 unsigned long int val
= entry
->d_un
.d_val
;
3099 if (val
& DF_P1_LAZYLOAD
)
3101 printf (" LAZYLOAD");
3102 val
^= DF_P1_LAZYLOAD
;
3104 if (val
& DF_P1_GROUPPERM
)
3106 printf (" GROUPPERM");
3107 val
^= DF_P1_GROUPPERM
;
3110 printf (" %lx", val
);
3119 printf (_("Flags:"));
3120 if (entry
->d_un
.d_val
== 0)
3121 printf (_(" None\n"));
3124 unsigned long int val
= entry
->d_un
.d_val
;
3130 if (val
& DF_1_GLOBAL
)
3135 if (val
& DF_1_GROUP
)
3140 if (val
& DF_1_NODELETE
)
3142 printf (" NODELETE");
3143 val
^= DF_1_NODELETE
;
3145 if (val
& DF_1_LOADFLTR
)
3147 printf (" LOADFLTR");
3148 val
^= DF_1_LOADFLTR
;
3150 if (val
& DF_1_INITFIRST
)
3152 printf (" INITFIRST");
3153 val
^= DF_1_INITFIRST
;
3155 if (val
& DF_1_NOOPEN
)
3160 if (val
& DF_1_ORIGIN
)
3165 if (val
& DF_1_DIRECT
)
3170 if (val
& DF_1_TRANS
)
3175 if (val
& DF_1_INTERPOSE
)
3177 printf (" INTERPOSE");
3178 val
^= DF_1_INTERPOSE
;
3181 printf (" %lx", val
);
3189 puts (get_dynamic_type (entry
->d_un
.d_val
));
3208 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
3214 if (dynamic_strings
== NULL
)
3217 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3221 switch (entry
->d_tag
)
3224 printf (_("Shared library: [%s]"), name
);
3226 if (strcmp (name
, program_interpreter
) == 0)
3227 printf (_(" program interpreter"));
3231 printf (_("Library soname: [%s]"), name
);
3235 printf (_("Library rpath: [%s]"), name
);
3239 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3244 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3260 case DT_INIT_ARRAYSZ
:
3261 case DT_FINI_ARRAYSZ
:
3264 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3265 printf (" (bytes)\n");
3275 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
3288 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
3292 name
= dynamic_strings
+ entry
->d_un
.d_val
;
3296 printf (_("Not needed object: [%s]\n"), name
);
3301 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3307 /* The value of this entry is ignored. */
3311 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
3312 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
3317 switch (elf_header
.e_machine
)
3320 case EM_MIPS_RS4_BE
:
3321 dynamic_segment_mips_val (entry
);
3324 dynamic_segment_parisc_val (entry
);
3327 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
3339 get_ver_flags (flags
)
3342 static char buff
[32];
3349 if (flags
& VER_FLG_BASE
)
3350 strcat (buff
, "BASE ");
3352 if (flags
& VER_FLG_WEAK
)
3354 if (flags
& VER_FLG_BASE
)
3355 strcat (buff
, "| ");
3357 strcat (buff
, "WEAK ");
3360 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
3361 strcat (buff
, "| <unknown>");
3366 /* Display the contents of the version sections. */
3368 process_version_sections (file
)
3371 Elf32_Internal_Shdr
* section
;
3378 for (i
= 0, section
= section_headers
;
3379 i
< elf_header
.e_shnum
;
3382 switch (section
->sh_type
)
3384 case SHT_GNU_verdef
:
3386 Elf_External_Verdef
* edefs
;
3393 (_("\nVersion definition section '%s' contains %ld entries:\n"),
3394 SECTION_NAME (section
), section
->sh_info
);
3396 printf (_(" Addr: 0x"));
3397 printf_vma (section
->sh_addr
);
3398 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3399 (unsigned long) section
->sh_offset
, section
->sh_link
,
3400 SECTION_NAME (section_headers
+ section
->sh_link
));
3402 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3403 edefs
, Elf_External_Verdef
*,
3404 "version definition section");
3406 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++ cnt
)
3409 Elf_External_Verdef
* edef
;
3410 Elf_Internal_Verdef ent
;
3411 Elf_External_Verdaux
* eaux
;
3412 Elf_Internal_Verdaux aux
;
3416 vstart
= ((char *) edefs
) + idx
;
3418 edef
= (Elf_External_Verdef
*) vstart
;
3420 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
3421 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
3422 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
3423 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
3424 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
3425 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
3426 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
3428 printf (_(" %#06x: Rev: %d Flags: %s"),
3429 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
3431 printf (_(" Index: %d Cnt: %d "),
3432 ent
.vd_ndx
, ent
.vd_cnt
);
3434 vstart
+= ent
.vd_aux
;
3436 eaux
= (Elf_External_Verdaux
*) vstart
;
3438 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3439 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3441 if (dynamic_strings
)
3442 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
3444 printf (_("Name index: %ld\n"), aux
.vda_name
);
3446 isum
= idx
+ ent
.vd_aux
;
3448 for (j
= 1; j
< ent
.vd_cnt
; j
++)
3450 isum
+= aux
.vda_next
;
3451 vstart
+= aux
.vda_next
;
3453 eaux
= (Elf_External_Verdaux
*) vstart
;
3455 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
3456 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
3458 if (dynamic_strings
)
3459 printf (_(" %#06x: Parent %d: %s\n"),
3460 isum
, j
, dynamic_strings
+ aux
.vda_name
);
3462 printf (_(" %#06x: Parent %d, name index: %ld\n"),
3463 isum
, j
, aux
.vda_name
);
3473 case SHT_GNU_verneed
:
3475 Elf_External_Verneed
* eneed
;
3481 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
3482 SECTION_NAME (section
), section
->sh_info
);
3484 printf (_(" Addr: 0x"));
3485 printf_vma (section
->sh_addr
);
3486 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
3487 (unsigned long) section
->sh_offset
, section
->sh_link
,
3488 SECTION_NAME (section_headers
+ section
->sh_link
));
3490 GET_DATA_ALLOC (section
->sh_offset
, section
->sh_size
,
3491 eneed
, Elf_External_Verneed
*,
3492 "version need section");
3494 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
3496 Elf_External_Verneed
* entry
;
3497 Elf_Internal_Verneed ent
;
3502 vstart
= ((char *) eneed
) + idx
;
3504 entry
= (Elf_External_Verneed
*) vstart
;
3506 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
3507 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
3508 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
3509 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
3510 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
3512 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
3514 if (dynamic_strings
)
3515 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
3517 printf (_(" File: %lx"), ent
.vn_file
);
3519 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
3521 vstart
+= ent
.vn_aux
;
3523 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
3525 Elf_External_Vernaux
* eaux
;
3526 Elf_Internal_Vernaux aux
;
3528 eaux
= (Elf_External_Vernaux
*) vstart
;
3530 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
3531 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
3532 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
3533 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
3534 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
3536 if (dynamic_strings
)
3537 printf (_(" %#06x: Name: %s"),
3538 isum
, dynamic_strings
+ aux
.vna_name
);
3540 printf (_(" %#06x: Name index: %lx"),
3541 isum
, aux
.vna_name
);
3543 printf (_(" Flags: %s Version: %d\n"),
3544 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
3546 isum
+= aux
.vna_next
;
3547 vstart
+= aux
.vna_next
;
3557 case SHT_GNU_versym
:
3559 Elf32_Internal_Shdr
* link_section
;
3562 unsigned char * edata
;
3563 unsigned short * data
;
3565 Elf_Internal_Sym
* symbols
;
3566 Elf32_Internal_Shdr
* string_sec
;
3568 link_section
= section_headers
+ section
->sh_link
;
3569 total
= section
->sh_size
/ section
->sh_entsize
;
3573 symbols
= GET_ELF_SYMBOLS (file
, link_section
->sh_offset
,
3574 link_section
->sh_size
/ link_section
->sh_entsize
);
3576 string_sec
= section_headers
+ link_section
->sh_link
;
3578 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
3579 strtab
, char *, "version string table");
3581 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
3582 SECTION_NAME (section
), total
);
3584 printf (_(" Addr: "));
3585 printf_vma (section
->sh_addr
);
3586 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
3587 (unsigned long) section
->sh_offset
, section
->sh_link
,
3588 SECTION_NAME (link_section
));
3590 GET_DATA_ALLOC (version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
3592 total
* sizeof (short), edata
,
3593 unsigned char *, "version symbol data");
3595 data
= (unsigned short *) malloc (total
* sizeof (short));
3597 for (cnt
= total
; cnt
--;)
3598 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
3603 for (cnt
= 0; cnt
< total
; cnt
+= 4)
3607 printf (" %03x:", cnt
);
3609 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
3610 switch (data
[cnt
+ j
])
3613 fputs (_(" 0 (*local*) "), stdout
);
3617 fputs (_(" 1 (*global*) "), stdout
);
3621 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
3622 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
3624 if (symbols
[cnt
+ j
].st_shndx
< SHN_LORESERVE
3625 && section_headers
[symbols
[cnt
+ j
].st_shndx
].sh_type
3628 /* We must test both. */
3629 Elf_Internal_Verneed ivn
;
3630 unsigned long offset
;
3632 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
3637 Elf_External_Verneed evn
;
3638 Elf_External_Vernaux evna
;
3639 Elf_Internal_Vernaux ivna
;
3640 unsigned long vna_off
;
3642 GET_DATA (offset
, evn
, "version need");
3644 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
3645 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
3647 vna_off
= offset
+ ivn
.vn_aux
;
3651 GET_DATA (vna_off
, evna
,
3652 "version need aux (1)");
3654 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
3655 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
3657 vna_off
+= ivna
.vna_next
;
3659 while (ivna
.vna_other
!= data
[cnt
+ j
]
3660 && ivna
.vna_next
!= 0);
3662 if (ivna
.vna_other
== data
[cnt
+ j
])
3664 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
3666 nn
+= printf ("(%s%-*s",
3667 strtab
+ ivna
.vna_name
,
3673 else if (ivn
.vn_next
== 0)
3675 if (data
[cnt
+ j
] != 0x8001)
3677 Elf_Internal_Verdef ivd
;
3678 Elf_External_Verdef evd
;
3680 offset
= version_info
3681 [DT_VERSIONTAGIDX (DT_VERDEF
)]
3686 GET_DATA (offset
, evd
,
3687 "version definition");
3689 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
3690 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
3692 offset
+= ivd
.vd_next
;
3695 != (data
[cnt
+ j
] & 0x7fff)
3696 && ivd
.vd_next
!= 0);
3699 == (data
[cnt
+ j
] & 0x7fff))
3701 Elf_External_Verdaux evda
;
3702 Elf_Internal_Verdaux ivda
;
3704 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
3706 GET_DATA (offset
+ ivd
.vd_aux
, evda
,
3707 "version definition aux");
3710 BYTE_GET (evda
.vda_name
);
3714 strtab
+ ivda
.vda_name
,
3725 offset
+= ivn
.vn_next
;
3727 while (ivn
.vn_next
);
3729 else if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
3731 Elf_Internal_Verneed ivn
;
3732 unsigned long offset
;
3734 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
3739 Elf_Internal_Vernaux ivna
;
3740 Elf_External_Verneed evn
;
3741 Elf_External_Vernaux evna
;
3742 unsigned long a_off
;
3744 GET_DATA (offset
, evn
, "version need");
3746 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
3747 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
3749 a_off
= offset
+ ivn
.vn_aux
;
3753 GET_DATA (a_off
, evna
,
3754 "version need aux (2)");
3756 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
3757 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
3759 a_off
+= ivna
.vna_next
;
3761 while (ivna
.vna_other
!= data
[cnt
+ j
]
3762 && ivna
.vna_next
!= 0);
3764 if (ivna
.vna_other
== data
[cnt
+ j
])
3766 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
3768 nn
+= printf ("(%s%-*s",
3769 strtab
+ ivna
.vna_name
,
3776 offset
+= ivn
.vn_next
;
3778 while (ivn
.vn_next
);
3780 else if (data
[cnt
+ j
] != 0x8001)
3782 Elf_Internal_Verdef ivd
;
3783 Elf_External_Verdef evd
;
3784 unsigned long offset
;
3786 offset
= version_info
3787 [DT_VERSIONTAGIDX (DT_VERDEF
)] - loadaddr
;
3791 GET_DATA (offset
, evd
, "version def");
3793 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
3794 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
3796 offset
+= ivd
.vd_next
;
3798 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
3799 && ivd
.vd_next
!= 0);
3801 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
3803 Elf_External_Verdaux evda
;
3804 Elf_Internal_Verdaux ivda
;
3806 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
3808 GET_DATA (offset
- ivd
.vd_next
+ ivd
.vd_aux
,
3809 evda
, "version def aux");
3811 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
3813 nn
+= printf ("(%s%-*s",
3814 strtab
+ ivda
.vda_name
,
3822 printf ("%*c", 18 - nn
, ' ');
3840 printf (_("\nNo version information found in this file.\n"));
3846 get_symbol_binding (binding
)
3847 unsigned int binding
;
3849 static char buff
[32];
3853 case STB_LOCAL
: return "LOCAL";
3854 case STB_GLOBAL
: return "GLOBAL";
3855 case STB_WEAK
: return "WEAK";
3857 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
3858 sprintf (buff
, _("<processor specific>: %d"), binding
);
3859 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
3860 sprintf (buff
, _("<OS specific>: %d"), binding
);
3862 sprintf (buff
, _("<unknown>: %d"), binding
);
3868 get_symbol_type (type
)
3871 static char buff
[32];
3875 case STT_NOTYPE
: return "NOTYPE";
3876 case STT_OBJECT
: return "OBJECT";
3877 case STT_FUNC
: return "FUNC";
3878 case STT_SECTION
: return "SECTION";
3879 case STT_FILE
: return "FILE";
3881 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
3883 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
3884 return "THUMB_FUNC";
3886 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
3889 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
3890 return "PARISC_MILLI";
3892 sprintf (buff
, _("<processor specific>: %d"), type
);
3894 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
3896 if (elf_header
.e_machine
== EM_PARISC
)
3898 if (type
== STT_HP_OPAQUE
)
3900 if (type
== STT_HP_STUB
)
3904 sprintf (buff
, _("<OS specific>: %d"), type
);
3907 sprintf (buff
, _("<unknown>: %d"), type
);
3913 get_symbol_index_type (type
)
3918 case SHN_UNDEF
: return "UND";
3919 case SHN_ABS
: return "ABS";
3920 case SHN_COMMON
: return "COM";
3922 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
3924 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
3926 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
3930 static char buff
[32];
3932 sprintf (buff
, "%3d", type
);
3940 get_dynamic_data (file
, number
)
3942 unsigned int number
;
3947 e_data
= (char *) malloc (number
* 4);
3951 error (_("Out of memory\n"));
3955 if (fread (e_data
, 4, number
, file
) != number
)
3957 error (_("Unable to read in dynamic data\n"));
3961 i_data
= (int *) malloc (number
* sizeof (* i_data
));
3965 error (_("Out of memory\n"));
3971 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
3978 /* Dump the symbol table */
3980 process_symbol_table (file
)
3983 Elf32_Internal_Shdr
* section
;
3988 int * buckets
= NULL
;
3989 int * chains
= NULL
;
3991 if (! do_syms
&& !do_histogram
)
3994 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
3997 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
3999 error (_("Unable to seek to start of dynamic information"));
4003 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
4005 error (_("Failed to read in number of buckets\n"));
4009 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
4011 error (_("Failed to read in number of chains\n"));
4015 nbuckets
= byte_get (nb
, 4);
4016 nchains
= byte_get (nc
, 4);
4018 buckets
= get_dynamic_data (file
, nbuckets
);
4019 chains
= get_dynamic_data (file
, nchains
);
4021 if (buckets
== NULL
|| chains
== NULL
)
4026 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
4031 printf (_("\nSymbol table for image:\n"));
4033 printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
4035 printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
4037 for (hn
= 0; hn
< nbuckets
; hn
++)
4042 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
4044 Elf_Internal_Sym
* psym
;
4046 psym
= dynamic_symbols
+ si
;
4048 printf (" %3d %3d: ", si
, hn
);
4049 print_vma (psym
->st_value
, LONG_HEX
);
4051 print_vma (psym
->st_size
, DEC_5
);
4053 printf (" %6s %6s %2d ",
4054 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
4055 get_symbol_binding (ELF_ST_BIND (psym
->st_info
)),
4058 printf ("%3.3s", get_symbol_index_type (psym
->st_shndx
));
4060 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
4064 else if (do_syms
&& !do_using_dynamic
)
4068 for (i
= 0, section
= section_headers
;
4069 i
< elf_header
.e_shnum
;
4074 Elf_Internal_Sym
* symtab
;
4075 Elf_Internal_Sym
* psym
;
4078 if ( section
->sh_type
!= SHT_SYMTAB
4079 && section
->sh_type
!= SHT_DYNSYM
)
4082 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
4083 SECTION_NAME (section
),
4084 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
4086 printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
4088 printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
4090 symtab
= GET_ELF_SYMBOLS (file
, section
->sh_offset
,
4091 section
->sh_size
/ section
->sh_entsize
);
4095 if (section
->sh_link
== elf_header
.e_shstrndx
)
4096 strtab
= string_table
;
4099 Elf32_Internal_Shdr
* string_sec
;
4101 string_sec
= section_headers
+ section
->sh_link
;
4103 GET_DATA_ALLOC (string_sec
->sh_offset
, string_sec
->sh_size
,
4104 strtab
, char *, "string table");
4107 for (si
= 0, psym
= symtab
;
4108 si
< section
->sh_size
/ section
->sh_entsize
;
4111 printf ("%6d: ", si
);
4112 print_vma (psym
->st_value
, LONG_HEX
);
4114 print_vma (psym
->st_size
, DEC_5
);
4115 printf (" %-7s %-6s %2d ",
4116 get_symbol_type (ELF_ST_TYPE (psym
->st_info
)),
4117 get_symbol_binding (ELF_ST_BIND (psym
->st_info
)),
4120 printf ("%4s", get_symbol_index_type (psym
->st_shndx
));
4122 printf (" %s", strtab
+ psym
->st_name
);
4124 if (section
->sh_type
== SHT_DYNSYM
&&
4125 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
4127 unsigned char data
[2];
4128 unsigned short vers_data
;
4129 unsigned long offset
;
4133 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
4136 GET_DATA (offset
+ si
* sizeof (vers_data
), data
,
4139 vers_data
= byte_get (data
, 2);
4141 is_nobits
= psym
->st_shndx
< SHN_LORESERVE
?
4142 (section_headers
[psym
->st_shndx
].sh_type
== SHT_NOBITS
)
4145 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
4147 if ((vers_data
& 0x8000) || vers_data
> 1)
4149 if (is_nobits
|| ! check_def
)
4151 Elf_External_Verneed evn
;
4152 Elf_Internal_Verneed ivn
;
4153 Elf_Internal_Vernaux ivna
;
4155 /* We must test both. */
4156 offset
= version_info
4157 [DT_VERSIONTAGIDX (DT_VERNEED
)] - loadaddr
;
4159 GET_DATA (offset
, evn
, "version need");
4161 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
4162 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
4166 unsigned long vna_off
;
4168 vna_off
= offset
+ ivn
.vn_aux
;
4172 Elf_External_Vernaux evna
;
4174 GET_DATA (vna_off
, evna
,
4175 "version need aux (3)");
4177 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
4178 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
4179 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
4181 vna_off
+= ivna
.vna_next
;
4183 while (ivna
.vna_other
!= vers_data
4184 && ivna
.vna_next
!= 0);
4186 if (ivna
.vna_other
== vers_data
)
4189 offset
+= ivn
.vn_next
;
4191 while (ivn
.vn_next
!= 0);
4193 if (ivna
.vna_other
== vers_data
)
4196 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
4199 else if (! is_nobits
)
4200 error (_("bad dynamic symbol"));
4207 if (vers_data
!= 0x8001)
4209 Elf_Internal_Verdef ivd
;
4210 Elf_Internal_Verdaux ivda
;
4211 Elf_External_Verdaux evda
;
4212 unsigned long offset
;
4215 version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
4220 Elf_External_Verdef evd
;
4222 GET_DATA (offset
, evd
, "version def");
4224 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
4225 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
4226 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
4228 offset
+= ivd
.vd_next
;
4230 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
4231 && ivd
.vd_next
!= 0);
4233 offset
-= ivd
.vd_next
;
4234 offset
+= ivd
.vd_aux
;
4236 GET_DATA (offset
, evda
, "version def aux");
4238 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
4240 if (psym
->st_name
!= ivda
.vda_name
)
4241 printf ((vers_data
& 0x8000)
4243 strtab
+ ivda
.vda_name
);
4253 if (strtab
!= string_table
)
4259 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
4261 if (do_histogram
&& buckets
!= NULL
)
4268 int nzero_counts
= 0;
4271 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
4273 printf (_(" Length Number %% of total Coverage\n"));
4275 lengths
= (int *) calloc (nbuckets
, sizeof (int));
4276 if (lengths
== NULL
)
4278 error (_("Out of memory"));
4281 for (hn
= 0; hn
< nbuckets
; ++hn
)
4286 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
4289 if (maxlength
< ++lengths
[hn
])
4294 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
4297 error (_("Out of memory"));
4301 for (hn
= 0; hn
< nbuckets
; ++hn
)
4302 ++ counts
[lengths
[hn
]];
4306 printf (" 0 %-10d (%5.1f%%)\n",
4307 counts
[0], (counts
[0] * 100.0) / nbuckets
);
4308 for (si
= 1; si
<= maxlength
; ++si
)
4310 nzero_counts
+= counts
[si
] * si
;
4311 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
4312 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
4313 (nzero_counts
* 100.0) / nsyms
);
4321 if (buckets
!= NULL
)
4331 process_syminfo (file
)
4332 FILE * file ATTRIBUTE_UNUSED
;
4336 if (dynamic_syminfo
== NULL
4338 /* No syminfo, this is ok. */
4341 /* There better should be a dynamic symbol section. */
4342 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
4346 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
4347 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
4349 printf (_(" Num: Name BoundTo Flags\n"));
4350 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
4352 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
4354 printf ("%4d: %-30s ", i
,
4355 dynamic_strings
+ dynamic_symbols
[i
].st_name
);
4357 switch (dynamic_syminfo
[i
].si_boundto
)
4359 case SYMINFO_BT_SELF
:
4360 fputs ("SELF ", stdout
);
4362 case SYMINFO_BT_PARENT
:
4363 fputs ("PARENT ", stdout
);
4366 if (dynamic_syminfo
[i
].si_boundto
> 0
4367 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
4370 + dynamic_segment
[dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
);
4372 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
4376 if (flags
& SYMINFO_FLG_DIRECT
)
4378 if (flags
& SYMINFO_FLG_PASSTHRU
)
4379 printf (" PASSTHRU");
4380 if (flags
& SYMINFO_FLG_COPY
)
4382 if (flags
& SYMINFO_FLG_LAZYLOAD
)
4383 printf (" LAZYLOAD");
4391 #ifdef SUPPORT_DISASSEMBLY
4393 disassemble_section (section
, file
)
4394 Elf32_Internal_Shdr
* section
;
4397 printf (_("\nAssembly dump of section %s\n"),
4398 SECTION_NAME (section
));
4400 /* XXX -- to be done --- XXX */
4407 dump_section (section
, file
)
4408 Elf32_Internal_Shdr
* section
;
4411 bfd_size_type bytes
;
4413 unsigned char * data
;
4414 unsigned char * start
;
4416 bytes
= section
->sh_size
;
4420 printf (_("\nSection '%s' has no data to dump.\n"),
4421 SECTION_NAME (section
));
4425 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
4427 addr
= section
->sh_addr
;
4429 GET_DATA_ALLOC (section
->sh_offset
, bytes
, start
, unsigned char *,
4440 lbytes
= (bytes
> 16 ? 16 : bytes
);
4442 printf (" 0x%8.8lx ", (unsigned long) addr
);
4444 switch (elf_header
.e_ident
[EI_DATA
])
4448 for (j
= 15; j
>= 0; j
--)
4451 printf ("%2.2x", data
[j
]);
4461 for (j
= 0; j
< 16; j
++)
4464 printf ("%2.2x", data
[j
]);
4474 for (j
= 0; j
< lbytes
; j
++)
4477 if (k
>= ' ' && k
< 0x80)
4496 static unsigned long int
4497 read_leb128 (data
, length_return
, sign
)
4498 unsigned char * data
;
4499 int * length_return
;
4502 unsigned long int result
= 0;
4503 unsigned int num_read
= 0;
4512 result
|= (byte
& 0x7f) << shift
;
4517 while (byte
& 0x80);
4519 if (length_return
!= NULL
)
4520 * length_return
= num_read
;
4522 if (sign
&& (shift
< 32) && (byte
& 0x40))
4523 result
|= -1 << shift
;
4528 typedef struct State_Machine_Registers
4530 unsigned long address
;
4533 unsigned int column
;
4537 /* This variable hold the number of the last entry seen
4538 in the File Table. */
4539 unsigned int last_file_entry
;
4542 static SMR state_machine_regs
;
4545 reset_state_machine (is_stmt
)
4548 state_machine_regs
.address
= 0;
4549 state_machine_regs
.file
= 1;
4550 state_machine_regs
.line
= 1;
4551 state_machine_regs
.column
= 0;
4552 state_machine_regs
.is_stmt
= is_stmt
;
4553 state_machine_regs
.basic_block
= 0;
4554 state_machine_regs
.end_sequence
= 0;
4555 state_machine_regs
.last_file_entry
= 0;
4558 /* Handled an extend line op. Returns true if this is the end
4561 process_extended_line_op (data
, is_stmt
, pointer_size
)
4562 unsigned char * data
;
4566 unsigned char op_code
;
4569 unsigned char * name
;
4572 len
= read_leb128 (data
, & bytes_read
, 0);
4577 warn (_("badly formed extended line op encountered!"));
4582 op_code
= * data
++;
4584 printf (_(" Extended opcode %d: "), op_code
);
4588 case DW_LNE_end_sequence
:
4589 printf (_("End of Sequence\n\n"));
4590 reset_state_machine (is_stmt
);
4593 case DW_LNE_set_address
:
4594 adr
= byte_get (data
, pointer_size
);
4595 printf (_("set Address to 0x%lx\n"), adr
);
4596 state_machine_regs
.address
= adr
;
4599 case DW_LNE_define_file
:
4600 printf (_(" define new File Table entry\n"));
4601 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4603 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
4605 data
+= strlen (data
) + 1;
4606 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4608 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4610 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4611 printf (_("%s\n\n"), name
);
4615 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
4622 /* Size of pointers in the .debug_line section. This information is not
4623 really present in that section. It's obtained before dumping the debug
4624 sections by doing some pre-scan of the .debug_info section. */
4625 static int debug_line_pointer_size
= 4;
4628 display_debug_lines (section
, start
, file
)
4629 Elf32_Internal_Shdr
* section
;
4630 unsigned char * start
;
4631 FILE * file ATTRIBUTE_UNUSED
;
4633 DWARF2_External_LineInfo
* external
;
4634 DWARF2_Internal_LineInfo info
;
4635 unsigned char * standard_opcodes
;
4636 unsigned char * data
= start
;
4637 unsigned char * end
= start
+ section
->sh_size
;
4638 unsigned char * end_of_sequence
;
4641 printf (_("\nDump of debug contents of section %s:\n\n"),
4642 SECTION_NAME (section
));
4646 external
= (DWARF2_External_LineInfo
*) data
;
4648 /* Check the length of the block. */
4649 info
.li_length
= BYTE_GET (external
->li_length
);
4650 if (info
.li_length
> section
->sh_size
)
4653 (_("The line info appears to be corrupt - the section is too small\n"));
4657 /* Check its version number. */
4658 info
.li_version
= BYTE_GET (external
->li_version
);
4659 if (info
.li_version
!= 2)
4661 warn (_("Only DWARF version 2 line info is currently supported.\n"));
4665 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
4666 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
4667 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
4668 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
4669 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
4670 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
4672 /* Sign extend the line base field. */
4673 info
.li_line_base
<<= 24;
4674 info
.li_line_base
>>= 24;
4676 printf (_(" Length: %ld\n"), info
.li_length
);
4677 printf (_(" DWARF Version: %d\n"), info
.li_version
);
4678 printf (_(" Prolgue Length: %d\n"), info
.li_prologue_length
);
4679 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
4680 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
4681 printf (_(" Line Base: %d\n"), info
.li_line_base
);
4682 printf (_(" Line Range: %d\n"), info
.li_line_range
);
4683 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
4685 end_of_sequence
= data
+ info
.li_length
+ sizeof (info
.li_length
);
4687 reset_state_machine (info
.li_default_is_stmt
);
4689 /* Display the contents of the Opcodes table. */
4690 standard_opcodes
= data
+ sizeof (* external
);
4692 printf (_("\n Opcodes:\n"));
4694 for (i
= 1; i
< info
.li_opcode_base
; i
++)
4695 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
4697 /* Display the contents of the Directory table. */
4698 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
4701 printf (_("\n The Directory Table is empty.\n"));
4704 printf (_("\n The Directory Table:\n"));
4708 printf (_(" %s\n"), data
);
4710 data
+= strlen (data
) + 1;
4714 /* Skip the NUL at the end of the table. */
4717 /* Display the contents of the File Name table. */
4719 printf (_("\n The File Name Table is empty.\n"));
4722 printf (_("\n The File Name Table:\n"));
4723 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
4730 printf (_(" %d\t"), ++ state_machine_regs
.last_file_entry
);
4733 data
+= strlen (data
) + 1;
4735 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4737 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4739 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
4741 printf (_("%s\n"), name
);
4745 /* Skip the NUL at the end of the table. */
4748 /* Now display the statements. */
4749 printf (_("\n Line Number Statements:\n"));
4752 while (data
< end_of_sequence
)
4754 unsigned char op_code
;
4758 op_code
= * data
++;
4762 case DW_LNS_extended_op
:
4763 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
4764 debug_line_pointer_size
);
4768 printf (_(" Copy\n"));
4771 case DW_LNS_advance_pc
:
4772 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
4774 state_machine_regs
.address
+= adv
;
4775 printf (_(" Advance PC by %d to %lx\n"), adv
,
4776 state_machine_regs
.address
);
4779 case DW_LNS_advance_line
:
4780 adv
= read_leb128 (data
, & bytes_read
, 1);
4782 state_machine_regs
.line
+= adv
;
4783 printf (_(" Advance Line by %d to %d\n"), adv
,
4784 state_machine_regs
.line
);
4787 case DW_LNS_set_file
:
4788 adv
= read_leb128 (data
, & bytes_read
, 0);
4790 printf (_(" Set File Name to entry %d in the File Name Table\n"),
4792 state_machine_regs
.file
= adv
;
4795 case DW_LNS_set_column
:
4796 adv
= read_leb128 (data
, & bytes_read
, 0);
4798 printf (_(" Set column to %d\n"), adv
);
4799 state_machine_regs
.column
= adv
;
4802 case DW_LNS_negate_stmt
:
4803 adv
= state_machine_regs
.is_stmt
;
4805 printf (_(" Set is_stmt to %d\n"), adv
);
4806 state_machine_regs
.is_stmt
= adv
;
4809 case DW_LNS_set_basic_block
:
4810 printf (_(" Set basic block\n"));
4811 state_machine_regs
.basic_block
= 1;
4814 case DW_LNS_const_add_pc
:
4815 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
4816 * info
.li_min_insn_length
);
4817 state_machine_regs
.address
+= adv
;
4818 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
4819 state_machine_regs
.address
);
4822 case DW_LNS_fixed_advance_pc
:
4823 adv
= byte_get (data
, 2);
4825 state_machine_regs
.address
+= adv
;
4826 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
4827 adv
, state_machine_regs
.address
);
4831 op_code
-= info
.li_opcode_base
;
4832 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
4833 state_machine_regs
.address
+= adv
;
4834 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
4835 op_code
, adv
, state_machine_regs
.address
);
4836 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
4837 state_machine_regs
.line
+= adv
;
4838 printf (_(" and Line by %d to %d\n"),
4839 adv
, state_machine_regs
.line
);
4850 display_debug_pubnames (section
, start
, file
)
4851 Elf32_Internal_Shdr
* section
;
4852 unsigned char * start
;
4853 FILE * file ATTRIBUTE_UNUSED
;
4855 DWARF2_External_PubNames
* external
;
4856 DWARF2_Internal_PubNames pubnames
;
4857 unsigned char * end
;
4859 end
= start
+ section
->sh_size
;
4861 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
4865 unsigned char * data
;
4866 unsigned long offset
;
4868 external
= (DWARF2_External_PubNames
*) start
;
4870 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
4871 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
4872 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
4873 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
4875 data
= start
+ sizeof (* external
);
4876 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
4878 if (pubnames
.pn_version
!= 2)
4880 warn (_("Only DWARF 2 pubnames are currently supported"));
4884 printf (_(" Length: %ld\n"),
4885 pubnames
.pn_length
);
4886 printf (_(" Version: %d\n"),
4887 pubnames
.pn_version
);
4888 printf (_(" Offset into .debug_info section: %ld\n"),
4889 pubnames
.pn_offset
);
4890 printf (_(" Size of area in .debug_info section: %ld\n"),
4893 printf (_("\n Offset\tName\n"));
4897 offset
= byte_get (data
, 4);
4902 printf (" %ld\t\t%s\n", offset
, data
);
4903 data
+= strlen (data
) + 1;
4906 while (offset
!= 0);
4919 case DW_TAG_padding
: return "DW_TAG_padding";
4920 case DW_TAG_array_type
: return "DW_TAG_array_type";
4921 case DW_TAG_class_type
: return "DW_TAG_class_type";
4922 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
4923 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
4924 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
4925 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
4926 case DW_TAG_label
: return "DW_TAG_label";
4927 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
4928 case DW_TAG_member
: return "DW_TAG_member";
4929 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
4930 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
4931 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
4932 case DW_TAG_string_type
: return "DW_TAG_string_type";
4933 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
4934 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
4935 case DW_TAG_typedef
: return "DW_TAG_typedef";
4936 case DW_TAG_union_type
: return "DW_TAG_union_type";
4937 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
4938 case DW_TAG_variant
: return "DW_TAG_variant";
4939 case DW_TAG_common_block
: return "DW_TAG_common_block";
4940 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
4941 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
4942 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
4943 case DW_TAG_module
: return "DW_TAG_module";
4944 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
4945 case DW_TAG_set_type
: return "DW_TAG_set_type";
4946 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
4947 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
4948 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
4949 case DW_TAG_base_type
: return "DW_TAG_base_type";
4950 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
4951 case DW_TAG_const_type
: return "DW_TAG_const_type";
4952 case DW_TAG_constant
: return "DW_TAG_constant";
4953 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
4954 case DW_TAG_file_type
: return "DW_TAG_file_type";
4955 case DW_TAG_friend
: return "DW_TAG_friend";
4956 case DW_TAG_namelist
: return "DW_TAG_namelist";
4957 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
4958 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
4959 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
4960 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
4961 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
4962 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
4963 case DW_TAG_try_block
: return "DW_TAG_try_block";
4964 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
4965 case DW_TAG_variable
: return "DW_TAG_variable";
4966 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
4967 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
4968 case DW_TAG_format_label
: return "DW_TAG_format_label";
4969 case DW_TAG_function_template
: return "DW_TAG_function_template";
4970 case DW_TAG_class_template
: return "DW_TAG_class_template";
4973 static char buffer
[100];
4975 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
4982 get_AT_name (attribute
)
4983 unsigned long attribute
;
4987 case DW_AT_sibling
: return "DW_AT_sibling";
4988 case DW_AT_location
: return "DW_AT_location";
4989 case DW_AT_name
: return "DW_AT_name";
4990 case DW_AT_ordering
: return "DW_AT_ordering";
4991 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
4992 case DW_AT_byte_size
: return "DW_AT_byte_size";
4993 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
4994 case DW_AT_bit_size
: return "DW_AT_bit_size";
4995 case DW_AT_element_list
: return "DW_AT_element_list";
4996 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
4997 case DW_AT_low_pc
: return "DW_AT_low_pc";
4998 case DW_AT_high_pc
: return "DW_AT_high_pc";
4999 case DW_AT_language
: return "DW_AT_language";
5000 case DW_AT_member
: return "DW_AT_member";
5001 case DW_AT_discr
: return "DW_AT_discr";
5002 case DW_AT_discr_value
: return "DW_AT_discr_value";
5003 case DW_AT_visibility
: return "DW_AT_visibility";
5004 case DW_AT_import
: return "DW_AT_import";
5005 case DW_AT_string_length
: return "DW_AT_string_length";
5006 case DW_AT_common_reference
: return "DW_AT_common_reference";
5007 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
5008 case DW_AT_const_value
: return "DW_AT_const_value";
5009 case DW_AT_containing_type
: return "DW_AT_containing_type";
5010 case DW_AT_default_value
: return "DW_AT_default_value";
5011 case DW_AT_inline
: return "DW_AT_inline";
5012 case DW_AT_is_optional
: return "DW_AT_is_optional";
5013 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
5014 case DW_AT_producer
: return "DW_AT_producer";
5015 case DW_AT_prototyped
: return "DW_AT_prototyped";
5016 case DW_AT_return_addr
: return "DW_AT_return_addr";
5017 case DW_AT_start_scope
: return "DW_AT_start_scope";
5018 case DW_AT_stride_size
: return "DW_AT_stride_size";
5019 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
5020 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
5021 case DW_AT_accessibility
: return "DW_AT_accessibility";
5022 case DW_AT_address_class
: return "DW_AT_address_class";
5023 case DW_AT_artificial
: return "DW_AT_artificial";
5024 case DW_AT_base_types
: return "DW_AT_base_types";
5025 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
5026 case DW_AT_count
: return "DW_AT_count";
5027 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
5028 case DW_AT_decl_column
: return "DW_AT_decl_column";
5029 case DW_AT_decl_file
: return "DW_AT_decl_file";
5030 case DW_AT_decl_line
: return "DW_AT_decl_line";
5031 case DW_AT_declaration
: return "DW_AT_declaration";
5032 case DW_AT_discr_list
: return "DW_AT_discr_list";
5033 case DW_AT_encoding
: return "DW_AT_encoding";
5034 case DW_AT_external
: return "DW_AT_external";
5035 case DW_AT_frame_base
: return "DW_AT_frame_base";
5036 case DW_AT_friend
: return "DW_AT_friend";
5037 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
5038 case DW_AT_macro_info
: return "DW_AT_macro_info";
5039 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
5040 case DW_AT_priority
: return "DW_AT_priority";
5041 case DW_AT_segment
: return "DW_AT_segment";
5042 case DW_AT_specification
: return "DW_AT_specification";
5043 case DW_AT_static_link
: return "DW_AT_static_link";
5044 case DW_AT_type
: return "DW_AT_type";
5045 case DW_AT_use_location
: return "DW_AT_use_location";
5046 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
5047 case DW_AT_virtuality
: return "DW_AT_virtuality";
5048 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
5049 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
5050 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
5051 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
5052 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
5053 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
5054 case DW_AT_MIPS_software_pipeline_depth
: return "DW_AT_MIPS_software_pipeline_depth";
5055 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
5056 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
5057 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
5058 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
5059 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
5060 case DW_AT_sf_names
: return "DW_AT_sf_names";
5061 case DW_AT_src_info
: return "DW_AT_src_info";
5062 case DW_AT_mac_info
: return "DW_AT_mac_info";
5063 case DW_AT_src_coords
: return "DW_AT_src_coords";
5064 case DW_AT_body_begin
: return "DW_AT_body_begin";
5065 case DW_AT_body_end
: return "DW_AT_body_end";
5068 static char buffer
[100];
5070 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
5077 get_FORM_name (form
)
5082 case DW_FORM_addr
: return "DW_FORM_addr";
5083 case DW_FORM_block2
: return "DW_FORM_block2";
5084 case DW_FORM_block4
: return "DW_FORM_block4";
5085 case DW_FORM_data2
: return "DW_FORM_data2";
5086 case DW_FORM_data4
: return "DW_FORM_data4";
5087 case DW_FORM_data8
: return "DW_FORM_data8";
5088 case DW_FORM_string
: return "DW_FORM_string";
5089 case DW_FORM_block
: return "DW_FORM_block";
5090 case DW_FORM_block1
: return "DW_FORM_block1";
5091 case DW_FORM_data1
: return "DW_FORM_data1";
5092 case DW_FORM_flag
: return "DW_FORM_flag";
5093 case DW_FORM_sdata
: return "DW_FORM_sdata";
5094 case DW_FORM_strp
: return "DW_FORM_strp";
5095 case DW_FORM_udata
: return "DW_FORM_udata";
5096 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
5097 case DW_FORM_ref1
: return "DW_FORM_ref1";
5098 case DW_FORM_ref2
: return "DW_FORM_ref2";
5099 case DW_FORM_ref4
: return "DW_FORM_ref4";
5100 case DW_FORM_ref8
: return "DW_FORM_ref8";
5101 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
5102 case DW_FORM_indirect
: return "DW_FORM_indirect";
5105 static char buffer
[100];
5107 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
5113 /* FIXME: There are better and more effiecint ways to handle
5114 these structures. For now though, I just want something that
5115 is simple to implement. */
5116 typedef struct abbrev_attr
5118 unsigned long attribute
;
5120 struct abbrev_attr
* next
;
5124 typedef struct abbrev_entry
5126 unsigned long entry
;
5129 struct abbrev_attr
* first_attr
;
5130 struct abbrev_attr
* last_attr
;
5131 struct abbrev_entry
* next
;
5135 static abbrev_entry
* first_abbrev
= NULL
;
5136 static abbrev_entry
* last_abbrev
= NULL
;
5139 free_abbrevs
PARAMS ((void))
5141 abbrev_entry
* abbrev
;
5143 for (abbrev
= first_abbrev
; abbrev
;)
5145 abbrev_entry
* next
= abbrev
->next
;
5148 for (attr
= abbrev
->first_attr
; attr
;)
5150 abbrev_attr
* next
= attr
->next
;
5160 last_abbrev
= first_abbrev
= NULL
;
5164 add_abbrev (number
, tag
, children
)
5165 unsigned long number
;
5169 abbrev_entry
* entry
;
5171 entry
= (abbrev_entry
*) malloc (sizeof (* entry
));
5177 entry
->entry
= number
;
5179 entry
->children
= children
;
5180 entry
->first_attr
= NULL
;
5181 entry
->last_attr
= NULL
;
5184 if (first_abbrev
== NULL
)
5185 first_abbrev
= entry
;
5187 last_abbrev
->next
= entry
;
5189 last_abbrev
= entry
;
5193 add_abbrev_attr (attribute
, form
)
5194 unsigned long attribute
;
5199 attr
= (abbrev_attr
*) malloc (sizeof (* attr
));
5205 attr
->attribute
= attribute
;
5209 if (last_abbrev
->first_attr
== NULL
)
5210 last_abbrev
->first_attr
= attr
;
5212 last_abbrev
->last_attr
->next
= attr
;
5214 last_abbrev
->last_attr
= attr
;
5217 /* Processes the (partial) contents of a .debug_abbrev section.
5218 Returns NULL if the end of the section was encountered.
5219 Returns the address after the last byte read if the end of
5220 an abbreviation set was found. */
5222 static unsigned char *
5223 process_abbrev_section (start
, end
)
5224 unsigned char * start
;
5225 unsigned char * end
;
5227 if (first_abbrev
!= NULL
)
5233 unsigned long entry
;
5235 unsigned long attribute
;
5238 entry
= read_leb128 (start
, & bytes_read
, 0);
5239 start
+= bytes_read
;
5241 /* A single zero is supposed to end the section according
5242 to the standard. If there's more, then signal that to
5245 return start
== end
? NULL
: start
;
5247 tag
= read_leb128 (start
, & bytes_read
, 0);
5248 start
+= bytes_read
;
5250 children
= * start
++;
5252 add_abbrev (entry
, tag
, children
);
5258 attribute
= read_leb128 (start
, & bytes_read
, 0);
5259 start
+= bytes_read
;
5261 form
= read_leb128 (start
, & bytes_read
, 0);
5262 start
+= bytes_read
;
5265 add_abbrev_attr (attribute
, form
);
5267 while (attribute
!= 0);
5275 display_debug_abbrev (section
, start
, file
)
5276 Elf32_Internal_Shdr
* section
;
5277 unsigned char * start
;
5278 FILE * file ATTRIBUTE_UNUSED
;
5280 abbrev_entry
* entry
;
5281 unsigned char * end
= start
+ section
->sh_size
;
5283 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
5287 start
= process_abbrev_section (start
, end
);
5289 printf (_(" Number TAG\n"));
5291 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
5295 printf (_(" %ld %s [%s]\n"),
5297 get_TAG_name (entry
->tag
),
5298 entry
->children
? _("has children") : _("no children"));
5300 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
5302 printf (_(" %-18s %s\n"),
5303 get_AT_name (attr
->attribute
),
5304 get_FORM_name (attr
->form
));
5316 static unsigned char *
5317 display_block (data
, length
)
5318 unsigned char * data
;
5319 unsigned long length
;
5321 printf (_(" %lu byte block: "), length
);
5324 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
5330 decode_location_expression (data
, pointer_size
)
5331 unsigned char * data
;
5332 unsigned int pointer_size
;
5336 unsigned long uvalue
;
5343 printf ("DW_OP_addr: %lx", (unsigned long) byte_get (data
, pointer_size
));
5346 printf ("DW_OP_deref");
5349 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
, 1));
5352 printf ("DW_OP_const1s: %ld", (long) byte_get (data
, 1));
5355 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
5358 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
5361 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
5364 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
5367 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
5368 (unsigned long) byte_get (data
+ 4, 4));
5371 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
5372 (long) byte_get (data
+ 4, 4));
5375 printf ("DW_OP_constu: %lu", read_leb128 (data
, NULL
, 0));
5378 printf ("DW_OP_consts: %ld", read_leb128 (data
, NULL
, 1));
5381 printf ("DW_OP_dup");
5384 printf ("DW_OP_drop");
5387 printf ("DW_OP_over");
5390 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
, 1));
5393 printf ("DW_OP_swap");
5396 printf ("DW_OP_rot");
5399 printf ("DW_OP_xderef");
5402 printf ("DW_OP_abs");
5405 printf ("DW_OP_and");
5408 printf ("DW_OP_div");
5411 printf ("DW_OP_minus");
5414 printf ("DW_OP_mod");
5417 printf ("DW_OP_mul");
5420 printf ("DW_OP_neg");
5423 printf ("DW_OP_not");
5426 printf ("DW_OP_or");
5429 printf ("DW_OP_plus");
5431 case DW_OP_plus_uconst
:
5432 printf ("DW_OP_plus_uconst: %lu", read_leb128 (data
, NULL
, 0));
5435 printf ("DW_OP_shl");
5438 printf ("DW_OP_shr");
5441 printf ("DW_OP_shra");
5444 printf ("DW_OP_xor");
5447 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
5450 printf ("DW_OP_eq");
5453 printf ("DW_OP_ge");
5456 printf ("DW_OP_gt");
5459 printf ("DW_OP_le");
5462 printf ("DW_OP_lt");
5465 printf ("DW_OP_ne");
5468 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
5471 printf ("DW_OP_lit0");
5474 printf ("DW_OP_lit1");
5477 printf ("DW_OP_lit2");
5480 printf ("DW_OP_lit3");
5483 printf ("DW_OP_lit4");
5486 printf ("DW_OP_lit5");
5489 printf ("DW_OP_lit6");
5492 printf ("DW_OP_lit7");
5495 printf ("DW_OP_lit8");
5498 printf ("DW_OP_lit9");
5501 printf ("DW_OP_lit10");
5504 printf ("DW_OP_lit11");
5507 printf ("DW_OP_lit12");
5510 printf ("DW_OP_lit13");
5513 printf ("DW_OP_lit14");
5516 printf ("DW_OP_lit15");
5519 printf ("DW_OP_lit16");
5522 printf ("DW_OP_lit17");
5525 printf ("DW_OP_lit18");
5528 printf ("DW_OP_lit19");
5531 printf ("DW_OP_lit20");
5534 printf ("DW_OP_lit21");
5537 printf ("DW_OP_lit22");
5540 printf ("DW_OP_lit23");
5543 printf ("DW_OP_lit24");
5546 printf ("DW_OP_lit25");
5549 printf ("DW_OP_lit26");
5552 printf ("DW_OP_lit27");
5555 printf ("DW_OP_lit28");
5558 printf ("DW_OP_lit29");
5561 printf ("DW_OP_lit30");
5564 printf ("DW_OP_lit31");
5567 printf ("DW_OP_reg0");
5570 printf ("DW_OP_reg1");
5573 printf ("DW_OP_reg2");
5576 printf ("DW_OP_reg3");
5579 printf ("DW_OP_reg4");
5582 printf ("DW_OP_reg5");
5585 printf ("DW_OP_reg6");
5588 printf ("DW_OP_reg7");
5591 printf ("DW_OP_reg8");
5594 printf ("DW_OP_reg9");
5597 printf ("DW_OP_reg10");
5600 printf ("DW_OP_reg11");
5603 printf ("DW_OP_reg12");
5606 printf ("DW_OP_reg13");
5609 printf ("DW_OP_reg14");
5612 printf ("DW_OP_reg15");
5615 printf ("DW_OP_reg16");
5618 printf ("DW_OP_reg17");
5621 printf ("DW_OP_reg18");
5624 printf ("DW_OP_reg19");
5627 printf ("DW_OP_reg20");
5630 printf ("DW_OP_reg21");
5633 printf ("DW_OP_reg22");
5636 printf ("DW_OP_reg23");
5639 printf ("DW_OP_reg24");
5642 printf ("DW_OP_reg25");
5645 printf ("DW_OP_reg26");
5648 printf ("DW_OP_reg27");
5651 printf ("DW_OP_reg28");
5654 printf ("DW_OP_reg29");
5657 printf ("DW_OP_reg30");
5660 printf ("DW_OP_reg31");
5663 printf ("DW_OP_breg0: %ld", read_leb128 (data
, NULL
, 1));
5666 printf ("DW_OP_breg1: %ld", read_leb128 (data
, NULL
, 1));
5669 printf ("DW_OP_breg2: %ld", read_leb128 (data
, NULL
, 1));
5672 printf ("DW_OP_breg3: %ld", read_leb128 (data
, NULL
, 1));
5675 printf ("DW_OP_breg4: %ld", read_leb128 (data
, NULL
, 1));
5678 printf ("DW_OP_breg5: %ld", read_leb128 (data
, NULL
, 1));
5681 printf ("DW_OP_breg6: %ld", read_leb128 (data
, NULL
, 1));
5684 printf ("DW_OP_breg7: %ld", read_leb128 (data
, NULL
, 1));
5687 printf ("DW_OP_breg8: %ld", read_leb128 (data
, NULL
, 1));
5690 printf ("DW_OP_breg9: %ld", read_leb128 (data
, NULL
, 1));
5693 printf ("DW_OP_breg10: %ld", read_leb128 (data
, NULL
, 1));
5696 printf ("DW_OP_breg11: %ld", read_leb128 (data
, NULL
, 1));
5699 printf ("DW_OP_breg12: %ld", read_leb128 (data
, NULL
, 1));
5702 printf ("DW_OP_breg13: %ld", read_leb128 (data
, NULL
, 1));
5705 printf ("DW_OP_breg14: %ld", read_leb128 (data
, NULL
, 1));
5708 printf ("DW_OP_breg15: %ld", read_leb128 (data
, NULL
, 1));
5711 printf ("DW_OP_breg16: %ld", read_leb128 (data
, NULL
, 1));
5714 printf ("DW_OP_breg17: %ld", read_leb128 (data
, NULL
, 1));
5717 printf ("DW_OP_breg18: %ld", read_leb128 (data
, NULL
, 1));
5720 printf ("DW_OP_breg19: %ld", read_leb128 (data
, NULL
, 1));
5723 printf ("DW_OP_breg20: %ld", read_leb128 (data
, NULL
, 1));
5726 printf ("DW_OP_breg21: %ld", read_leb128 (data
, NULL
, 1));
5729 printf ("DW_OP_breg22: %ld", read_leb128 (data
, NULL
, 1));
5732 printf ("DW_OP_breg23: %ld", read_leb128 (data
, NULL
, 1));
5735 printf ("DW_OP_breg24: %ld", read_leb128 (data
, NULL
, 1));
5738 printf ("DW_OP_breg25: %ld", read_leb128 (data
, NULL
, 1));
5741 printf ("DW_OP_breg26: %ld", read_leb128 (data
, NULL
, 1));
5744 printf ("DW_OP_breg27: %ld", read_leb128 (data
, NULL
, 1));
5747 printf ("DW_OP_breg28: %ld", read_leb128 (data
, NULL
, 1));
5750 printf ("DW_OP_breg29: %ld", read_leb128 (data
, NULL
, 1));
5753 printf ("DW_OP_breg30: %ld", read_leb128 (data
, NULL
, 1));
5756 printf ("DW_OP_breg31: %ld", read_leb128 (data
, NULL
, 1));
5759 printf ("DW_OP_regx: %lu", read_leb128 (data
, NULL
, 0));
5762 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, NULL
, 1));
5765 uvalue
= read_leb128 (data
, &bytes_read
, 0);
5766 printf ("DW_OP_bregx: %lu %ld", uvalue
,
5767 read_leb128 (data
+ bytes_read
, NULL
, 1));
5770 printf ("DW_OP_piece: %lu", read_leb128 (data
, NULL
, 0));
5772 case DW_OP_deref_size
:
5773 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
, 1));
5775 case DW_OP_xderef_size
:
5776 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
, 1));
5779 printf ("DW_OP_nop");
5783 if (op
>= DW_OP_lo_user
5784 && op
<= DW_OP_hi_user
)
5785 printf (_("(User defined location op)"));
5787 printf (_("(Unknown location op)"));
5793 static unsigned char *
5794 read_and_display_attr (attribute
, form
, data
, pointer_size
)
5795 unsigned long attribute
;
5797 unsigned char * data
;
5798 unsigned long pointer_size
;
5800 unsigned long uvalue
= 0;
5801 unsigned char * block_start
= NULL
;
5805 printf (" %-18s:", get_AT_name (attribute
));
5809 case DW_FORM_ref_addr
:
5814 case DW_FORM_ref_udata
:
5820 case DW_FORM_ref_addr
:
5822 uvalue
= byte_get (data
, pointer_size
);
5823 printf (is_ref
? " <%x>" : " %#x", uvalue
);
5824 data
+= pointer_size
;
5830 uvalue
= byte_get (data
++, 1);
5831 printf (is_ref
? " <%x>" : " %d", uvalue
);
5836 uvalue
= byte_get (data
, 2);
5838 printf (is_ref
? " <%x>" : " %d", uvalue
);
5843 uvalue
= byte_get (data
, 4);
5845 printf (is_ref
? " <%x>" : " %d", uvalue
);
5850 uvalue
= byte_get (data
, 4);
5851 printf (" %lx", uvalue
);
5852 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
5856 case DW_FORM_string
:
5857 printf (" %s", data
);
5858 data
+= strlen (data
) + 1;
5862 uvalue
= read_leb128 (data
, & bytes_read
, 1);
5864 printf (" %ld", (long) uvalue
);
5867 case DW_FORM_ref_udata
:
5869 uvalue
= read_leb128 (data
, & bytes_read
, 0);
5871 printf (is_ref
? " <%lx>" : " %ld", uvalue
);
5875 uvalue
= read_leb128 (data
, & bytes_read
, 0);
5876 block_start
= data
+ bytes_read
;
5877 data
= display_block (block_start
, uvalue
);
5878 uvalue
= * block_start
;
5881 case DW_FORM_block1
:
5882 uvalue
= byte_get (data
, 1);
5883 block_start
= data
+ 1;
5884 data
= display_block (block_start
, uvalue
);
5885 uvalue
= * block_start
;
5888 case DW_FORM_block2
:
5889 uvalue
= byte_get (data
, 2);
5890 block_start
= data
+ 2;
5891 data
= display_block (block_start
, uvalue
);
5892 uvalue
= * block_start
;
5895 case DW_FORM_block4
:
5896 uvalue
= byte_get (data
, 4);
5897 block_start
= data
+ 4;
5898 data
= display_block (block_start
, uvalue
);
5899 uvalue
= * block_start
;
5903 case DW_FORM_indirect
:
5904 warn (_("Unable to handle FORM: %d"), form
);
5908 warn (_("Unrecognised form: %d"), form
);
5912 /* For some attributes we can display futher information. */
5921 case DW_INL_not_inlined
: printf (_("(not inlined)")); break;
5922 case DW_INL_inlined
: printf (_("(inlined)")); break;
5923 case DW_INL_declared_not_inlined
: printf (_("(declared as inline but ignored)")); break;
5924 case DW_INL_declared_inlined
: printf (_("(declared as inline and inlined)")); break;
5925 default: printf (_(" (Unknown inline attribute value: %lx)"), uvalue
); break;
5929 case DW_AT_frame_base
:
5930 if (uvalue
>= DW_OP_reg0
&& uvalue
<= DW_OP_reg31
)
5931 printf ("(reg %ld)", uvalue
- DW_OP_reg0
);
5934 case DW_AT_language
:
5937 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
5938 case DW_LANG_C89
: printf ("(ANSI C)"); break;
5939 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
5940 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
5941 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
5942 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
5943 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
5944 case DW_LANG_Ada83
: printf ("(Ada)"); break;
5945 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
5946 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
5947 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
5948 default: printf ("(Unknown: %lx)", uvalue
); break;
5952 case DW_AT_encoding
:
5955 case DW_ATE_void
: printf ("(void)"); break;
5956 case DW_ATE_address
: printf ("(machine address)"); break;
5957 case DW_ATE_boolean
: printf ("(boolean)"); break;
5958 case DW_ATE_complex_float
: printf ("(complex float)"); break;
5959 case DW_ATE_float
: printf ("(float)"); break;
5960 case DW_ATE_signed
: printf ("(signed)"); break;
5961 case DW_ATE_signed_char
: printf ("(signed char)"); break;
5962 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
5963 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
5965 if (uvalue
>= DW_ATE_lo_user
5966 && uvalue
<= DW_ATE_hi_user
)
5967 printf ("(user defined type)");
5969 printf ("(unknown type)");
5974 case DW_AT_accessibility
:
5977 case DW_ACCESS_public
: printf ("(public)"); break;
5978 case DW_ACCESS_protected
: printf ("(protected)"); break;
5979 case DW_ACCESS_private
: printf ("(private)"); break;
5980 default: printf ("(unknown accessibility)"); break;
5984 case DW_AT_visibility
:
5987 case DW_VIS_local
: printf ("(local)"); break;
5988 case DW_VIS_exported
: printf ("(exported)"); break;
5989 case DW_VIS_qualified
: printf ("(qualified)"); break;
5990 default: printf ("(unknown visibility)"); break;
5994 case DW_AT_virtuality
:
5997 case DW_VIRTUALITY_none
: printf ("(none)"); break;
5998 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
5999 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
6000 default: printf ("(unknown virtuality)"); break;
6004 case DW_AT_identifier_case
:
6007 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
6008 case DW_ID_up_case
: printf ("(up_case)"); break;
6009 case DW_ID_down_case
: printf ("(down_case)"); break;
6010 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
6011 default: printf ("(unknown case)"); break;
6015 case DW_AT_calling_convention
:
6018 case DW_CC_normal
: printf ("(normal)"); break;
6019 case DW_CC_program
: printf ("(program)"); break;
6020 case DW_CC_nocall
: printf ("(nocall)"); break;
6022 if (uvalue
>= DW_CC_lo_user
6023 && uvalue
<= DW_CC_hi_user
)
6024 printf ("(user defined)");
6026 printf ("(unknown convention)");
6030 case DW_AT_location
:
6031 case DW_AT_data_member_location
:
6032 case DW_AT_vtable_elem_location
:
6034 decode_location_expression (block_start
, pointer_size
);
6047 display_debug_info (section
, start
, file
)
6048 Elf32_Internal_Shdr
* section
;
6049 unsigned char * start
;
6052 unsigned char * end
= start
+ section
->sh_size
;
6053 unsigned char * section_begin
= start
;
6055 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6059 DWARF2_External_CompUnit
* external
;
6060 DWARF2_Internal_CompUnit compunit
;
6061 unsigned char * tags
;
6065 external
= (DWARF2_External_CompUnit
*) start
;
6067 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
6068 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
6069 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
6070 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6072 tags
= start
+ sizeof (* external
);
6073 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
6075 if (compunit
.cu_version
!= 2)
6077 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
6081 printf (_(" Compilation Unit:\n"));
6082 printf (_(" Length: %ld\n"), compunit
.cu_length
);
6083 printf (_(" Version: %d\n"), compunit
.cu_version
);
6084 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
6085 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
6087 if (first_abbrev
!= NULL
)
6090 /* Read in the abbrevs used by this compilation unit. */
6093 Elf32_Internal_Shdr
* sec
;
6094 unsigned char * begin
;
6096 /* Locate the .debug_abbrev section and process it. */
6097 for (i
= 0, sec
= section_headers
;
6098 i
< elf_header
.e_shnum
;
6100 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
6103 if (i
== -1 || sec
->sh_size
== 0)
6105 warn (_("Unable to locate .debug_abbrev section!\n"));
6109 GET_DATA_ALLOC (sec
->sh_offset
, sec
->sh_size
, begin
, unsigned char *,
6110 "debug_abbrev section data");
6112 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
6113 begin
+ sec
->sh_size
);
6119 while (tags
< start
)
6122 unsigned long abbrev_number
;
6123 abbrev_entry
* entry
;
6126 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
6129 /* A null DIE marks the end of a list of children. */
6130 if (abbrev_number
== 0)
6136 /* Scan through the abbreviation list until we reach the
6138 for (entry
= first_abbrev
;
6139 entry
&& entry
->entry
!= abbrev_number
;
6140 entry
= entry
->next
)
6145 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
6150 printf (_(" <%d><%x>: Abbrev Number: %lu (%s)\n"),
6151 level
, tags
- section_begin
- bytes_read
,
6153 get_TAG_name (entry
->tag
));
6155 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
6156 tags
= read_and_display_attr (attr
->attribute
,
6159 compunit
.cu_pointer_size
);
6161 if (entry
->children
)
6172 display_debug_aranges (section
, start
, file
)
6173 Elf32_Internal_Shdr
* section
;
6174 unsigned char * start
;
6175 FILE * file ATTRIBUTE_UNUSED
;
6177 unsigned char * end
= start
+ section
->sh_size
;
6179 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
6183 DWARF2_External_ARange
* external
;
6184 DWARF2_Internal_ARange arange
;
6185 unsigned char * ranges
;
6186 unsigned long length
;
6187 unsigned long address
;
6190 external
= (DWARF2_External_ARange
*) start
;
6192 arange
.ar_length
= BYTE_GET (external
->ar_length
);
6193 arange
.ar_version
= BYTE_GET (external
->ar_version
);
6194 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
6195 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
6196 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
6198 printf (_(" Length: %ld\n"), arange
.ar_length
);
6199 printf (_(" Version: %d\n"), arange
.ar_version
);
6200 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
6201 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
6202 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
6204 printf (_("\n Address Length\n"));
6206 ranges
= start
+ sizeof (* external
);
6208 /* Must pad to an alignment boundary that is twice the pointer size. */
6209 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
6211 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
6215 address
= byte_get (ranges
, arange
.ar_pointer_size
);
6217 ranges
+= arange
.ar_pointer_size
;
6219 length
= byte_get (ranges
, arange
.ar_pointer_size
);
6221 ranges
+= arange
.ar_pointer_size
;
6223 /* A pair of zeros marks the end of the list. */
6224 if (address
== 0 && length
== 0)
6227 printf (" %8.8lx %lu\n", address
, length
);
6230 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
6240 display_debug_not_supported (section
, start
, file
)
6241 Elf32_Internal_Shdr
* section
;
6242 unsigned char * start ATTRIBUTE_UNUSED
;
6243 FILE * file ATTRIBUTE_UNUSED
;
6245 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
6246 SECTION_NAME (section
));
6251 /* Pre-scan the .debug_info section to record the size of address.
6252 When dumping the .debug_line, we use that size information, assuming
6253 that all compilation units have the same address size. */
6255 prescan_debug_info (section
, start
, file
)
6256 Elf32_Internal_Shdr
* section ATTRIBUTE_UNUSED
;
6257 unsigned char * start
;
6258 FILE * file ATTRIBUTE_UNUSED
;
6260 DWARF2_External_CompUnit
* external
;
6262 external
= (DWARF2_External_CompUnit
*) start
;
6264 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
6268 /* A structure containing the name of a debug section and a pointer
6269 to a function that can decode it. The third field is a prescan
6270 function to be run over the section before displaying any of the
6275 int (* display
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6276 int (* prescan
) PARAMS ((Elf32_Internal_Shdr
*, unsigned char *, FILE *));
6280 { ".debug_info", display_debug_info
, prescan_debug_info
},
6281 { ".debug_abbrev", display_debug_abbrev
, NULL
},
6282 { ".debug_line", display_debug_lines
, NULL
},
6283 { ".debug_aranges", display_debug_aranges
, NULL
},
6284 { ".debug_pubnames", display_debug_pubnames
, NULL
},
6285 { ".debug_macinfo", display_debug_not_supported
, NULL
},
6286 { ".debug_frame", display_debug_not_supported
, NULL
},
6287 { ".debug_str", display_debug_not_supported
, NULL
},
6288 { ".debug_static_func", display_debug_not_supported
, NULL
},
6289 { ".debug_static_vars", display_debug_not_supported
, NULL
},
6290 { ".debug_types", display_debug_not_supported
, NULL
},
6291 { ".debug_weaknames", display_debug_not_supported
, NULL
}
6295 display_debug_section (section
, file
)
6296 Elf32_Internal_Shdr
* section
;
6299 char * name
= SECTION_NAME (section
);
6300 bfd_size_type length
;
6301 unsigned char * start
;
6304 length
= section
->sh_size
;
6307 printf (_("\nSection '%s' has no debugging data.\n"), name
);
6311 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6312 "debug section data");
6314 /* See if we know how to display the contents of this section. */
6315 for (i
= NUM_ELEM (debug_displays
); i
--;)
6316 if (strcmp (debug_displays
[i
].name
, name
) == 0)
6318 debug_displays
[i
].display (section
, start
, file
);
6323 printf (_("Unrecognised debug section: %s\n"), name
);
6327 /* If we loaded in the abbrev section at some point,
6328 we must release it here. */
6329 if (first_abbrev
!= NULL
)
6336 process_section_contents (file
)
6339 Elf32_Internal_Shdr
* section
;
6345 /* Pre-scan the debug sections to find some debug information not
6346 present in some of them. For the .debug_line, we must find out the
6347 size of address (specified in .debug_info and .debug_aranges). */
6348 for (i
= 0, section
= section_headers
;
6349 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6352 char * name
= SECTION_NAME (section
);
6355 if (section
->sh_size
== 0)
6358 /* See if there is some pre-scan operation for this section. */
6359 for (j
= NUM_ELEM (debug_displays
); j
--;)
6360 if (strcmp (debug_displays
[j
].name
, name
) == 0)
6362 if (debug_displays
[j
].prescan
!= NULL
)
6364 bfd_size_type length
;
6365 unsigned char * start
;
6367 length
= section
->sh_size
;
6368 GET_DATA_ALLOC (section
->sh_offset
, length
, start
, unsigned char *,
6369 "debug section data");
6371 debug_displays
[j
].prescan (section
, start
, file
);
6379 for (i
= 0, section
= section_headers
;
6380 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
6383 #ifdef SUPPORT_DISASSEMBLY
6384 if (dump_sects
[i
] & DISASS_DUMP
)
6385 disassemble_section (section
, file
);
6387 if (dump_sects
[i
] & HEX_DUMP
)
6388 dump_section (section
, file
);
6390 if (dump_sects
[i
] & DEBUG_DUMP
)
6391 display_debug_section (section
, file
);
6394 if (i
< num_dump_sects
)
6395 warn (_("Some sections were not dumped because they do not exist!\n"));
6401 process_mips_fpe_exception (mask
)
6407 if (mask
& OEX_FPU_INEX
)
6408 fputs ("INEX", stdout
), first
= 0;
6409 if (mask
& OEX_FPU_UFLO
)
6410 printf ("%sUFLO", first
? "" : "|"), first
= 0;
6411 if (mask
& OEX_FPU_OFLO
)
6412 printf ("%sOFLO", first
? "" : "|"), first
= 0;
6413 if (mask
& OEX_FPU_DIV0
)
6414 printf ("%sDIV0", first
? "" : "|"), first
= 0;
6415 if (mask
& OEX_FPU_INVAL
)
6416 printf ("%sINVAL", first
? "" : "|");
6419 fputs ("0", stdout
);
6423 process_mips_specific (file
)
6426 Elf_Internal_Dyn
* entry
;
6427 size_t liblist_offset
= 0;
6428 size_t liblistno
= 0;
6429 size_t conflictsno
= 0;
6430 size_t options_offset
= 0;
6431 size_t conflicts_offset
= 0;
6433 /* We have a lot of special sections. Thanks SGI! */
6434 if (dynamic_segment
== NULL
)
6435 /* No information available. */
6438 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
6439 switch (entry
->d_tag
)
6441 case DT_MIPS_LIBLIST
:
6442 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
6444 case DT_MIPS_LIBLISTNO
:
6445 liblistno
= entry
->d_un
.d_val
;
6447 case DT_MIPS_OPTIONS
:
6448 options_offset
= entry
->d_un
.d_val
- loadaddr
;
6450 case DT_MIPS_CONFLICT
:
6451 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
6453 case DT_MIPS_CONFLICTNO
:
6454 conflictsno
= entry
->d_un
.d_val
;
6460 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
6462 Elf32_External_Lib
* elib
;
6465 GET_DATA_ALLOC (liblist_offset
, liblistno
* sizeof (Elf32_External_Lib
),
6466 elib
, Elf32_External_Lib
*, "liblist");
6468 printf ("\nSection '.liblist' contains %d entries:\n", liblistno
);
6469 fputs (" Library Time Stamp Checksum Version Flags\n",
6472 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
6478 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
6479 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
6480 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
6481 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
6482 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
6484 strftime (timebuf
, 20, "%Y-%m-%dT%H:%M:%S", gmtime (&time
));
6486 printf ("%3d: %-20s %s %#10lx %-7ld", cnt
,
6487 dynamic_strings
+ liblist
.l_name
, timebuf
,
6488 liblist
.l_checksum
, liblist
.l_version
);
6490 if (liblist
.l_flags
== 0)
6501 { " EXACT_MATCH", LL_EXACT_MATCH
},
6502 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
6503 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
6504 { " EXPORTS", LL_EXPORTS
},
6505 { " DELAY_LOAD", LL_DELAY_LOAD
},
6506 { " DELTA", LL_DELTA
}
6508 int flags
= liblist
.l_flags
;
6512 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
6514 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
6516 fputs (l_flags_vals
[fcnt
].name
, stdout
);
6517 flags
^= l_flags_vals
[fcnt
].bit
;
6520 printf (" %#x", (unsigned int) flags
);
6529 if (options_offset
!= 0)
6531 Elf_External_Options
* eopt
;
6532 Elf_Internal_Shdr
* sect
= section_headers
;
6533 Elf_Internal_Options
* iopt
;
6534 Elf_Internal_Options
* option
;
6538 /* Find the section header so that we get the size. */
6539 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
6542 GET_DATA_ALLOC (options_offset
, sect
->sh_size
, eopt
,
6543 Elf_External_Options
*, "options");
6545 iopt
= (Elf_Internal_Options
*) malloc ((sect
->sh_size
/ sizeof (eopt
))
6549 error (_("Out of memory"));
6555 while (offset
< sect
->sh_size
)
6557 Elf_External_Options
* eoption
;
6559 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
6561 option
->kind
= BYTE_GET (eoption
->kind
);
6562 option
->size
= BYTE_GET (eoption
->size
);
6563 option
->section
= BYTE_GET (eoption
->section
);
6564 option
->info
= BYTE_GET (eoption
->info
);
6566 offset
+= option
->size
;
6571 printf (_("\nSection '%s' contains %d entries:\n"),
6572 string_table
+ sect
->sh_name
, cnt
);
6579 switch (option
->kind
)
6582 /* This shouldn't happen. */
6583 printf (" NULL %d %lx", option
->section
, option
->info
);
6586 printf (" REGINFO ");
6587 if (elf_header
.e_machine
== EM_MIPS
)
6590 Elf32_External_RegInfo
*ereg
;
6591 Elf32_RegInfo reginfo
;
6593 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
6594 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6595 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6596 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6597 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6598 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6599 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
6601 printf ("GPR %08lx GP 0x%lx\n",
6603 (unsigned long) reginfo
.ri_gp_value
);
6604 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6605 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6606 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6611 Elf64_External_RegInfo
* ereg
;
6612 Elf64_Internal_RegInfo reginfo
;
6614 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
6615 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
6616 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
6617 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
6618 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
6619 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
6620 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
6622 printf ("GPR %08lx GP 0x",
6623 reginfo
.ri_gprmask
);
6624 printf_vma (reginfo
.ri_gp_value
);
6627 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
6628 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
6629 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
6633 case ODK_EXCEPTIONS
:
6634 fputs (" EXCEPTIONS fpe_min(", stdout
);
6635 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
6636 fputs (") fpe_max(", stdout
);
6637 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
6638 fputs (")", stdout
);
6640 if (option
->info
& OEX_PAGE0
)
6641 fputs (" PAGE0", stdout
);
6642 if (option
->info
& OEX_SMM
)
6643 fputs (" SMM", stdout
);
6644 if (option
->info
& OEX_FPDBUG
)
6645 fputs (" FPDBUG", stdout
);
6646 if (option
->info
& OEX_DISMISS
)
6647 fputs (" DISMISS", stdout
);
6650 fputs (" PAD ", stdout
);
6651 if (option
->info
& OPAD_PREFIX
)
6652 fputs (" PREFIX", stdout
);
6653 if (option
->info
& OPAD_POSTFIX
)
6654 fputs (" POSTFIX", stdout
);
6655 if (option
->info
& OPAD_SYMBOL
)
6656 fputs (" SYMBOL", stdout
);
6659 fputs (" HWPATCH ", stdout
);
6660 if (option
->info
& OHW_R4KEOP
)
6661 fputs (" R4KEOP", stdout
);
6662 if (option
->info
& OHW_R8KPFETCH
)
6663 fputs (" R8KPFETCH", stdout
);
6664 if (option
->info
& OHW_R5KEOP
)
6665 fputs (" R5KEOP", stdout
);
6666 if (option
->info
& OHW_R5KCVTL
)
6667 fputs (" R5KCVTL", stdout
);
6670 fputs (" FILL ", stdout
);
6671 /* XXX Print content of info word? */
6674 fputs (" TAGS ", stdout
);
6675 /* XXX Print content of info word? */
6678 fputs (" HWAND ", stdout
);
6679 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6680 fputs (" R4KEOP_CHECKED", stdout
);
6681 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6682 fputs (" R4KEOP_CLEAN", stdout
);
6685 fputs (" HWOR ", stdout
);
6686 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
6687 fputs (" R4KEOP_CHECKED", stdout
);
6688 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
6689 fputs (" R4KEOP_CLEAN", stdout
);
6692 printf (" GP_GROUP %#06lx self-contained %#06lx",
6693 option
->info
& OGP_GROUP
,
6694 (option
->info
& OGP_SELF
) >> 16);
6697 printf (" IDENT %#06lx self-contained %#06lx",
6698 option
->info
& OGP_GROUP
,
6699 (option
->info
& OGP_SELF
) >> 16);
6702 /* This shouldn't happen. */
6703 printf (" %3d ??? %d %lx",
6704 option
->kind
, option
->section
, option
->info
);
6708 len
= sizeof (*eopt
);
6709 while (len
< option
->size
)
6710 if (((char *) option
)[len
] >= ' '
6711 && ((char *) option
)[len
] < 0x7f)
6712 printf ("%c", ((char *) option
)[len
++]);
6714 printf ("\\%03o", ((char *) option
)[len
++]);
6716 fputs ("\n", stdout
);
6723 if (conflicts_offset
!= 0 && conflictsno
!= 0)
6725 Elf32_External_Conflict
* econf32
;
6726 Elf64_External_Conflict
* econf64
;
6727 Elf32_Conflict
* iconf
;
6730 if (dynamic_symbols
== NULL
)
6732 error (_("conflict list with without table"));
6736 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
6739 error (_("Out of memory"));
6745 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf32
),
6746 econf32
, Elf32_External_Conflict
*, "conflict");
6748 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6749 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
6753 GET_DATA_ALLOC (conflicts_offset
, conflictsno
* sizeof (*econf64
),
6754 econf64
, Elf64_External_Conflict
*, "conflict");
6756 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6757 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
6760 printf (_("\nSection '.conflict' contains %d entries:\n"), conflictsno
);
6761 puts (_(" Num: Index Value Name"));
6763 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
6765 Elf_Internal_Sym
* psym
= &dynamic_symbols
[iconf
[cnt
]];
6767 printf ("%5u: %8lu ", cnt
, iconf
[cnt
]);
6768 print_vma (psym
->st_value
, FULL_HEX
);
6769 printf (" %s\n", dynamic_strings
+ psym
->st_name
);
6779 get_note_type (e_type
)
6782 static char buff
[64];
6786 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
6787 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
6788 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
6789 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
6790 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
6791 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
6792 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
6793 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
6794 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
6796 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
6801 /* Note that by the ELF standard, the name field is already null byte
6802 terminated, and namesz includes the terminating null byte.
6803 I.E. the value of namesz for the name "FSF" is 4.
6805 If the value of namesz is zero, there is no name present. */
6807 process_note (pnote
)
6808 Elf32_Internal_Note
* pnote
;
6810 printf (" %s\t\t0x%08lx\t%s\n",
6811 pnote
->namesz
? pnote
->namedata
: "(NONE)",
6812 pnote
->descsz
, get_note_type (pnote
->type
));
6818 process_corefile_note_segment (file
, offset
, length
)
6823 Elf_External_Note
* pnotes
;
6824 Elf_External_Note
* external
;
6830 GET_DATA_ALLOC (offset
, length
, pnotes
, Elf_External_Note
*, "notes");
6834 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"), offset
, length
);
6835 printf (_(" Owner\t\tData size\tDescription\n"));
6837 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
6839 Elf32_Internal_Note inote
;
6842 inote
.type
= BYTE_GET (external
->type
);
6843 inote
.namesz
= BYTE_GET (external
->namesz
);
6844 inote
.namedata
= external
->name
;
6845 inote
.descsz
= BYTE_GET (external
->descsz
);
6846 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
6847 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
6849 external
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
6851 /* Verify that name is null terminated. It appears that at least
6852 one version of Linux (RedHat 6.0) generates corefiles that don't
6853 comply with the ELF spec by failing to include the null byte in
6855 if (inote
.namedata
[inote
.namesz
] != '\0')
6857 temp
= malloc (inote
.namesz
+ 1);
6861 error (_("Out of memory\n"));
6866 strncpy (temp
, inote
.namedata
, inote
.namesz
);
6867 temp
[inote
.namesz
] = 0;
6869 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
6870 inote
.namedata
= temp
;
6873 res
&= process_note (& inote
);
6888 process_corefile_note_segments (file
)
6891 Elf_Internal_Phdr
* program_headers
;
6892 Elf_Internal_Phdr
* segment
;
6896 program_headers
= (Elf_Internal_Phdr
*) malloc
6897 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
6899 if (program_headers
== NULL
)
6901 error (_("Out of memory\n"));
6906 i
= get_32bit_program_headers (file
, program_headers
);
6908 i
= get_64bit_program_headers (file
, program_headers
);
6912 free (program_headers
);
6916 for (i
= 0, segment
= program_headers
;
6917 i
< elf_header
.e_phnum
;
6920 if (segment
->p_type
== PT_NOTE
)
6921 res
&= process_corefile_note_segment (file
,
6922 (bfd_vma
) segment
->p_offset
,
6923 (bfd_vma
) segment
->p_filesz
);
6926 free (program_headers
);
6932 process_corefile_contents (file
)
6935 /* If we have not been asked to display the notes then do nothing. */
6939 /* If file is not a core file then exit. */
6940 if (elf_header
.e_type
!= ET_CORE
)
6943 /* No program headers means no NOTE segment. */
6944 if (elf_header
.e_phnum
== 0)
6946 printf (_("No note segments present in the core file.\n"));
6950 return process_corefile_note_segments (file
);
6954 process_arch_specific (file
)
6960 switch (elf_header
.e_machine
)
6963 case EM_MIPS_RS4_BE
:
6964 return process_mips_specific (file
);
6973 get_file_header (file
)
6976 /* Read in the identity array. */
6977 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
6980 /* Determine how to read the rest of the header. */
6981 switch (elf_header
.e_ident
[EI_DATA
])
6983 default: /* fall through */
6984 case ELFDATANONE
: /* fall through */
6985 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
6986 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
6989 /* For now we only support 32 bit and 64 bit ELF files. */
6990 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
6992 /* Read in the rest of the header. */
6995 Elf32_External_Ehdr ehdr32
;
6997 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
7000 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
7001 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
7002 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
7003 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
7004 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
7005 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
7006 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
7007 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
7008 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
7009 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
7010 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
7011 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
7012 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
7016 Elf64_External_Ehdr ehdr64
;
7018 /* If we have been compiled with sizeof (bfd_vma) == 4, then
7019 we will not be able to cope with the 64bit data found in
7020 64 ELF files. Detect this now and abort before we start
7021 overwritting things. */
7022 if (sizeof (bfd_vma
) < 8)
7024 error (_("This instance of readelf has been built without support for a\n"));
7025 error (_("64 bit data type and so it cannot read 64 bit ELF files.\n"));
7029 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
7032 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
7033 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
7034 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
7035 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
7036 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
7037 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
7038 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
7039 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
7040 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
7041 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
7042 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
7043 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
7044 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
7051 process_file (file_name
)
7055 struct stat statbuf
;
7058 if (stat (file_name
, & statbuf
) < 0)
7060 error (_("Cannot stat input file %s.\n"), file_name
);
7064 file
= fopen (file_name
, "rb");
7067 error (_("Input file %s not found.\n"), file_name
);
7071 if (! get_file_header (file
))
7073 error (_("%s: Failed to read file header\n"), file_name
);
7078 /* Initialise per file variables. */
7079 for (i
= NUM_ELEM (version_info
); i
--;)
7080 version_info
[i
] = 0;
7082 for (i
= NUM_ELEM (dynamic_info
); i
--;)
7083 dynamic_info
[i
] = 0;
7085 /* Process the file. */
7087 printf (_("\nFile: %s\n"), file_name
);
7089 if (! process_file_header ())
7095 process_section_headers (file
);
7097 process_program_headers (file
);
7099 process_dynamic_segment (file
);
7101 process_relocs (file
);
7103 process_symbol_table (file
);
7105 process_syminfo (file
);
7107 process_version_sections (file
);
7109 process_section_contents (file
);
7111 process_corefile_contents (file
);
7113 process_arch_specific (file
);
7117 if (section_headers
)
7119 free (section_headers
);
7120 section_headers
= NULL
;
7125 free (string_table
);
7126 string_table
= NULL
;
7129 if (dynamic_strings
)
7131 free (dynamic_strings
);
7132 dynamic_strings
= NULL
;
7135 if (dynamic_symbols
)
7137 free (dynamic_symbols
);
7138 dynamic_symbols
= NULL
;
7139 num_dynamic_syms
= 0;
7142 if (dynamic_syminfo
)
7144 free (dynamic_syminfo
);
7145 dynamic_syminfo
= NULL
;
7149 #ifdef SUPPORT_DISASSEMBLY
7150 /* Needed by the i386 disassembler. For extra credit, someone could
7151 fix this so that we insert symbolic addresses here, esp for GOT/PLT
7155 print_address (unsigned int addr
, FILE * outfile
)
7157 fprintf (outfile
,"0x%8.8x", addr
);
7160 /* Needed by the i386 disassembler. */
7162 db_task_printsym (unsigned int addr
)
7164 print_address (addr
, stderr
);
7173 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
7174 setlocale (LC_MESSAGES
, "");
7176 bindtextdomain (PACKAGE
, LOCALEDIR
);
7177 textdomain (PACKAGE
);
7179 parse_args (argc
, argv
);
7181 if (optind
< (argc
- 1))
7184 while (optind
< argc
)
7185 process_file (argv
[optind
++]);
7187 if (dump_sects
!= NULL
)