1 /* readelf.c -- display contents of an ELF format file
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
7 This file is part of GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include <sys/types.h>
32 /* Define BFD64 here, even if our default architecture is 32 bit ELF
33 as this will allow us to read in and parse 64bit and 32bit ELF files.
34 Only do this if we believe that the compiler can support a 64 bit
35 data type. For now we only rely on GCC being able to do this. */
41 #include "elf/common.h"
42 #include "elf/external.h"
43 #include "elf/internal.h"
44 #include "elf/dwarf2.h"
46 /* The following headers use the elf/reloc-macros.h file to
47 automatically generate relocation recognition functions
48 such as elf_mips_reloc_type() */
50 #define RELOC_MACROS_GEN_FUNC
52 #include "elf/alpha.h"
72 #include "elf/m68hc11.h"
73 #include "elf/mcore.h"
76 #include "elf/mn10200.h"
77 #include "elf/mn10300.h"
78 #include "elf/msp430.h"
82 #include "elf/ppc64.h"
85 #include "elf/sparc.h"
88 #include "elf/x86-64.h"
89 #include "elf/xstormy16.h"
90 #include "elf/iq2000.h"
95 char *program_name
= "readelf";
96 unsigned long dynamic_addr
;
97 bfd_size_type dynamic_size
;
98 char *dynamic_strings
;
100 unsigned long string_table_length
;
101 unsigned long num_dynamic_syms
;
102 Elf_Internal_Sym
*dynamic_symbols
;
103 Elf_Internal_Syminfo
*dynamic_syminfo
;
104 unsigned long dynamic_syminfo_offset
;
105 unsigned int dynamic_syminfo_nent
;
106 char program_interpreter
[64];
107 long dynamic_info
[DT_JMPREL
+ 1];
108 long version_info
[16];
110 Elf_Internal_Ehdr elf_header
;
111 Elf_Internal_Shdr
*section_headers
;
112 Elf_Internal_Dyn
*dynamic_segment
;
113 Elf_Internal_Shdr
*symtab_shndx_hdr
;
121 int do_using_dynamic
;
129 int do_debug_abbrevs
;
131 int do_debug_pubnames
;
132 int do_debug_aranges
;
134 int do_debug_frames_interp
;
135 int do_debug_macinfo
;
142 /* A dynamic array of flags indicating which sections require dumping. */
143 char *dump_sects
= NULL
;
144 unsigned int num_dump_sects
= 0;
146 #define HEX_DUMP (1 << 0)
147 #define DISASS_DUMP (1 << 1)
148 #define DEBUG_DUMP (1 << 2)
150 /* How to rpint a vma value. */
151 typedef enum print_mode
163 /* Forward declarations for dumb compilers. */
164 static void print_vma
165 PARAMS ((bfd_vma
, print_mode
));
166 static void print_symbol
167 PARAMS ((int, const char *));
168 static bfd_vma (*byte_get
)
169 PARAMS ((unsigned char *, int));
170 static bfd_vma byte_get_little_endian
171 PARAMS ((unsigned char *, int));
172 static bfd_vma byte_get_big_endian
173 PARAMS ((unsigned char *, int));
174 static const char *get_mips_dynamic_type
175 PARAMS ((unsigned long));
176 static const char *get_sparc64_dynamic_type
177 PARAMS ((unsigned long));
178 static const char *get_ppc64_dynamic_type
179 PARAMS ((unsigned long));
180 static const char *get_parisc_dynamic_type
181 PARAMS ((unsigned long));
182 static const char *get_dynamic_type
183 PARAMS ((unsigned long));
184 static int slurp_rela_relocs
185 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**,
187 static int slurp_rel_relocs
188 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**,
190 static int dump_relocations
191 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*,
192 unsigned long, char *, int));
193 static char *get_file_type
195 static char *get_machine_name
197 static void decode_ARM_machine_flags
198 PARAMS ((unsigned, char[]));
199 static char *get_machine_flags
200 PARAMS ((unsigned, unsigned));
201 static const char *get_mips_segment_type
202 PARAMS ((unsigned long));
203 static const char *get_parisc_segment_type
204 PARAMS ((unsigned long));
205 static const char *get_ia64_segment_type
206 PARAMS ((unsigned long));
207 static const char *get_segment_type
208 PARAMS ((unsigned long));
209 static const char *get_mips_section_type_name
210 PARAMS ((unsigned int));
211 static const char *get_parisc_section_type_name
212 PARAMS ((unsigned int));
213 static const char *get_ia64_section_type_name
214 PARAMS ((unsigned int));
215 static const char *get_section_type_name
216 PARAMS ((unsigned int));
217 static const char *get_symbol_binding
218 PARAMS ((unsigned int));
219 static const char *get_symbol_type
220 PARAMS ((unsigned int));
221 static const char *get_symbol_visibility
222 PARAMS ((unsigned int));
223 static const char *get_symbol_index_type
224 PARAMS ((unsigned int));
225 static const char *get_dynamic_flags
229 static void parse_args
230 PARAMS ((int, char **));
231 static int process_file_header
233 static int process_program_headers
235 static int process_section_headers
237 static int process_unwind
239 static void dynamic_segment_mips_val
240 PARAMS ((Elf_Internal_Dyn
*));
241 static void dynamic_segment_parisc_val
242 PARAMS ((Elf_Internal_Dyn
*));
243 static int process_dynamic_segment
245 static int process_symbol_table
247 static int process_syminfo
249 static int process_section_contents
251 static void process_mips_fpe_exception
253 static int process_mips_specific
255 static int process_file
257 static int process_relocs
259 static int process_version_sections
261 static char *get_ver_flags
262 PARAMS ((unsigned int));
263 static int get_32bit_section_headers
264 PARAMS ((FILE *, unsigned int));
265 static int get_64bit_section_headers
266 PARAMS ((FILE *, unsigned int));
267 static int get_32bit_program_headers
268 PARAMS ((FILE *, Elf_Internal_Phdr
*));
269 static int get_64bit_program_headers
270 PARAMS ((FILE *, Elf_Internal_Phdr
*));
271 static int get_file_header
273 static Elf_Internal_Sym
*get_32bit_elf_symbols
274 PARAMS ((FILE *, Elf_Internal_Shdr
*));
275 static Elf_Internal_Sym
*get_64bit_elf_symbols
276 PARAMS ((FILE *, Elf_Internal_Shdr
*));
277 static const char *get_elf_section_flags
279 static int *get_dynamic_data
280 PARAMS ((FILE *, unsigned int));
281 static int get_32bit_dynamic_segment
283 static int get_64bit_dynamic_segment
285 #ifdef SUPPORT_DISASSEMBLY
286 static int disassemble_section
287 PARAMS ((Elf_Internal_Shdr
*, FILE *));
289 static int dump_section
290 PARAMS ((Elf_Internal_Shdr
*, FILE *));
291 static int display_debug_section
292 PARAMS ((Elf_Internal_Shdr
*, FILE *));
293 static int display_debug_info
294 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
295 static int display_debug_not_supported
296 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
297 static int prescan_debug_info
298 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
299 static int display_debug_lines
300 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
301 static int display_debug_pubnames
302 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
303 static int display_debug_abbrev
304 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
305 static int display_debug_aranges
306 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
307 static int display_debug_frames
308 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
309 static int display_debug_macinfo
310 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
311 static int display_debug_str
312 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
313 static int display_debug_loc
314 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
315 static unsigned char *process_abbrev_section
316 PARAMS ((unsigned char *, unsigned char *));
317 static void load_debug_str
319 static void free_debug_str
321 static const char *fetch_indirect_string
322 PARAMS ((unsigned long));
323 static void load_debug_loc
325 static void free_debug_loc
327 static unsigned long read_leb128
328 PARAMS ((unsigned char *, int *, int));
329 static int process_extended_line_op
330 PARAMS ((unsigned char *, int, int));
331 static void reset_state_machine
333 static char *get_TAG_name
334 PARAMS ((unsigned long));
335 static char *get_AT_name
336 PARAMS ((unsigned long));
337 static char *get_FORM_name
338 PARAMS ((unsigned long));
339 static void free_abbrevs
341 static void add_abbrev
342 PARAMS ((unsigned long, unsigned long, int));
343 static void add_abbrev_attr
344 PARAMS ((unsigned long, unsigned long));
345 static unsigned char *read_and_display_attr
346 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
348 static unsigned char *read_and_display_attr_value
349 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
351 static unsigned char *display_block
352 PARAMS ((unsigned char *, unsigned long));
353 static void decode_location_expression
354 PARAMS ((unsigned char *, unsigned int, unsigned long));
355 static void request_dump
356 PARAMS ((unsigned int, int));
357 static const char *get_elf_class
358 PARAMS ((unsigned int));
359 static const char *get_data_encoding
360 PARAMS ((unsigned int));
361 static const char *get_osabi_name
362 PARAMS ((unsigned int));
363 static int guess_is_rela
364 PARAMS ((unsigned long));
365 static const char *get_note_type
366 PARAMS ((unsigned int));
367 static const char *get_netbsd_elfcore_note_type
368 PARAMS ((unsigned int));
369 static int process_note
370 PARAMS ((Elf_Internal_Note
*));
371 static int process_corefile_note_segment
372 PARAMS ((FILE *, bfd_vma
, bfd_vma
));
373 static int process_corefile_note_segments
375 static int process_corefile_contents
377 static int process_arch_specific
379 static int process_gnu_liblist
382 typedef int Elf32_Word
;
386 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
387 ((X)->sh_name >= string_table_length \
388 ? "<corrupt>" : string_table + (X)->sh_name))
390 /* Given st_shndx I, map to section_headers index. */
391 #define SECTION_HEADER_INDEX(I) \
392 ((I) < SHN_LORESERVE \
394 : ((I) <= SHN_HIRESERVE \
396 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
398 /* Reverse of the above. */
399 #define SECTION_HEADER_NUM(N) \
400 ((N) < SHN_LORESERVE \
402 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
404 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
406 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
408 #define BYTE_GET(field) byte_get (field, sizeof (field))
410 /* If we can support a 64 bit data type then BFD64 should be defined
411 and sizeof (bfd_vma) == 8. In this case when translating from an
412 external 8 byte field to an internal field, we can assume that the
413 internal field is also 8 bytes wide and so we can extract all the data.
414 If, however, BFD64 is not defined, then we must assume that the
415 internal data structure only has 4 byte wide fields that are the
416 equivalent of the 8 byte wide external counterparts, and so we must
417 truncate the data. */
419 #define BYTE_GET8(field) byte_get (field, -8)
421 #define BYTE_GET8(field) byte_get (field, 8)
424 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
426 #define GET_ELF_SYMBOLS(file, section) \
427 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
428 : get_64bit_elf_symbols (file, section))
432 error
VPARAMS ((const char *message
, ...))
434 VA_OPEN (args
, message
);
435 VA_FIXEDARG (args
, const char *, message
);
437 fprintf (stderr
, _("%s: Error: "), program_name
);
438 vfprintf (stderr
, message
, args
);
443 warn
VPARAMS ((const char *message
, ...))
445 VA_OPEN (args
, message
);
446 VA_FIXEDARG (args
, const char *, message
);
448 fprintf (stderr
, _("%s: Warning: "), program_name
);
449 vfprintf (stderr
, message
, args
);
453 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
456 get_data (var
, file
, offset
, size
, reason
)
468 if (fseek (file
, offset
, SEEK_SET
))
470 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
477 mvar
= (PTR
) malloc (size
);
481 error (_("Out of memory allocating %d bytes for %s\n"),
487 if (fread (mvar
, size
, 1, file
) != 1)
489 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
499 byte_get_little_endian (field
, size
)
500 unsigned char *field
;
509 return ((unsigned int) (field
[0]))
510 | (((unsigned int) (field
[1])) << 8);
514 /* We want to extract data from an 8 byte wide field and
515 place it into a 4 byte wide field. Since this is a little
516 endian source we can just use the 4 byte extraction code. */
520 return ((unsigned long) (field
[0]))
521 | (((unsigned long) (field
[1])) << 8)
522 | (((unsigned long) (field
[2])) << 16)
523 | (((unsigned long) (field
[3])) << 24);
528 /* This is a special case, generated by the BYTE_GET8 macro.
529 It means that we are loading an 8 byte value from a field
530 in an external structure into an 8 byte value in a field
531 in an internal strcuture. */
532 return ((bfd_vma
) (field
[0]))
533 | (((bfd_vma
) (field
[1])) << 8)
534 | (((bfd_vma
) (field
[2])) << 16)
535 | (((bfd_vma
) (field
[3])) << 24)
536 | (((bfd_vma
) (field
[4])) << 32)
537 | (((bfd_vma
) (field
[5])) << 40)
538 | (((bfd_vma
) (field
[6])) << 48)
539 | (((bfd_vma
) (field
[7])) << 56);
542 error (_("Unhandled data length: %d\n"), size
);
547 /* Print a VMA value. */
549 print_vma (vma
, mode
)
559 case FULL_HEX
: printf ("0x"); /* drop through */
560 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
561 case PREFIX_HEX
: printf ("0x"); /* drop through */
562 case HEX
: printf ("%lx", (unsigned long) vma
); break;
563 case DEC
: printf ("%ld", (unsigned long) vma
); break;
564 case DEC_5
: printf ("%5ld", (long) vma
); break;
565 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
586 #if BFD_HOST_64BIT_LONG
589 if (_bfd_int64_high (vma
))
590 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
592 printf ("%lx", _bfd_int64_low (vma
));
597 #if BFD_HOST_64BIT_LONG
600 if (_bfd_int64_high (vma
))
602 printf ("++%ld", _bfd_int64_low (vma
));
604 printf ("%ld", _bfd_int64_low (vma
));
609 #if BFD_HOST_64BIT_LONG
610 printf ("%5ld", vma
);
612 if (_bfd_int64_high (vma
))
614 printf ("++%ld", _bfd_int64_low (vma
));
616 printf ("%5ld", _bfd_int64_low (vma
));
621 #if BFD_HOST_64BIT_LONG
624 if (_bfd_int64_high (vma
))
626 printf ("++%lu", _bfd_int64_low (vma
));
628 printf ("%lu", _bfd_int64_low (vma
));
636 /* Display a symbol on stdout. If do_wide is not true then
637 format the symbol to be at most WIDTH characters,
638 truncating as necessary. If WIDTH is negative then
639 format the string to be exactly - WIDTH characters,
640 truncating or padding as necessary. */
643 print_symbol (width
, symbol
)
648 printf ("%s", symbol
);
650 printf ("%-*.*s", width
, width
, symbol
);
652 printf ("%-.*s", width
, symbol
);
656 byte_get_big_endian (field
, size
)
657 unsigned char *field
;
666 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
669 return ((unsigned long) (field
[3]))
670 | (((unsigned long) (field
[2])) << 8)
671 | (((unsigned long) (field
[1])) << 16)
672 | (((unsigned long) (field
[0])) << 24);
676 /* Although we are extracing data from an 8 byte wide field, we
677 are returning only 4 bytes of data. */
678 return ((unsigned long) (field
[7]))
679 | (((unsigned long) (field
[6])) << 8)
680 | (((unsigned long) (field
[5])) << 16)
681 | (((unsigned long) (field
[4])) << 24);
685 /* This is a special case, generated by the BYTE_GET8 macro.
686 It means that we are loading an 8 byte value from a field
687 in an external structure into an 8 byte value in a field
688 in an internal strcuture. */
689 return ((bfd_vma
) (field
[7]))
690 | (((bfd_vma
) (field
[6])) << 8)
691 | (((bfd_vma
) (field
[5])) << 16)
692 | (((bfd_vma
) (field
[4])) << 24)
693 | (((bfd_vma
) (field
[3])) << 32)
694 | (((bfd_vma
) (field
[2])) << 40)
695 | (((bfd_vma
) (field
[1])) << 48)
696 | (((bfd_vma
) (field
[0])) << 56);
700 error (_("Unhandled data length: %d\n"), size
);
705 /* Guess the relocation size commonly used by the specific machines. */
708 guess_is_rela (e_machine
)
709 unsigned long e_machine
;
713 /* Targets that use REL relocations. */
729 /* Targets that use RELA relocations. */
744 case EM_CYGNUS_MN10200
:
746 case EM_CYGNUS_MN10300
:
789 warn (_("Don't know about relocations on this machine architecture\n"));
795 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
797 unsigned long rel_offset
;
798 unsigned long rel_size
;
799 Elf_Internal_Rela
**relasp
;
800 unsigned long *nrelasp
;
802 Elf_Internal_Rela
*relas
;
803 unsigned long nrelas
;
808 Elf32_External_Rela
*erelas
;
810 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
811 rel_size
, _("relocs"));
815 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
817 relas
= (Elf_Internal_Rela
*)
818 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
822 error(_("out of memory parsing relocs"));
826 for (i
= 0; i
< nrelas
; i
++)
828 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
829 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
830 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
837 Elf64_External_Rela
*erelas
;
839 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
840 rel_size
, _("relocs"));
844 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
846 relas
= (Elf_Internal_Rela
*)
847 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
851 error(_("out of memory parsing relocs"));
855 for (i
= 0; i
< nrelas
; i
++)
857 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
858 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
859 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
870 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
872 unsigned long rel_offset
;
873 unsigned long rel_size
;
874 Elf_Internal_Rela
**relsp
;
875 unsigned long *nrelsp
;
877 Elf_Internal_Rela
*rels
;
883 Elf32_External_Rel
*erels
;
885 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
886 rel_size
, _("relocs"));
890 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
892 rels
= (Elf_Internal_Rela
*) malloc (nrels
* sizeof (Elf_Internal_Rela
));
896 error(_("out of memory parsing relocs"));
900 for (i
= 0; i
< nrels
; i
++)
902 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
903 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
904 rels
[i
].r_addend
= 0;
911 Elf64_External_Rel
*erels
;
913 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
914 rel_size
, _("relocs"));
918 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
920 rels
= (Elf_Internal_Rela
*) malloc (nrels
* sizeof (Elf_Internal_Rela
));
924 error(_("out of memory parsing relocs"));
928 for (i
= 0; i
< nrels
; i
++)
930 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
931 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
932 rels
[i
].r_addend
= 0;
942 /* Display the contents of the relocation data found at the specified offset. */
944 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
946 unsigned long rel_offset
;
947 unsigned long rel_size
;
948 Elf_Internal_Sym
*symtab
;
954 Elf_Internal_Rela
*rels
;
957 if (is_rela
== UNKNOWN
)
958 is_rela
= guess_is_rela (elf_header
.e_machine
);
962 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
967 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
976 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
978 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
983 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
985 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
993 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
995 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1000 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1002 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1006 for (i
= 0; i
< rel_size
; i
++)
1009 const char *rtype2
= NULL
;
1010 const char *rtype3
= NULL
;
1013 bfd_vma symtab_index
;
1015 bfd_vma type2
= (bfd_vma
) NULL
;
1016 bfd_vma type3
= (bfd_vma
) NULL
;
1018 offset
= rels
[i
].r_offset
;
1019 info
= rels
[i
].r_info
;
1023 type
= ELF32_R_TYPE (info
);
1024 symtab_index
= ELF32_R_SYM (info
);
1028 /* The #ifdef BFD64 below is to prevent a compile time warning.
1029 We know that if we do not have a 64 bit data type that we
1030 will never execute this code anyway. */
1032 if (elf_header
.e_machine
== EM_MIPS
)
1034 /* In little-endian objects, r_info isn't really a 64-bit
1035 little-endian value: it has a 32-bit little-endian
1036 symbol index followed by four individual byte fields.
1037 Reorder INFO accordingly. */
1038 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1039 info
= (((info
& 0xffffffff) << 32)
1040 | ((info
>> 56) & 0xff)
1041 | ((info
>> 40) & 0xff00)
1042 | ((info
>> 24) & 0xff0000)
1043 | ((info
>> 8) & 0xff000000));
1044 type
= ELF64_MIPS_R_TYPE (info
);
1045 type2
= ELF64_MIPS_R_TYPE2 (info
);
1046 type3
= ELF64_MIPS_R_TYPE3 (info
);
1048 else if (elf_header
.e_machine
== EM_SPARCV9
)
1049 type
= ELF64_R_TYPE_ID (info
);
1051 type
= ELF64_R_TYPE (info
);
1053 symtab_index
= ELF64_R_SYM (info
);
1059 #ifdef _bfd_int64_low
1060 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1062 printf ("%8.8lx %8.8lx ", offset
, info
);
1067 #ifdef _bfd_int64_low
1069 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1070 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1071 _bfd_int64_high (offset
),
1072 _bfd_int64_low (offset
),
1073 _bfd_int64_high (info
),
1074 _bfd_int64_low (info
));
1077 ? "%16.16lx %16.16lx "
1078 : "%12.12lx %12.12lx ",
1083 switch (elf_header
.e_machine
)
1090 case EM_CYGNUS_M32R
:
1091 rtype
= elf_m32r_reloc_type (type
);
1096 rtype
= elf_i386_reloc_type (type
);
1101 rtype
= elf_m68hc11_reloc_type (type
);
1105 rtype
= elf_m68k_reloc_type (type
);
1109 rtype
= elf_i960_reloc_type (type
);
1114 rtype
= elf_avr_reloc_type (type
);
1117 case EM_OLD_SPARCV9
:
1118 case EM_SPARC32PLUS
:
1121 rtype
= elf_sparc_reloc_type (type
);
1125 case EM_CYGNUS_V850
:
1126 rtype
= v850_reloc_type (type
);
1130 case EM_CYGNUS_D10V
:
1131 rtype
= elf_d10v_reloc_type (type
);
1135 case EM_CYGNUS_D30V
:
1136 rtype
= elf_d30v_reloc_type (type
);
1140 rtype
= elf_dlx_reloc_type (type
);
1144 rtype
= elf_sh_reloc_type (type
);
1148 case EM_CYGNUS_MN10300
:
1149 rtype
= elf_mn10300_reloc_type (type
);
1153 case EM_CYGNUS_MN10200
:
1154 rtype
= elf_mn10200_reloc_type (type
);
1158 case EM_CYGNUS_FR30
:
1159 rtype
= elf_fr30_reloc_type (type
);
1163 rtype
= elf_frv_reloc_type (type
);
1167 rtype
= elf_mcore_reloc_type (type
);
1171 rtype
= elf_mmix_reloc_type (type
);
1176 rtype
= elf_msp430_reloc_type (type
);
1180 rtype
= elf_ppc_reloc_type (type
);
1184 rtype
= elf_ppc64_reloc_type (type
);
1188 case EM_MIPS_RS3_LE
:
1189 rtype
= elf_mips_reloc_type (type
);
1192 rtype2
= elf_mips_reloc_type (type2
);
1193 rtype3
= elf_mips_reloc_type (type3
);
1198 rtype
= elf_alpha_reloc_type (type
);
1202 rtype
= elf_arm_reloc_type (type
);
1206 rtype
= elf_arc_reloc_type (type
);
1210 rtype
= elf_hppa_reloc_type (type
);
1216 rtype
= elf_h8_reloc_type (type
);
1221 rtype
= elf_or32_reloc_type (type
);
1226 rtype
= elf_pj_reloc_type (type
);
1229 rtype
= elf_ia64_reloc_type (type
);
1233 rtype
= elf_cris_reloc_type (type
);
1237 rtype
= elf_i860_reloc_type (type
);
1241 rtype
= elf_x86_64_reloc_type (type
);
1245 rtype
= i370_reloc_type (type
);
1250 rtype
= elf_s390_reloc_type (type
);
1254 rtype
= elf_xstormy16_reloc_type (type
);
1258 rtype
= elf_vax_reloc_type (type
);
1263 rtype
= elf_ip2k_reloc_type (type
);
1267 rtype
= elf_iq2000_reloc_type (type
);
1272 #ifdef _bfd_int64_low
1273 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1275 printf (_("unrecognized: %-7lx"), type
);
1278 printf (do_wide
? "%-21.21s" : "%-17.17s", rtype
);
1282 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1283 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1286 Elf_Internal_Sym
*psym
;
1288 psym
= symtab
+ symtab_index
;
1291 print_vma (psym
->st_value
, LONG_HEX
);
1292 printf (is_32bit_elf
? " " : " ");
1294 if (psym
->st_name
== 0)
1296 const char *sec_name
= "<null>";
1299 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1301 bfd_vma sec_index
= (bfd_vma
) -1;
1303 if (psym
->st_shndx
< SHN_LORESERVE
)
1304 sec_index
= psym
->st_shndx
;
1305 else if (psym
->st_shndx
> SHN_LORESERVE
)
1306 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1309 if (sec_index
!= (bfd_vma
) -1)
1310 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1311 else if (psym
->st_shndx
== SHN_ABS
)
1313 else if (psym
->st_shndx
== SHN_COMMON
)
1314 sec_name
= "COMMON";
1317 sprintf (name_buf
, "<section 0x%x>",
1318 (unsigned int) psym
->st_shndx
);
1319 sec_name
= name_buf
;
1322 print_symbol (22, sec_name
);
1324 else if (strtab
== NULL
)
1325 printf (_("<string table index %3ld>"), psym
->st_name
);
1327 print_symbol (22, strtab
+ psym
->st_name
);
1330 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1335 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1336 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1339 if (elf_header
.e_machine
== EM_SPARCV9
1340 && !strcmp (rtype
, "R_SPARC_OLO10"))
1341 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1345 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1347 printf (" Type2: ");
1350 #ifdef _bfd_int64_low
1351 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1353 printf (_("unrecognized: %-7lx"), type2
);
1356 printf ("%-17.17s", rtype2
);
1358 printf("\n Type3: ");
1361 #ifdef _bfd_int64_low
1362 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1364 printf (_("unrecognized: %-7lx"), type3
);
1367 printf ("%-17.17s", rtype3
);
1379 get_mips_dynamic_type (type
)
1384 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1385 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1386 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1387 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1388 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1389 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1390 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1391 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1392 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1393 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1394 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1395 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1396 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1397 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1398 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1399 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1400 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1401 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1402 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1403 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1404 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1405 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1406 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1407 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1408 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1409 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1410 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1411 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1412 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1413 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1414 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1415 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1416 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1417 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1418 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1419 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1420 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1421 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1422 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1423 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1424 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1425 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1426 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1433 get_sparc64_dynamic_type (type
)
1438 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1445 get_ppc64_dynamic_type (type
)
1450 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1451 case DT_PPC64_OPD
: return "PPC64_OPD";
1452 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1459 get_parisc_dynamic_type (type
)
1464 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1465 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1466 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1467 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1468 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1469 case DT_HP_PREINIT
: return "HP_PREINIT";
1470 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1471 case DT_HP_NEEDED
: return "HP_NEEDED";
1472 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1473 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1474 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1475 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1476 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1483 get_dynamic_type (type
)
1486 static char buff
[32];
1490 case DT_NULL
: return "NULL";
1491 case DT_NEEDED
: return "NEEDED";
1492 case DT_PLTRELSZ
: return "PLTRELSZ";
1493 case DT_PLTGOT
: return "PLTGOT";
1494 case DT_HASH
: return "HASH";
1495 case DT_STRTAB
: return "STRTAB";
1496 case DT_SYMTAB
: return "SYMTAB";
1497 case DT_RELA
: return "RELA";
1498 case DT_RELASZ
: return "RELASZ";
1499 case DT_RELAENT
: return "RELAENT";
1500 case DT_STRSZ
: return "STRSZ";
1501 case DT_SYMENT
: return "SYMENT";
1502 case DT_INIT
: return "INIT";
1503 case DT_FINI
: return "FINI";
1504 case DT_SONAME
: return "SONAME";
1505 case DT_RPATH
: return "RPATH";
1506 case DT_SYMBOLIC
: return "SYMBOLIC";
1507 case DT_REL
: return "REL";
1508 case DT_RELSZ
: return "RELSZ";
1509 case DT_RELENT
: return "RELENT";
1510 case DT_PLTREL
: return "PLTREL";
1511 case DT_DEBUG
: return "DEBUG";
1512 case DT_TEXTREL
: return "TEXTREL";
1513 case DT_JMPREL
: return "JMPREL";
1514 case DT_BIND_NOW
: return "BIND_NOW";
1515 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1516 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1517 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1518 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1519 case DT_RUNPATH
: return "RUNPATH";
1520 case DT_FLAGS
: return "FLAGS";
1522 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1523 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1525 case DT_CHECKSUM
: return "CHECKSUM";
1526 case DT_PLTPADSZ
: return "PLTPADSZ";
1527 case DT_MOVEENT
: return "MOVEENT";
1528 case DT_MOVESZ
: return "MOVESZ";
1529 case DT_FEATURE
: return "FEATURE";
1530 case DT_POSFLAG_1
: return "POSFLAG_1";
1531 case DT_SYMINSZ
: return "SYMINSZ";
1532 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1534 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1535 case DT_CONFIG
: return "CONFIG";
1536 case DT_DEPAUDIT
: return "DEPAUDIT";
1537 case DT_AUDIT
: return "AUDIT";
1538 case DT_PLTPAD
: return "PLTPAD";
1539 case DT_MOVETAB
: return "MOVETAB";
1540 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1542 case DT_VERSYM
: return "VERSYM";
1544 case DT_RELACOUNT
: return "RELACOUNT";
1545 case DT_RELCOUNT
: return "RELCOUNT";
1546 case DT_FLAGS_1
: return "FLAGS_1";
1547 case DT_VERDEF
: return "VERDEF";
1548 case DT_VERDEFNUM
: return "VERDEFNUM";
1549 case DT_VERNEED
: return "VERNEED";
1550 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1552 case DT_AUXILIARY
: return "AUXILIARY";
1553 case DT_USED
: return "USED";
1554 case DT_FILTER
: return "FILTER";
1556 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1557 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1558 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1559 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1560 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1563 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1567 switch (elf_header
.e_machine
)
1570 case EM_MIPS_RS3_LE
:
1571 result
= get_mips_dynamic_type (type
);
1574 result
= get_sparc64_dynamic_type (type
);
1577 result
= get_ppc64_dynamic_type (type
);
1587 sprintf (buff
, _("Processor Specific: %lx"), type
);
1589 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1593 switch (elf_header
.e_machine
)
1596 result
= get_parisc_dynamic_type (type
);
1606 sprintf (buff
, _("Operating System specific: %lx"), type
);
1609 sprintf (buff
, _("<unknown>: %lx"), type
);
1616 get_file_type (e_type
)
1619 static char buff
[32];
1623 case ET_NONE
: return _("NONE (None)");
1624 case ET_REL
: return _("REL (Relocatable file)");
1625 case ET_EXEC
: return _("EXEC (Executable file)");
1626 case ET_DYN
: return _("DYN (Shared object file)");
1627 case ET_CORE
: return _("CORE (Core file)");
1630 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1631 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1632 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1633 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1635 sprintf (buff
, _("<unknown>: %x"), e_type
);
1641 get_machine_name (e_machine
)
1644 static char buff
[64]; /* XXX */
1648 case EM_NONE
: return _("None");
1649 case EM_M32
: return "WE32100";
1650 case EM_SPARC
: return "Sparc";
1651 case EM_386
: return "Intel 80386";
1652 case EM_68K
: return "MC68000";
1653 case EM_88K
: return "MC88000";
1654 case EM_486
: return "Intel 80486";
1655 case EM_860
: return "Intel 80860";
1656 case EM_MIPS
: return "MIPS R3000";
1657 case EM_S370
: return "IBM System/370";
1658 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1659 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1660 case EM_PARISC
: return "HPPA";
1661 case EM_PPC_OLD
: return "Power PC (old)";
1662 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1663 case EM_960
: return "Intel 90860";
1664 case EM_PPC
: return "PowerPC";
1665 case EM_PPC64
: return "PowerPC64";
1666 case EM_V800
: return "NEC V800";
1667 case EM_FR20
: return "Fujitsu FR20";
1668 case EM_RH32
: return "TRW RH32";
1669 case EM_MCORE
: return "MCORE";
1670 case EM_ARM
: return "ARM";
1671 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1672 case EM_SH
: return "Hitachi SH";
1673 case EM_SPARCV9
: return "Sparc v9";
1674 case EM_TRICORE
: return "Siemens Tricore";
1675 case EM_ARC
: return "ARC";
1676 case EM_H8_300
: return "Hitachi H8/300";
1677 case EM_H8_300H
: return "Hitachi H8/300H";
1678 case EM_H8S
: return "Hitachi H8S";
1679 case EM_H8_500
: return "Hitachi H8/500";
1680 case EM_IA_64
: return "Intel IA-64";
1681 case EM_MIPS_X
: return "Stanford MIPS-X";
1682 case EM_COLDFIRE
: return "Motorola Coldfire";
1683 case EM_68HC12
: return "Motorola M68HC12";
1684 case EM_ALPHA
: return "Alpha";
1685 case EM_CYGNUS_D10V
:
1686 case EM_D10V
: return "d10v";
1687 case EM_CYGNUS_D30V
:
1688 case EM_D30V
: return "d30v";
1689 case EM_CYGNUS_M32R
:
1690 case EM_M32R
: return "Mitsubishi M32r";
1691 case EM_CYGNUS_V850
:
1692 case EM_V850
: return "NEC v850";
1693 case EM_CYGNUS_MN10300
:
1694 case EM_MN10300
: return "mn10300";
1695 case EM_CYGNUS_MN10200
:
1696 case EM_MN10200
: return "mn10200";
1697 case EM_CYGNUS_FR30
:
1698 case EM_FR30
: return "Fujitsu FR30";
1699 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1701 case EM_PJ
: return "picoJava";
1702 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1703 case EM_PCP
: return "Siemens PCP";
1704 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1705 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1706 case EM_STARCORE
: return "Motorola Star*Core processor";
1707 case EM_ME16
: return "Toyota ME16 processor";
1708 case EM_ST100
: return "STMicroelectronics ST100 processor";
1709 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1710 case EM_FX66
: return "Siemens FX66 microcontroller";
1711 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1712 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1713 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1714 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1715 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1716 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1717 case EM_SVX
: return "Silicon Graphics SVx";
1718 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1719 case EM_VAX
: return "Digital VAX";
1721 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1722 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1723 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1724 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1725 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1726 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1727 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1728 case EM_PRISM
: return "Vitesse Prism";
1729 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1731 case EM_S390
: return "IBM S/390";
1732 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1734 case EM_OR32
: return "OpenRISC";
1735 case EM_DLX
: return "OpenDLX";
1737 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1738 case EM_IQ2000
: return "Vitesse IQ2000";
1740 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1746 decode_ARM_machine_flags (e_flags
, buf
)
1753 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1754 e_flags
&= ~ EF_ARM_EABIMASK
;
1756 /* Handle "generic" ARM flags. */
1757 if (e_flags
& EF_ARM_RELEXEC
)
1759 strcat (buf
, ", relocatable executable");
1760 e_flags
&= ~ EF_ARM_RELEXEC
;
1763 if (e_flags
& EF_ARM_HASENTRY
)
1765 strcat (buf
, ", has entry point");
1766 e_flags
&= ~ EF_ARM_HASENTRY
;
1769 /* Now handle EABI specific flags. */
1773 strcat (buf
, ", <unrecognized EABI>");
1778 case EF_ARM_EABI_VER1
:
1779 strcat (buf
, ", Version1 EABI");
1784 /* Process flags one bit at a time. */
1785 flag
= e_flags
& - e_flags
;
1790 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1791 strcat (buf
, ", sorted symbol tables");
1801 case EF_ARM_EABI_VER2
:
1802 strcat (buf
, ", Version2 EABI");
1807 /* Process flags one bit at a time. */
1808 flag
= e_flags
& - e_flags
;
1813 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1814 strcat (buf
, ", sorted symbol tables");
1817 case EF_ARM_DYNSYMSUSESEGIDX
:
1818 strcat (buf
, ", dynamic symbols use segment index");
1821 case EF_ARM_MAPSYMSFIRST
:
1822 strcat (buf
, ", mapping symbols precede others");
1832 case EF_ARM_EABI_UNKNOWN
:
1833 strcat (buf
, ", GNU EABI");
1838 /* Process flags one bit at a time. */
1839 flag
= e_flags
& - e_flags
;
1844 case EF_ARM_INTERWORK
:
1845 strcat (buf
, ", interworking enabled");
1848 case EF_ARM_APCS_26
:
1849 strcat (buf
, ", uses APCS/26");
1852 case EF_ARM_APCS_FLOAT
:
1853 strcat (buf
, ", uses APCS/float");
1857 strcat (buf
, ", position independent");
1861 strcat (buf
, ", 8 bit structure alignment");
1864 case EF_ARM_NEW_ABI
:
1865 strcat (buf
, ", uses new ABI");
1868 case EF_ARM_OLD_ABI
:
1869 strcat (buf
, ", uses old ABI");
1872 case EF_ARM_SOFT_FLOAT
:
1873 strcat (buf
, ", software FP");
1876 case EF_ARM_MAVERICK_FLOAT
:
1877 strcat (buf
, ", Maverick FP");
1888 strcat (buf
,", <unknown>");
1892 get_machine_flags (e_flags
, e_machine
)
1896 static char buf
[1024];
1908 decode_ARM_machine_flags (e_flags
, buf
);
1912 if (e_flags
& EF_CPU32
)
1913 strcat (buf
, ", cpu32");
1914 if (e_flags
& EF_M68000
)
1915 strcat (buf
, ", m68000");
1919 if (e_flags
& EF_PPC_EMB
)
1920 strcat (buf
, ", emb");
1922 if (e_flags
& EF_PPC_RELOCATABLE
)
1923 strcat (buf
, ", relocatable");
1925 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1926 strcat (buf
, ", relocatable-lib");
1930 case EM_CYGNUS_V850
:
1931 switch (e_flags
& EF_V850_ARCH
)
1934 strcat (buf
, ", v850e");
1937 strcat (buf
, ", v850");
1940 strcat (buf
, ", unknown v850 architecture variant");
1946 case EM_CYGNUS_M32R
:
1947 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1948 strcat (buf
, ", m32r");
1953 case EM_MIPS_RS3_LE
:
1954 if (e_flags
& EF_MIPS_NOREORDER
)
1955 strcat (buf
, ", noreorder");
1957 if (e_flags
& EF_MIPS_PIC
)
1958 strcat (buf
, ", pic");
1960 if (e_flags
& EF_MIPS_CPIC
)
1961 strcat (buf
, ", cpic");
1963 if (e_flags
& EF_MIPS_UCODE
)
1964 strcat (buf
, ", ugen_reserved");
1966 if (e_flags
& EF_MIPS_ABI2
)
1967 strcat (buf
, ", abi2");
1969 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1970 strcat (buf
, ", odk first");
1972 if (e_flags
& EF_MIPS_32BITMODE
)
1973 strcat (buf
, ", 32bitmode");
1975 switch ((e_flags
& EF_MIPS_MACH
))
1977 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1978 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1979 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1980 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1981 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1982 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1983 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1984 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1985 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1987 /* We simply ignore the field in this case to avoid confusion:
1988 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1991 default: strcat (buf
, ", unknown CPU"); break;
1994 switch ((e_flags
& EF_MIPS_ABI
))
1996 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1997 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1998 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1999 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2001 /* We simply ignore the field in this case to avoid confusion:
2002 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2003 This means it is likely to be an o32 file, but not for
2006 default: strcat (buf
, ", unknown ABI"); break;
2009 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2010 strcat (buf
, ", mdmx");
2012 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2013 strcat (buf
, ", mips16");
2015 switch ((e_flags
& EF_MIPS_ARCH
))
2017 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2018 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2019 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2020 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2021 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2022 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2023 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2024 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2025 default: strcat (buf
, ", unknown ISA"); break;
2031 if (e_flags
& EF_SPARC_32PLUS
)
2032 strcat (buf
, ", v8+");
2034 if (e_flags
& EF_SPARC_SUN_US1
)
2035 strcat (buf
, ", ultrasparcI");
2037 if (e_flags
& EF_SPARC_SUN_US3
)
2038 strcat (buf
, ", ultrasparcIII");
2040 if (e_flags
& EF_SPARC_HAL_R1
)
2041 strcat (buf
, ", halr1");
2043 if (e_flags
& EF_SPARC_LEDATA
)
2044 strcat (buf
, ", ledata");
2046 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2047 strcat (buf
, ", tso");
2049 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2050 strcat (buf
, ", pso");
2052 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2053 strcat (buf
, ", rmo");
2057 switch (e_flags
& EF_PARISC_ARCH
)
2059 case EFA_PARISC_1_0
:
2060 strcpy (buf
, ", PA-RISC 1.0");
2062 case EFA_PARISC_1_1
:
2063 strcpy (buf
, ", PA-RISC 1.1");
2065 case EFA_PARISC_2_0
:
2066 strcpy (buf
, ", PA-RISC 2.0");
2071 if (e_flags
& EF_PARISC_TRAPNIL
)
2072 strcat (buf
, ", trapnil");
2073 if (e_flags
& EF_PARISC_EXT
)
2074 strcat (buf
, ", ext");
2075 if (e_flags
& EF_PARISC_LSB
)
2076 strcat (buf
, ", lsb");
2077 if (e_flags
& EF_PARISC_WIDE
)
2078 strcat (buf
, ", wide");
2079 if (e_flags
& EF_PARISC_NO_KABP
)
2080 strcat (buf
, ", no kabp");
2081 if (e_flags
& EF_PARISC_LAZYSWAP
)
2082 strcat (buf
, ", lazyswap");
2087 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2088 strcat (buf
, ", new calling convention");
2090 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2091 strcat (buf
, ", gnu calling convention");
2095 if ((e_flags
& EF_IA_64_ABI64
))
2096 strcat (buf
, ", 64-bit");
2098 strcat (buf
, ", 32-bit");
2099 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2100 strcat (buf
, ", reduced fp model");
2101 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2102 strcat (buf
, ", no function descriptors, constant gp");
2103 else if ((e_flags
& EF_IA_64_CONS_GP
))
2104 strcat (buf
, ", constant gp");
2105 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2106 strcat (buf
, ", absolute");
2110 if ((e_flags
& EF_VAX_NONPIC
))
2111 strcat (buf
, ", non-PIC");
2112 if ((e_flags
& EF_VAX_DFLOAT
))
2113 strcat (buf
, ", D-Float");
2114 if ((e_flags
& EF_VAX_GFLOAT
))
2115 strcat (buf
, ", G-Float");
2124 get_mips_segment_type (type
)
2129 case PT_MIPS_REGINFO
:
2131 case PT_MIPS_RTPROC
:
2133 case PT_MIPS_OPTIONS
:
2143 get_parisc_segment_type (type
)
2148 case PT_HP_TLS
: return "HP_TLS";
2149 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2150 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2151 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2152 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2153 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2154 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2155 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2156 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2157 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2158 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2159 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2160 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2161 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2170 get_ia64_segment_type (type
)
2175 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2176 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2177 case PT_HP_TLS
: return "HP_TLS";
2178 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2179 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2180 case PT_IA_64_HP_STACK
: return "HP_STACK";
2189 get_segment_type (p_type
)
2190 unsigned long p_type
;
2192 static char buff
[32];
2196 case PT_NULL
: return "NULL";
2197 case PT_LOAD
: return "LOAD";
2198 case PT_DYNAMIC
: return "DYNAMIC";
2199 case PT_INTERP
: return "INTERP";
2200 case PT_NOTE
: return "NOTE";
2201 case PT_SHLIB
: return "SHLIB";
2202 case PT_PHDR
: return "PHDR";
2203 case PT_TLS
: return "TLS";
2205 case PT_GNU_EH_FRAME
:
2206 return "GNU_EH_FRAME";
2209 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2213 switch (elf_header
.e_machine
)
2216 case EM_MIPS_RS3_LE
:
2217 result
= get_mips_segment_type (p_type
);
2220 result
= get_parisc_segment_type (p_type
);
2223 result
= get_ia64_segment_type (p_type
);
2233 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2235 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2239 switch (elf_header
.e_machine
)
2242 result
= get_parisc_segment_type (p_type
);
2245 result
= get_ia64_segment_type (p_type
);
2255 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2258 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2265 get_mips_section_type_name (sh_type
)
2266 unsigned int sh_type
;
2270 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2271 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2272 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2273 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2274 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2275 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2276 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2277 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2278 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2279 case SHT_MIPS_RELD
: return "MIPS_RELD";
2280 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2281 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2282 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2283 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2284 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2285 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2286 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2287 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2288 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2289 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2290 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2291 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2292 case SHT_MIPS_LINE
: return "MIPS_LINE";
2293 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2294 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2295 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2296 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2297 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2298 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2299 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2300 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2301 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2302 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2303 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2304 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2305 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2306 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2307 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2308 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2316 get_parisc_section_type_name (sh_type
)
2317 unsigned int sh_type
;
2321 case SHT_PARISC_EXT
: return "PARISC_EXT";
2322 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2323 case SHT_PARISC_DOC
: return "PARISC_DOC";
2331 get_ia64_section_type_name (sh_type
)
2332 unsigned int sh_type
;
2336 case SHT_IA_64_EXT
: return "IA_64_EXT";
2337 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2345 get_section_type_name (sh_type
)
2346 unsigned int sh_type
;
2348 static char buff
[32];
2352 case SHT_NULL
: return "NULL";
2353 case SHT_PROGBITS
: return "PROGBITS";
2354 case SHT_SYMTAB
: return "SYMTAB";
2355 case SHT_STRTAB
: return "STRTAB";
2356 case SHT_RELA
: return "RELA";
2357 case SHT_HASH
: return "HASH";
2358 case SHT_DYNAMIC
: return "DYNAMIC";
2359 case SHT_NOTE
: return "NOTE";
2360 case SHT_NOBITS
: return "NOBITS";
2361 case SHT_REL
: return "REL";
2362 case SHT_SHLIB
: return "SHLIB";
2363 case SHT_DYNSYM
: return "DYNSYM";
2364 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2365 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2366 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2367 case SHT_GROUP
: return "GROUP";
2368 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2369 case SHT_GNU_verdef
: return "VERDEF";
2370 case SHT_GNU_verneed
: return "VERNEED";
2371 case SHT_GNU_versym
: return "VERSYM";
2372 case 0x6ffffff0: return "VERSYM";
2373 case 0x6ffffffc: return "VERDEF";
2374 case 0x7ffffffd: return "AUXILIARY";
2375 case 0x7fffffff: return "FILTER";
2376 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2379 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2383 switch (elf_header
.e_machine
)
2386 case EM_MIPS_RS3_LE
:
2387 result
= get_mips_section_type_name (sh_type
);
2390 result
= get_parisc_section_type_name (sh_type
);
2393 result
= get_ia64_section_type_name (sh_type
);
2403 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2405 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2406 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2407 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2408 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2410 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2416 #define OPTION_DEBUG_DUMP 512
2418 struct option options
[] =
2420 {"all", no_argument
, 0, 'a'},
2421 {"file-header", no_argument
, 0, 'h'},
2422 {"program-headers", no_argument
, 0, 'l'},
2423 {"headers", no_argument
, 0, 'e'},
2424 {"histogram", no_argument
, 0, 'I'},
2425 {"segments", no_argument
, 0, 'l'},
2426 {"sections", no_argument
, 0, 'S'},
2427 {"section-headers", no_argument
, 0, 'S'},
2428 {"symbols", no_argument
, 0, 's'},
2429 {"syms", no_argument
, 0, 's'},
2430 {"relocs", no_argument
, 0, 'r'},
2431 {"notes", no_argument
, 0, 'n'},
2432 {"dynamic", no_argument
, 0, 'd'},
2433 {"arch-specific", no_argument
, 0, 'A'},
2434 {"version-info", no_argument
, 0, 'V'},
2435 {"use-dynamic", no_argument
, 0, 'D'},
2436 {"hex-dump", required_argument
, 0, 'x'},
2437 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2438 {"unwind", no_argument
, 0, 'u'},
2439 #ifdef SUPPORT_DISASSEMBLY
2440 {"instruction-dump", required_argument
, 0, 'i'},
2443 {"version", no_argument
, 0, 'v'},
2444 {"wide", no_argument
, 0, 'W'},
2445 {"help", no_argument
, 0, 'H'},
2446 {0, no_argument
, 0, 0}
2452 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2453 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2454 fprintf (stdout
, _(" Options are:\n\
2455 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2456 -h --file-header Display the ELF file header\n\
2457 -l --program-headers Display the program headers\n\
2458 --segments An alias for --program-headers\n\
2459 -S --section-headers Display the sections' header\n\
2460 --sections An alias for --section-headers\n\
2461 -e --headers Equivalent to: -h -l -S\n\
2462 -s --syms Display the symbol table\n\
2463 --symbols An alias for --syms\n\
2464 -n --notes Display the core notes (if present)\n\
2465 -r --relocs Display the relocations (if present)\n\
2466 -u --unwind Display the unwind info (if present)\n\
2467 -d --dynamic Display the dynamic segment (if present)\n\
2468 -V --version-info Display the version sections (if present)\n\
2469 -A --arch-specific Display architecture specific information (if any).\n\
2470 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2471 -x --hex-dump=<number> Dump the contents of section <number>\n\
2472 -w[liaprmfFso] or\n\
2473 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2474 Display the contents of DWARF2 debug sections\n"));
2475 #ifdef SUPPORT_DISASSEMBLY
2476 fprintf (stdout
, _("\
2477 -i --instruction-dump=<number>\n\
2478 Disassemble the contents of section <number>\n"));
2480 fprintf (stdout
, _("\
2481 -I --histogram Display histogram of bucket list lengths\n\
2482 -W --wide Allow output width to exceed 80 characters\n\
2483 -H --help Display this information\n\
2484 -v --version Display the version number of readelf\n"));
2485 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2491 request_dump (section
, type
)
2492 unsigned int section
;
2495 if (section
>= num_dump_sects
)
2497 char *new_dump_sects
;
2499 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2501 if (new_dump_sects
== NULL
)
2502 error (_("Out of memory allocating dump request table."));
2505 /* Copy current flag settings. */
2506 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2510 dump_sects
= new_dump_sects
;
2511 num_dump_sects
= section
+ 1;
2516 dump_sects
[section
] |= type
;
2522 parse_args (argc
, argv
)
2531 while ((c
= getopt_long
2532 (argc
, argv
, "ersuahnldSDAIw::x:i:vVWH", options
, NULL
)) != EOF
)
2599 section
= strtoul (optarg
, & cp
, 0);
2600 if (! *cp
&& section
>= 0)
2602 request_dump (section
, HEX_DUMP
);
2612 unsigned int index
= 0;
2616 while (optarg
[index
])
2617 switch (optarg
[index
++])
2626 do_debug_abbrevs
= 1;
2636 do_debug_pubnames
= 1;
2641 do_debug_aranges
= 1;
2645 do_debug_frames_interp
= 1;
2647 do_debug_frames
= 1;
2652 do_debug_macinfo
= 1;
2666 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2671 case OPTION_DEBUG_DUMP
:
2677 static const char *debug_dump_opt
[]
2678 = { "line", "info", "abbrev", "pubnames", "ranges",
2679 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2688 for (index
= 0; debug_dump_opt
[index
]; index
++)
2690 size_t len
= strlen (debug_dump_opt
[index
]);
2692 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2693 && (p
[len
] == ',' || p
[len
] == '\0'))
2702 do_debug_abbrevs
= 1;
2713 do_debug_pubnames
= 1;
2717 do_debug_aranges
= 1;
2722 do_debug_frames_interp
= 1;
2723 do_debug_frames
= 1;
2727 do_debug_macinfo
= 1;
2740 if (debug_dump_opt
[index
] == NULL
)
2742 warn (_("Unrecognized debug option '%s'\n"), p
);
2743 p
= strchr (p
, ',');
2753 #ifdef SUPPORT_DISASSEMBLY
2756 section
= strtoul (optarg
, & cp
, 0);
2757 if (! *cp
&& section
>= 0)
2759 request_dump (section
, DISASS_DUMP
);
2765 print_version (program_name
);
2775 /* xgettext:c-format */
2776 error (_("Invalid option '-%c'\n"), c
);
2783 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2784 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2785 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2789 warn (_("Nothing to do.\n"));
2795 get_elf_class (elf_class
)
2796 unsigned int elf_class
;
2798 static char buff
[32];
2802 case ELFCLASSNONE
: return _("none");
2803 case ELFCLASS32
: return "ELF32";
2804 case ELFCLASS64
: return "ELF64";
2806 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2812 get_data_encoding (encoding
)
2813 unsigned int encoding
;
2815 static char buff
[32];
2819 case ELFDATANONE
: return _("none");
2820 case ELFDATA2LSB
: return _("2's complement, little endian");
2821 case ELFDATA2MSB
: return _("2's complement, big endian");
2823 sprintf (buff
, _("<unknown: %x>"), encoding
);
2829 get_osabi_name (osabi
)
2832 static char buff
[32];
2836 case ELFOSABI_NONE
: return "UNIX - System V";
2837 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2838 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2839 case ELFOSABI_LINUX
: return "UNIX - Linux";
2840 case ELFOSABI_HURD
: return "GNU/Hurd";
2841 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2842 case ELFOSABI_AIX
: return "UNIX - AIX";
2843 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2844 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2845 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2846 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2847 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2848 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2849 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2850 case ELFOSABI_AROS
: return "Amiga Research OS";
2851 case ELFOSABI_STANDALONE
: return _("Standalone App");
2852 case ELFOSABI_ARM
: return "ARM";
2854 sprintf (buff
, _("<unknown: %x>"), osabi
);
2859 /* Decode the data held in 'elf_header'. */
2861 process_file_header ()
2863 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2864 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2865 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2866 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2869 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2877 printf (_("ELF Header:\n"));
2878 printf (_(" Magic: "));
2879 for (i
= 0; i
< EI_NIDENT
; i
++)
2880 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2882 printf (_(" Class: %s\n"),
2883 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2884 printf (_(" Data: %s\n"),
2885 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2886 printf (_(" Version: %d %s\n"),
2887 elf_header
.e_ident
[EI_VERSION
],
2888 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2890 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2893 printf (_(" OS/ABI: %s\n"),
2894 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2895 printf (_(" ABI Version: %d\n"),
2896 elf_header
.e_ident
[EI_ABIVERSION
]);
2897 printf (_(" Type: %s\n"),
2898 get_file_type (elf_header
.e_type
));
2899 printf (_(" Machine: %s\n"),
2900 get_machine_name (elf_header
.e_machine
));
2901 printf (_(" Version: 0x%lx\n"),
2902 (unsigned long) elf_header
.e_version
);
2904 printf (_(" Entry point address: "));
2905 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2906 printf (_("\n Start of program headers: "));
2907 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2908 printf (_(" (bytes into file)\n Start of section headers: "));
2909 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2910 printf (_(" (bytes into file)\n"));
2912 printf (_(" Flags: 0x%lx%s\n"),
2913 (unsigned long) elf_header
.e_flags
,
2914 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2915 printf (_(" Size of this header: %ld (bytes)\n"),
2916 (long) elf_header
.e_ehsize
);
2917 printf (_(" Size of program headers: %ld (bytes)\n"),
2918 (long) elf_header
.e_phentsize
);
2919 printf (_(" Number of program headers: %ld\n"),
2920 (long) elf_header
.e_phnum
);
2921 printf (_(" Size of section headers: %ld (bytes)\n"),
2922 (long) elf_header
.e_shentsize
);
2923 printf (_(" Number of section headers: %ld"),
2924 (long) elf_header
.e_shnum
);
2925 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2926 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2927 putc ('\n', stdout
);
2928 printf (_(" Section header string table index: %ld"),
2929 (long) elf_header
.e_shstrndx
);
2930 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2931 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2932 putc ('\n', stdout
);
2935 if (section_headers
!= NULL
)
2937 if (elf_header
.e_shnum
== 0)
2938 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2939 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2940 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2941 free (section_headers
);
2942 section_headers
= NULL
;
2950 get_32bit_program_headers (file
, program_headers
)
2952 Elf_Internal_Phdr
*program_headers
;
2954 Elf32_External_Phdr
*phdrs
;
2955 Elf32_External_Phdr
*external
;
2956 Elf_Internal_Phdr
*internal
;
2959 phdrs
= ((Elf32_External_Phdr
*)
2960 get_data (NULL
, file
, elf_header
.e_phoff
,
2961 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2962 _("program headers")));
2966 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2967 i
< elf_header
.e_phnum
;
2968 i
++, internal
++, external
++)
2970 internal
->p_type
= BYTE_GET (external
->p_type
);
2971 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2972 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2973 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2974 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2975 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2976 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2977 internal
->p_align
= BYTE_GET (external
->p_align
);
2986 get_64bit_program_headers (file
, program_headers
)
2988 Elf_Internal_Phdr
*program_headers
;
2990 Elf64_External_Phdr
*phdrs
;
2991 Elf64_External_Phdr
*external
;
2992 Elf_Internal_Phdr
*internal
;
2995 phdrs
= ((Elf64_External_Phdr
*)
2996 get_data (NULL
, file
, elf_header
.e_phoff
,
2997 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2998 _("program headers")));
3002 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3003 i
< elf_header
.e_phnum
;
3004 i
++, internal
++, external
++)
3006 internal
->p_type
= BYTE_GET (external
->p_type
);
3007 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3008 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
3009 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
3010 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
3011 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
3012 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
3013 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3021 /* Returns 1 if the program headers were loaded. */
3024 process_program_headers (file
)
3027 Elf_Internal_Phdr
*program_headers
;
3028 Elf_Internal_Phdr
*segment
;
3031 if (elf_header
.e_phnum
== 0)
3034 printf (_("\nThere are no program headers in this file.\n"));
3038 if (do_segments
&& !do_header
)
3040 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3041 printf (_("Entry point "));
3042 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3043 printf (_("\nThere are %d program headers, starting at offset "),
3044 elf_header
.e_phnum
);
3045 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3049 program_headers
= (Elf_Internal_Phdr
*) malloc
3050 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3052 if (program_headers
== NULL
)
3054 error (_("Out of memory\n"));
3059 i
= get_32bit_program_headers (file
, program_headers
);
3061 i
= get_64bit_program_headers (file
, program_headers
);
3065 free (program_headers
);
3071 if (elf_header
.e_phnum
> 1)
3072 printf (_("\nProgram Headers:\n"));
3074 printf (_("\nProgram Headers:\n"));
3078 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3081 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3085 (_(" Type Offset VirtAddr PhysAddr\n"));
3087 (_(" FileSiz MemSiz Flags Align\n"));
3095 for (i
= 0, segment
= program_headers
;
3096 i
< elf_header
.e_phnum
;
3101 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3105 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3106 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3107 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3108 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3109 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3111 (segment
->p_flags
& PF_R
? 'R' : ' '),
3112 (segment
->p_flags
& PF_W
? 'W' : ' '),
3113 (segment
->p_flags
& PF_X
? 'E' : ' '));
3114 printf ("%#lx", (unsigned long) segment
->p_align
);
3118 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3119 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3122 print_vma (segment
->p_offset
, FULL_HEX
);
3126 print_vma (segment
->p_vaddr
, FULL_HEX
);
3128 print_vma (segment
->p_paddr
, FULL_HEX
);
3131 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3132 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3135 print_vma (segment
->p_filesz
, FULL_HEX
);
3139 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3140 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3143 print_vma (segment
->p_offset
, FULL_HEX
);
3147 (segment
->p_flags
& PF_R
? 'R' : ' '),
3148 (segment
->p_flags
& PF_W
? 'W' : ' '),
3149 (segment
->p_flags
& PF_X
? 'E' : ' '));
3151 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3152 printf ("%#lx", (unsigned long) segment
->p_align
);
3155 print_vma (segment
->p_align
, PREFIX_HEX
);
3160 print_vma (segment
->p_offset
, FULL_HEX
);
3162 print_vma (segment
->p_vaddr
, FULL_HEX
);
3164 print_vma (segment
->p_paddr
, FULL_HEX
);
3166 print_vma (segment
->p_filesz
, FULL_HEX
);
3168 print_vma (segment
->p_memsz
, FULL_HEX
);
3170 (segment
->p_flags
& PF_R
? 'R' : ' '),
3171 (segment
->p_flags
& PF_W
? 'W' : ' '),
3172 (segment
->p_flags
& PF_X
? 'E' : ' '));
3173 print_vma (segment
->p_align
, HEX
);
3177 switch (segment
->p_type
)
3182 unsigned long align_mask
= -segment
->p_align
;
3184 if (align_mask
== 0)
3186 loadaddr
= ((segment
->p_vaddr
& align_mask
)
3187 - (segment
->p_offset
& align_mask
));
3193 error (_("more than one dynamic segment\n"));
3195 dynamic_addr
= segment
->p_offset
;
3196 dynamic_size
= segment
->p_filesz
;
3200 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
3201 error (_("Unable to find program interpreter name\n"));
3204 program_interpreter
[0] = 0;
3205 fscanf (file
, "%63s", program_interpreter
);
3208 printf (_("\n [Requesting program interpreter: %s]"),
3209 program_interpreter
);
3215 putc ('\n', stdout
);
3224 if (do_segments
&& section_headers
!= NULL
)
3226 printf (_("\n Section to Segment mapping:\n"));
3227 printf (_(" Segment Sections...\n"));
3229 assert (string_table
!= NULL
);
3231 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3234 Elf_Internal_Shdr
*section
;
3236 segment
= program_headers
+ i
;
3237 section
= section_headers
;
3239 printf (" %2.2d ", i
);
3241 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3243 if (section
->sh_size
> 0
3244 /* Compare allocated sections by VMA, unallocated
3245 sections by file offset. */
3246 && (section
->sh_flags
& SHF_ALLOC
3247 ? (section
->sh_addr
>= segment
->p_vaddr
3248 && section
->sh_addr
+ section
->sh_size
3249 <= segment
->p_vaddr
+ segment
->p_memsz
)
3250 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3251 && (section
->sh_offset
+ section
->sh_size
3252 <= segment
->p_offset
+ segment
->p_filesz
))))
3253 printf ("%s ", SECTION_NAME (section
));
3260 free (program_headers
);
3267 get_32bit_section_headers (file
, num
)
3271 Elf32_External_Shdr
*shdrs
;
3272 Elf_Internal_Shdr
*internal
;
3275 shdrs
= ((Elf32_External_Shdr
*)
3276 get_data (NULL
, file
, elf_header
.e_shoff
,
3277 elf_header
.e_shentsize
* num
,
3278 _("section headers")));
3282 section_headers
= ((Elf_Internal_Shdr
*)
3283 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3285 if (section_headers
== NULL
)
3287 error (_("Out of memory\n"));
3291 for (i
= 0, internal
= section_headers
;
3295 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3296 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3297 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3298 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3299 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3300 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3301 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3302 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3303 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3304 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3313 get_64bit_section_headers (file
, num
)
3317 Elf64_External_Shdr
*shdrs
;
3318 Elf_Internal_Shdr
*internal
;
3321 shdrs
= ((Elf64_External_Shdr
*)
3322 get_data (NULL
, file
, elf_header
.e_shoff
,
3323 elf_header
.e_shentsize
* num
,
3324 _("section headers")));
3328 section_headers
= ((Elf_Internal_Shdr
*)
3329 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3331 if (section_headers
== NULL
)
3333 error (_("Out of memory\n"));
3337 for (i
= 0, internal
= section_headers
;
3341 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3342 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3343 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3344 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3345 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3346 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3347 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3348 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3349 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3350 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3358 static Elf_Internal_Sym
*
3359 get_32bit_elf_symbols (file
, section
)
3361 Elf_Internal_Shdr
*section
;
3363 unsigned long number
;
3364 Elf32_External_Sym
*esyms
;
3365 Elf_External_Sym_Shndx
*shndx
;
3366 Elf_Internal_Sym
*isyms
;
3367 Elf_Internal_Sym
*psym
;
3370 esyms
= ((Elf32_External_Sym
*)
3371 get_data (NULL
, file
, section
->sh_offset
,
3372 section
->sh_size
, _("symbols")));
3377 if (symtab_shndx_hdr
!= NULL
3378 && (symtab_shndx_hdr
->sh_link
3379 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3381 shndx
= ((Elf_External_Sym_Shndx
*)
3382 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3383 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3391 number
= section
->sh_size
/ section
->sh_entsize
;
3392 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3396 error (_("Out of memory\n"));
3403 for (j
= 0, psym
= isyms
;
3407 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3408 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3409 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3410 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3411 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3413 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3414 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3415 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3425 static Elf_Internal_Sym
*
3426 get_64bit_elf_symbols (file
, section
)
3428 Elf_Internal_Shdr
*section
;
3430 unsigned long number
;
3431 Elf64_External_Sym
*esyms
;
3432 Elf_External_Sym_Shndx
*shndx
;
3433 Elf_Internal_Sym
*isyms
;
3434 Elf_Internal_Sym
*psym
;
3437 esyms
= ((Elf64_External_Sym
*)
3438 get_data (NULL
, file
, section
->sh_offset
,
3439 section
->sh_size
, _("symbols")));
3444 if (symtab_shndx_hdr
!= NULL
3445 && (symtab_shndx_hdr
->sh_link
3446 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3448 shndx
= ((Elf_External_Sym_Shndx
*)
3449 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3450 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3458 number
= section
->sh_size
/ section
->sh_entsize
;
3459 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3463 error (_("Out of memory\n"));
3470 for (j
= 0, psym
= isyms
;
3474 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3475 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3476 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3477 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3478 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3480 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3481 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3482 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3493 get_elf_section_flags (sh_flags
)
3496 static char buff
[32];
3504 flag
= sh_flags
& - sh_flags
;
3509 case SHF_WRITE
: strcat (buff
, "W"); break;
3510 case SHF_ALLOC
: strcat (buff
, "A"); break;
3511 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3512 case SHF_MERGE
: strcat (buff
, "M"); break;
3513 case SHF_STRINGS
: strcat (buff
, "S"); break;
3514 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3515 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3516 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3517 case SHF_GROUP
: strcat (buff
, "G"); break;
3518 case SHF_TLS
: strcat (buff
, "T"); break;
3521 if (flag
& SHF_MASKOS
)
3524 sh_flags
&= ~ SHF_MASKOS
;
3526 else if (flag
& SHF_MASKPROC
)
3529 sh_flags
&= ~ SHF_MASKPROC
;
3541 process_section_headers (file
)
3544 Elf_Internal_Shdr
*section
;
3547 section_headers
= NULL
;
3549 if (elf_header
.e_shnum
== 0)
3552 printf (_("\nThere are no sections in this file.\n"));
3557 if (do_sections
&& !do_header
)
3558 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3559 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3563 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3566 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3569 /* Read in the string table, so that we have names to display. */
3570 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3572 if (section
->sh_size
!= 0)
3574 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3575 section
->sh_size
, _("string table"));
3577 string_table_length
= section
->sh_size
;
3580 /* Scan the sections for the dynamic symbol table
3581 and dynamic string table and debug sections. */
3582 dynamic_symbols
= NULL
;
3583 dynamic_strings
= NULL
;
3584 dynamic_syminfo
= NULL
;
3585 symtab_shndx_hdr
= NULL
;
3587 for (i
= 0, section
= section_headers
;
3588 i
< elf_header
.e_shnum
;
3591 char *name
= SECTION_NAME (section
);
3593 if (section
->sh_type
== SHT_DYNSYM
)
3595 if (dynamic_symbols
!= NULL
)
3597 error (_("File contains multiple dynamic symbol tables\n"));
3601 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3602 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3604 else if (section
->sh_type
== SHT_STRTAB
3605 && strcmp (name
, ".dynstr") == 0)
3607 if (dynamic_strings
!= NULL
)
3609 error (_("File contains multiple dynamic string tables\n"));
3613 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3615 _("dynamic strings"));
3617 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3619 if (symtab_shndx_hdr
!= NULL
)
3621 error (_("File contains multiple symtab shndx tables\n"));
3624 symtab_shndx_hdr
= section
;
3626 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3627 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3628 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3630 && strncmp (name
, ".debug_", 7) == 0)
3635 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3636 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3637 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3638 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3639 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3640 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3641 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3642 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3643 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3645 request_dump (i
, DEBUG_DUMP
);
3647 /* linkonce section to be combined with .debug_info at link time. */
3648 else if ((do_debugging
|| do_debug_info
)
3649 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3650 request_dump (i
, DEBUG_DUMP
);
3651 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3652 request_dump (i
, DEBUG_DUMP
);
3658 if (elf_header
.e_shnum
> 1)
3659 printf (_("\nSection Headers:\n"));
3661 printf (_("\nSection Header:\n"));
3665 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3668 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3671 printf (_(" [Nr] Name Type Address Offset\n"));
3672 printf (_(" Size EntSize Flags Link Info Align\n"));
3675 for (i
= 0, section
= section_headers
;
3676 i
< elf_header
.e_shnum
;
3679 printf (" [%2u] %-17.17s %-15.15s ",
3680 SECTION_HEADER_NUM (i
),
3681 SECTION_NAME (section
),
3682 get_section_type_name (section
->sh_type
));
3686 print_vma (section
->sh_addr
, LONG_HEX
);
3688 printf ( " %6.6lx %6.6lx %2.2lx",
3689 (unsigned long) section
->sh_offset
,
3690 (unsigned long) section
->sh_size
,
3691 (unsigned long) section
->sh_entsize
);
3693 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3695 printf ("%2ld %3lx %2ld\n",
3696 (unsigned long) section
->sh_link
,
3697 (unsigned long) section
->sh_info
,
3698 (unsigned long) section
->sh_addralign
);
3702 print_vma (section
->sh_addr
, LONG_HEX
);
3704 if ((long) section
->sh_offset
== section
->sh_offset
)
3705 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3709 print_vma (section
->sh_offset
, LONG_HEX
);
3712 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3713 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3717 print_vma (section
->sh_size
, LONG_HEX
);
3720 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3721 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3725 print_vma (section
->sh_entsize
, LONG_HEX
);
3728 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3730 printf ("%2ld %3lx ",
3731 (unsigned long) section
->sh_link
,
3732 (unsigned long) section
->sh_info
);
3734 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3735 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3738 print_vma (section
->sh_addralign
, DEC
);
3745 print_vma (section
->sh_addr
, LONG_HEX
);
3746 if ((long) section
->sh_offset
== section
->sh_offset
)
3747 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3751 print_vma (section
->sh_offset
, LONG_HEX
);
3754 print_vma (section
->sh_size
, LONG_HEX
);
3756 print_vma (section
->sh_entsize
, LONG_HEX
);
3758 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3760 printf (" %2ld %3lx %ld\n",
3761 (unsigned long) section
->sh_link
,
3762 (unsigned long) section
->sh_info
,
3763 (unsigned long) section
->sh_addralign
);
3767 printf (_("Key to Flags:\n\
3768 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3769 I (info), L (link order), G (group), x (unknown)\n\
3770 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3775 /* Process the reloc section. */
3777 process_relocs (file
)
3780 unsigned long rel_size
;
3781 unsigned long rel_offset
;
3787 if (do_using_dynamic
)
3789 int is_rela
= FALSE
;
3794 if (dynamic_info
[DT_REL
])
3796 rel_offset
= dynamic_info
[DT_REL
];
3797 rel_size
= dynamic_info
[DT_RELSZ
];
3800 else if (dynamic_info
[DT_RELA
])
3802 rel_offset
= dynamic_info
[DT_RELA
];
3803 rel_size
= dynamic_info
[DT_RELASZ
];
3806 else if (dynamic_info
[DT_JMPREL
])
3808 rel_offset
= dynamic_info
[DT_JMPREL
];
3809 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3811 switch (dynamic_info
[DT_PLTREL
])
3828 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3829 rel_offset
, rel_size
);
3831 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3832 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
,
3836 printf (_("\nThere are no dynamic relocations in this file.\n"));
3840 Elf_Internal_Shdr
*section
;
3844 for (i
= 0, section
= section_headers
;
3845 i
< elf_header
.e_shnum
;
3848 if ( section
->sh_type
!= SHT_RELA
3849 && section
->sh_type
!= SHT_REL
)
3852 rel_offset
= section
->sh_offset
;
3853 rel_size
= section
->sh_size
;
3857 Elf_Internal_Shdr
*strsec
;
3858 Elf_Internal_Sym
*symtab
;
3861 unsigned long nsyms
;
3863 printf (_("\nRelocation section "));
3865 if (string_table
== NULL
)
3866 printf ("%d", section
->sh_name
);
3868 printf (_("'%s'"), SECTION_NAME (section
));
3870 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3871 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3876 if (section
->sh_link
)
3878 Elf_Internal_Shdr
*symsec
;
3880 symsec
= SECTION_HEADER (section
->sh_link
);
3881 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3882 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3887 strsec
= SECTION_HEADER (symsec
->sh_link
);
3889 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3893 is_rela
= section
->sh_type
== SHT_RELA
;
3895 dump_relocations (file
, rel_offset
, rel_size
,
3896 symtab
, nsyms
, strtab
, is_rela
);
3908 printf (_("\nThere are no relocations in this file.\n"));
3914 #include "unwind-ia64.h"
3916 /* An absolute address consists of a section and an offset. If the
3917 section is NULL, the offset itself is the address, otherwise, the
3918 address equals to LOAD_ADDRESS(section) + offset. */
3922 unsigned short section
;
3928 struct unw_table_entry
3930 struct absaddr start
;
3932 struct absaddr info
;
3934 *table
; /* Unwind table. */
3935 unsigned long table_len
; /* Length of unwind table. */
3936 unsigned char *info
; /* Unwind info. */
3937 unsigned long info_size
; /* Size of unwind info. */
3938 bfd_vma info_addr
; /* starting address of unwind info. */
3939 bfd_vma seg_base
; /* Starting address of segment. */
3940 Elf_Internal_Sym
*symtab
; /* The symbol table. */
3941 unsigned long nsyms
; /* Number of symbols. */
3942 char *strtab
; /* The string table. */
3943 unsigned long strtab_size
; /* Size of string table. */
3946 static void find_symbol_for_address
3947 PARAMS ((struct unw_aux_info
*, struct absaddr
, const char **, bfd_vma
*));
3948 static void dump_ia64_unwind
3949 PARAMS ((struct unw_aux_info
*));
3950 static int slurp_ia64_unwind_table
3951 PARAMS ((FILE *, struct unw_aux_info
*, Elf_Internal_Shdr
*));
3954 find_symbol_for_address (aux
, addr
, symname
, offset
)
3955 struct unw_aux_info
*aux
;
3956 struct absaddr addr
;
3957 const char **symname
;
3960 bfd_vma dist
= (bfd_vma
) 0x100000;
3961 Elf_Internal_Sym
*sym
, *best
= NULL
;
3964 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3966 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3967 && sym
->st_name
!= 0
3968 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3969 && addr
.offset
>= sym
->st_value
3970 && addr
.offset
- sym
->st_value
< dist
)
3973 dist
= addr
.offset
- sym
->st_value
;
3980 *symname
= (best
->st_name
>= aux
->strtab_size
3981 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3986 *offset
= addr
.offset
;
3990 dump_ia64_unwind (aux
)
3991 struct unw_aux_info
*aux
;
3994 struct unw_table_entry
*tp
;
3997 addr_size
= is_32bit_elf
? 4 : 8;
3999 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4003 const unsigned char *dp
;
4004 const unsigned char *head
;
4005 const char *procname
;
4007 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4009 fputs ("\n<", stdout
);
4013 fputs (procname
, stdout
);
4016 printf ("+%lx", (unsigned long) offset
);
4019 fputs (">: [", stdout
);
4020 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4021 fputc ('-', stdout
);
4022 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4023 printf ("], info at +0x%lx\n",
4024 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4026 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4027 stamp
= BYTE_GET8 ((unsigned char *) head
);
4029 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4030 (unsigned) UNW_VER (stamp
),
4031 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4032 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4033 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4034 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4036 if (UNW_VER (stamp
) != 1)
4038 printf ("\tUnknown version.\n");
4043 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4044 dp
= unw_decode (dp
, in_body
, & in_body
);
4049 slurp_ia64_unwind_table (file
, aux
, sec
)
4051 struct unw_aux_info
*aux
;
4052 Elf_Internal_Shdr
*sec
;
4054 unsigned long size
, addr_size
, nrelas
, i
;
4055 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
4056 struct unw_table_entry
*tep
;
4057 Elf_Internal_Shdr
*relsec
;
4058 Elf_Internal_Rela
*rela
, *rp
;
4059 unsigned char *table
, *tp
;
4060 Elf_Internal_Sym
*sym
;
4061 const char *relname
;
4064 addr_size
= is_32bit_elf
? 4 : 8;
4066 /* First, find the starting address of the segment that includes
4069 if (elf_header
.e_phnum
)
4071 prog_hdrs
= (Elf_Internal_Phdr
*)
4072 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
4075 result
= get_32bit_program_headers (file
, prog_hdrs
);
4077 result
= get_64bit_program_headers (file
, prog_hdrs
);
4085 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
4087 if (seg
->p_type
!= PT_LOAD
)
4090 if (sec
->sh_addr
>= seg
->p_vaddr
4091 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4093 aux
->seg_base
= seg
->p_vaddr
;
4101 /* Second, build the unwind table from the contents of the unwind section: */
4102 size
= sec
->sh_size
;
4103 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4104 size
, _("unwind table"));
4108 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4109 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4111 tep
->start
.section
= SHN_UNDEF
;
4112 tep
->end
.section
= SHN_UNDEF
;
4113 tep
->info
.section
= SHN_UNDEF
;
4116 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4117 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4118 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4122 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4123 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4124 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4126 tep
->start
.offset
+= aux
->seg_base
;
4127 tep
->end
.offset
+= aux
->seg_base
;
4128 tep
->info
.offset
+= aux
->seg_base
;
4132 /* Third, apply any relocations to the unwind table: */
4134 for (relsec
= section_headers
;
4135 relsec
< section_headers
+ elf_header
.e_shnum
;
4138 if (relsec
->sh_type
!= SHT_RELA
4139 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4142 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4146 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4150 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4151 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4153 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4155 warn (_("Skipping unexpected symbol type %u\n"),
4156 ELF32_ST_TYPE (sym
->st_info
));
4162 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4163 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4165 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4167 warn (_("Skipping unexpected symbol type %u\n"),
4168 ELF64_ST_TYPE (sym
->st_info
));
4173 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4175 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4179 i
= rp
->r_offset
/ (3 * addr_size
);
4181 switch (rp
->r_offset
/addr_size
% 3)
4184 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4185 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4188 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4189 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4192 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4193 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4203 aux
->table_len
= size
/ (3 * addr_size
);
4208 process_unwind (file
)
4211 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4212 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4213 struct unw_aux_info aux
;
4218 if (elf_header
.e_machine
!= EM_IA_64
)
4220 printf (_("\nThere are no unwind sections in this file.\n"));
4224 memset (& aux
, 0, sizeof (aux
));
4226 addr_size
= is_32bit_elf
? 4 : 8;
4228 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4230 if (sec
->sh_type
== SHT_SYMTAB
)
4232 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4233 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4235 strsec
= SECTION_HEADER (sec
->sh_link
);
4236 aux
.strtab_size
= strsec
->sh_size
;
4237 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4238 aux
.strtab_size
, _("string table"));
4240 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4245 printf (_("\nThere are no unwind sections in this file.\n"));
4247 while (unwcount
-- > 0)
4252 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4253 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4254 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4261 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4263 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4266 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4267 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4268 suffix
= SECTION_NAME (unwsec
) + len
;
4269 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4271 if (strncmp (SECTION_NAME (sec
),
4272 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4273 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4278 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4279 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4280 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4281 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4283 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4285 suffix
= SECTION_NAME (unwsec
) + len
;
4286 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4288 if (strncmp (SECTION_NAME (sec
),
4289 ELF_STRING_ia64_unwind_info
, len2
) == 0
4290 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4294 if (i
== elf_header
.e_shnum
)
4296 printf (_("\nCould not find unwind info section for "));
4298 if (string_table
== NULL
)
4299 printf ("%d", unwsec
->sh_name
);
4301 printf (_("'%s'"), SECTION_NAME (unwsec
));
4305 aux
.info_size
= sec
->sh_size
;
4306 aux
.info_addr
= sec
->sh_addr
;
4307 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4308 aux
.info_size
, _("unwind info"));
4310 printf (_("\nUnwind section "));
4312 if (string_table
== NULL
)
4313 printf ("%d", unwsec
->sh_name
);
4315 printf (_("'%s'"), SECTION_NAME (unwsec
));
4317 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4318 (unsigned long) unwsec
->sh_offset
,
4319 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4321 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4323 if (aux
.table_len
> 0)
4324 dump_ia64_unwind (& aux
);
4327 free ((char *) aux
.table
);
4329 free ((char *) aux
.info
);
4338 free ((char *) aux
.strtab
);
4344 dynamic_segment_mips_val (entry
)
4345 Elf_Internal_Dyn
*entry
;
4347 switch (entry
->d_tag
)
4350 if (entry
->d_un
.d_val
== 0)
4354 static const char * opts
[] =
4356 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4357 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4358 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4359 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4364 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4365 if (entry
->d_un
.d_val
& (1 << cnt
))
4367 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4374 case DT_MIPS_IVERSION
:
4375 if (dynamic_strings
!= NULL
)
4376 printf ("Interface Version: %s\n",
4377 dynamic_strings
+ entry
->d_un
.d_val
);
4379 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4382 case DT_MIPS_TIME_STAMP
:
4387 time_t time
= entry
->d_un
.d_val
;
4388 tmp
= gmtime (&time
);
4389 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4390 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4391 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4392 printf ("Time Stamp: %s\n", timebuf
);
4396 case DT_MIPS_RLD_VERSION
:
4397 case DT_MIPS_LOCAL_GOTNO
:
4398 case DT_MIPS_CONFLICTNO
:
4399 case DT_MIPS_LIBLISTNO
:
4400 case DT_MIPS_SYMTABNO
:
4401 case DT_MIPS_UNREFEXTNO
:
4402 case DT_MIPS_HIPAGENO
:
4403 case DT_MIPS_DELTA_CLASS_NO
:
4404 case DT_MIPS_DELTA_INSTANCE_NO
:
4405 case DT_MIPS_DELTA_RELOC_NO
:
4406 case DT_MIPS_DELTA_SYM_NO
:
4407 case DT_MIPS_DELTA_CLASSSYM_NO
:
4408 case DT_MIPS_COMPACT_SIZE
:
4409 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4413 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4419 dynamic_segment_parisc_val (entry
)
4420 Elf_Internal_Dyn
*entry
;
4422 switch (entry
->d_tag
)
4424 case DT_HP_DLD_FLAGS
:
4433 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4434 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4435 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4436 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4437 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4438 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4439 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4440 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4441 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4442 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4443 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4447 bfd_vma val
= entry
->d_un
.d_val
;
4449 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4450 if (val
& flags
[cnt
].bit
)
4454 fputs (flags
[cnt
].str
, stdout
);
4456 val
^= flags
[cnt
].bit
;
4459 if (val
!= 0 || first
)
4463 print_vma (val
, HEX
);
4469 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4476 get_32bit_dynamic_segment (file
)
4479 Elf32_External_Dyn
*edyn
;
4480 Elf_Internal_Dyn
*entry
;
4483 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4484 dynamic_size
, _("dynamic segment"));
4488 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4489 how large this .dynamic is now. We can do this even before the byte
4490 swapping since the DT_NULL tag is recognizable. */
4492 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4495 dynamic_segment
= (Elf_Internal_Dyn
*)
4496 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4498 if (dynamic_segment
== NULL
)
4500 error (_("Out of memory\n"));
4505 for (i
= 0, entry
= dynamic_segment
;
4509 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4510 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4519 get_64bit_dynamic_segment (file
)
4522 Elf64_External_Dyn
*edyn
;
4523 Elf_Internal_Dyn
*entry
;
4526 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4527 dynamic_size
, _("dynamic segment"));
4531 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4532 how large this .dynamic is now. We can do this even before the byte
4533 swapping since the DT_NULL tag is recognizable. */
4535 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4538 dynamic_segment
= (Elf_Internal_Dyn
*)
4539 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4541 if (dynamic_segment
== NULL
)
4543 error (_("Out of memory\n"));
4548 for (i
= 0, entry
= dynamic_segment
;
4552 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4553 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4562 get_dynamic_flags (flags
)
4565 static char buff
[128];
4573 flag
= flags
& - flags
;
4581 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4582 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4583 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4584 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4585 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4586 default: strcpy (p
, "unknown"); break;
4589 p
= strchr (p
, '\0');
4594 /* Parse and display the contents of the dynamic segment. */
4596 process_dynamic_segment (file
)
4599 Elf_Internal_Dyn
*entry
;
4602 if (dynamic_size
== 0)
4605 printf (_("\nThere is no dynamic segment in this file.\n"));
4612 if (! get_32bit_dynamic_segment (file
))
4615 else if (! get_64bit_dynamic_segment (file
))
4618 /* Find the appropriate symbol table. */
4619 if (dynamic_symbols
== NULL
)
4621 for (i
= 0, entry
= dynamic_segment
;
4625 Elf_Internal_Shdr section
;
4627 if (entry
->d_tag
!= DT_SYMTAB
)
4630 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4632 /* Since we do not know how big the symbol table is,
4633 we default to reading in the entire file (!) and
4634 processing that. This is overkill, I know, but it
4636 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4638 if (fseek (file
, 0, SEEK_END
))
4639 error (_("Unable to seek to end of file!"));
4641 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4643 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4645 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4647 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4648 if (num_dynamic_syms
< 1)
4650 error (_("Unable to determine the number of symbols to load\n"));
4654 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4658 /* Similarly find a string table. */
4659 if (dynamic_strings
== NULL
)
4661 for (i
= 0, entry
= dynamic_segment
;
4665 unsigned long offset
;
4668 if (entry
->d_tag
!= DT_STRTAB
)
4671 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4673 /* Since we do not know how big the string table is,
4674 we default to reading in the entire file (!) and
4675 processing that. This is overkill, I know, but it
4678 offset
= entry
->d_un
.d_val
- loadaddr
;
4679 if (fseek (file
, 0, SEEK_END
))
4680 error (_("Unable to seek to end of file\n"));
4681 str_tab_len
= ftell (file
) - offset
;
4683 if (str_tab_len
< 1)
4686 (_("Unable to determine the length of the dynamic string table\n"));
4690 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4691 _("dynamic string table"));
4696 /* And find the syminfo section if available. */
4697 if (dynamic_syminfo
== NULL
)
4699 unsigned long syminsz
= 0;
4701 for (i
= 0, entry
= dynamic_segment
;
4705 if (entry
->d_tag
== DT_SYMINENT
)
4707 /* Note: these braces are necessary to avoid a syntax
4708 error from the SunOS4 C compiler. */
4709 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4711 else if (entry
->d_tag
== DT_SYMINSZ
)
4712 syminsz
= entry
->d_un
.d_val
;
4713 else if (entry
->d_tag
== DT_SYMINFO
)
4714 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4717 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4719 Elf_External_Syminfo
*extsyminfo
;
4720 Elf_Internal_Syminfo
*syminfo
;
4722 /* There is a syminfo section. Read the data. */
4723 extsyminfo
= ((Elf_External_Syminfo
*)
4724 get_data (NULL
, file
, dynamic_syminfo_offset
,
4725 syminsz
, _("symbol information")));
4729 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4730 if (dynamic_syminfo
== NULL
)
4732 error (_("Out of memory\n"));
4736 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4737 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4740 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4741 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4748 if (do_dynamic
&& dynamic_addr
)
4749 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4750 dynamic_addr
, (long) dynamic_size
);
4752 printf (_(" Tag Type Name/Value\n"));
4754 for (i
= 0, entry
= dynamic_segment
;
4763 print_vma (entry
->d_tag
, FULL_HEX
);
4764 dtype
= get_dynamic_type (entry
->d_tag
);
4765 printf (" (%s)%*s", dtype
,
4766 ((is_32bit_elf
? 27 : 19)
4767 - (int) strlen (dtype
)),
4771 switch (entry
->d_tag
)
4775 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4785 switch (entry
->d_tag
)
4788 printf (_("Auxiliary library"));
4792 printf (_("Filter library"));
4796 printf (_("Configuration file"));
4800 printf (_("Dependency audit library"));
4804 printf (_("Audit library"));
4808 if (dynamic_strings
)
4809 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4813 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4822 printf (_("Flags:"));
4824 if (entry
->d_un
.d_val
== 0)
4825 printf (_(" None\n"));
4828 unsigned long int val
= entry
->d_un
.d_val
;
4830 if (val
& DTF_1_PARINIT
)
4832 printf (" PARINIT");
4833 val
^= DTF_1_PARINIT
;
4835 if (val
& DTF_1_CONFEXP
)
4837 printf (" CONFEXP");
4838 val
^= DTF_1_CONFEXP
;
4841 printf (" %lx", val
);
4850 printf (_("Flags:"));
4852 if (entry
->d_un
.d_val
== 0)
4853 printf (_(" None\n"));
4856 unsigned long int val
= entry
->d_un
.d_val
;
4858 if (val
& DF_P1_LAZYLOAD
)
4860 printf (" LAZYLOAD");
4861 val
^= DF_P1_LAZYLOAD
;
4863 if (val
& DF_P1_GROUPPERM
)
4865 printf (" GROUPPERM");
4866 val
^= DF_P1_GROUPPERM
;
4869 printf (" %lx", val
);
4878 printf (_("Flags:"));
4879 if (entry
->d_un
.d_val
== 0)
4880 printf (_(" None\n"));
4883 unsigned long int val
= entry
->d_un
.d_val
;
4890 if (val
& DF_1_GLOBAL
)
4895 if (val
& DF_1_GROUP
)
4900 if (val
& DF_1_NODELETE
)
4902 printf (" NODELETE");
4903 val
^= DF_1_NODELETE
;
4905 if (val
& DF_1_LOADFLTR
)
4907 printf (" LOADFLTR");
4908 val
^= DF_1_LOADFLTR
;
4910 if (val
& DF_1_INITFIRST
)
4912 printf (" INITFIRST");
4913 val
^= DF_1_INITFIRST
;
4915 if (val
& DF_1_NOOPEN
)
4920 if (val
& DF_1_ORIGIN
)
4925 if (val
& DF_1_DIRECT
)
4930 if (val
& DF_1_TRANS
)
4935 if (val
& DF_1_INTERPOSE
)
4937 printf (" INTERPOSE");
4938 val
^= DF_1_INTERPOSE
;
4940 if (val
& DF_1_NODEFLIB
)
4942 printf (" NODEFLIB");
4943 val
^= DF_1_NODEFLIB
;
4945 if (val
& DF_1_NODUMP
)
4950 if (val
& DF_1_CONLFAT
)
4952 printf (" CONLFAT");
4953 val
^= DF_1_CONLFAT
;
4956 printf (" %lx", val
);
4964 puts (get_dynamic_type (entry
->d_un
.d_val
));
4984 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4990 if (dynamic_strings
== NULL
)
4993 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4997 switch (entry
->d_tag
)
5000 printf (_("Shared library: [%s]"), name
);
5002 if (strcmp (name
, program_interpreter
) == 0)
5003 printf (_(" program interpreter"));
5007 printf (_("Library soname: [%s]"), name
);
5011 printf (_("Library rpath: [%s]"), name
);
5015 printf (_("Library runpath: [%s]"), name
);
5019 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5024 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5040 case DT_INIT_ARRAYSZ
:
5041 case DT_FINI_ARRAYSZ
:
5042 case DT_GNU_CONFLICTSZ
:
5043 case DT_GNU_LIBLISTSZ
:
5046 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5047 printf (" (bytes)\n");
5057 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5070 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5074 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5078 printf (_("Not needed object: [%s]\n"), name
);
5083 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5089 /* The value of this entry is ignored. */
5094 case DT_GNU_PRELINKED
:
5098 time_t time
= entry
->d_un
.d_val
;
5100 tmp
= gmtime (&time
);
5101 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5102 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5103 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5109 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5110 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5115 switch (elf_header
.e_machine
)
5118 case EM_MIPS_RS3_LE
:
5119 dynamic_segment_mips_val (entry
);
5122 dynamic_segment_parisc_val (entry
);
5125 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5137 get_ver_flags (flags
)
5140 static char buff
[32];
5147 if (flags
& VER_FLG_BASE
)
5148 strcat (buff
, "BASE ");
5150 if (flags
& VER_FLG_WEAK
)
5152 if (flags
& VER_FLG_BASE
)
5153 strcat (buff
, "| ");
5155 strcat (buff
, "WEAK ");
5158 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5159 strcat (buff
, "| <unknown>");
5164 /* Display the contents of the version sections. */
5166 process_version_sections (file
)
5169 Elf_Internal_Shdr
*section
;
5176 for (i
= 0, section
= section_headers
;
5177 i
< elf_header
.e_shnum
;
5180 switch (section
->sh_type
)
5182 case SHT_GNU_verdef
:
5184 Elf_External_Verdef
*edefs
;
5191 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5192 SECTION_NAME (section
), section
->sh_info
);
5194 printf (_(" Addr: 0x"));
5195 printf_vma (section
->sh_addr
);
5196 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5197 (unsigned long) section
->sh_offset
, section
->sh_link
,
5198 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5200 edefs
= ((Elf_External_Verdef
*)
5201 get_data (NULL
, file
, section
->sh_offset
,
5203 _("version definition section")));
5207 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5210 Elf_External_Verdef
*edef
;
5211 Elf_Internal_Verdef ent
;
5212 Elf_External_Verdaux
*eaux
;
5213 Elf_Internal_Verdaux aux
;
5217 vstart
= ((char *) edefs
) + idx
;
5219 edef
= (Elf_External_Verdef
*) vstart
;
5221 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5222 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5223 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5224 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5225 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5226 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5227 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5229 printf (_(" %#06x: Rev: %d Flags: %s"),
5230 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5232 printf (_(" Index: %d Cnt: %d "),
5233 ent
.vd_ndx
, ent
.vd_cnt
);
5235 vstart
+= ent
.vd_aux
;
5237 eaux
= (Elf_External_Verdaux
*) vstart
;
5239 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5240 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5242 if (dynamic_strings
)
5243 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5245 printf (_("Name index: %ld\n"), aux
.vda_name
);
5247 isum
= idx
+ ent
.vd_aux
;
5249 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5251 isum
+= aux
.vda_next
;
5252 vstart
+= aux
.vda_next
;
5254 eaux
= (Elf_External_Verdaux
*) vstart
;
5256 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5257 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5259 if (dynamic_strings
)
5260 printf (_(" %#06x: Parent %d: %s\n"),
5261 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5263 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5264 isum
, j
, aux
.vda_name
);
5274 case SHT_GNU_verneed
:
5276 Elf_External_Verneed
*eneed
;
5282 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5283 SECTION_NAME (section
), section
->sh_info
);
5285 printf (_(" Addr: 0x"));
5286 printf_vma (section
->sh_addr
);
5287 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5288 (unsigned long) section
->sh_offset
, section
->sh_link
,
5289 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5291 eneed
= ((Elf_External_Verneed
*)
5292 get_data (NULL
, file
, section
->sh_offset
,
5293 section
->sh_size
, _("version need section")));
5297 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5299 Elf_External_Verneed
*entry
;
5300 Elf_Internal_Verneed ent
;
5305 vstart
= ((char *) eneed
) + idx
;
5307 entry
= (Elf_External_Verneed
*) vstart
;
5309 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5310 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5311 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5312 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5313 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5315 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5317 if (dynamic_strings
)
5318 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5320 printf (_(" File: %lx"), ent
.vn_file
);
5322 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5324 vstart
+= ent
.vn_aux
;
5326 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5328 Elf_External_Vernaux
*eaux
;
5329 Elf_Internal_Vernaux aux
;
5331 eaux
= (Elf_External_Vernaux
*) vstart
;
5333 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5334 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5335 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5336 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5337 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5339 if (dynamic_strings
)
5340 printf (_(" %#06x: Name: %s"),
5341 isum
, dynamic_strings
+ aux
.vna_name
);
5343 printf (_(" %#06x: Name index: %lx"),
5344 isum
, aux
.vna_name
);
5346 printf (_(" Flags: %s Version: %d\n"),
5347 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5349 isum
+= aux
.vna_next
;
5350 vstart
+= aux
.vna_next
;
5360 case SHT_GNU_versym
:
5362 Elf_Internal_Shdr
*link_section
;
5365 unsigned char *edata
;
5366 unsigned short *data
;
5368 Elf_Internal_Sym
*symbols
;
5369 Elf_Internal_Shdr
*string_sec
;
5371 link_section
= SECTION_HEADER (section
->sh_link
);
5372 total
= section
->sh_size
/ section
->sh_entsize
;
5376 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5378 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5380 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5381 string_sec
->sh_size
,
5382 _("version string table"));
5386 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5387 SECTION_NAME (section
), total
);
5389 printf (_(" Addr: "));
5390 printf_vma (section
->sh_addr
);
5391 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5392 (unsigned long) section
->sh_offset
, section
->sh_link
,
5393 SECTION_NAME (link_section
));
5397 get_data (NULL
, file
,
5398 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
5399 total
* sizeof (short), _("version symbol data")));
5406 data
= (unsigned short *) malloc (total
* sizeof (short));
5408 for (cnt
= total
; cnt
--;)
5409 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5414 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5417 int check_def
, check_need
;
5420 printf (" %03x:", cnt
);
5422 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5423 switch (data
[cnt
+ j
])
5426 fputs (_(" 0 (*local*) "), stdout
);
5430 fputs (_(" 1 (*global*) "), stdout
);
5434 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5435 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5439 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5442 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5449 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5451 Elf_Internal_Verneed ivn
;
5452 unsigned long offset
;
5454 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5459 Elf_Internal_Vernaux ivna
;
5460 Elf_External_Verneed evn
;
5461 Elf_External_Vernaux evna
;
5462 unsigned long a_off
;
5464 get_data (&evn
, file
, offset
, sizeof (evn
),
5467 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5468 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5470 a_off
= offset
+ ivn
.vn_aux
;
5474 get_data (&evna
, file
, a_off
, sizeof (evna
),
5475 _("version need aux (2)"));
5477 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5478 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5480 a_off
+= ivna
.vna_next
;
5482 while (ivna
.vna_other
!= data
[cnt
+ j
]
5483 && ivna
.vna_next
!= 0);
5485 if (ivna
.vna_other
== data
[cnt
+ j
])
5487 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5489 name
= strtab
+ ivna
.vna_name
;
5490 nn
+= printf ("(%s%-*s",
5492 12 - (int) strlen (name
),
5498 offset
+= ivn
.vn_next
;
5500 while (ivn
.vn_next
);
5503 if (check_def
&& data
[cnt
+ j
] != 0x8001
5504 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5506 Elf_Internal_Verdef ivd
;
5507 Elf_External_Verdef evd
;
5508 unsigned long offset
;
5510 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5515 get_data (&evd
, file
, offset
, sizeof (evd
),
5518 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5519 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5521 offset
+= ivd
.vd_next
;
5523 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5524 && ivd
.vd_next
!= 0);
5526 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5528 Elf_External_Verdaux evda
;
5529 Elf_Internal_Verdaux ivda
;
5531 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5533 get_data (&evda
, file
,
5534 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5535 sizeof (evda
), _("version def aux"));
5537 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5539 name
= strtab
+ ivda
.vda_name
;
5540 nn
+= printf ("(%s%-*s",
5542 12 - (int) strlen (name
),
5548 printf ("%*c", 18 - nn
, ' ');
5566 printf (_("\nNo version information found in this file.\n"));
5572 get_symbol_binding (binding
)
5573 unsigned int binding
;
5575 static char buff
[32];
5579 case STB_LOCAL
: return "LOCAL";
5580 case STB_GLOBAL
: return "GLOBAL";
5581 case STB_WEAK
: return "WEAK";
5583 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5584 sprintf (buff
, _("<processor specific>: %d"), binding
);
5585 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5586 sprintf (buff
, _("<OS specific>: %d"), binding
);
5588 sprintf (buff
, _("<unknown>: %d"), binding
);
5594 get_symbol_type (type
)
5597 static char buff
[32];
5601 case STT_NOTYPE
: return "NOTYPE";
5602 case STT_OBJECT
: return "OBJECT";
5603 case STT_FUNC
: return "FUNC";
5604 case STT_SECTION
: return "SECTION";
5605 case STT_FILE
: return "FILE";
5606 case STT_COMMON
: return "COMMON";
5607 case STT_TLS
: return "TLS";
5609 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5611 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5612 return "THUMB_FUNC";
5614 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5617 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5618 return "PARISC_MILLI";
5620 sprintf (buff
, _("<processor specific>: %d"), type
);
5622 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5624 if (elf_header
.e_machine
== EM_PARISC
)
5626 if (type
== STT_HP_OPAQUE
)
5628 if (type
== STT_HP_STUB
)
5632 sprintf (buff
, _("<OS specific>: %d"), type
);
5635 sprintf (buff
, _("<unknown>: %d"), type
);
5641 get_symbol_visibility (visibility
)
5642 unsigned int visibility
;
5646 case STV_DEFAULT
: return "DEFAULT";
5647 case STV_INTERNAL
: return "INTERNAL";
5648 case STV_HIDDEN
: return "HIDDEN";
5649 case STV_PROTECTED
: return "PROTECTED";
5655 get_symbol_index_type (type
)
5658 static char buff
[32];
5662 case SHN_UNDEF
: return "UND";
5663 case SHN_ABS
: return "ABS";
5664 case SHN_COMMON
: return "COM";
5666 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5667 sprintf (buff
, "PRC[0x%04x]", type
);
5668 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5669 sprintf (buff
, "OS [0x%04x]", type
);
5670 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5671 sprintf (buff
, "RSV[0x%04x]", type
);
5673 sprintf (buff
, "%3d", type
);
5681 get_dynamic_data (file
, number
)
5683 unsigned int number
;
5685 unsigned char *e_data
;
5688 e_data
= (unsigned char *) malloc (number
* 4);
5692 error (_("Out of memory\n"));
5696 if (fread (e_data
, 4, number
, file
) != number
)
5698 error (_("Unable to read in dynamic data\n"));
5702 i_data
= (int *) malloc (number
* sizeof (*i_data
));
5706 error (_("Out of memory\n"));
5712 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5719 /* Dump the symbol table. */
5721 process_symbol_table (file
)
5724 Elf_Internal_Shdr
*section
;
5725 unsigned char nb
[4];
5726 unsigned char nc
[4];
5729 int *buckets
= NULL
;
5732 if (! do_syms
&& !do_histogram
)
5735 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5738 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5740 error (_("Unable to seek to start of dynamic information"));
5744 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5746 error (_("Failed to read in number of buckets\n"));
5750 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5752 error (_("Failed to read in number of chains\n"));
5756 nbuckets
= byte_get (nb
, 4);
5757 nchains
= byte_get (nc
, 4);
5759 buckets
= get_dynamic_data (file
, nbuckets
);
5760 chains
= get_dynamic_data (file
, nchains
);
5762 if (buckets
== NULL
|| chains
== NULL
)
5767 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5772 printf (_("\nSymbol table for image:\n"));
5774 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5776 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5778 for (hn
= 0; hn
< nbuckets
; hn
++)
5783 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5785 Elf_Internal_Sym
*psym
;
5787 psym
= dynamic_symbols
+ si
;
5789 printf (" %3d %3d: ", si
, hn
);
5790 print_vma (psym
->st_value
, LONG_HEX
);
5792 print_vma (psym
->st_size
, DEC_5
);
5794 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5795 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5796 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5797 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5798 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5803 else if (do_syms
&& !do_using_dynamic
)
5807 for (i
= 0, section
= section_headers
;
5808 i
< elf_header
.e_shnum
;
5813 Elf_Internal_Sym
*symtab
;
5814 Elf_Internal_Sym
*psym
;
5817 if ( section
->sh_type
!= SHT_SYMTAB
5818 && section
->sh_type
!= SHT_DYNSYM
)
5821 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5822 SECTION_NAME (section
),
5823 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5825 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5827 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5829 symtab
= GET_ELF_SYMBOLS (file
, section
);
5833 if (section
->sh_link
== elf_header
.e_shstrndx
)
5834 strtab
= string_table
;
5837 Elf_Internal_Shdr
*string_sec
;
5839 string_sec
= SECTION_HEADER (section
->sh_link
);
5841 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5842 string_sec
->sh_size
,
5846 for (si
= 0, psym
= symtab
;
5847 si
< section
->sh_size
/ section
->sh_entsize
;
5850 printf ("%6d: ", si
);
5851 print_vma (psym
->st_value
, LONG_HEX
);
5853 print_vma (psym
->st_size
, DEC_5
);
5854 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5855 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5856 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5857 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5858 print_symbol (25, strtab
+ psym
->st_name
);
5860 if (section
->sh_type
== SHT_DYNSYM
&&
5861 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5863 unsigned char data
[2];
5864 unsigned short vers_data
;
5865 unsigned long offset
;
5869 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5872 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5873 sizeof (data
), _("version data"));
5875 vers_data
= byte_get (data
, 2);
5877 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5880 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5882 if ((vers_data
& 0x8000) || vers_data
> 1)
5884 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5885 && (is_nobits
|| ! check_def
))
5887 Elf_External_Verneed evn
;
5888 Elf_Internal_Verneed ivn
;
5889 Elf_Internal_Vernaux ivna
;
5891 /* We must test both. */
5892 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5897 unsigned long vna_off
;
5899 get_data (&evn
, file
, offset
, sizeof (evn
),
5902 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5903 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5905 vna_off
= offset
+ ivn
.vn_aux
;
5909 Elf_External_Vernaux evna
;
5911 get_data (&evna
, file
, vna_off
,
5913 _("version need aux (3)"));
5915 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5916 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5917 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5919 vna_off
+= ivna
.vna_next
;
5921 while (ivna
.vna_other
!= vers_data
5922 && ivna
.vna_next
!= 0);
5924 if (ivna
.vna_other
== vers_data
)
5927 offset
+= ivn
.vn_next
;
5929 while (ivn
.vn_next
!= 0);
5931 if (ivna
.vna_other
== vers_data
)
5934 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5937 else if (! is_nobits
)
5938 error (_("bad dynamic symbol"));
5945 if (vers_data
!= 0x8001
5946 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5948 Elf_Internal_Verdef ivd
;
5949 Elf_Internal_Verdaux ivda
;
5950 Elf_External_Verdaux evda
;
5951 unsigned long offset
;
5954 = (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5959 Elf_External_Verdef evd
;
5961 get_data (&evd
, file
, offset
, sizeof (evd
),
5964 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5965 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5966 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5968 offset
+= ivd
.vd_next
;
5970 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5971 && ivd
.vd_next
!= 0);
5973 offset
-= ivd
.vd_next
;
5974 offset
+= ivd
.vd_aux
;
5976 get_data (&evda
, file
, offset
, sizeof (evda
),
5977 _("version def aux"));
5979 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5981 if (psym
->st_name
!= ivda
.vda_name
)
5982 printf ((vers_data
& 0x8000)
5984 strtab
+ ivda
.vda_name
);
5994 if (strtab
!= string_table
)
6000 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6002 if (do_histogram
&& buckets
!= NULL
)
6009 int nzero_counts
= 0;
6012 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6014 printf (_(" Length Number %% of total Coverage\n"));
6016 lengths
= (int *) calloc (nbuckets
, sizeof (int));
6017 if (lengths
== NULL
)
6019 error (_("Out of memory"));
6022 for (hn
= 0; hn
< nbuckets
; ++hn
)
6027 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6030 if (maxlength
< ++lengths
[hn
])
6035 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
6038 error (_("Out of memory"));
6042 for (hn
= 0; hn
< nbuckets
; ++hn
)
6043 ++counts
[lengths
[hn
]];
6047 printf (" 0 %-10d (%5.1f%%)\n",
6048 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6049 for (si
= 1; si
<= maxlength
; ++si
)
6051 nzero_counts
+= counts
[si
] * si
;
6052 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6053 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6054 (nzero_counts
* 100.0) / nsyms
);
6062 if (buckets
!= NULL
)
6072 process_syminfo (file
)
6073 FILE *file ATTRIBUTE_UNUSED
;
6077 if (dynamic_syminfo
== NULL
6079 /* No syminfo, this is ok. */
6082 /* There better should be a dynamic symbol section. */
6083 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6087 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6088 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6090 printf (_(" Num: Name BoundTo Flags\n"));
6091 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6093 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6095 printf ("%4d: ", i
);
6096 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6099 switch (dynamic_syminfo
[i
].si_boundto
)
6101 case SYMINFO_BT_SELF
:
6102 fputs ("SELF ", stdout
);
6104 case SYMINFO_BT_PARENT
:
6105 fputs ("PARENT ", stdout
);
6108 if (dynamic_syminfo
[i
].si_boundto
> 0
6109 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6114 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6118 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6122 if (flags
& SYMINFO_FLG_DIRECT
)
6124 if (flags
& SYMINFO_FLG_PASSTHRU
)
6125 printf (" PASSTHRU");
6126 if (flags
& SYMINFO_FLG_COPY
)
6128 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6129 printf (" LAZYLOAD");
6137 #ifdef SUPPORT_DISASSEMBLY
6139 disassemble_section (section
, file
)
6140 Elf_Internal_Shdr
*section
;
6143 printf (_("\nAssembly dump of section %s\n"),
6144 SECTION_NAME (section
));
6146 /* XXX -- to be done --- XXX */
6153 dump_section (section
, file
)
6154 Elf_Internal_Shdr
*section
;
6157 bfd_size_type bytes
;
6159 unsigned char *data
;
6160 unsigned char *start
;
6162 bytes
= section
->sh_size
;
6166 printf (_("\nSection '%s' has no data to dump.\n"),
6167 SECTION_NAME (section
));
6171 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6173 addr
= section
->sh_addr
;
6175 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
6188 lbytes
= (bytes
> 16 ? 16 : bytes
);
6190 printf (" 0x%8.8lx ", (unsigned long) addr
);
6192 switch (elf_header
.e_ident
[EI_DATA
])
6196 for (j
= 15; j
>= 0; j
--)
6199 printf ("%2.2x", data
[j
]);
6209 for (j
= 0; j
< 16; j
++)
6212 printf ("%2.2x", data
[j
]);
6222 for (j
= 0; j
< lbytes
; j
++)
6225 if (k
>= ' ' && k
< 0x80)
6244 static unsigned long int
6245 read_leb128 (data
, length_return
, sign
)
6246 unsigned char *data
;
6250 unsigned long int result
= 0;
6251 unsigned int num_read
= 0;
6260 result
|= (byte
& 0x7f) << shift
;
6265 while (byte
& 0x80);
6267 if (length_return
!= NULL
)
6268 *length_return
= num_read
;
6270 if (sign
&& (shift
< 32) && (byte
& 0x40))
6271 result
|= -1 << shift
;
6276 typedef struct State_Machine_Registers
6278 unsigned long address
;
6281 unsigned int column
;
6285 /* This variable hold the number of the last entry seen
6286 in the File Table. */
6287 unsigned int last_file_entry
;
6290 static SMR state_machine_regs
;
6293 reset_state_machine (is_stmt
)
6296 state_machine_regs
.address
= 0;
6297 state_machine_regs
.file
= 1;
6298 state_machine_regs
.line
= 1;
6299 state_machine_regs
.column
= 0;
6300 state_machine_regs
.is_stmt
= is_stmt
;
6301 state_machine_regs
.basic_block
= 0;
6302 state_machine_regs
.end_sequence
= 0;
6303 state_machine_regs
.last_file_entry
= 0;
6306 /* Handled an extend line op. Returns true if this is the end
6309 process_extended_line_op (data
, is_stmt
, pointer_size
)
6310 unsigned char *data
;
6314 unsigned char op_code
;
6317 unsigned char *name
;
6320 len
= read_leb128 (data
, & bytes_read
, 0);
6325 warn (_("badly formed extended line op encountered!\n"));
6332 printf (_(" Extended opcode %d: "), op_code
);
6336 case DW_LNE_end_sequence
:
6337 printf (_("End of Sequence\n\n"));
6338 reset_state_machine (is_stmt
);
6341 case DW_LNE_set_address
:
6342 adr
= byte_get (data
, pointer_size
);
6343 printf (_("set Address to 0x%lx\n"), adr
);
6344 state_machine_regs
.address
= adr
;
6347 case DW_LNE_define_file
:
6348 printf (_(" define new File Table entry\n"));
6349 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6351 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6353 data
+= strlen ((char *) data
) + 1;
6354 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6356 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6358 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6359 printf (_("%s\n\n"), name
);
6363 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6370 /* Size of pointers in the .debug_line section. This information is not
6371 really present in that section. It's obtained before dumping the debug
6372 sections by doing some pre-scan of the .debug_info section. */
6373 static int debug_line_pointer_size
= 4;
6376 display_debug_lines (section
, start
, file
)
6377 Elf_Internal_Shdr
*section
;
6378 unsigned char * start
;
6379 FILE *file ATTRIBUTE_UNUSED
;
6381 DWARF2_External_LineInfo
*external
;
6382 DWARF2_Internal_LineInfo info
;
6383 unsigned char *standard_opcodes
;
6384 unsigned char *data
= start
;
6385 unsigned char *end
= start
+ section
->sh_size
;
6386 unsigned char *end_of_sequence
;
6389 printf (_("\nDump of debug contents of section %s:\n\n"),
6390 SECTION_NAME (section
));
6394 external
= (DWARF2_External_LineInfo
*) data
;
6396 /* Check the length of the block. */
6397 info
.li_length
= BYTE_GET (external
->li_length
);
6399 if (info
.li_length
== 0xffffffff)
6401 warn (_("64-bit DWARF line info is not supported yet.\n"));
6405 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
6408 (_("The line info appears to be corrupt - the section is too small\n"));
6412 /* Check its version number. */
6413 info
.li_version
= BYTE_GET (external
->li_version
);
6414 if (info
.li_version
!= 2)
6416 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6420 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
6421 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
6422 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
6423 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
6424 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
6425 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
6427 /* Sign extend the line base field. */
6428 info
.li_line_base
<<= 24;
6429 info
.li_line_base
>>= 24;
6431 printf (_(" Length: %ld\n"), info
.li_length
);
6432 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6433 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6434 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6435 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6436 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6437 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6438 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6440 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
6442 reset_state_machine (info
.li_default_is_stmt
);
6444 /* Display the contents of the Opcodes table. */
6445 standard_opcodes
= data
+ sizeof (*external
);
6447 printf (_("\n Opcodes:\n"));
6449 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6450 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6452 /* Display the contents of the Directory table. */
6453 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6456 printf (_("\n The Directory Table is empty.\n"));
6459 printf (_("\n The Directory Table:\n"));
6463 printf (_(" %s\n"), data
);
6465 data
+= strlen ((char *) data
) + 1;
6469 /* Skip the NUL at the end of the table. */
6472 /* Display the contents of the File Name table. */
6474 printf (_("\n The File Name Table is empty.\n"));
6477 printf (_("\n The File Name Table:\n"));
6478 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6482 unsigned char *name
;
6485 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6488 data
+= strlen ((char *) data
) + 1;
6490 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6492 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6494 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6496 printf (_("%s\n"), name
);
6500 /* Skip the NUL at the end of the table. */
6503 /* Now display the statements. */
6504 printf (_("\n Line Number Statements:\n"));
6507 while (data
< end_of_sequence
)
6509 unsigned char op_code
;
6515 if (op_code
>= info
.li_opcode_base
)
6517 op_code
-= info
.li_opcode_base
;
6518 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6519 state_machine_regs
.address
+= adv
;
6520 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6521 op_code
, adv
, state_machine_regs
.address
);
6522 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6523 state_machine_regs
.line
+= adv
;
6524 printf (_(" and Line by %d to %d\n"),
6525 adv
, state_machine_regs
.line
);
6527 else switch (op_code
)
6529 case DW_LNS_extended_op
:
6530 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6531 debug_line_pointer_size
);
6535 printf (_(" Copy\n"));
6538 case DW_LNS_advance_pc
:
6539 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6541 state_machine_regs
.address
+= adv
;
6542 printf (_(" Advance PC by %d to %lx\n"), adv
,
6543 state_machine_regs
.address
);
6546 case DW_LNS_advance_line
:
6547 adv
= read_leb128 (data
, & bytes_read
, 1);
6549 state_machine_regs
.line
+= adv
;
6550 printf (_(" Advance Line by %d to %d\n"), adv
,
6551 state_machine_regs
.line
);
6554 case DW_LNS_set_file
:
6555 adv
= read_leb128 (data
, & bytes_read
, 0);
6557 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6559 state_machine_regs
.file
= adv
;
6562 case DW_LNS_set_column
:
6563 adv
= read_leb128 (data
, & bytes_read
, 0);
6565 printf (_(" Set column to %d\n"), adv
);
6566 state_machine_regs
.column
= adv
;
6569 case DW_LNS_negate_stmt
:
6570 adv
= state_machine_regs
.is_stmt
;
6572 printf (_(" Set is_stmt to %d\n"), adv
);
6573 state_machine_regs
.is_stmt
= adv
;
6576 case DW_LNS_set_basic_block
:
6577 printf (_(" Set basic block\n"));
6578 state_machine_regs
.basic_block
= 1;
6581 case DW_LNS_const_add_pc
:
6582 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6583 * info
.li_min_insn_length
);
6584 state_machine_regs
.address
+= adv
;
6585 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6586 state_machine_regs
.address
);
6589 case DW_LNS_fixed_advance_pc
:
6590 adv
= byte_get (data
, 2);
6592 state_machine_regs
.address
+= adv
;
6593 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6594 adv
, state_machine_regs
.address
);
6597 case DW_LNS_set_prologue_end
:
6598 printf (_(" Set prologue_end to true\n"));
6601 case DW_LNS_set_epilogue_begin
:
6602 printf (_(" Set epilogue_begin to true\n"));
6605 case DW_LNS_set_isa
:
6606 adv
= read_leb128 (data
, & bytes_read
, 0);
6608 printf (_(" Set ISA to %d\n"), adv
);
6612 printf (_(" Unknown opcode %d with operands: "), op_code
);
6615 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6617 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6618 i
== 1 ? "" : ", ");
6633 display_debug_pubnames (section
, start
, file
)
6634 Elf_Internal_Shdr
*section
;
6635 unsigned char *start
;
6636 FILE *file ATTRIBUTE_UNUSED
;
6638 DWARF2_External_PubNames
*external
;
6639 DWARF2_Internal_PubNames pubnames
;
6642 end
= start
+ section
->sh_size
;
6644 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6648 unsigned char *data
;
6649 unsigned long offset
;
6651 external
= (DWARF2_External_PubNames
*) start
;
6653 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6654 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6655 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6656 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6658 data
= start
+ sizeof (*external
);
6659 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6661 if (pubnames
.pn_length
== 0xffffffff)
6663 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6667 if (pubnames
.pn_version
!= 2)
6669 static int warned
= 0;
6673 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6680 printf (_(" Length: %ld\n"),
6681 pubnames
.pn_length
);
6682 printf (_(" Version: %d\n"),
6683 pubnames
.pn_version
);
6684 printf (_(" Offset into .debug_info section: %ld\n"),
6685 pubnames
.pn_offset
);
6686 printf (_(" Size of area in .debug_info section: %ld\n"),
6689 printf (_("\n Offset\tName\n"));
6693 offset
= byte_get (data
, 4);
6698 printf (" %ld\t\t%s\n", offset
, data
);
6699 data
+= strlen ((char *) data
) + 1;
6702 while (offset
!= 0);
6715 case DW_TAG_padding
: return "DW_TAG_padding";
6716 case DW_TAG_array_type
: return "DW_TAG_array_type";
6717 case DW_TAG_class_type
: return "DW_TAG_class_type";
6718 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6719 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6720 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6721 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6722 case DW_TAG_label
: return "DW_TAG_label";
6723 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6724 case DW_TAG_member
: return "DW_TAG_member";
6725 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6726 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6727 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6728 case DW_TAG_string_type
: return "DW_TAG_string_type";
6729 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6730 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6731 case DW_TAG_typedef
: return "DW_TAG_typedef";
6732 case DW_TAG_union_type
: return "DW_TAG_union_type";
6733 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6734 case DW_TAG_variant
: return "DW_TAG_variant";
6735 case DW_TAG_common_block
: return "DW_TAG_common_block";
6736 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6737 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6738 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6739 case DW_TAG_module
: return "DW_TAG_module";
6740 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6741 case DW_TAG_set_type
: return "DW_TAG_set_type";
6742 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6743 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6744 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6745 case DW_TAG_base_type
: return "DW_TAG_base_type";
6746 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6747 case DW_TAG_const_type
: return "DW_TAG_const_type";
6748 case DW_TAG_constant
: return "DW_TAG_constant";
6749 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6750 case DW_TAG_file_type
: return "DW_TAG_file_type";
6751 case DW_TAG_friend
: return "DW_TAG_friend";
6752 case DW_TAG_namelist
: return "DW_TAG_namelist";
6753 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6754 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6755 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6756 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6757 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6758 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6759 case DW_TAG_try_block
: return "DW_TAG_try_block";
6760 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6761 case DW_TAG_variable
: return "DW_TAG_variable";
6762 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6763 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6764 case DW_TAG_format_label
: return "DW_TAG_format_label";
6765 case DW_TAG_function_template
: return "DW_TAG_function_template";
6766 case DW_TAG_class_template
: return "DW_TAG_class_template";
6767 /* DWARF 2.1 values. */
6768 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6769 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6770 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6771 case DW_TAG_namespace
: return "DW_TAG_namespace";
6772 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6773 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6774 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6775 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6777 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6778 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6779 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6782 static char buffer
[100];
6784 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6791 get_AT_name (attribute
)
6792 unsigned long attribute
;
6796 case DW_AT_sibling
: return "DW_AT_sibling";
6797 case DW_AT_location
: return "DW_AT_location";
6798 case DW_AT_name
: return "DW_AT_name";
6799 case DW_AT_ordering
: return "DW_AT_ordering";
6800 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6801 case DW_AT_byte_size
: return "DW_AT_byte_size";
6802 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6803 case DW_AT_bit_size
: return "DW_AT_bit_size";
6804 case DW_AT_element_list
: return "DW_AT_element_list";
6805 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6806 case DW_AT_low_pc
: return "DW_AT_low_pc";
6807 case DW_AT_high_pc
: return "DW_AT_high_pc";
6808 case DW_AT_language
: return "DW_AT_language";
6809 case DW_AT_member
: return "DW_AT_member";
6810 case DW_AT_discr
: return "DW_AT_discr";
6811 case DW_AT_discr_value
: return "DW_AT_discr_value";
6812 case DW_AT_visibility
: return "DW_AT_visibility";
6813 case DW_AT_import
: return "DW_AT_import";
6814 case DW_AT_string_length
: return "DW_AT_string_length";
6815 case DW_AT_common_reference
: return "DW_AT_common_reference";
6816 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6817 case DW_AT_const_value
: return "DW_AT_const_value";
6818 case DW_AT_containing_type
: return "DW_AT_containing_type";
6819 case DW_AT_default_value
: return "DW_AT_default_value";
6820 case DW_AT_inline
: return "DW_AT_inline";
6821 case DW_AT_is_optional
: return "DW_AT_is_optional";
6822 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6823 case DW_AT_producer
: return "DW_AT_producer";
6824 case DW_AT_prototyped
: return "DW_AT_prototyped";
6825 case DW_AT_return_addr
: return "DW_AT_return_addr";
6826 case DW_AT_start_scope
: return "DW_AT_start_scope";
6827 case DW_AT_stride_size
: return "DW_AT_stride_size";
6828 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6829 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6830 case DW_AT_accessibility
: return "DW_AT_accessibility";
6831 case DW_AT_address_class
: return "DW_AT_address_class";
6832 case DW_AT_artificial
: return "DW_AT_artificial";
6833 case DW_AT_base_types
: return "DW_AT_base_types";
6834 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6835 case DW_AT_count
: return "DW_AT_count";
6836 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6837 case DW_AT_decl_column
: return "DW_AT_decl_column";
6838 case DW_AT_decl_file
: return "DW_AT_decl_file";
6839 case DW_AT_decl_line
: return "DW_AT_decl_line";
6840 case DW_AT_declaration
: return "DW_AT_declaration";
6841 case DW_AT_discr_list
: return "DW_AT_discr_list";
6842 case DW_AT_encoding
: return "DW_AT_encoding";
6843 case DW_AT_external
: return "DW_AT_external";
6844 case DW_AT_frame_base
: return "DW_AT_frame_base";
6845 case DW_AT_friend
: return "DW_AT_friend";
6846 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6847 case DW_AT_macro_info
: return "DW_AT_macro_info";
6848 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6849 case DW_AT_priority
: return "DW_AT_priority";
6850 case DW_AT_segment
: return "DW_AT_segment";
6851 case DW_AT_specification
: return "DW_AT_specification";
6852 case DW_AT_static_link
: return "DW_AT_static_link";
6853 case DW_AT_type
: return "DW_AT_type";
6854 case DW_AT_use_location
: return "DW_AT_use_location";
6855 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6856 case DW_AT_virtuality
: return "DW_AT_virtuality";
6857 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6858 /* DWARF 2.1 values. */
6859 case DW_AT_allocated
: return "DW_AT_allocated";
6860 case DW_AT_associated
: return "DW_AT_associated";
6861 case DW_AT_data_location
: return "DW_AT_data_location";
6862 case DW_AT_stride
: return "DW_AT_stride";
6863 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6864 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6865 case DW_AT_extension
: return "DW_AT_extension";
6866 case DW_AT_ranges
: return "DW_AT_ranges";
6867 case DW_AT_trampoline
: return "DW_AT_trampoline";
6868 case DW_AT_call_column
: return "DW_AT_call_column";
6869 case DW_AT_call_file
: return "DW_AT_call_file";
6870 case DW_AT_call_line
: return "DW_AT_call_line";
6871 /* SGI/MIPS extensions. */
6872 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6873 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6874 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6875 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6876 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6877 case DW_AT_MIPS_software_pipeline_depth
:
6878 return "DW_AT_MIPS_software_pipeline_depth";
6879 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6880 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6881 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6882 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6883 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6884 /* GNU extensions. */
6885 case DW_AT_sf_names
: return "DW_AT_sf_names";
6886 case DW_AT_src_info
: return "DW_AT_src_info";
6887 case DW_AT_mac_info
: return "DW_AT_mac_info";
6888 case DW_AT_src_coords
: return "DW_AT_src_coords";
6889 case DW_AT_body_begin
: return "DW_AT_body_begin";
6890 case DW_AT_body_end
: return "DW_AT_body_end";
6891 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
6892 /* UPC extension. */
6893 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
6896 static char buffer
[100];
6898 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6905 get_FORM_name (form
)
6910 case DW_FORM_addr
: return "DW_FORM_addr";
6911 case DW_FORM_block2
: return "DW_FORM_block2";
6912 case DW_FORM_block4
: return "DW_FORM_block4";
6913 case DW_FORM_data2
: return "DW_FORM_data2";
6914 case DW_FORM_data4
: return "DW_FORM_data4";
6915 case DW_FORM_data8
: return "DW_FORM_data8";
6916 case DW_FORM_string
: return "DW_FORM_string";
6917 case DW_FORM_block
: return "DW_FORM_block";
6918 case DW_FORM_block1
: return "DW_FORM_block1";
6919 case DW_FORM_data1
: return "DW_FORM_data1";
6920 case DW_FORM_flag
: return "DW_FORM_flag";
6921 case DW_FORM_sdata
: return "DW_FORM_sdata";
6922 case DW_FORM_strp
: return "DW_FORM_strp";
6923 case DW_FORM_udata
: return "DW_FORM_udata";
6924 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6925 case DW_FORM_ref1
: return "DW_FORM_ref1";
6926 case DW_FORM_ref2
: return "DW_FORM_ref2";
6927 case DW_FORM_ref4
: return "DW_FORM_ref4";
6928 case DW_FORM_ref8
: return "DW_FORM_ref8";
6929 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6930 case DW_FORM_indirect
: return "DW_FORM_indirect";
6933 static char buffer
[100];
6935 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6941 /* FIXME: There are better and more effiecint ways to handle
6942 these structures. For now though, I just want something that
6943 is simple to implement. */
6944 typedef struct abbrev_attr
6946 unsigned long attribute
;
6948 struct abbrev_attr
*next
;
6952 typedef struct abbrev_entry
6954 unsigned long entry
;
6957 struct abbrev_attr
*first_attr
;
6958 struct abbrev_attr
*last_attr
;
6959 struct abbrev_entry
*next
;
6963 static abbrev_entry
*first_abbrev
= NULL
;
6964 static abbrev_entry
*last_abbrev
= NULL
;
6969 abbrev_entry
*abbrev
;
6971 for (abbrev
= first_abbrev
; abbrev
;)
6973 abbrev_entry
*next
= abbrev
->next
;
6976 for (attr
= abbrev
->first_attr
; attr
;)
6978 abbrev_attr
*next
= attr
->next
;
6988 last_abbrev
= first_abbrev
= NULL
;
6992 add_abbrev (number
, tag
, children
)
6993 unsigned long number
;
6997 abbrev_entry
*entry
;
6999 entry
= (abbrev_entry
*) malloc (sizeof (*entry
));
7005 entry
->entry
= number
;
7007 entry
->children
= children
;
7008 entry
->first_attr
= NULL
;
7009 entry
->last_attr
= NULL
;
7012 if (first_abbrev
== NULL
)
7013 first_abbrev
= entry
;
7015 last_abbrev
->next
= entry
;
7017 last_abbrev
= entry
;
7021 add_abbrev_attr (attribute
, form
)
7022 unsigned long attribute
;
7027 attr
= (abbrev_attr
*) malloc (sizeof (*attr
));
7033 attr
->attribute
= attribute
;
7037 if (last_abbrev
->first_attr
== NULL
)
7038 last_abbrev
->first_attr
= attr
;
7040 last_abbrev
->last_attr
->next
= attr
;
7042 last_abbrev
->last_attr
= attr
;
7045 /* Processes the (partial) contents of a .debug_abbrev section.
7046 Returns NULL if the end of the section was encountered.
7047 Returns the address after the last byte read if the end of
7048 an abbreviation set was found. */
7050 static unsigned char *
7051 process_abbrev_section (start
, end
)
7052 unsigned char *start
;
7055 if (first_abbrev
!= NULL
)
7061 unsigned long entry
;
7063 unsigned long attribute
;
7066 entry
= read_leb128 (start
, & bytes_read
, 0);
7067 start
+= bytes_read
;
7069 /* A single zero is supposed to end the section according
7070 to the standard. If there's more, then signal that to
7073 return start
== end
? NULL
: start
;
7075 tag
= read_leb128 (start
, & bytes_read
, 0);
7076 start
+= bytes_read
;
7078 children
= *start
++;
7080 add_abbrev (entry
, tag
, children
);
7086 attribute
= read_leb128 (start
, & bytes_read
, 0);
7087 start
+= bytes_read
;
7089 form
= read_leb128 (start
, & bytes_read
, 0);
7090 start
+= bytes_read
;
7093 add_abbrev_attr (attribute
, form
);
7095 while (attribute
!= 0);
7103 display_debug_macinfo (section
, start
, file
)
7104 Elf_Internal_Shdr
*section
;
7105 unsigned char *start
;
7106 FILE *file ATTRIBUTE_UNUSED
;
7108 unsigned char *end
= start
+ section
->sh_size
;
7109 unsigned char *curr
= start
;
7110 unsigned int bytes_read
;
7111 enum dwarf_macinfo_record_type op
;
7113 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7117 unsigned int lineno
;
7125 case DW_MACINFO_start_file
:
7127 unsigned int filenum
;
7129 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7131 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7134 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7138 case DW_MACINFO_end_file
:
7139 printf (_(" DW_MACINFO_end_file\n"));
7142 case DW_MACINFO_define
:
7143 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7146 curr
+= strlen (string
) + 1;
7147 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7150 case DW_MACINFO_undef
:
7151 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7154 curr
+= strlen (string
) + 1;
7155 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7158 case DW_MACINFO_vendor_ext
:
7160 unsigned int constant
;
7162 constant
= read_leb128 (curr
, & bytes_read
, 0);
7165 curr
+= strlen (string
) + 1;
7166 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7177 display_debug_abbrev (section
, start
, file
)
7178 Elf_Internal_Shdr
*section
;
7179 unsigned char *start
;
7180 FILE *file ATTRIBUTE_UNUSED
;
7182 abbrev_entry
*entry
;
7183 unsigned char *end
= start
+ section
->sh_size
;
7185 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7189 start
= process_abbrev_section (start
, end
);
7191 if (first_abbrev
== NULL
)
7194 printf (_(" Number TAG\n"));
7196 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7200 printf (_(" %ld %s [%s]\n"),
7202 get_TAG_name (entry
->tag
),
7203 entry
->children
? _("has children") : _("no children"));
7205 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7207 printf (_(" %-18s %s\n"),
7208 get_AT_name (attr
->attribute
),
7209 get_FORM_name (attr
->form
));
7223 static unsigned char *
7224 display_block (data
, length
)
7225 unsigned char *data
;
7226 unsigned long length
;
7228 printf (_(" %lu byte block: "), length
);
7231 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7237 decode_location_expression (data
, pointer_size
, length
)
7238 unsigned char * data
;
7239 unsigned int pointer_size
;
7240 unsigned long length
;
7244 unsigned long uvalue
;
7245 unsigned char *end
= data
+ length
;
7254 printf ("DW_OP_addr: %lx",
7255 (unsigned long) byte_get (data
, pointer_size
));
7256 data
+= pointer_size
;
7259 printf ("DW_OP_deref");
7262 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7265 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7268 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7272 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7276 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7280 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7284 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7285 (unsigned long) byte_get (data
+ 4, 4));
7289 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7290 (long) byte_get (data
+ 4, 4));
7294 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7298 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7302 printf ("DW_OP_dup");
7305 printf ("DW_OP_drop");
7308 printf ("DW_OP_over");
7311 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7314 printf ("DW_OP_swap");
7317 printf ("DW_OP_rot");
7320 printf ("DW_OP_xderef");
7323 printf ("DW_OP_abs");
7326 printf ("DW_OP_and");
7329 printf ("DW_OP_div");
7332 printf ("DW_OP_minus");
7335 printf ("DW_OP_mod");
7338 printf ("DW_OP_mul");
7341 printf ("DW_OP_neg");
7344 printf ("DW_OP_not");
7347 printf ("DW_OP_or");
7350 printf ("DW_OP_plus");
7352 case DW_OP_plus_uconst
:
7353 printf ("DW_OP_plus_uconst: %lu",
7354 read_leb128 (data
, &bytes_read
, 0));
7358 printf ("DW_OP_shl");
7361 printf ("DW_OP_shr");
7364 printf ("DW_OP_shra");
7367 printf ("DW_OP_xor");
7370 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7374 printf ("DW_OP_eq");
7377 printf ("DW_OP_ge");
7380 printf ("DW_OP_gt");
7383 printf ("DW_OP_le");
7386 printf ("DW_OP_lt");
7389 printf ("DW_OP_ne");
7392 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7428 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7463 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7498 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7499 read_leb128 (data
, &bytes_read
, 1));
7504 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7508 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7512 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7514 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7515 read_leb128 (data
, &bytes_read
, 1));
7519 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7522 case DW_OP_deref_size
:
7523 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7525 case DW_OP_xderef_size
:
7526 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7529 printf ("DW_OP_nop");
7532 /* DWARF 3 extensions. */
7533 case DW_OP_push_object_address
:
7534 printf ("DW_OP_push_object_address");
7537 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7541 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7544 case DW_OP_call_ref
:
7545 printf ("DW_OP_call_ref");
7548 /* GNU extensions. */
7549 case DW_OP_GNU_push_tls_address
:
7550 printf ("DW_OP_GNU_push_tls_address");
7554 if (op
>= DW_OP_lo_user
7555 && op
<= DW_OP_hi_user
)
7556 printf (_("(User defined location op)"));
7558 printf (_("(Unknown location op)"));
7559 /* No way to tell where the next op is, so just bail. */
7563 /* Separate the ops. */
7568 static const char *debug_loc_contents
;
7569 static bfd_vma debug_loc_size
;
7572 load_debug_loc (file
)
7575 Elf_Internal_Shdr
*sec
;
7578 /* If it is already loaded, do nothing. */
7579 if (debug_loc_contents
!= NULL
)
7582 /* Locate the .debug_loc section. */
7583 for (i
= 0, sec
= section_headers
;
7584 i
< elf_header
.e_shnum
;
7586 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7589 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7592 debug_loc_size
= sec
->sh_size
;
7594 debug_loc_contents
= ((char *)
7595 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7596 _("debug_loc section data")));
7602 if (debug_loc_contents
== NULL
)
7605 free ((char *) debug_loc_contents
);
7606 debug_loc_contents
= NULL
;
7612 display_debug_loc (section
, start
, file
)
7613 Elf_Internal_Shdr
*section
;
7614 unsigned char *start
;
7615 FILE *file ATTRIBUTE_UNUSED
;
7617 unsigned char *section_end
;
7618 unsigned long bytes
;
7619 unsigned char *section_begin
= start
;
7622 addr
= section
->sh_addr
;
7623 bytes
= section
->sh_size
;
7624 section_end
= start
+ bytes
;
7628 printf (_("\nThe .debug_loc section is empty.\n"));
7632 printf (_("Contents of the .debug_loc section:\n\n"));
7633 printf (_("\n Offset Begin End Expression\n"));
7635 while (start
< section_end
)
7637 unsigned long begin
;
7639 unsigned short length
;
7640 unsigned long offset
;
7642 offset
= start
- section_begin
;
7646 /* Normally, the lists in the debug_loc section are related to a
7647 given compilation unit, and thus, we would use the pointer size
7648 of that compilation unit. However, since we are displaying it
7649 seperately here, we either have to store pointer sizes of all
7650 compilation units, or assume they don't change. We assume,
7651 like the debug_line display, that it doesn't change. */
7652 begin
= byte_get (start
, debug_line_pointer_size
);
7653 start
+= debug_line_pointer_size
;
7654 end
= byte_get (start
, debug_line_pointer_size
);
7655 start
+= debug_line_pointer_size
;
7657 if (begin
== 0 && end
== 0)
7660 /* For now, skip any base address specifiers. */
7661 if (begin
== 0xffffffff)
7667 length
= byte_get (start
, 2);
7670 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7671 decode_location_expression (start
, debug_line_pointer_size
, length
);
7681 static const char *debug_str_contents
;
7682 static bfd_vma debug_str_size
;
7685 load_debug_str (file
)
7688 Elf_Internal_Shdr
*sec
;
7691 /* If it is already loaded, do nothing. */
7692 if (debug_str_contents
!= NULL
)
7695 /* Locate the .debug_str section. */
7696 for (i
= 0, sec
= section_headers
;
7697 i
< elf_header
.e_shnum
;
7699 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7702 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7705 debug_str_size
= sec
->sh_size
;
7707 debug_str_contents
= ((char *)
7708 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7709 _("debug_str section data")));
7715 if (debug_str_contents
== NULL
)
7718 free ((char *) debug_str_contents
);
7719 debug_str_contents
= NULL
;
7724 fetch_indirect_string (offset
)
7725 unsigned long offset
;
7727 if (debug_str_contents
== NULL
)
7728 return _("<no .debug_str section>");
7730 if (offset
> debug_str_size
)
7731 return _("<offset is too big>");
7733 return debug_str_contents
+ offset
;
7737 display_debug_str (section
, start
, file
)
7738 Elf_Internal_Shdr
*section
;
7739 unsigned char *start
;
7740 FILE *file ATTRIBUTE_UNUSED
;
7742 unsigned long bytes
;
7745 addr
= section
->sh_addr
;
7746 bytes
= section
->sh_size
;
7750 printf (_("\nThe .debug_str section is empty.\n"));
7754 printf (_("Contents of the .debug_str section:\n\n"));
7762 lbytes
= (bytes
> 16 ? 16 : bytes
);
7764 printf (" 0x%8.8lx ", (unsigned long) addr
);
7766 for (j
= 0; j
< 16; j
++)
7769 printf ("%2.2x", start
[j
]);
7777 for (j
= 0; j
< lbytes
; j
++)
7780 if (k
>= ' ' && k
< 0x80)
7796 static unsigned char *
7797 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7798 unsigned long attribute
;
7800 unsigned char *data
;
7801 unsigned long cu_offset
;
7802 unsigned long pointer_size
;
7804 unsigned long uvalue
= 0;
7805 unsigned char *block_start
= NULL
;
7813 case DW_FORM_ref_addr
:
7815 uvalue
= byte_get (data
, pointer_size
);
7816 data
+= pointer_size
;
7820 uvalue
= byte_get (data
, /* offset_size */ 4);
7821 data
+= /* offset_size */ 4;
7827 uvalue
= byte_get (data
++, 1);
7832 uvalue
= byte_get (data
, 2);
7838 uvalue
= byte_get (data
, 4);
7843 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7847 case DW_FORM_ref_udata
:
7849 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7853 case DW_FORM_indirect
:
7854 form
= read_leb128 (data
, & bytes_read
, 0);
7856 printf (" %s", get_FORM_name (form
));
7857 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7863 case DW_FORM_ref_addr
:
7864 printf (" <#%lx>", uvalue
);
7870 case DW_FORM_ref_udata
:
7871 printf (" <%lx>", uvalue
+ cu_offset
);
7875 printf (" %#lx", uvalue
);
7883 printf (" %ld", uvalue
);
7888 uvalue
= byte_get (data
, 4);
7889 printf (" %lx", uvalue
);
7890 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7894 case DW_FORM_string
:
7895 printf (" %s", data
);
7896 data
+= strlen ((char *) data
) + 1;
7900 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7901 block_start
= data
+ bytes_read
;
7902 data
= display_block (block_start
, uvalue
);
7905 case DW_FORM_block1
:
7906 uvalue
= byte_get (data
, 1);
7907 block_start
= data
+ 1;
7908 data
= display_block (block_start
, uvalue
);
7911 case DW_FORM_block2
:
7912 uvalue
= byte_get (data
, 2);
7913 block_start
= data
+ 2;
7914 data
= display_block (block_start
, uvalue
);
7917 case DW_FORM_block4
:
7918 uvalue
= byte_get (data
, 4);
7919 block_start
= data
+ 4;
7920 data
= display_block (block_start
, uvalue
);
7924 printf (_(" (indirect string, offset: 0x%lx): %s"),
7925 uvalue
, fetch_indirect_string (uvalue
));
7928 case DW_FORM_indirect
:
7929 /* Handled above. */
7933 warn (_("Unrecognized form: %d\n"), form
);
7937 /* For some attributes we can display futher information. */
7946 case DW_INL_not_inlined
:
7947 printf (_("(not inlined)"));
7949 case DW_INL_inlined
:
7950 printf (_("(inlined)"));
7952 case DW_INL_declared_not_inlined
:
7953 printf (_("(declared as inline but ignored)"));
7955 case DW_INL_declared_inlined
:
7956 printf (_("(declared as inline and inlined)"));
7959 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
7964 case DW_AT_language
:
7967 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7968 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7969 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7970 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7971 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7972 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7973 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7974 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7975 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7976 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7977 /* DWARF 2.1 values. */
7978 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7979 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7980 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7981 /* MIPS extension. */
7982 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7983 /* UPC extension. */
7984 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
7986 printf ("(Unknown: %lx)", uvalue
);
7991 case DW_AT_encoding
:
7994 case DW_ATE_void
: printf ("(void)"); break;
7995 case DW_ATE_address
: printf ("(machine address)"); break;
7996 case DW_ATE_boolean
: printf ("(boolean)"); break;
7997 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7998 case DW_ATE_float
: printf ("(float)"); break;
7999 case DW_ATE_signed
: printf ("(signed)"); break;
8000 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8001 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8002 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8003 /* DWARF 2.1 value. */
8004 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8006 if (uvalue
>= DW_ATE_lo_user
8007 && uvalue
<= DW_ATE_hi_user
)
8008 printf ("(user defined type)");
8010 printf ("(unknown type)");
8015 case DW_AT_accessibility
:
8018 case DW_ACCESS_public
: printf ("(public)"); break;
8019 case DW_ACCESS_protected
: printf ("(protected)"); break;
8020 case DW_ACCESS_private
: printf ("(private)"); break;
8022 printf ("(unknown accessibility)");
8027 case DW_AT_visibility
:
8030 case DW_VIS_local
: printf ("(local)"); break;
8031 case DW_VIS_exported
: printf ("(exported)"); break;
8032 case DW_VIS_qualified
: printf ("(qualified)"); break;
8033 default: printf ("(unknown visibility)"); break;
8037 case DW_AT_virtuality
:
8040 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8041 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8042 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8043 default: printf ("(unknown virtuality)"); break;
8047 case DW_AT_identifier_case
:
8050 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8051 case DW_ID_up_case
: printf ("(up_case)"); break;
8052 case DW_ID_down_case
: printf ("(down_case)"); break;
8053 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8054 default: printf ("(unknown case)"); break;
8058 case DW_AT_calling_convention
:
8061 case DW_CC_normal
: printf ("(normal)"); break;
8062 case DW_CC_program
: printf ("(program)"); break;
8063 case DW_CC_nocall
: printf ("(nocall)"); break;
8065 if (uvalue
>= DW_CC_lo_user
8066 && uvalue
<= DW_CC_hi_user
)
8067 printf ("(user defined)");
8069 printf ("(unknown convention)");
8073 case DW_AT_ordering
:
8076 case -1: printf ("(undefined)"); break;
8077 case 0: printf ("(row major)"); break;
8078 case 1: printf ("(column major)"); break;
8082 case DW_AT_frame_base
:
8083 case DW_AT_location
:
8084 case DW_AT_data_member_location
:
8085 case DW_AT_vtable_elem_location
:
8086 case DW_AT_allocated
:
8087 case DW_AT_associated
:
8088 case DW_AT_data_location
:
8090 case DW_AT_upper_bound
:
8091 case DW_AT_lower_bound
:
8095 decode_location_expression (block_start
, pointer_size
, uvalue
);
8098 else if (form
== DW_FORM_data4
)
8101 printf ("location list");
8113 static unsigned char *
8114 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
8115 unsigned long attribute
;
8117 unsigned char *data
;
8118 unsigned long cu_offset
;
8119 unsigned long pointer_size
;
8121 printf (" %-18s:", get_AT_name (attribute
));
8122 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8129 display_debug_info (section
, start
, file
)
8130 Elf_Internal_Shdr
*section
;
8131 unsigned char *start
;
8134 unsigned char *end
= start
+ section
->sh_size
;
8135 unsigned char *section_begin
= start
;
8137 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8139 load_debug_str (file
);
8140 load_debug_loc (file
);
8144 DWARF2_External_CompUnit
*external
;
8145 DWARF2_Internal_CompUnit compunit
;
8146 Elf_Internal_Shdr
*relsec
;
8147 unsigned char *tags
;
8150 unsigned long cu_offset
;
8152 external
= (DWARF2_External_CompUnit
*) start
;
8154 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
8155 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
8156 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
8157 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8159 if (compunit
.cu_length
== 0xffffffff)
8161 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8165 /* Check for RELA relocations in the
8166 abbrev_offset address, and apply them. */
8167 for (relsec
= section_headers
;
8168 relsec
< section_headers
+ elf_header
.e_shnum
;
8171 unsigned long nrelas
;
8172 Elf_Internal_Rela
*rela
, *rp
;
8173 Elf_Internal_Shdr
*symsec
;
8174 Elf_Internal_Sym
*symtab
;
8175 Elf_Internal_Sym
*sym
;
8177 if (relsec
->sh_type
!= SHT_RELA
8178 || SECTION_HEADER (relsec
->sh_info
) != section
8179 || relsec
->sh_size
== 0)
8182 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8186 symsec
= SECTION_HEADER (relsec
->sh_link
);
8187 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8189 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8192 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
8198 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8200 if (ELF32_R_SYM (rp
->r_info
) != 0
8201 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8203 warn (_("Skipping unexpected symbol type %u\n"),
8204 ELF32_ST_TYPE (sym
->st_info
));
8210 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8212 if (ELF64_R_SYM (rp
->r_info
) != 0
8213 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8215 warn (_("Skipping unexpected symbol type %u\n"),
8216 ELF64_ST_TYPE (sym
->st_info
));
8221 compunit
.cu_abbrev_offset
= rp
->r_addend
;
8229 tags
= start
+ sizeof (*external
);
8230 cu_offset
= start
- section_begin
;
8231 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
8233 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8234 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8235 printf (_(" Version: %d\n"), compunit
.cu_version
);
8236 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8237 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8239 if (compunit
.cu_version
!= 2)
8241 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8247 /* Read in the abbrevs used by this compilation unit. */
8249 Elf_Internal_Shdr
*sec
;
8250 unsigned char *begin
;
8252 /* Locate the .debug_abbrev section and process it. */
8253 for (i
= 0, sec
= section_headers
;
8254 i
< elf_header
.e_shnum
;
8256 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8259 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8261 warn (_("Unable to locate .debug_abbrev section!\n"));
8265 begin
= ((unsigned char *)
8266 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8267 _("debug_abbrev section data")));
8271 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8272 begin
+ sec
->sh_size
);
8278 while (tags
< start
)
8281 unsigned long abbrev_number
;
8282 abbrev_entry
*entry
;
8285 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8288 /* A null DIE marks the end of a list of children. */
8289 if (abbrev_number
== 0)
8295 /* Scan through the abbreviation list until we reach the
8297 for (entry
= first_abbrev
;
8298 entry
&& entry
->entry
!= abbrev_number
;
8299 entry
= entry
->next
)
8304 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8309 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8311 (unsigned long) (tags
- section_begin
- bytes_read
),
8313 get_TAG_name (entry
->tag
));
8315 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8316 tags
= read_and_display_attr (attr
->attribute
,
8319 compunit
.cu_pointer_size
);
8321 if (entry
->children
)
8335 display_debug_aranges (section
, start
, file
)
8336 Elf_Internal_Shdr
*section
;
8337 unsigned char *start
;
8338 FILE *file ATTRIBUTE_UNUSED
;
8340 unsigned char *end
= start
+ section
->sh_size
;
8342 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8346 DWARF2_External_ARange
*external
;
8347 DWARF2_Internal_ARange arange
;
8348 unsigned char *ranges
;
8349 unsigned long length
;
8350 unsigned long address
;
8353 external
= (DWARF2_External_ARange
*) start
;
8355 arange
.ar_length
= BYTE_GET (external
->ar_length
);
8356 arange
.ar_version
= BYTE_GET (external
->ar_version
);
8357 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
8358 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
8359 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
8361 if (arange
.ar_length
== 0xffffffff)
8363 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8367 if (arange
.ar_version
!= 2)
8369 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8373 printf (_(" Length: %ld\n"), arange
.ar_length
);
8374 printf (_(" Version: %d\n"), arange
.ar_version
);
8375 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8376 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8377 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8379 printf (_("\n Address Length\n"));
8381 ranges
= start
+ sizeof (*external
);
8383 /* Must pad to an alignment boundary that is twice the pointer size. */
8384 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
8386 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8390 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8392 ranges
+= arange
.ar_pointer_size
;
8394 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8396 ranges
+= arange
.ar_pointer_size
;
8398 /* A pair of zeros marks the end of the list. */
8399 if (address
== 0 && length
== 0)
8402 printf (" %8.8lx %lu\n", address
, length
);
8405 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
8413 typedef struct Frame_Chunk
8415 struct Frame_Chunk
*next
;
8416 unsigned char *chunk_start
;
8418 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8419 short int *col_type
;
8422 unsigned int code_factor
;
8424 unsigned long pc_begin
;
8425 unsigned long pc_range
;
8429 unsigned char fde_encoding
;
8433 /* A marker for a col_type that means this column was never referenced
8434 in the frame info. */
8435 #define DW_CFA_unreferenced (-1)
8437 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
8438 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
8439 static int size_of_encoded_value
PARAMS ((int));
8442 frame_need_space (fc
, reg
)
8446 int prev
= fc
->ncols
;
8448 if (reg
< fc
->ncols
)
8451 fc
->ncols
= reg
+ 1;
8452 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
8453 fc
->ncols
* sizeof (short int));
8454 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
8455 fc
->ncols
* sizeof (int));
8457 while (prev
< fc
->ncols
)
8459 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8460 fc
->col_offset
[prev
] = 0;
8466 frame_display_row (fc
, need_col_headers
, max_regs
)
8468 int *need_col_headers
;
8474 if (*max_regs
< fc
->ncols
)
8475 *max_regs
= fc
->ncols
;
8477 if (*need_col_headers
)
8479 *need_col_headers
= 0;
8481 printf (" LOC CFA ");
8483 for (r
= 0; r
< *max_regs
; r
++)
8484 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8489 printf ("r%-4d", r
);
8495 printf ("%08lx ", fc
->pc_begin
);
8496 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8497 printf ("%-8s ", tmp
);
8499 for (r
= 0; r
< fc
->ncols
; r
++)
8501 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8503 switch (fc
->col_type
[r
])
8505 case DW_CFA_undefined
:
8508 case DW_CFA_same_value
:
8512 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8514 case DW_CFA_register
:
8515 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8518 strcpy (tmp
, "n/a");
8521 printf ("%-5s", tmp
);
8528 size_of_encoded_value (encoding
)
8531 switch (encoding
& 0x7)
8534 case 0: return is_32bit_elf
? 4 : 8;
8541 #define GET(N) byte_get (start, N); start += N
8542 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8543 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8546 display_debug_frames (section
, start
, file
)
8547 Elf_Internal_Shdr
*section
;
8548 unsigned char *start
;
8549 FILE *file ATTRIBUTE_UNUSED
;
8551 unsigned char *end
= start
+ section
->sh_size
;
8552 unsigned char *section_start
= start
;
8553 Frame_Chunk
*chunks
= 0;
8554 Frame_Chunk
*remembered_state
= 0;
8556 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8559 int addr_size
= is_32bit_elf
? 4 : 8;
8561 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8565 unsigned char *saved_start
;
8566 unsigned char *block_end
;
8567 unsigned long length
;
8568 unsigned long cie_id
;
8571 int need_col_headers
= 1;
8572 unsigned char *augmentation_data
= NULL
;
8573 unsigned long augmentation_data_len
= 0;
8574 int encoded_ptr_size
= addr_size
;
8576 saved_start
= start
;
8577 length
= byte_get (start
, 4); start
+= 4;
8581 printf ("\n%08lx ZERO terminator\n\n",
8582 (unsigned long)(saved_start
- section_start
));
8586 if (length
== 0xffffffff)
8588 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8592 block_end
= saved_start
+ length
+ 4;
8593 cie_id
= byte_get (start
, 4); start
+= 4;
8595 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8599 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8600 memset (fc
, 0, sizeof (Frame_Chunk
));
8604 fc
->chunk_start
= saved_start
;
8606 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8607 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8608 frame_need_space (fc
, max_regs
-1);
8612 fc
->augmentation
= start
;
8613 start
= strchr (start
, '\0') + 1;
8615 if (fc
->augmentation
[0] == 'z')
8617 fc
->code_factor
= LEB ();
8618 fc
->data_factor
= SLEB ();
8619 fc
->ra
= byte_get (start
, 1); start
+= 1;
8620 augmentation_data_len
= LEB ();
8621 augmentation_data
= start
;
8622 start
+= augmentation_data_len
;
8624 else if (strcmp (fc
->augmentation
, "eh") == 0)
8627 fc
->code_factor
= LEB ();
8628 fc
->data_factor
= SLEB ();
8629 fc
->ra
= byte_get (start
, 1); start
+= 1;
8633 fc
->code_factor
= LEB ();
8634 fc
->data_factor
= SLEB ();
8635 fc
->ra
= byte_get (start
, 1); start
+= 1;
8639 if (do_debug_frames_interp
)
8640 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8641 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8642 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8646 printf ("\n%08lx %08lx %08lx CIE\n",
8647 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8648 printf (" Version: %d\n", version
);
8649 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8650 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8651 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8652 printf (" Return address column: %d\n", fc
->ra
);
8654 if (augmentation_data_len
)
8657 printf (" Augmentation data: ");
8658 for (i
= 0; i
< augmentation_data_len
; ++i
)
8659 printf (" %02x", augmentation_data
[i
]);
8665 if (augmentation_data_len
)
8667 unsigned char *p
, *q
;
8668 p
= fc
->augmentation
+ 1;
8669 q
= augmentation_data
;
8676 q
+= 1 + size_of_encoded_value (*q
);
8678 fc
->fde_encoding
= *q
++;
8684 if (fc
->fde_encoding
)
8685 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8688 frame_need_space (fc
, fc
->ra
);
8692 unsigned char *look_for
;
8693 static Frame_Chunk fde_fc
;
8696 memset (fc
, 0, sizeof (Frame_Chunk
));
8698 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8700 for (cie
= chunks
; cie
; cie
= cie
->next
)
8701 if (cie
->chunk_start
== look_for
)
8706 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8707 cie_id
, saved_start
);
8710 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8711 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8712 frame_need_space (fc
, max_regs
- 1);
8714 fc
->augmentation
= "";
8715 fc
->fde_encoding
= 0;
8719 fc
->ncols
= cie
->ncols
;
8720 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8721 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8722 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8723 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8724 fc
->augmentation
= cie
->augmentation
;
8725 fc
->code_factor
= cie
->code_factor
;
8726 fc
->data_factor
= cie
->data_factor
;
8727 fc
->cfa_reg
= cie
->cfa_reg
;
8728 fc
->cfa_offset
= cie
->cfa_offset
;
8730 frame_need_space (fc
, max_regs
-1);
8731 fc
->fde_encoding
= cie
->fde_encoding
;
8734 if (fc
->fde_encoding
)
8735 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8737 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8738 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8739 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
8740 start
+= encoded_ptr_size
;
8741 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8742 start
+= encoded_ptr_size
;
8744 if (cie
->augmentation
[0] == 'z')
8746 augmentation_data_len
= LEB ();
8747 augmentation_data
= start
;
8748 start
+= augmentation_data_len
;
8751 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8752 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8753 (unsigned long)(cie
->chunk_start
- section_start
),
8754 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8755 if (! do_debug_frames_interp
&& augmentation_data_len
)
8758 printf (" Augmentation data: ");
8759 for (i
= 0; i
< augmentation_data_len
; ++i
)
8760 printf (" %02x", augmentation_data
[i
]);
8766 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8767 about to interpret instructions for the chunk. */
8769 if (do_debug_frames_interp
)
8771 /* Start by making a pass over the chunk, allocating storage
8772 and taking note of what registers are used. */
8773 unsigned char *tmp
= start
;
8775 while (start
< block_end
)
8785 /* Warning: if you add any more cases to this switch, be
8786 sure to add them to the corresponding switch below. */
8789 case DW_CFA_advance_loc
:
8793 frame_need_space (fc
, opa
);
8794 fc
->col_type
[opa
] = DW_CFA_undefined
;
8796 case DW_CFA_restore
:
8797 frame_need_space (fc
, opa
);
8798 fc
->col_type
[opa
] = DW_CFA_undefined
;
8800 case DW_CFA_set_loc
:
8801 start
+= encoded_ptr_size
;
8803 case DW_CFA_advance_loc1
:
8806 case DW_CFA_advance_loc2
:
8809 case DW_CFA_advance_loc4
:
8812 case DW_CFA_offset_extended
:
8813 reg
= LEB (); LEB ();
8814 frame_need_space (fc
, reg
);
8815 fc
->col_type
[reg
] = DW_CFA_undefined
;
8817 case DW_CFA_restore_extended
:
8819 frame_need_space (fc
, reg
);
8820 fc
->col_type
[reg
] = DW_CFA_undefined
;
8822 case DW_CFA_undefined
:
8824 frame_need_space (fc
, reg
);
8825 fc
->col_type
[reg
] = DW_CFA_undefined
;
8827 case DW_CFA_same_value
:
8829 frame_need_space (fc
, reg
);
8830 fc
->col_type
[reg
] = DW_CFA_undefined
;
8832 case DW_CFA_register
:
8833 reg
= LEB (); LEB ();
8834 frame_need_space (fc
, reg
);
8835 fc
->col_type
[reg
] = DW_CFA_undefined
;
8837 case DW_CFA_def_cfa
:
8840 case DW_CFA_def_cfa_register
:
8843 case DW_CFA_def_cfa_offset
:
8846 case DW_CFA_offset_extended_sf
:
8847 reg
= LEB (); SLEB ();
8848 frame_need_space (fc
, reg
);
8849 fc
->col_type
[reg
] = DW_CFA_undefined
;
8851 case DW_CFA_def_cfa_sf
:
8854 case DW_CFA_def_cfa_offset_sf
:
8857 case DW_CFA_GNU_args_size
:
8860 case DW_CFA_GNU_negative_offset_extended
:
8861 reg
= LEB (); LEB ();
8862 frame_need_space (fc
, reg
);
8863 fc
->col_type
[reg
] = DW_CFA_undefined
;
8872 /* Now we know what registers are used, make a second pass over
8873 the chunk, this time actually printing out the info. */
8875 while (start
< block_end
)
8878 unsigned long ul
, reg
, roffs
;
8887 /* Warning: if you add any more cases to this switch, be
8888 sure to add them to the corresponding switch above. */
8891 case DW_CFA_advance_loc
:
8892 if (do_debug_frames_interp
)
8893 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8895 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8896 opa
* fc
->code_factor
,
8897 fc
->pc_begin
+ opa
* fc
->code_factor
);
8898 fc
->pc_begin
+= opa
* fc
->code_factor
;
8903 if (! do_debug_frames_interp
)
8904 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8905 opa
, roffs
* fc
->data_factor
);
8906 fc
->col_type
[opa
] = DW_CFA_offset
;
8907 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8910 case DW_CFA_restore
:
8911 if (! do_debug_frames_interp
)
8912 printf (" DW_CFA_restore: r%d\n", opa
);
8913 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8914 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8917 case DW_CFA_set_loc
:
8918 vma
= byte_get (start
, encoded_ptr_size
);
8919 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8920 vma
+= section
->sh_addr
+ (start
- section_start
);
8921 start
+= encoded_ptr_size
;
8922 if (do_debug_frames_interp
)
8923 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8925 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8929 case DW_CFA_advance_loc1
:
8930 ofs
= byte_get (start
, 1); start
+= 1;
8931 if (do_debug_frames_interp
)
8932 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8934 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8935 ofs
* fc
->code_factor
,
8936 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8937 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8940 case DW_CFA_advance_loc2
:
8941 ofs
= byte_get (start
, 2); start
+= 2;
8942 if (do_debug_frames_interp
)
8943 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8945 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8946 ofs
* fc
->code_factor
,
8947 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8948 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8951 case DW_CFA_advance_loc4
:
8952 ofs
= byte_get (start
, 4); start
+= 4;
8953 if (do_debug_frames_interp
)
8954 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8956 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8957 ofs
* fc
->code_factor
,
8958 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8959 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8962 case DW_CFA_offset_extended
:
8965 if (! do_debug_frames_interp
)
8966 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8967 reg
, roffs
* fc
->data_factor
);
8968 fc
->col_type
[reg
] = DW_CFA_offset
;
8969 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8972 case DW_CFA_restore_extended
:
8974 if (! do_debug_frames_interp
)
8975 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8976 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8977 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8980 case DW_CFA_undefined
:
8982 if (! do_debug_frames_interp
)
8983 printf (" DW_CFA_undefined: r%ld\n", reg
);
8984 fc
->col_type
[reg
] = DW_CFA_undefined
;
8985 fc
->col_offset
[reg
] = 0;
8988 case DW_CFA_same_value
:
8990 if (! do_debug_frames_interp
)
8991 printf (" DW_CFA_same_value: r%ld\n", reg
);
8992 fc
->col_type
[reg
] = DW_CFA_same_value
;
8993 fc
->col_offset
[reg
] = 0;
8996 case DW_CFA_register
:
8999 if (! do_debug_frames_interp
)
9000 printf (" DW_CFA_register: r%ld\n", reg
);
9001 fc
->col_type
[reg
] = DW_CFA_register
;
9002 fc
->col_offset
[reg
] = roffs
;
9005 case DW_CFA_remember_state
:
9006 if (! do_debug_frames_interp
)
9007 printf (" DW_CFA_remember_state\n");
9008 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
9009 rs
->ncols
= fc
->ncols
;
9010 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
9011 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
9012 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9013 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9014 rs
->next
= remembered_state
;
9015 remembered_state
= rs
;
9018 case DW_CFA_restore_state
:
9019 if (! do_debug_frames_interp
)
9020 printf (" DW_CFA_restore_state\n");
9021 rs
= remembered_state
;
9022 remembered_state
= rs
->next
;
9023 frame_need_space (fc
, rs
->ncols
-1);
9024 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9025 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9026 free (rs
->col_type
);
9027 free (rs
->col_offset
);
9031 case DW_CFA_def_cfa
:
9032 fc
->cfa_reg
= LEB ();
9033 fc
->cfa_offset
= LEB ();
9034 if (! do_debug_frames_interp
)
9035 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9036 fc
->cfa_reg
, fc
->cfa_offset
);
9039 case DW_CFA_def_cfa_register
:
9040 fc
->cfa_reg
= LEB ();
9041 if (! do_debug_frames_interp
)
9042 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9045 case DW_CFA_def_cfa_offset
:
9046 fc
->cfa_offset
= LEB ();
9047 if (! do_debug_frames_interp
)
9048 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9052 if (! do_debug_frames_interp
)
9053 printf (" DW_CFA_nop\n");
9056 case DW_CFA_offset_extended_sf
:
9059 frame_need_space (fc
, reg
);
9060 if (! do_debug_frames_interp
)
9061 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9062 reg
, l
* fc
->data_factor
);
9063 fc
->col_type
[reg
] = DW_CFA_offset
;
9064 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9067 case DW_CFA_def_cfa_sf
:
9068 fc
->cfa_reg
= LEB ();
9069 fc
->cfa_offset
= SLEB ();
9070 if (! do_debug_frames_interp
)
9071 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9072 fc
->cfa_reg
, fc
->cfa_offset
);
9075 case DW_CFA_def_cfa_offset_sf
:
9076 fc
->cfa_offset
= SLEB ();
9077 if (! do_debug_frames_interp
)
9078 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9081 case DW_CFA_GNU_window_save
:
9082 if (! do_debug_frames_interp
)
9083 printf (" DW_CFA_GNU_window_save\n");
9086 case DW_CFA_GNU_args_size
:
9088 if (! do_debug_frames_interp
)
9089 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9092 case DW_CFA_GNU_negative_offset_extended
:
9095 frame_need_space (fc
, reg
);
9096 if (! do_debug_frames_interp
)
9097 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9098 reg
, l
* fc
->data_factor
);
9099 fc
->col_type
[reg
] = DW_CFA_offset
;
9100 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9103 /* FIXME: How do we handle these? */
9104 case DW_CFA_def_cfa_expression
:
9105 fprintf (stderr
, "unsupported DW_CFA_def_cfa_expression\n");
9109 case DW_CFA_expression
:
9110 fprintf (stderr
, "unsupported DW_CFA_expression\n");
9115 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9120 if (do_debug_frames_interp
)
9121 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9136 display_debug_not_supported (section
, start
, file
)
9137 Elf_Internal_Shdr
*section
;
9138 unsigned char *start ATTRIBUTE_UNUSED
;
9139 FILE *file ATTRIBUTE_UNUSED
;
9141 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9142 SECTION_NAME (section
));
9147 /* Pre-scan the .debug_info section to record the size of address.
9148 When dumping the .debug_line, we use that size information, assuming
9149 that all compilation units have the same address size. */
9151 prescan_debug_info (section
, start
, file
)
9152 Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
;
9153 unsigned char *start
;
9154 FILE *file ATTRIBUTE_UNUSED
;
9156 DWARF2_External_CompUnit
*external
;
9158 external
= (DWARF2_External_CompUnit
*) start
;
9160 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
9164 /* A structure containing the name of a debug section and a pointer
9165 to a function that can decode it. The third field is a prescan
9166 function to be run over the section before displaying any of the
9170 const char *const name
;
9171 int (*display
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9172 int (*prescan
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9176 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9177 { ".debug_aranges", display_debug_aranges
, NULL
},
9178 { ".debug_frame", display_debug_frames
, NULL
},
9179 { ".debug_info", display_debug_info
, prescan_debug_info
},
9180 { ".debug_line", display_debug_lines
, NULL
},
9181 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9182 { ".eh_frame", display_debug_frames
, NULL
},
9183 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9184 { ".debug_str", display_debug_str
, NULL
},
9185 { ".debug_loc", display_debug_loc
, NULL
},
9186 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9187 { ".debug_ranges", display_debug_not_supported
, NULL
},
9188 { ".debug_static_func", display_debug_not_supported
, NULL
},
9189 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9190 { ".debug_types", display_debug_not_supported
, NULL
},
9191 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9195 display_debug_section (section
, file
)
9196 Elf_Internal_Shdr
*section
;
9199 char *name
= SECTION_NAME (section
);
9200 bfd_size_type length
;
9201 unsigned char *start
;
9204 length
= section
->sh_size
;
9207 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9211 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
9212 _("debug section data"));
9216 /* See if we know how to display the contents of this section. */
9217 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9218 name
= ".debug_info";
9220 for (i
= NUM_ELEM (debug_displays
); i
--;)
9221 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9223 debug_displays
[i
].display (section
, start
, file
);
9228 printf (_("Unrecognized debug section: %s\n"), name
);
9232 /* If we loaded in the abbrev section at some point,
9233 we must release it here. */
9240 process_section_contents (file
)
9243 Elf_Internal_Shdr
*section
;
9249 /* Pre-scan the debug sections to find some debug information not
9250 present in some of them. For the .debug_line, we must find out the
9251 size of address (specified in .debug_info and .debug_aranges). */
9252 for (i
= 0, section
= section_headers
;
9253 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9256 char *name
= SECTION_NAME (section
);
9259 if (section
->sh_size
== 0)
9262 /* See if there is some pre-scan operation for this section. */
9263 for (j
= NUM_ELEM (debug_displays
); j
--;)
9264 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9266 if (debug_displays
[j
].prescan
!= NULL
)
9268 bfd_size_type length
;
9269 unsigned char *start
;
9271 length
= section
->sh_size
;
9272 start
= ((unsigned char *)
9273 get_data (NULL
, file
, section
->sh_offset
, length
,
9274 _("debug section data")));
9278 debug_displays
[j
].prescan (section
, start
, file
);
9286 for (i
= 0, section
= section_headers
;
9287 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9290 #ifdef SUPPORT_DISASSEMBLY
9291 if (dump_sects
[i
] & DISASS_DUMP
)
9292 disassemble_section (section
, file
);
9294 if (dump_sects
[i
] & HEX_DUMP
)
9295 dump_section (section
, file
);
9297 if (dump_sects
[i
] & DEBUG_DUMP
)
9298 display_debug_section (section
, file
);
9301 if (i
< num_dump_sects
)
9302 warn (_("Some sections were not dumped because they do not exist!\n"));
9308 process_mips_fpe_exception (mask
)
9314 if (mask
& OEX_FPU_INEX
)
9315 fputs ("INEX", stdout
), first
= 0;
9316 if (mask
& OEX_FPU_UFLO
)
9317 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9318 if (mask
& OEX_FPU_OFLO
)
9319 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9320 if (mask
& OEX_FPU_DIV0
)
9321 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9322 if (mask
& OEX_FPU_INVAL
)
9323 printf ("%sINVAL", first
? "" : "|");
9326 fputs ("0", stdout
);
9330 process_mips_specific (file
)
9333 Elf_Internal_Dyn
*entry
;
9334 size_t liblist_offset
= 0;
9335 size_t liblistno
= 0;
9336 size_t conflictsno
= 0;
9337 size_t options_offset
= 0;
9338 size_t conflicts_offset
= 0;
9340 /* We have a lot of special sections. Thanks SGI! */
9341 if (dynamic_segment
== NULL
)
9342 /* No information available. */
9345 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9346 switch (entry
->d_tag
)
9348 case DT_MIPS_LIBLIST
:
9349 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
9351 case DT_MIPS_LIBLISTNO
:
9352 liblistno
= entry
->d_un
.d_val
;
9354 case DT_MIPS_OPTIONS
:
9355 options_offset
= entry
->d_un
.d_val
- loadaddr
;
9357 case DT_MIPS_CONFLICT
:
9358 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
9360 case DT_MIPS_CONFLICTNO
:
9361 conflictsno
= entry
->d_un
.d_val
;
9367 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9369 Elf32_External_Lib
*elib
;
9372 elib
= ((Elf32_External_Lib
*)
9373 get_data (NULL
, file
, liblist_offset
,
9374 liblistno
* sizeof (Elf32_External_Lib
),
9378 printf ("\nSection '.liblist' contains %lu entries:\n",
9379 (unsigned long) liblistno
);
9380 fputs (" Library Time Stamp Checksum Version Flags\n",
9383 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9390 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9391 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9392 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9393 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9394 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9396 tmp
= gmtime (&time
);
9397 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9398 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9399 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9401 printf ("%3lu: ", (unsigned long) cnt
);
9402 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9403 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9406 if (liblist
.l_flags
== 0)
9417 { " EXACT_MATCH", LL_EXACT_MATCH
},
9418 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9419 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9420 { " EXPORTS", LL_EXPORTS
},
9421 { " DELAY_LOAD", LL_DELAY_LOAD
},
9422 { " DELTA", LL_DELTA
}
9424 int flags
= liblist
.l_flags
;
9428 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9430 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9432 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9433 flags
^= l_flags_vals
[fcnt
].bit
;
9436 printf (" %#x", (unsigned int) flags
);
9446 if (options_offset
!= 0)
9448 Elf_External_Options
*eopt
;
9449 Elf_Internal_Shdr
*sect
= section_headers
;
9450 Elf_Internal_Options
*iopt
;
9451 Elf_Internal_Options
*option
;
9455 /* Find the section header so that we get the size. */
9456 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9459 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
9460 sect
->sh_size
, _("options"));
9463 iopt
= ((Elf_Internal_Options
*)
9464 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
)));
9467 error (_("Out of memory"));
9474 while (offset
< sect
->sh_size
)
9476 Elf_External_Options
*eoption
;
9478 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9480 option
->kind
= BYTE_GET (eoption
->kind
);
9481 option
->size
= BYTE_GET (eoption
->size
);
9482 option
->section
= BYTE_GET (eoption
->section
);
9483 option
->info
= BYTE_GET (eoption
->info
);
9485 offset
+= option
->size
;
9491 printf (_("\nSection '%s' contains %d entries:\n"),
9492 SECTION_NAME (sect
), cnt
);
9500 switch (option
->kind
)
9503 /* This shouldn't happen. */
9504 printf (" NULL %d %lx", option
->section
, option
->info
);
9507 printf (" REGINFO ");
9508 if (elf_header
.e_machine
== EM_MIPS
)
9511 Elf32_External_RegInfo
*ereg
;
9512 Elf32_RegInfo reginfo
;
9514 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9515 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9516 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9517 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9518 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9519 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9520 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9522 printf ("GPR %08lx GP 0x%lx\n",
9524 (unsigned long) reginfo
.ri_gp_value
);
9525 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9526 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9527 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9532 Elf64_External_RegInfo
*ereg
;
9533 Elf64_Internal_RegInfo reginfo
;
9535 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9536 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9537 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9538 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9539 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9540 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9541 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9543 printf ("GPR %08lx GP 0x",
9544 reginfo
.ri_gprmask
);
9545 printf_vma (reginfo
.ri_gp_value
);
9548 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9549 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9550 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9554 case ODK_EXCEPTIONS
:
9555 fputs (" EXCEPTIONS fpe_min(", stdout
);
9556 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9557 fputs (") fpe_max(", stdout
);
9558 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9559 fputs (")", stdout
);
9561 if (option
->info
& OEX_PAGE0
)
9562 fputs (" PAGE0", stdout
);
9563 if (option
->info
& OEX_SMM
)
9564 fputs (" SMM", stdout
);
9565 if (option
->info
& OEX_FPDBUG
)
9566 fputs (" FPDBUG", stdout
);
9567 if (option
->info
& OEX_DISMISS
)
9568 fputs (" DISMISS", stdout
);
9571 fputs (" PAD ", stdout
);
9572 if (option
->info
& OPAD_PREFIX
)
9573 fputs (" PREFIX", stdout
);
9574 if (option
->info
& OPAD_POSTFIX
)
9575 fputs (" POSTFIX", stdout
);
9576 if (option
->info
& OPAD_SYMBOL
)
9577 fputs (" SYMBOL", stdout
);
9580 fputs (" HWPATCH ", stdout
);
9581 if (option
->info
& OHW_R4KEOP
)
9582 fputs (" R4KEOP", stdout
);
9583 if (option
->info
& OHW_R8KPFETCH
)
9584 fputs (" R8KPFETCH", stdout
);
9585 if (option
->info
& OHW_R5KEOP
)
9586 fputs (" R5KEOP", stdout
);
9587 if (option
->info
& OHW_R5KCVTL
)
9588 fputs (" R5KCVTL", stdout
);
9591 fputs (" FILL ", stdout
);
9592 /* XXX Print content of info word? */
9595 fputs (" TAGS ", stdout
);
9596 /* XXX Print content of info word? */
9599 fputs (" HWAND ", stdout
);
9600 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9601 fputs (" R4KEOP_CHECKED", stdout
);
9602 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9603 fputs (" R4KEOP_CLEAN", stdout
);
9606 fputs (" HWOR ", stdout
);
9607 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9608 fputs (" R4KEOP_CHECKED", stdout
);
9609 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9610 fputs (" R4KEOP_CLEAN", stdout
);
9613 printf (" GP_GROUP %#06lx self-contained %#06lx",
9614 option
->info
& OGP_GROUP
,
9615 (option
->info
& OGP_SELF
) >> 16);
9618 printf (" IDENT %#06lx self-contained %#06lx",
9619 option
->info
& OGP_GROUP
,
9620 (option
->info
& OGP_SELF
) >> 16);
9623 /* This shouldn't happen. */
9624 printf (" %3d ??? %d %lx",
9625 option
->kind
, option
->section
, option
->info
);
9629 len
= sizeof (*eopt
);
9630 while (len
< option
->size
)
9631 if (((char *) option
)[len
] >= ' '
9632 && ((char *) option
)[len
] < 0x7f)
9633 printf ("%c", ((char *) option
)[len
++]);
9635 printf ("\\%03o", ((char *) option
)[len
++]);
9637 fputs ("\n", stdout
);
9645 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9647 Elf32_Conflict
*iconf
;
9650 if (dynamic_symbols
== NULL
)
9652 error (_("conflict list found without a dynamic symbol table"));
9656 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
9659 error (_("Out of memory"));
9665 Elf32_External_Conflict
*econf32
;
9667 econf32
= ((Elf32_External_Conflict
*)
9668 get_data (NULL
, file
, conflicts_offset
,
9669 conflictsno
* sizeof (*econf32
),
9674 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9675 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9681 Elf64_External_Conflict
*econf64
;
9683 econf64
= ((Elf64_External_Conflict
*)
9684 get_data (NULL
, file
, conflicts_offset
,
9685 conflictsno
* sizeof (*econf64
),
9690 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9691 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9696 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9697 (long) conflictsno
);
9698 puts (_(" Num: Index Value Name"));
9700 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9702 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9704 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9705 print_vma (psym
->st_value
, FULL_HEX
);
9707 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9718 process_gnu_liblist (file
)
9721 Elf_Internal_Shdr
*section
, *string_sec
;
9722 Elf32_External_Lib
*elib
;
9730 for (i
= 0, section
= section_headers
;
9731 i
< elf_header
.e_shnum
;
9734 switch (section
->sh_type
)
9736 case SHT_GNU_LIBLIST
:
9737 elib
= ((Elf32_External_Lib
*)
9738 get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
9743 string_sec
= SECTION_HEADER (section
->sh_link
);
9745 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
9746 string_sec
->sh_size
,
9747 _("liblist string table"));
9750 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9756 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9757 SECTION_NAME (section
),
9758 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9760 puts (" Library Time Stamp Checksum Version Flags");
9762 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9770 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9771 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9772 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9773 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9774 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9776 tmp
= gmtime (&time
);
9777 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9778 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9779 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9781 printf ("%3lu: ", (unsigned long) cnt
);
9783 printf ("%-20s", strtab
+ liblist
.l_name
);
9785 printf ("%-20.20s", strtab
+ liblist
.l_name
);
9786 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9787 liblist
.l_version
, liblist
.l_flags
);
9798 get_note_type (e_type
)
9801 static char buff
[64];
9805 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9806 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9807 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9808 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9809 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9810 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9811 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9812 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9813 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9814 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9815 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9817 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9823 get_netbsd_elfcore_note_type (e_type
)
9826 static char buff
[64];
9828 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9830 /* NetBSD core "procinfo" structure. */
9831 return _("NetBSD procinfo structure");
9834 /* As of Jan 2002 there are no other machine-independent notes
9835 defined for NetBSD core files. If the note type is less
9836 than the start of the machine-dependent note types, we don't
9839 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9841 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9845 switch (elf_header
.e_machine
)
9847 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9848 and PT_GETFPREGS == mach+2. */
9853 case EM_SPARC32PLUS
:
9857 case NT_NETBSDCORE_FIRSTMACH
+0:
9858 return _("PT_GETREGS (reg structure)");
9859 case NT_NETBSDCORE_FIRSTMACH
+2:
9860 return _("PT_GETFPREGS (fpreg structure)");
9866 /* On all other arch's, PT_GETREGS == mach+1 and
9867 PT_GETFPREGS == mach+3. */
9871 case NT_NETBSDCORE_FIRSTMACH
+1:
9872 return _("PT_GETREGS (reg structure)");
9873 case NT_NETBSDCORE_FIRSTMACH
+3:
9874 return _("PT_GETFPREGS (fpreg structure)");
9880 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9884 /* Note that by the ELF standard, the name field is already null byte
9885 terminated, and namesz includes the terminating null byte.
9886 I.E. the value of namesz for the name "FSF" is 4.
9888 If the value of namesz is zero, there is no name present. */
9890 process_note (pnote
)
9891 Elf_Internal_Note
*pnote
;
9895 if (pnote
->namesz
== 0)
9897 /* If there is no note name, then use the default set of
9898 note type strings. */
9899 nt
= get_note_type (pnote
->type
);
9901 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9903 /* NetBSD-specific core file notes. */
9904 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9908 /* Don't recognize this note name; just use the default set of
9909 note type strings. */
9910 nt
= get_note_type (pnote
->type
);
9913 printf (" %s\t\t0x%08lx\t%s\n",
9914 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9921 process_corefile_note_segment (file
, offset
, length
)
9926 Elf_External_Note
*pnotes
;
9927 Elf_External_Note
*external
;
9933 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9940 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9941 (unsigned long) offset
, (unsigned long) length
);
9942 printf (_(" Owner\t\tData size\tDescription\n"));
9944 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9946 Elf_External_Note
*next
;
9947 Elf_Internal_Note inote
;
9950 inote
.type
= BYTE_GET (external
->type
);
9951 inote
.namesz
= BYTE_GET (external
->namesz
);
9952 inote
.namedata
= external
->name
;
9953 inote
.descsz
= BYTE_GET (external
->descsz
);
9954 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9955 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9957 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9959 if (((char *) next
) > (((char *) pnotes
) + length
))
9961 warn (_("corrupt note found at offset %x into core notes\n"),
9962 ((char *) external
) - ((char *) pnotes
));
9963 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9964 inote
.type
, inote
.namesz
, inote
.descsz
);
9970 /* Verify that name is null terminated. It appears that at least
9971 one version of Linux (RedHat 6.0) generates corefiles that don't
9972 comply with the ELF spec by failing to include the null byte in
9974 if (inote
.namedata
[inote
.namesz
] != '\0')
9976 temp
= malloc (inote
.namesz
+ 1);
9980 error (_("Out of memory\n"));
9985 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9986 temp
[inote
.namesz
] = 0;
9988 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9989 inote
.namedata
= temp
;
9992 res
&= process_note (& inote
);
10007 process_corefile_note_segments (file
)
10010 Elf_Internal_Phdr
*program_headers
;
10011 Elf_Internal_Phdr
*segment
;
10015 program_headers
= (Elf_Internal_Phdr
*) malloc
10016 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
10018 if (program_headers
== NULL
)
10020 error (_("Out of memory\n"));
10025 i
= get_32bit_program_headers (file
, program_headers
);
10027 i
= get_64bit_program_headers (file
, program_headers
);
10031 free (program_headers
);
10035 for (i
= 0, segment
= program_headers
;
10036 i
< elf_header
.e_phnum
;
10039 if (segment
->p_type
== PT_NOTE
)
10040 res
&= process_corefile_note_segment (file
,
10041 (bfd_vma
) segment
->p_offset
,
10042 (bfd_vma
) segment
->p_filesz
);
10045 free (program_headers
);
10051 process_corefile_contents (file
)
10054 /* If we have not been asked to display the notes then do nothing. */
10058 /* If file is not a core file then exit. */
10059 if (elf_header
.e_type
!= ET_CORE
)
10062 /* No program headers means no NOTE segment. */
10063 if (elf_header
.e_phnum
== 0)
10065 printf (_("No note segments present in the core file.\n"));
10069 return process_corefile_note_segments (file
);
10073 process_arch_specific (file
)
10079 switch (elf_header
.e_machine
)
10082 case EM_MIPS_RS3_LE
:
10083 return process_mips_specific (file
);
10092 get_file_header (file
)
10095 /* Read in the identity array. */
10096 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10099 /* Determine how to read the rest of the header. */
10100 switch (elf_header
.e_ident
[EI_DATA
])
10102 default: /* fall through */
10103 case ELFDATANONE
: /* fall through */
10104 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
10105 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
10108 /* For now we only support 32 bit and 64 bit ELF files. */
10109 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10111 /* Read in the rest of the header. */
10114 Elf32_External_Ehdr ehdr32
;
10116 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10119 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10120 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10121 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10122 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10123 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10124 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10125 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10126 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10127 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10128 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10129 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10130 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10131 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10135 Elf64_External_Ehdr ehdr64
;
10137 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10138 we will not be able to cope with the 64bit data found in
10139 64 ELF files. Detect this now and abort before we start
10140 overwritting things. */
10141 if (sizeof (bfd_vma
) < 8)
10143 error (_("This instance of readelf has been built without support for a\n\
10144 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10148 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10151 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10152 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10153 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10154 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10155 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10156 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10157 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10158 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10159 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10160 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10161 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10162 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10163 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10166 if (elf_header
.e_shoff
)
10168 /* There may be some extensions in the first section header. Don't
10169 bomb if we can't read it. */
10171 get_32bit_section_headers (file
, 1);
10173 get_64bit_section_headers (file
, 1);
10180 process_file (file_name
)
10184 struct stat statbuf
;
10187 if (stat (file_name
, & statbuf
) < 0)
10189 error (_("Cannot stat input file %s.\n"), file_name
);
10193 file
= fopen (file_name
, "rb");
10196 error (_("Input file %s not found.\n"), file_name
);
10200 if (! get_file_header (file
))
10202 error (_("%s: Failed to read file header\n"), file_name
);
10207 /* Initialise per file variables. */
10208 for (i
= NUM_ELEM (version_info
); i
--;)
10209 version_info
[i
] = 0;
10211 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10212 dynamic_info
[i
] = 0;
10214 /* Process the file. */
10216 printf (_("\nFile: %s\n"), file_name
);
10218 if (! process_file_header ())
10224 if (! process_section_headers (file
))
10226 /* Without loaded section headers we
10227 cannot process lots of things. */
10228 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10230 if (! do_using_dynamic
)
10231 do_syms
= do_reloc
= 0;
10234 if (process_program_headers (file
))
10235 process_dynamic_segment (file
);
10237 process_relocs (file
);
10239 process_unwind (file
);
10241 process_symbol_table (file
);
10243 process_syminfo (file
);
10245 process_version_sections (file
);
10247 process_section_contents (file
);
10249 process_corefile_contents (file
);
10251 process_gnu_liblist (file
);
10253 process_arch_specific (file
);
10257 if (section_headers
)
10259 free (section_headers
);
10260 section_headers
= NULL
;
10265 free (string_table
);
10266 string_table
= NULL
;
10267 string_table_length
= 0;
10270 if (dynamic_strings
)
10272 free (dynamic_strings
);
10273 dynamic_strings
= NULL
;
10276 if (dynamic_symbols
)
10278 free (dynamic_symbols
);
10279 dynamic_symbols
= NULL
;
10280 num_dynamic_syms
= 0;
10283 if (dynamic_syminfo
)
10285 free (dynamic_syminfo
);
10286 dynamic_syminfo
= NULL
;
10292 #ifdef SUPPORT_DISASSEMBLY
10293 /* Needed by the i386 disassembler. For extra credit, someone could
10294 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10298 print_address (unsigned int addr
, FILE *outfile
)
10300 fprintf (outfile
,"0x%8.8x", addr
);
10303 /* Needed by the i386 disassembler. */
10305 db_task_printsym (unsigned int addr
)
10307 print_address (addr
, stderr
);
10311 int main
PARAMS ((int, char **));
10319 char *cmdline_dump_sects
= NULL
;
10320 unsigned num_cmdline_dump_sects
= 0;
10322 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10323 setlocale (LC_MESSAGES
, "");
10325 #if defined (HAVE_SETLOCALE)
10326 setlocale (LC_CTYPE
, "");
10328 bindtextdomain (PACKAGE
, LOCALEDIR
);
10329 textdomain (PACKAGE
);
10331 parse_args (argc
, argv
);
10333 if (optind
< (argc
- 1))
10336 /* When processing more than one file remember the dump requests
10337 issued on command line to reset them after each file. */
10338 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10340 cmdline_dump_sects
= malloc (num_dump_sects
);
10341 if (cmdline_dump_sects
== NULL
)
10342 error (_("Out of memory allocating dump request table."));
10345 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10346 num_cmdline_dump_sects
= num_dump_sects
;
10351 while (optind
< argc
)
10353 err
|= process_file (argv
[optind
++]);
10355 /* Reset dump requests. */
10356 if (optind
< argc
&& dump_sects
!= NULL
)
10358 num_dump_sects
= num_cmdline_dump_sects
;
10359 if (num_cmdline_dump_sects
> 0)
10360 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10364 if (dump_sects
!= NULL
)
10366 if (cmdline_dump_sects
!= NULL
)
10367 free (cmdline_dump_sects
);