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 if (elf_header
.e_machine
== EM_MIPS
)
1030 type
= ELF64_MIPS_R_TYPE (info
);
1031 type2
= ELF64_MIPS_R_TYPE2 (info
);
1032 type3
= ELF64_MIPS_R_TYPE3 (info
);
1034 else if (elf_header
.e_machine
== EM_SPARCV9
)
1035 type
= ELF64_R_TYPE_ID (info
);
1037 type
= ELF64_R_TYPE (info
);
1038 /* The #ifdef BFD64 below is to prevent a compile time warning.
1039 We know that if we do not have a 64 bit data type that we
1040 will never execute this code anyway. */
1042 symtab_index
= ELF64_R_SYM (info
);
1048 #ifdef _bfd_int64_low
1049 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1051 printf ("%8.8lx %8.8lx ", offset
, info
);
1056 #ifdef _bfd_int64_low
1058 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1059 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1060 _bfd_int64_high (offset
),
1061 _bfd_int64_low (offset
),
1062 _bfd_int64_high (info
),
1063 _bfd_int64_low (info
));
1066 ? "%16.16lx %16.16lx "
1067 : "%12.12lx %12.12lx ",
1072 switch (elf_header
.e_machine
)
1079 case EM_CYGNUS_M32R
:
1080 rtype
= elf_m32r_reloc_type (type
);
1085 rtype
= elf_i386_reloc_type (type
);
1090 rtype
= elf_m68hc11_reloc_type (type
);
1094 rtype
= elf_m68k_reloc_type (type
);
1098 rtype
= elf_i960_reloc_type (type
);
1103 rtype
= elf_avr_reloc_type (type
);
1106 case EM_OLD_SPARCV9
:
1107 case EM_SPARC32PLUS
:
1110 rtype
= elf_sparc_reloc_type (type
);
1114 case EM_CYGNUS_V850
:
1115 rtype
= v850_reloc_type (type
);
1119 case EM_CYGNUS_D10V
:
1120 rtype
= elf_d10v_reloc_type (type
);
1124 case EM_CYGNUS_D30V
:
1125 rtype
= elf_d30v_reloc_type (type
);
1129 rtype
= elf_dlx_reloc_type (type
);
1133 rtype
= elf_sh_reloc_type (type
);
1137 case EM_CYGNUS_MN10300
:
1138 rtype
= elf_mn10300_reloc_type (type
);
1142 case EM_CYGNUS_MN10200
:
1143 rtype
= elf_mn10200_reloc_type (type
);
1147 case EM_CYGNUS_FR30
:
1148 rtype
= elf_fr30_reloc_type (type
);
1152 rtype
= elf_frv_reloc_type (type
);
1156 rtype
= elf_mcore_reloc_type (type
);
1160 rtype
= elf_mmix_reloc_type (type
);
1165 rtype
= elf_msp430_reloc_type (type
);
1169 rtype
= elf_ppc_reloc_type (type
);
1173 rtype
= elf_ppc64_reloc_type (type
);
1177 case EM_MIPS_RS3_LE
:
1178 rtype
= elf_mips_reloc_type (type
);
1181 rtype2
= elf_mips_reloc_type (type2
);
1182 rtype3
= elf_mips_reloc_type (type3
);
1187 rtype
= elf_alpha_reloc_type (type
);
1191 rtype
= elf_arm_reloc_type (type
);
1195 rtype
= elf_arc_reloc_type (type
);
1199 rtype
= elf_hppa_reloc_type (type
);
1205 rtype
= elf_h8_reloc_type (type
);
1210 rtype
= elf_or32_reloc_type (type
);
1215 rtype
= elf_pj_reloc_type (type
);
1218 rtype
= elf_ia64_reloc_type (type
);
1222 rtype
= elf_cris_reloc_type (type
);
1226 rtype
= elf_i860_reloc_type (type
);
1230 rtype
= elf_x86_64_reloc_type (type
);
1234 rtype
= i370_reloc_type (type
);
1239 rtype
= elf_s390_reloc_type (type
);
1243 rtype
= elf_xstormy16_reloc_type (type
);
1247 rtype
= elf_vax_reloc_type (type
);
1252 rtype
= elf_ip2k_reloc_type (type
);
1256 rtype
= elf_iq2000_reloc_type (type
);
1261 #ifdef _bfd_int64_low
1262 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1264 printf (_("unrecognized: %-7lx"), type
);
1267 printf (do_wide
? "%-21.21s" : "%-17.17s", rtype
);
1271 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1272 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1275 Elf_Internal_Sym
*psym
;
1277 psym
= symtab
+ symtab_index
;
1280 print_vma (psym
->st_value
, LONG_HEX
);
1281 printf (is_32bit_elf
? " " : " ");
1283 if (psym
->st_name
== 0)
1285 const char *sec_name
= "<null>";
1288 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1290 bfd_vma sec_index
= (bfd_vma
) -1;
1292 if (psym
->st_shndx
< SHN_LORESERVE
)
1293 sec_index
= psym
->st_shndx
;
1294 else if (psym
->st_shndx
> SHN_LORESERVE
)
1295 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1298 if (sec_index
!= (bfd_vma
) -1)
1299 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1300 else if (psym
->st_shndx
== SHN_ABS
)
1302 else if (psym
->st_shndx
== SHN_COMMON
)
1303 sec_name
= "COMMON";
1306 sprintf (name_buf
, "<section 0x%x>",
1307 (unsigned int) psym
->st_shndx
);
1308 sec_name
= name_buf
;
1311 print_symbol (22, sec_name
);
1313 else if (strtab
== NULL
)
1314 printf (_("<string table index %3ld>"), psym
->st_name
);
1316 print_symbol (22, strtab
+ psym
->st_name
);
1319 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1324 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1325 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1328 if (elf_header
.e_machine
== EM_SPARCV9
1329 && !strcmp (rtype
, "R_SPARC_OLO10"))
1330 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1334 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1336 printf (" Type2: ");
1339 #ifdef _bfd_int64_low
1340 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1342 printf (_("unrecognized: %-7lx"), type2
);
1345 printf ("%-17.17s", rtype2
);
1347 printf("\n Type3: ");
1350 #ifdef _bfd_int64_low
1351 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1353 printf (_("unrecognized: %-7lx"), type3
);
1356 printf ("%-17.17s", rtype3
);
1368 get_mips_dynamic_type (type
)
1373 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1374 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1375 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1376 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1377 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1378 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1379 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1380 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1381 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1382 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1383 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1384 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1385 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1386 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1387 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1388 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1389 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1390 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1391 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1392 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1393 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1394 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1395 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1396 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1397 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1398 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1399 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1400 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1401 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1402 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1403 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1404 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1405 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1406 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1407 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1408 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1409 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1410 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1411 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1412 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1413 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1414 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1415 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1422 get_sparc64_dynamic_type (type
)
1427 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1434 get_ppc64_dynamic_type (type
)
1439 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1440 case DT_PPC64_OPD
: return "PPC64_OPD";
1441 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1448 get_parisc_dynamic_type (type
)
1453 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1454 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1455 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1456 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1457 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1458 case DT_HP_PREINIT
: return "HP_PREINIT";
1459 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1460 case DT_HP_NEEDED
: return "HP_NEEDED";
1461 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1462 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1463 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1464 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1465 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1472 get_dynamic_type (type
)
1475 static char buff
[32];
1479 case DT_NULL
: return "NULL";
1480 case DT_NEEDED
: return "NEEDED";
1481 case DT_PLTRELSZ
: return "PLTRELSZ";
1482 case DT_PLTGOT
: return "PLTGOT";
1483 case DT_HASH
: return "HASH";
1484 case DT_STRTAB
: return "STRTAB";
1485 case DT_SYMTAB
: return "SYMTAB";
1486 case DT_RELA
: return "RELA";
1487 case DT_RELASZ
: return "RELASZ";
1488 case DT_RELAENT
: return "RELAENT";
1489 case DT_STRSZ
: return "STRSZ";
1490 case DT_SYMENT
: return "SYMENT";
1491 case DT_INIT
: return "INIT";
1492 case DT_FINI
: return "FINI";
1493 case DT_SONAME
: return "SONAME";
1494 case DT_RPATH
: return "RPATH";
1495 case DT_SYMBOLIC
: return "SYMBOLIC";
1496 case DT_REL
: return "REL";
1497 case DT_RELSZ
: return "RELSZ";
1498 case DT_RELENT
: return "RELENT";
1499 case DT_PLTREL
: return "PLTREL";
1500 case DT_DEBUG
: return "DEBUG";
1501 case DT_TEXTREL
: return "TEXTREL";
1502 case DT_JMPREL
: return "JMPREL";
1503 case DT_BIND_NOW
: return "BIND_NOW";
1504 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1505 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1506 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1507 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1508 case DT_RUNPATH
: return "RUNPATH";
1509 case DT_FLAGS
: return "FLAGS";
1511 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1512 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1514 case DT_CHECKSUM
: return "CHECKSUM";
1515 case DT_PLTPADSZ
: return "PLTPADSZ";
1516 case DT_MOVEENT
: return "MOVEENT";
1517 case DT_MOVESZ
: return "MOVESZ";
1518 case DT_FEATURE
: return "FEATURE";
1519 case DT_POSFLAG_1
: return "POSFLAG_1";
1520 case DT_SYMINSZ
: return "SYMINSZ";
1521 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1523 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1524 case DT_CONFIG
: return "CONFIG";
1525 case DT_DEPAUDIT
: return "DEPAUDIT";
1526 case DT_AUDIT
: return "AUDIT";
1527 case DT_PLTPAD
: return "PLTPAD";
1528 case DT_MOVETAB
: return "MOVETAB";
1529 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1531 case DT_VERSYM
: return "VERSYM";
1533 case DT_RELACOUNT
: return "RELACOUNT";
1534 case DT_RELCOUNT
: return "RELCOUNT";
1535 case DT_FLAGS_1
: return "FLAGS_1";
1536 case DT_VERDEF
: return "VERDEF";
1537 case DT_VERDEFNUM
: return "VERDEFNUM";
1538 case DT_VERNEED
: return "VERNEED";
1539 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1541 case DT_AUXILIARY
: return "AUXILIARY";
1542 case DT_USED
: return "USED";
1543 case DT_FILTER
: return "FILTER";
1545 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1546 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1547 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1548 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1549 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1552 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1556 switch (elf_header
.e_machine
)
1559 case EM_MIPS_RS3_LE
:
1560 result
= get_mips_dynamic_type (type
);
1563 result
= get_sparc64_dynamic_type (type
);
1566 result
= get_ppc64_dynamic_type (type
);
1576 sprintf (buff
, _("Processor Specific: %lx"), type
);
1578 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1582 switch (elf_header
.e_machine
)
1585 result
= get_parisc_dynamic_type (type
);
1595 sprintf (buff
, _("Operating System specific: %lx"), type
);
1598 sprintf (buff
, _("<unknown>: %lx"), type
);
1605 get_file_type (e_type
)
1608 static char buff
[32];
1612 case ET_NONE
: return _("NONE (None)");
1613 case ET_REL
: return _("REL (Relocatable file)");
1614 case ET_EXEC
: return _("EXEC (Executable file)");
1615 case ET_DYN
: return _("DYN (Shared object file)");
1616 case ET_CORE
: return _("CORE (Core file)");
1619 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1620 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1621 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1622 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1624 sprintf (buff
, _("<unknown>: %x"), e_type
);
1630 get_machine_name (e_machine
)
1633 static char buff
[64]; /* XXX */
1637 case EM_NONE
: return _("None");
1638 case EM_M32
: return "WE32100";
1639 case EM_SPARC
: return "Sparc";
1640 case EM_386
: return "Intel 80386";
1641 case EM_68K
: return "MC68000";
1642 case EM_88K
: return "MC88000";
1643 case EM_486
: return "Intel 80486";
1644 case EM_860
: return "Intel 80860";
1645 case EM_MIPS
: return "MIPS R3000";
1646 case EM_S370
: return "IBM System/370";
1647 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1648 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1649 case EM_PARISC
: return "HPPA";
1650 case EM_PPC_OLD
: return "Power PC (old)";
1651 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1652 case EM_960
: return "Intel 90860";
1653 case EM_PPC
: return "PowerPC";
1654 case EM_PPC64
: return "PowerPC64";
1655 case EM_V800
: return "NEC V800";
1656 case EM_FR20
: return "Fujitsu FR20";
1657 case EM_RH32
: return "TRW RH32";
1658 case EM_MCORE
: return "MCORE";
1659 case EM_ARM
: return "ARM";
1660 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1661 case EM_SH
: return "Hitachi SH";
1662 case EM_SPARCV9
: return "Sparc v9";
1663 case EM_TRICORE
: return "Siemens Tricore";
1664 case EM_ARC
: return "ARC";
1665 case EM_H8_300
: return "Hitachi H8/300";
1666 case EM_H8_300H
: return "Hitachi H8/300H";
1667 case EM_H8S
: return "Hitachi H8S";
1668 case EM_H8_500
: return "Hitachi H8/500";
1669 case EM_IA_64
: return "Intel IA-64";
1670 case EM_MIPS_X
: return "Stanford MIPS-X";
1671 case EM_COLDFIRE
: return "Motorola Coldfire";
1672 case EM_68HC12
: return "Motorola M68HC12";
1673 case EM_ALPHA
: return "Alpha";
1674 case EM_CYGNUS_D10V
:
1675 case EM_D10V
: return "d10v";
1676 case EM_CYGNUS_D30V
:
1677 case EM_D30V
: return "d30v";
1678 case EM_CYGNUS_M32R
:
1679 case EM_M32R
: return "Mitsubishi M32r";
1680 case EM_CYGNUS_V850
:
1681 case EM_V850
: return "NEC v850";
1682 case EM_CYGNUS_MN10300
:
1683 case EM_MN10300
: return "mn10300";
1684 case EM_CYGNUS_MN10200
:
1685 case EM_MN10200
: return "mn10200";
1686 case EM_CYGNUS_FR30
:
1687 case EM_FR30
: return "Fujitsu FR30";
1688 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1690 case EM_PJ
: return "picoJava";
1691 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1692 case EM_PCP
: return "Siemens PCP";
1693 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1694 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1695 case EM_STARCORE
: return "Motorola Star*Core processor";
1696 case EM_ME16
: return "Toyota ME16 processor";
1697 case EM_ST100
: return "STMicroelectronics ST100 processor";
1698 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1699 case EM_FX66
: return "Siemens FX66 microcontroller";
1700 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1701 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1702 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1703 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1704 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1705 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1706 case EM_SVX
: return "Silicon Graphics SVx";
1707 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1708 case EM_VAX
: return "Digital VAX";
1710 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1711 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1712 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1713 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1714 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1715 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1716 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1717 case EM_PRISM
: return "Vitesse Prism";
1718 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1720 case EM_S390
: return "IBM S/390";
1721 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1723 case EM_OR32
: return "OpenRISC";
1724 case EM_DLX
: return "OpenDLX";
1726 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1727 case EM_IQ2000
: return "Vitesse IQ2000";
1729 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1735 decode_ARM_machine_flags (e_flags
, buf
)
1742 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1743 e_flags
&= ~ EF_ARM_EABIMASK
;
1745 /* Handle "generic" ARM flags. */
1746 if (e_flags
& EF_ARM_RELEXEC
)
1748 strcat (buf
, ", relocatable executable");
1749 e_flags
&= ~ EF_ARM_RELEXEC
;
1752 if (e_flags
& EF_ARM_HASENTRY
)
1754 strcat (buf
, ", has entry point");
1755 e_flags
&= ~ EF_ARM_HASENTRY
;
1758 /* Now handle EABI specific flags. */
1762 strcat (buf
, ", <unrecognized EABI>");
1767 case EF_ARM_EABI_VER1
:
1768 strcat (buf
, ", Version1 EABI");
1773 /* Process flags one bit at a time. */
1774 flag
= e_flags
& - e_flags
;
1779 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1780 strcat (buf
, ", sorted symbol tables");
1790 case EF_ARM_EABI_VER2
:
1791 strcat (buf
, ", Version2 EABI");
1796 /* Process flags one bit at a time. */
1797 flag
= e_flags
& - e_flags
;
1802 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1803 strcat (buf
, ", sorted symbol tables");
1806 case EF_ARM_DYNSYMSUSESEGIDX
:
1807 strcat (buf
, ", dynamic symbols use segment index");
1810 case EF_ARM_MAPSYMSFIRST
:
1811 strcat (buf
, ", mapping symbols precede others");
1821 case EF_ARM_EABI_UNKNOWN
:
1822 strcat (buf
, ", GNU EABI");
1827 /* Process flags one bit at a time. */
1828 flag
= e_flags
& - e_flags
;
1833 case EF_ARM_INTERWORK
:
1834 strcat (buf
, ", interworking enabled");
1837 case EF_ARM_APCS_26
:
1838 strcat (buf
, ", uses APCS/26");
1841 case EF_ARM_APCS_FLOAT
:
1842 strcat (buf
, ", uses APCS/float");
1846 strcat (buf
, ", position independent");
1850 strcat (buf
, ", 8 bit structure alignment");
1853 case EF_ARM_NEW_ABI
:
1854 strcat (buf
, ", uses new ABI");
1857 case EF_ARM_OLD_ABI
:
1858 strcat (buf
, ", uses old ABI");
1861 case EF_ARM_SOFT_FLOAT
:
1862 strcat (buf
, ", software FP");
1873 strcat (buf
,", <unknown>");
1877 get_machine_flags (e_flags
, e_machine
)
1881 static char buf
[1024];
1893 decode_ARM_machine_flags (e_flags
, buf
);
1897 if (e_flags
& EF_CPU32
)
1898 strcat (buf
, ", cpu32");
1899 if (e_flags
& EF_M68000
)
1900 strcat (buf
, ", m68000");
1904 if (e_flags
& EF_PPC_EMB
)
1905 strcat (buf
, ", emb");
1907 if (e_flags
& EF_PPC_RELOCATABLE
)
1908 strcat (buf
, ", relocatable");
1910 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
1911 strcat (buf
, ", relocatable-lib");
1915 case EM_CYGNUS_V850
:
1916 switch (e_flags
& EF_V850_ARCH
)
1919 strcat (buf
, ", v850e");
1922 strcat (buf
, ", v850");
1925 strcat (buf
, ", unknown v850 architecture variant");
1931 case EM_CYGNUS_M32R
:
1932 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
1933 strcat (buf
, ", m32r");
1938 case EM_MIPS_RS3_LE
:
1939 if (e_flags
& EF_MIPS_NOREORDER
)
1940 strcat (buf
, ", noreorder");
1942 if (e_flags
& EF_MIPS_PIC
)
1943 strcat (buf
, ", pic");
1945 if (e_flags
& EF_MIPS_CPIC
)
1946 strcat (buf
, ", cpic");
1948 if (e_flags
& EF_MIPS_UCODE
)
1949 strcat (buf
, ", ugen_reserved");
1951 if (e_flags
& EF_MIPS_ABI2
)
1952 strcat (buf
, ", abi2");
1954 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
1955 strcat (buf
, ", odk first");
1957 if (e_flags
& EF_MIPS_32BITMODE
)
1958 strcat (buf
, ", 32bitmode");
1960 switch ((e_flags
& EF_MIPS_MACH
))
1962 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
1963 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
1964 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
1965 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
1966 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
1967 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
1968 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
1969 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
1970 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
1972 /* We simply ignore the field in this case to avoid confusion:
1973 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1976 default: strcat (buf
, ", unknown CPU"); break;
1979 switch ((e_flags
& EF_MIPS_ABI
))
1981 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
1982 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
1983 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
1984 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
1986 /* We simply ignore the field in this case to avoid confusion:
1987 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1988 This means it is likely to be an o32 file, but not for
1991 default: strcat (buf
, ", unknown ABI"); break;
1994 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
1995 strcat (buf
, ", mdmx");
1997 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
1998 strcat (buf
, ", mips16");
2000 switch ((e_flags
& EF_MIPS_ARCH
))
2002 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2003 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2004 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2005 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2006 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2007 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2008 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2009 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2010 default: strcat (buf
, ", unknown ISA"); break;
2016 if (e_flags
& EF_SPARC_32PLUS
)
2017 strcat (buf
, ", v8+");
2019 if (e_flags
& EF_SPARC_SUN_US1
)
2020 strcat (buf
, ", ultrasparcI");
2022 if (e_flags
& EF_SPARC_SUN_US3
)
2023 strcat (buf
, ", ultrasparcIII");
2025 if (e_flags
& EF_SPARC_HAL_R1
)
2026 strcat (buf
, ", halr1");
2028 if (e_flags
& EF_SPARC_LEDATA
)
2029 strcat (buf
, ", ledata");
2031 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2032 strcat (buf
, ", tso");
2034 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2035 strcat (buf
, ", pso");
2037 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2038 strcat (buf
, ", rmo");
2042 switch (e_flags
& EF_PARISC_ARCH
)
2044 case EFA_PARISC_1_0
:
2045 strcpy (buf
, ", PA-RISC 1.0");
2047 case EFA_PARISC_1_1
:
2048 strcpy (buf
, ", PA-RISC 1.1");
2050 case EFA_PARISC_2_0
:
2051 strcpy (buf
, ", PA-RISC 2.0");
2056 if (e_flags
& EF_PARISC_TRAPNIL
)
2057 strcat (buf
, ", trapnil");
2058 if (e_flags
& EF_PARISC_EXT
)
2059 strcat (buf
, ", ext");
2060 if (e_flags
& EF_PARISC_LSB
)
2061 strcat (buf
, ", lsb");
2062 if (e_flags
& EF_PARISC_WIDE
)
2063 strcat (buf
, ", wide");
2064 if (e_flags
& EF_PARISC_NO_KABP
)
2065 strcat (buf
, ", no kabp");
2066 if (e_flags
& EF_PARISC_LAZYSWAP
)
2067 strcat (buf
, ", lazyswap");
2072 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2073 strcat (buf
, ", new calling convention");
2075 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2076 strcat (buf
, ", gnu calling convention");
2080 if ((e_flags
& EF_IA_64_ABI64
))
2081 strcat (buf
, ", 64-bit");
2083 strcat (buf
, ", 32-bit");
2084 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2085 strcat (buf
, ", reduced fp model");
2086 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2087 strcat (buf
, ", no function descriptors, constant gp");
2088 else if ((e_flags
& EF_IA_64_CONS_GP
))
2089 strcat (buf
, ", constant gp");
2090 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2091 strcat (buf
, ", absolute");
2095 if ((e_flags
& EF_VAX_NONPIC
))
2096 strcat (buf
, ", non-PIC");
2097 if ((e_flags
& EF_VAX_DFLOAT
))
2098 strcat (buf
, ", D-Float");
2099 if ((e_flags
& EF_VAX_GFLOAT
))
2100 strcat (buf
, ", G-Float");
2109 get_mips_segment_type (type
)
2114 case PT_MIPS_REGINFO
:
2116 case PT_MIPS_RTPROC
:
2118 case PT_MIPS_OPTIONS
:
2128 get_parisc_segment_type (type
)
2133 case PT_HP_TLS
: return "HP_TLS";
2134 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2135 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2136 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2137 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2138 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2139 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2140 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2141 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2142 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2143 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2144 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2145 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2146 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2155 get_ia64_segment_type (type
)
2160 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2161 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2162 case PT_HP_TLS
: return "HP_TLS";
2163 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2164 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2165 case PT_IA_64_HP_STACK
: return "HP_STACK";
2174 get_segment_type (p_type
)
2175 unsigned long p_type
;
2177 static char buff
[32];
2181 case PT_NULL
: return "NULL";
2182 case PT_LOAD
: return "LOAD";
2183 case PT_DYNAMIC
: return "DYNAMIC";
2184 case PT_INTERP
: return "INTERP";
2185 case PT_NOTE
: return "NOTE";
2186 case PT_SHLIB
: return "SHLIB";
2187 case PT_PHDR
: return "PHDR";
2188 case PT_TLS
: return "TLS";
2190 case PT_GNU_EH_FRAME
:
2191 return "GNU_EH_FRAME";
2194 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2198 switch (elf_header
.e_machine
)
2201 case EM_MIPS_RS3_LE
:
2202 result
= get_mips_segment_type (p_type
);
2205 result
= get_parisc_segment_type (p_type
);
2208 result
= get_ia64_segment_type (p_type
);
2218 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2220 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2224 switch (elf_header
.e_machine
)
2227 result
= get_parisc_segment_type (p_type
);
2230 result
= get_ia64_segment_type (p_type
);
2240 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2243 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2250 get_mips_section_type_name (sh_type
)
2251 unsigned int sh_type
;
2255 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2256 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2257 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2258 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2259 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2260 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2261 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2262 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2263 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2264 case SHT_MIPS_RELD
: return "MIPS_RELD";
2265 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2266 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2267 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2268 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2269 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2270 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2271 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2272 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2273 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2274 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2275 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2276 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2277 case SHT_MIPS_LINE
: return "MIPS_LINE";
2278 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2279 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2280 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2281 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2282 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2283 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2284 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2285 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2286 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2287 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2288 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2289 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2290 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2291 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2292 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2293 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2301 get_parisc_section_type_name (sh_type
)
2302 unsigned int sh_type
;
2306 case SHT_PARISC_EXT
: return "PARISC_EXT";
2307 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2308 case SHT_PARISC_DOC
: return "PARISC_DOC";
2316 get_ia64_section_type_name (sh_type
)
2317 unsigned int sh_type
;
2321 case SHT_IA_64_EXT
: return "IA_64_EXT";
2322 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2330 get_section_type_name (sh_type
)
2331 unsigned int sh_type
;
2333 static char buff
[32];
2337 case SHT_NULL
: return "NULL";
2338 case SHT_PROGBITS
: return "PROGBITS";
2339 case SHT_SYMTAB
: return "SYMTAB";
2340 case SHT_STRTAB
: return "STRTAB";
2341 case SHT_RELA
: return "RELA";
2342 case SHT_HASH
: return "HASH";
2343 case SHT_DYNAMIC
: return "DYNAMIC";
2344 case SHT_NOTE
: return "NOTE";
2345 case SHT_NOBITS
: return "NOBITS";
2346 case SHT_REL
: return "REL";
2347 case SHT_SHLIB
: return "SHLIB";
2348 case SHT_DYNSYM
: return "DYNSYM";
2349 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2350 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2351 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2352 case SHT_GROUP
: return "GROUP";
2353 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2354 case SHT_GNU_verdef
: return "VERDEF";
2355 case SHT_GNU_verneed
: return "VERNEED";
2356 case SHT_GNU_versym
: return "VERSYM";
2357 case 0x6ffffff0: return "VERSYM";
2358 case 0x6ffffffc: return "VERDEF";
2359 case 0x7ffffffd: return "AUXILIARY";
2360 case 0x7fffffff: return "FILTER";
2361 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2364 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2368 switch (elf_header
.e_machine
)
2371 case EM_MIPS_RS3_LE
:
2372 result
= get_mips_section_type_name (sh_type
);
2375 result
= get_parisc_section_type_name (sh_type
);
2378 result
= get_ia64_section_type_name (sh_type
);
2388 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2390 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2391 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2392 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2393 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2395 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2401 #define OPTION_DEBUG_DUMP 512
2403 struct option options
[] =
2405 {"all", no_argument
, 0, 'a'},
2406 {"file-header", no_argument
, 0, 'h'},
2407 {"program-headers", no_argument
, 0, 'l'},
2408 {"headers", no_argument
, 0, 'e'},
2409 {"histogram", no_argument
, 0, 'I'},
2410 {"segments", no_argument
, 0, 'l'},
2411 {"sections", no_argument
, 0, 'S'},
2412 {"section-headers", no_argument
, 0, 'S'},
2413 {"symbols", no_argument
, 0, 's'},
2414 {"syms", no_argument
, 0, 's'},
2415 {"relocs", no_argument
, 0, 'r'},
2416 {"notes", no_argument
, 0, 'n'},
2417 {"dynamic", no_argument
, 0, 'd'},
2418 {"arch-specific", no_argument
, 0, 'A'},
2419 {"version-info", no_argument
, 0, 'V'},
2420 {"use-dynamic", no_argument
, 0, 'D'},
2421 {"hex-dump", required_argument
, 0, 'x'},
2422 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2423 {"unwind", no_argument
, 0, 'u'},
2424 #ifdef SUPPORT_DISASSEMBLY
2425 {"instruction-dump", required_argument
, 0, 'i'},
2428 {"version", no_argument
, 0, 'v'},
2429 {"wide", no_argument
, 0, 'W'},
2430 {"help", no_argument
, 0, 'H'},
2431 {0, no_argument
, 0, 0}
2437 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2438 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2439 fprintf (stdout
, _(" Options are:\n\
2440 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2441 -h --file-header Display the ELF file header\n\
2442 -l --program-headers Display the program headers\n\
2443 --segments An alias for --program-headers\n\
2444 -S --section-headers Display the sections' header\n\
2445 --sections An alias for --section-headers\n\
2446 -e --headers Equivalent to: -h -l -S\n\
2447 -s --syms Display the symbol table\n\
2448 --symbols An alias for --syms\n\
2449 -n --notes Display the core notes (if present)\n\
2450 -r --relocs Display the relocations (if present)\n\
2451 -u --unwind Display the unwind info (if present)\n\
2452 -d --dynamic Display the dynamic segment (if present)\n\
2453 -V --version-info Display the version sections (if present)\n\
2454 -A --arch-specific Display architecture specific information (if any).\n\
2455 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2456 -x --hex-dump=<number> Dump the contents of section <number>\n\
2457 -w[liaprmfFso] or\n\
2458 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2459 Display the contents of DWARF2 debug sections\n"));
2460 #ifdef SUPPORT_DISASSEMBLY
2461 fprintf (stdout
, _("\
2462 -i --instruction-dump=<number>\n\
2463 Disassemble the contents of section <number>\n"));
2465 fprintf (stdout
, _("\
2466 -I --histogram Display histogram of bucket list lengths\n\
2467 -W --wide Allow output width to exceed 80 characters\n\
2468 -H --help Display this information\n\
2469 -v --version Display the version number of readelf\n"));
2470 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2476 request_dump (section
, type
)
2477 unsigned int section
;
2480 if (section
>= num_dump_sects
)
2482 char *new_dump_sects
;
2484 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2486 if (new_dump_sects
== NULL
)
2487 error (_("Out of memory allocating dump request table."));
2490 /* Copy current flag settings. */
2491 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2495 dump_sects
= new_dump_sects
;
2496 num_dump_sects
= section
+ 1;
2501 dump_sects
[section
] |= type
;
2507 parse_args (argc
, argv
)
2516 while ((c
= getopt_long
2517 (argc
, argv
, "ersuahnldSDAIw::x:i:vVW", options
, NULL
)) != EOF
)
2584 section
= strtoul (optarg
, & cp
, 0);
2585 if (! *cp
&& section
>= 0)
2587 request_dump (section
, HEX_DUMP
);
2597 unsigned int index
= 0;
2601 while (optarg
[index
])
2602 switch (optarg
[index
++])
2611 do_debug_abbrevs
= 1;
2621 do_debug_pubnames
= 1;
2626 do_debug_aranges
= 1;
2630 do_debug_frames_interp
= 1;
2632 do_debug_frames
= 1;
2637 do_debug_macinfo
= 1;
2651 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2656 case OPTION_DEBUG_DUMP
:
2662 static const char *debug_dump_opt
[]
2663 = { "line", "info", "abbrev", "pubnames", "ranges",
2664 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2673 for (index
= 0; debug_dump_opt
[index
]; index
++)
2675 size_t len
= strlen (debug_dump_opt
[index
]);
2677 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2678 && (p
[len
] == ',' || p
[len
] == '\0'))
2687 do_debug_abbrevs
= 1;
2698 do_debug_pubnames
= 1;
2702 do_debug_aranges
= 1;
2707 do_debug_frames_interp
= 1;
2708 do_debug_frames
= 1;
2712 do_debug_macinfo
= 1;
2725 if (debug_dump_opt
[index
] == NULL
)
2727 warn (_("Unrecognized debug option '%s'\n"), p
);
2728 p
= strchr (p
, ',');
2738 #ifdef SUPPORT_DISASSEMBLY
2741 section
= strtoul (optarg
, & cp
, 0);
2742 if (! *cp
&& section
>= 0)
2744 request_dump (section
, DISASS_DUMP
);
2750 print_version (program_name
);
2760 /* xgettext:c-format */
2761 error (_("Invalid option '-%c'\n"), c
);
2768 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2769 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2770 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2774 warn (_("Nothing to do.\n"));
2780 get_elf_class (elf_class
)
2781 unsigned int elf_class
;
2783 static char buff
[32];
2787 case ELFCLASSNONE
: return _("none");
2788 case ELFCLASS32
: return "ELF32";
2789 case ELFCLASS64
: return "ELF64";
2791 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2797 get_data_encoding (encoding
)
2798 unsigned int encoding
;
2800 static char buff
[32];
2804 case ELFDATANONE
: return _("none");
2805 case ELFDATA2LSB
: return _("2's complement, little endian");
2806 case ELFDATA2MSB
: return _("2's complement, big endian");
2808 sprintf (buff
, _("<unknown: %x>"), encoding
);
2814 get_osabi_name (osabi
)
2817 static char buff
[32];
2821 case ELFOSABI_NONE
: return "UNIX - System V";
2822 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2823 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2824 case ELFOSABI_LINUX
: return "UNIX - Linux";
2825 case ELFOSABI_HURD
: return "GNU/Hurd";
2826 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2827 case ELFOSABI_AIX
: return "UNIX - AIX";
2828 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2829 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2830 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2831 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2832 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2833 case ELFOSABI_STANDALONE
: return _("Standalone App");
2834 case ELFOSABI_ARM
: return "ARM";
2836 sprintf (buff
, _("<unknown: %x>"), osabi
);
2841 /* Decode the data held in 'elf_header'. */
2843 process_file_header ()
2845 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2846 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2847 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2848 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2851 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2859 printf (_("ELF Header:\n"));
2860 printf (_(" Magic: "));
2861 for (i
= 0; i
< EI_NIDENT
; i
++)
2862 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2864 printf (_(" Class: %s\n"),
2865 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2866 printf (_(" Data: %s\n"),
2867 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2868 printf (_(" Version: %d %s\n"),
2869 elf_header
.e_ident
[EI_VERSION
],
2870 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2872 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2875 printf (_(" OS/ABI: %s\n"),
2876 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2877 printf (_(" ABI Version: %d\n"),
2878 elf_header
.e_ident
[EI_ABIVERSION
]);
2879 printf (_(" Type: %s\n"),
2880 get_file_type (elf_header
.e_type
));
2881 printf (_(" Machine: %s\n"),
2882 get_machine_name (elf_header
.e_machine
));
2883 printf (_(" Version: 0x%lx\n"),
2884 (unsigned long) elf_header
.e_version
);
2886 printf (_(" Entry point address: "));
2887 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2888 printf (_("\n Start of program headers: "));
2889 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2890 printf (_(" (bytes into file)\n Start of section headers: "));
2891 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2892 printf (_(" (bytes into file)\n"));
2894 printf (_(" Flags: 0x%lx%s\n"),
2895 (unsigned long) elf_header
.e_flags
,
2896 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2897 printf (_(" Size of this header: %ld (bytes)\n"),
2898 (long) elf_header
.e_ehsize
);
2899 printf (_(" Size of program headers: %ld (bytes)\n"),
2900 (long) elf_header
.e_phentsize
);
2901 printf (_(" Number of program headers: %ld\n"),
2902 (long) elf_header
.e_phnum
);
2903 printf (_(" Size of section headers: %ld (bytes)\n"),
2904 (long) elf_header
.e_shentsize
);
2905 printf (_(" Number of section headers: %ld"),
2906 (long) elf_header
.e_shnum
);
2907 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2908 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2909 putc ('\n', stdout
);
2910 printf (_(" Section header string table index: %ld"),
2911 (long) elf_header
.e_shstrndx
);
2912 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2913 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2914 putc ('\n', stdout
);
2917 if (section_headers
!= NULL
)
2919 if (elf_header
.e_shnum
== 0)
2920 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2921 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2922 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2923 free (section_headers
);
2924 section_headers
= NULL
;
2932 get_32bit_program_headers (file
, program_headers
)
2934 Elf_Internal_Phdr
*program_headers
;
2936 Elf32_External_Phdr
*phdrs
;
2937 Elf32_External_Phdr
*external
;
2938 Elf_Internal_Phdr
*internal
;
2941 phdrs
= ((Elf32_External_Phdr
*)
2942 get_data (NULL
, file
, elf_header
.e_phoff
,
2943 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2944 _("program headers")));
2948 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2949 i
< elf_header
.e_phnum
;
2950 i
++, internal
++, external
++)
2952 internal
->p_type
= BYTE_GET (external
->p_type
);
2953 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2954 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2955 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2956 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2957 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2958 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2959 internal
->p_align
= BYTE_GET (external
->p_align
);
2968 get_64bit_program_headers (file
, program_headers
)
2970 Elf_Internal_Phdr
*program_headers
;
2972 Elf64_External_Phdr
*phdrs
;
2973 Elf64_External_Phdr
*external
;
2974 Elf_Internal_Phdr
*internal
;
2977 phdrs
= ((Elf64_External_Phdr
*)
2978 get_data (NULL
, file
, elf_header
.e_phoff
,
2979 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2980 _("program headers")));
2984 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2985 i
< elf_header
.e_phnum
;
2986 i
++, internal
++, external
++)
2988 internal
->p_type
= BYTE_GET (external
->p_type
);
2989 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2990 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2991 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2992 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2993 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2994 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2995 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3003 /* Returns 1 if the program headers were loaded. */
3006 process_program_headers (file
)
3009 Elf_Internal_Phdr
*program_headers
;
3010 Elf_Internal_Phdr
*segment
;
3013 if (elf_header
.e_phnum
== 0)
3016 printf (_("\nThere are no program headers in this file.\n"));
3020 if (do_segments
&& !do_header
)
3022 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3023 printf (_("Entry point "));
3024 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3025 printf (_("\nThere are %d program headers, starting at offset "),
3026 elf_header
.e_phnum
);
3027 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3031 program_headers
= (Elf_Internal_Phdr
*) malloc
3032 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3034 if (program_headers
== NULL
)
3036 error (_("Out of memory\n"));
3041 i
= get_32bit_program_headers (file
, program_headers
);
3043 i
= get_64bit_program_headers (file
, program_headers
);
3047 free (program_headers
);
3053 if (elf_header
.e_phnum
> 1)
3054 printf (_("\nProgram Headers:\n"));
3056 printf (_("\nProgram Headers:\n"));
3060 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3063 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3067 (_(" Type Offset VirtAddr PhysAddr\n"));
3069 (_(" FileSiz MemSiz Flags Align\n"));
3077 for (i
= 0, segment
= program_headers
;
3078 i
< elf_header
.e_phnum
;
3083 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3087 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3088 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3089 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3090 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3091 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3093 (segment
->p_flags
& PF_R
? 'R' : ' '),
3094 (segment
->p_flags
& PF_W
? 'W' : ' '),
3095 (segment
->p_flags
& PF_X
? 'E' : ' '));
3096 printf ("%#lx", (unsigned long) segment
->p_align
);
3100 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3101 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3104 print_vma (segment
->p_offset
, FULL_HEX
);
3108 print_vma (segment
->p_vaddr
, FULL_HEX
);
3110 print_vma (segment
->p_paddr
, FULL_HEX
);
3113 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3114 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3117 print_vma (segment
->p_filesz
, FULL_HEX
);
3121 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3122 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3125 print_vma (segment
->p_offset
, FULL_HEX
);
3129 (segment
->p_flags
& PF_R
? 'R' : ' '),
3130 (segment
->p_flags
& PF_W
? 'W' : ' '),
3131 (segment
->p_flags
& PF_X
? 'E' : ' '));
3133 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3134 printf ("%#lx", (unsigned long) segment
->p_align
);
3137 print_vma (segment
->p_align
, PREFIX_HEX
);
3142 print_vma (segment
->p_offset
, FULL_HEX
);
3144 print_vma (segment
->p_vaddr
, FULL_HEX
);
3146 print_vma (segment
->p_paddr
, FULL_HEX
);
3148 print_vma (segment
->p_filesz
, FULL_HEX
);
3150 print_vma (segment
->p_memsz
, FULL_HEX
);
3152 (segment
->p_flags
& PF_R
? 'R' : ' '),
3153 (segment
->p_flags
& PF_W
? 'W' : ' '),
3154 (segment
->p_flags
& PF_X
? 'E' : ' '));
3155 print_vma (segment
->p_align
, HEX
);
3159 switch (segment
->p_type
)
3164 unsigned long align_mask
= -segment
->p_align
;
3166 if (align_mask
== 0)
3168 loadaddr
= ((segment
->p_vaddr
& align_mask
)
3169 - (segment
->p_offset
& align_mask
));
3175 error (_("more than one dynamic segment\n"));
3177 dynamic_addr
= segment
->p_offset
;
3178 dynamic_size
= segment
->p_filesz
;
3182 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
3183 error (_("Unable to find program interpreter name\n"));
3186 program_interpreter
[0] = 0;
3187 fscanf (file
, "%63s", program_interpreter
);
3190 printf (_("\n [Requesting program interpreter: %s]"),
3191 program_interpreter
);
3197 putc ('\n', stdout
);
3206 if (do_segments
&& section_headers
!= NULL
)
3208 printf (_("\n Section to Segment mapping:\n"));
3209 printf (_(" Segment Sections...\n"));
3211 assert (string_table
!= NULL
);
3213 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3216 Elf_Internal_Shdr
*section
;
3218 segment
= program_headers
+ i
;
3219 section
= section_headers
;
3221 printf (" %2.2d ", i
);
3223 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3225 if (section
->sh_size
> 0
3226 /* Compare allocated sections by VMA, unallocated
3227 sections by file offset. */
3228 && (section
->sh_flags
& SHF_ALLOC
3229 ? (section
->sh_addr
>= segment
->p_vaddr
3230 && section
->sh_addr
+ section
->sh_size
3231 <= segment
->p_vaddr
+ segment
->p_memsz
)
3232 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3233 && (section
->sh_offset
+ section
->sh_size
3234 <= segment
->p_offset
+ segment
->p_filesz
))))
3235 printf ("%s ", SECTION_NAME (section
));
3242 free (program_headers
);
3249 get_32bit_section_headers (file
, num
)
3253 Elf32_External_Shdr
*shdrs
;
3254 Elf_Internal_Shdr
*internal
;
3257 shdrs
= ((Elf32_External_Shdr
*)
3258 get_data (NULL
, file
, elf_header
.e_shoff
,
3259 elf_header
.e_shentsize
* num
,
3260 _("section headers")));
3264 section_headers
= ((Elf_Internal_Shdr
*)
3265 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3267 if (section_headers
== NULL
)
3269 error (_("Out of memory\n"));
3273 for (i
= 0, internal
= section_headers
;
3277 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3278 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3279 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3280 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3281 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3282 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3283 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3284 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3285 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3286 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3295 get_64bit_section_headers (file
, num
)
3299 Elf64_External_Shdr
*shdrs
;
3300 Elf_Internal_Shdr
*internal
;
3303 shdrs
= ((Elf64_External_Shdr
*)
3304 get_data (NULL
, file
, elf_header
.e_shoff
,
3305 elf_header
.e_shentsize
* num
,
3306 _("section headers")));
3310 section_headers
= ((Elf_Internal_Shdr
*)
3311 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3313 if (section_headers
== NULL
)
3315 error (_("Out of memory\n"));
3319 for (i
= 0, internal
= section_headers
;
3323 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3324 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3325 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3326 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3327 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3328 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3329 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3330 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3331 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3332 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3340 static Elf_Internal_Sym
*
3341 get_32bit_elf_symbols (file
, section
)
3343 Elf_Internal_Shdr
*section
;
3345 unsigned long number
;
3346 Elf32_External_Sym
*esyms
;
3347 Elf_External_Sym_Shndx
*shndx
;
3348 Elf_Internal_Sym
*isyms
;
3349 Elf_Internal_Sym
*psym
;
3352 esyms
= ((Elf32_External_Sym
*)
3353 get_data (NULL
, file
, section
->sh_offset
,
3354 section
->sh_size
, _("symbols")));
3359 if (symtab_shndx_hdr
!= NULL
3360 && (symtab_shndx_hdr
->sh_link
3361 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3363 shndx
= ((Elf_External_Sym_Shndx
*)
3364 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3365 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3373 number
= section
->sh_size
/ section
->sh_entsize
;
3374 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3378 error (_("Out of memory\n"));
3385 for (j
= 0, psym
= isyms
;
3389 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3390 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3391 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3392 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3393 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3395 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3396 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3397 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3407 static Elf_Internal_Sym
*
3408 get_64bit_elf_symbols (file
, section
)
3410 Elf_Internal_Shdr
*section
;
3412 unsigned long number
;
3413 Elf64_External_Sym
*esyms
;
3414 Elf_External_Sym_Shndx
*shndx
;
3415 Elf_Internal_Sym
*isyms
;
3416 Elf_Internal_Sym
*psym
;
3419 esyms
= ((Elf64_External_Sym
*)
3420 get_data (NULL
, file
, section
->sh_offset
,
3421 section
->sh_size
, _("symbols")));
3426 if (symtab_shndx_hdr
!= NULL
3427 && (symtab_shndx_hdr
->sh_link
3428 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3430 shndx
= ((Elf_External_Sym_Shndx
*)
3431 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3432 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3440 number
= section
->sh_size
/ section
->sh_entsize
;
3441 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3445 error (_("Out of memory\n"));
3452 for (j
= 0, psym
= isyms
;
3456 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3457 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3458 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3459 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3460 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3462 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3463 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3464 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3475 get_elf_section_flags (sh_flags
)
3478 static char buff
[32];
3486 flag
= sh_flags
& - sh_flags
;
3491 case SHF_WRITE
: strcat (buff
, "W"); break;
3492 case SHF_ALLOC
: strcat (buff
, "A"); break;
3493 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3494 case SHF_MERGE
: strcat (buff
, "M"); break;
3495 case SHF_STRINGS
: strcat (buff
, "S"); break;
3496 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3497 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3498 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3499 case SHF_GROUP
: strcat (buff
, "G"); break;
3500 case SHF_TLS
: strcat (buff
, "T"); break;
3503 if (flag
& SHF_MASKOS
)
3506 sh_flags
&= ~ SHF_MASKOS
;
3508 else if (flag
& SHF_MASKPROC
)
3511 sh_flags
&= ~ SHF_MASKPROC
;
3523 process_section_headers (file
)
3526 Elf_Internal_Shdr
*section
;
3529 section_headers
= NULL
;
3531 if (elf_header
.e_shnum
== 0)
3534 printf (_("\nThere are no sections in this file.\n"));
3539 if (do_sections
&& !do_header
)
3540 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3541 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3545 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3548 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3551 /* Read in the string table, so that we have names to display. */
3552 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3554 if (section
->sh_size
!= 0)
3556 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3557 section
->sh_size
, _("string table"));
3559 string_table_length
= section
->sh_size
;
3562 /* Scan the sections for the dynamic symbol table
3563 and dynamic string table and debug sections. */
3564 dynamic_symbols
= NULL
;
3565 dynamic_strings
= NULL
;
3566 dynamic_syminfo
= NULL
;
3567 symtab_shndx_hdr
= NULL
;
3569 for (i
= 0, section
= section_headers
;
3570 i
< elf_header
.e_shnum
;
3573 char *name
= SECTION_NAME (section
);
3575 if (section
->sh_type
== SHT_DYNSYM
)
3577 if (dynamic_symbols
!= NULL
)
3579 error (_("File contains multiple dynamic symbol tables\n"));
3583 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3584 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3586 else if (section
->sh_type
== SHT_STRTAB
3587 && strcmp (name
, ".dynstr") == 0)
3589 if (dynamic_strings
!= NULL
)
3591 error (_("File contains multiple dynamic string tables\n"));
3595 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3597 _("dynamic strings"));
3599 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3601 if (symtab_shndx_hdr
!= NULL
)
3603 error (_("File contains multiple symtab shndx tables\n"));
3606 symtab_shndx_hdr
= section
;
3608 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3609 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3610 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3612 && strncmp (name
, ".debug_", 7) == 0)
3617 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3618 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3619 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3620 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3621 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3622 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3623 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3624 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3625 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3627 request_dump (i
, DEBUG_DUMP
);
3629 /* linkonce section to be combined with .debug_info at link time. */
3630 else if ((do_debugging
|| do_debug_info
)
3631 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3632 request_dump (i
, DEBUG_DUMP
);
3633 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3634 request_dump (i
, DEBUG_DUMP
);
3640 if (elf_header
.e_shnum
> 1)
3641 printf (_("\nSection Headers:\n"));
3643 printf (_("\nSection Header:\n"));
3647 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3650 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3653 printf (_(" [Nr] Name Type Address Offset\n"));
3654 printf (_(" Size EntSize Flags Link Info Align\n"));
3657 for (i
= 0, section
= section_headers
;
3658 i
< elf_header
.e_shnum
;
3661 printf (" [%2u] %-17.17s %-15.15s ",
3662 SECTION_HEADER_NUM (i
),
3663 SECTION_NAME (section
),
3664 get_section_type_name (section
->sh_type
));
3668 print_vma (section
->sh_addr
, LONG_HEX
);
3670 printf ( " %6.6lx %6.6lx %2.2lx",
3671 (unsigned long) section
->sh_offset
,
3672 (unsigned long) section
->sh_size
,
3673 (unsigned long) section
->sh_entsize
);
3675 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3677 printf ("%2ld %3lx %2ld\n",
3678 (unsigned long) section
->sh_link
,
3679 (unsigned long) section
->sh_info
,
3680 (unsigned long) section
->sh_addralign
);
3684 print_vma (section
->sh_addr
, LONG_HEX
);
3686 if ((long) section
->sh_offset
== section
->sh_offset
)
3687 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3691 print_vma (section
->sh_offset
, LONG_HEX
);
3694 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3695 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3699 print_vma (section
->sh_size
, LONG_HEX
);
3702 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3703 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3707 print_vma (section
->sh_entsize
, LONG_HEX
);
3710 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3712 printf ("%2ld %3lx ",
3713 (unsigned long) section
->sh_link
,
3714 (unsigned long) section
->sh_info
);
3716 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3717 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3720 print_vma (section
->sh_addralign
, DEC
);
3727 print_vma (section
->sh_addr
, LONG_HEX
);
3728 if ((long) section
->sh_offset
== section
->sh_offset
)
3729 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3733 print_vma (section
->sh_offset
, LONG_HEX
);
3736 print_vma (section
->sh_size
, LONG_HEX
);
3738 print_vma (section
->sh_entsize
, LONG_HEX
);
3740 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3742 printf (" %2ld %3lx %ld\n",
3743 (unsigned long) section
->sh_link
,
3744 (unsigned long) section
->sh_info
,
3745 (unsigned long) section
->sh_addralign
);
3749 printf (_("Key to Flags:\n\
3750 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3751 I (info), L (link order), G (group), x (unknown)\n\
3752 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3757 /* Process the reloc section. */
3759 process_relocs (file
)
3762 unsigned long rel_size
;
3763 unsigned long rel_offset
;
3769 if (do_using_dynamic
)
3771 int is_rela
= FALSE
;
3776 if (dynamic_info
[DT_REL
])
3778 rel_offset
= dynamic_info
[DT_REL
];
3779 rel_size
= dynamic_info
[DT_RELSZ
];
3782 else if (dynamic_info
[DT_RELA
])
3784 rel_offset
= dynamic_info
[DT_RELA
];
3785 rel_size
= dynamic_info
[DT_RELASZ
];
3788 else if (dynamic_info
[DT_JMPREL
])
3790 rel_offset
= dynamic_info
[DT_JMPREL
];
3791 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3793 switch (dynamic_info
[DT_PLTREL
])
3810 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3811 rel_offset
, rel_size
);
3813 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3814 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
,
3818 printf (_("\nThere are no dynamic relocations in this file.\n"));
3822 Elf_Internal_Shdr
*section
;
3826 for (i
= 0, section
= section_headers
;
3827 i
< elf_header
.e_shnum
;
3830 if ( section
->sh_type
!= SHT_RELA
3831 && section
->sh_type
!= SHT_REL
)
3834 rel_offset
= section
->sh_offset
;
3835 rel_size
= section
->sh_size
;
3839 Elf_Internal_Shdr
*strsec
;
3840 Elf_Internal_Sym
*symtab
;
3843 unsigned long nsyms
;
3845 printf (_("\nRelocation section "));
3847 if (string_table
== NULL
)
3848 printf ("%d", section
->sh_name
);
3850 printf (_("'%s'"), SECTION_NAME (section
));
3852 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3853 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3858 if (section
->sh_link
)
3860 Elf_Internal_Shdr
*symsec
;
3862 symsec
= SECTION_HEADER (section
->sh_link
);
3863 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3864 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3869 strsec
= SECTION_HEADER (symsec
->sh_link
);
3871 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3875 is_rela
= section
->sh_type
== SHT_RELA
;
3877 dump_relocations (file
, rel_offset
, rel_size
,
3878 symtab
, nsyms
, strtab
, is_rela
);
3890 printf (_("\nThere are no relocations in this file.\n"));
3896 #include "unwind-ia64.h"
3898 /* An absolute address consists of a section and an offset. If the
3899 section is NULL, the offset itself is the address, otherwise, the
3900 address equals to LOAD_ADDRESS(section) + offset. */
3904 unsigned short section
;
3910 struct unw_table_entry
3912 struct absaddr start
;
3914 struct absaddr info
;
3916 *table
; /* Unwind table. */
3917 unsigned long table_len
; /* Length of unwind table. */
3918 unsigned char *info
; /* Unwind info. */
3919 unsigned long info_size
; /* Size of unwind info. */
3920 bfd_vma info_addr
; /* starting address of unwind info. */
3921 bfd_vma seg_base
; /* Starting address of segment. */
3922 Elf_Internal_Sym
*symtab
; /* The symbol table. */
3923 unsigned long nsyms
; /* Number of symbols. */
3924 char *strtab
; /* The string table. */
3925 unsigned long strtab_size
; /* Size of string table. */
3928 static void find_symbol_for_address
3929 PARAMS ((struct unw_aux_info
*, struct absaddr
, const char **, bfd_vma
*));
3930 static void dump_ia64_unwind
3931 PARAMS ((struct unw_aux_info
*));
3932 static int slurp_ia64_unwind_table
3933 PARAMS ((FILE *, struct unw_aux_info
*, Elf_Internal_Shdr
*));
3936 find_symbol_for_address (aux
, addr
, symname
, offset
)
3937 struct unw_aux_info
*aux
;
3938 struct absaddr addr
;
3939 const char **symname
;
3942 bfd_vma dist
= (bfd_vma
) 0x100000;
3943 Elf_Internal_Sym
*sym
, *best
= NULL
;
3946 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3948 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3949 && sym
->st_name
!= 0
3950 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3951 && addr
.offset
>= sym
->st_value
3952 && addr
.offset
- sym
->st_value
< dist
)
3955 dist
= addr
.offset
- sym
->st_value
;
3962 *symname
= (best
->st_name
>= aux
->strtab_size
3963 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3968 *offset
= addr
.offset
;
3972 dump_ia64_unwind (aux
)
3973 struct unw_aux_info
*aux
;
3976 struct unw_table_entry
*tp
;
3979 addr_size
= is_32bit_elf
? 4 : 8;
3981 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3985 const unsigned char *dp
;
3986 const unsigned char *head
;
3987 const char *procname
;
3989 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3991 fputs ("\n<", stdout
);
3995 fputs (procname
, stdout
);
3998 printf ("+%lx", (unsigned long) offset
);
4001 fputs (">: [", stdout
);
4002 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4003 fputc ('-', stdout
);
4004 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4005 printf ("], info at +0x%lx\n",
4006 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4008 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4009 stamp
= BYTE_GET8 ((unsigned char *) head
);
4011 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4012 (unsigned) UNW_VER (stamp
),
4013 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4014 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4015 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4016 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4018 if (UNW_VER (stamp
) != 1)
4020 printf ("\tUnknown version.\n");
4025 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4026 dp
= unw_decode (dp
, in_body
, & in_body
);
4031 slurp_ia64_unwind_table (file
, aux
, sec
)
4033 struct unw_aux_info
*aux
;
4034 Elf_Internal_Shdr
*sec
;
4036 unsigned long size
, addr_size
, nrelas
, i
;
4037 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
4038 struct unw_table_entry
*tep
;
4039 Elf_Internal_Shdr
*relsec
;
4040 Elf_Internal_Rela
*rela
, *rp
;
4041 unsigned char *table
, *tp
;
4042 Elf_Internal_Sym
*sym
;
4043 const char *relname
;
4046 addr_size
= is_32bit_elf
? 4 : 8;
4048 /* First, find the starting address of the segment that includes
4051 if (elf_header
.e_phnum
)
4053 prog_hdrs
= (Elf_Internal_Phdr
*)
4054 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
4057 result
= get_32bit_program_headers (file
, prog_hdrs
);
4059 result
= get_64bit_program_headers (file
, prog_hdrs
);
4067 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
4069 if (seg
->p_type
!= PT_LOAD
)
4072 if (sec
->sh_addr
>= seg
->p_vaddr
4073 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4075 aux
->seg_base
= seg
->p_vaddr
;
4083 /* Second, build the unwind table from the contents of the unwind section: */
4084 size
= sec
->sh_size
;
4085 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4086 size
, _("unwind table"));
4090 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4091 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4093 tep
->start
.section
= SHN_UNDEF
;
4094 tep
->end
.section
= SHN_UNDEF
;
4095 tep
->info
.section
= SHN_UNDEF
;
4098 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4099 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4100 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4104 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4105 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4106 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4108 tep
->start
.offset
+= aux
->seg_base
;
4109 tep
->end
.offset
+= aux
->seg_base
;
4110 tep
->info
.offset
+= aux
->seg_base
;
4114 /* Third, apply any relocations to the unwind table: */
4116 for (relsec
= section_headers
;
4117 relsec
< section_headers
+ elf_header
.e_shnum
;
4120 if (relsec
->sh_type
!= SHT_RELA
4121 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4124 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4128 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4132 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4133 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4135 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4137 warn (_("Skipping unexpected symbol type %u\n"),
4138 ELF32_ST_TYPE (sym
->st_info
));
4144 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4145 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4147 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4149 warn (_("Skipping unexpected symbol type %u\n"),
4150 ELF64_ST_TYPE (sym
->st_info
));
4155 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4157 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4161 i
= rp
->r_offset
/ (3 * addr_size
);
4163 switch (rp
->r_offset
/addr_size
% 3)
4166 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4167 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4170 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4171 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4174 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4175 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4185 aux
->table_len
= size
/ (3 * addr_size
);
4190 process_unwind (file
)
4193 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4194 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4195 struct unw_aux_info aux
;
4200 if (elf_header
.e_machine
!= EM_IA_64
)
4202 printf (_("\nThere are no unwind sections in this file.\n"));
4206 memset (& aux
, 0, sizeof (aux
));
4208 addr_size
= is_32bit_elf
? 4 : 8;
4210 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4212 if (sec
->sh_type
== SHT_SYMTAB
)
4214 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4215 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4217 strsec
= SECTION_HEADER (sec
->sh_link
);
4218 aux
.strtab_size
= strsec
->sh_size
;
4219 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4220 aux
.strtab_size
, _("string table"));
4222 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4227 printf (_("\nThere are no unwind sections in this file.\n"));
4229 while (unwcount
-- > 0)
4234 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4235 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4236 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4243 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4245 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4248 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4249 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4250 suffix
= SECTION_NAME (unwsec
) + len
;
4251 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4253 if (strncmp (SECTION_NAME (sec
),
4254 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4255 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4260 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4261 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4262 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4263 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4265 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4267 suffix
= SECTION_NAME (unwsec
) + len
;
4268 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4270 if (strncmp (SECTION_NAME (sec
),
4271 ELF_STRING_ia64_unwind_info
, len2
) == 0
4272 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4276 if (i
== elf_header
.e_shnum
)
4278 printf (_("\nCould not find unwind info section for "));
4280 if (string_table
== NULL
)
4281 printf ("%d", unwsec
->sh_name
);
4283 printf (_("'%s'"), SECTION_NAME (unwsec
));
4287 aux
.info_size
= sec
->sh_size
;
4288 aux
.info_addr
= sec
->sh_addr
;
4289 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4290 aux
.info_size
, _("unwind info"));
4292 printf (_("\nUnwind section "));
4294 if (string_table
== NULL
)
4295 printf ("%d", unwsec
->sh_name
);
4297 printf (_("'%s'"), SECTION_NAME (unwsec
));
4299 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4300 (unsigned long) unwsec
->sh_offset
,
4301 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4303 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4305 if (aux
.table_len
> 0)
4306 dump_ia64_unwind (& aux
);
4309 free ((char *) aux
.table
);
4311 free ((char *) aux
.info
);
4320 free ((char *) aux
.strtab
);
4326 dynamic_segment_mips_val (entry
)
4327 Elf_Internal_Dyn
*entry
;
4329 switch (entry
->d_tag
)
4332 if (entry
->d_un
.d_val
== 0)
4336 static const char * opts
[] =
4338 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4339 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4340 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4341 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4346 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4347 if (entry
->d_un
.d_val
& (1 << cnt
))
4349 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4356 case DT_MIPS_IVERSION
:
4357 if (dynamic_strings
!= NULL
)
4358 printf ("Interface Version: %s\n",
4359 dynamic_strings
+ entry
->d_un
.d_val
);
4361 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4364 case DT_MIPS_TIME_STAMP
:
4369 time_t time
= entry
->d_un
.d_val
;
4370 tmp
= gmtime (&time
);
4371 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4372 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4373 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4374 printf ("Time Stamp: %s\n", timebuf
);
4378 case DT_MIPS_RLD_VERSION
:
4379 case DT_MIPS_LOCAL_GOTNO
:
4380 case DT_MIPS_CONFLICTNO
:
4381 case DT_MIPS_LIBLISTNO
:
4382 case DT_MIPS_SYMTABNO
:
4383 case DT_MIPS_UNREFEXTNO
:
4384 case DT_MIPS_HIPAGENO
:
4385 case DT_MIPS_DELTA_CLASS_NO
:
4386 case DT_MIPS_DELTA_INSTANCE_NO
:
4387 case DT_MIPS_DELTA_RELOC_NO
:
4388 case DT_MIPS_DELTA_SYM_NO
:
4389 case DT_MIPS_DELTA_CLASSSYM_NO
:
4390 case DT_MIPS_COMPACT_SIZE
:
4391 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4395 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4401 dynamic_segment_parisc_val (entry
)
4402 Elf_Internal_Dyn
*entry
;
4404 switch (entry
->d_tag
)
4406 case DT_HP_DLD_FLAGS
:
4415 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4416 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4417 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4418 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4419 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4420 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4421 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4422 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4423 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4424 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4425 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4429 bfd_vma val
= entry
->d_un
.d_val
;
4431 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4432 if (val
& flags
[cnt
].bit
)
4436 fputs (flags
[cnt
].str
, stdout
);
4438 val
^= flags
[cnt
].bit
;
4441 if (val
!= 0 || first
)
4445 print_vma (val
, HEX
);
4451 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4458 get_32bit_dynamic_segment (file
)
4461 Elf32_External_Dyn
*edyn
;
4462 Elf_Internal_Dyn
*entry
;
4465 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4466 dynamic_size
, _("dynamic segment"));
4470 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4471 how large this .dynamic is now. We can do this even before the byte
4472 swapping since the DT_NULL tag is recognizable. */
4474 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4477 dynamic_segment
= (Elf_Internal_Dyn
*)
4478 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4480 if (dynamic_segment
== NULL
)
4482 error (_("Out of memory\n"));
4487 for (i
= 0, entry
= dynamic_segment
;
4491 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4492 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4501 get_64bit_dynamic_segment (file
)
4504 Elf64_External_Dyn
*edyn
;
4505 Elf_Internal_Dyn
*entry
;
4508 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4509 dynamic_size
, _("dynamic segment"));
4513 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4514 how large this .dynamic is now. We can do this even before the byte
4515 swapping since the DT_NULL tag is recognizable. */
4517 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4520 dynamic_segment
= (Elf_Internal_Dyn
*)
4521 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4523 if (dynamic_segment
== NULL
)
4525 error (_("Out of memory\n"));
4530 for (i
= 0, entry
= dynamic_segment
;
4534 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4535 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4544 get_dynamic_flags (flags
)
4547 static char buff
[128];
4555 flag
= flags
& - flags
;
4563 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4564 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4565 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4566 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4567 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4568 default: strcpy (p
, "unknown"); break;
4571 p
= strchr (p
, '\0');
4576 /* Parse and display the contents of the dynamic segment. */
4578 process_dynamic_segment (file
)
4581 Elf_Internal_Dyn
*entry
;
4584 if (dynamic_size
== 0)
4587 printf (_("\nThere is no dynamic segment in this file.\n"));
4594 if (! get_32bit_dynamic_segment (file
))
4597 else if (! get_64bit_dynamic_segment (file
))
4600 /* Find the appropriate symbol table. */
4601 if (dynamic_symbols
== NULL
)
4603 for (i
= 0, entry
= dynamic_segment
;
4607 Elf_Internal_Shdr section
;
4609 if (entry
->d_tag
!= DT_SYMTAB
)
4612 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4614 /* Since we do not know how big the symbol table is,
4615 we default to reading in the entire file (!) and
4616 processing that. This is overkill, I know, but it
4618 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4620 if (fseek (file
, 0, SEEK_END
))
4621 error (_("Unable to seek to end of file!"));
4623 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4625 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4627 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4629 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4630 if (num_dynamic_syms
< 1)
4632 error (_("Unable to determine the number of symbols to load\n"));
4636 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4640 /* Similarly find a string table. */
4641 if (dynamic_strings
== NULL
)
4643 for (i
= 0, entry
= dynamic_segment
;
4647 unsigned long offset
;
4650 if (entry
->d_tag
!= DT_STRTAB
)
4653 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4655 /* Since we do not know how big the string table is,
4656 we default to reading in the entire file (!) and
4657 processing that. This is overkill, I know, but it
4660 offset
= entry
->d_un
.d_val
- loadaddr
;
4661 if (fseek (file
, 0, SEEK_END
))
4662 error (_("Unable to seek to end of file\n"));
4663 str_tab_len
= ftell (file
) - offset
;
4665 if (str_tab_len
< 1)
4668 (_("Unable to determine the length of the dynamic string table\n"));
4672 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4673 _("dynamic string table"));
4678 /* And find the syminfo section if available. */
4679 if (dynamic_syminfo
== NULL
)
4681 unsigned long syminsz
= 0;
4683 for (i
= 0, entry
= dynamic_segment
;
4687 if (entry
->d_tag
== DT_SYMINENT
)
4689 /* Note: these braces are necessary to avoid a syntax
4690 error from the SunOS4 C compiler. */
4691 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4693 else if (entry
->d_tag
== DT_SYMINSZ
)
4694 syminsz
= entry
->d_un
.d_val
;
4695 else if (entry
->d_tag
== DT_SYMINFO
)
4696 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4699 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4701 Elf_External_Syminfo
*extsyminfo
;
4702 Elf_Internal_Syminfo
*syminfo
;
4704 /* There is a syminfo section. Read the data. */
4705 extsyminfo
= ((Elf_External_Syminfo
*)
4706 get_data (NULL
, file
, dynamic_syminfo_offset
,
4707 syminsz
, _("symbol information")));
4711 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4712 if (dynamic_syminfo
== NULL
)
4714 error (_("Out of memory\n"));
4718 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4719 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4722 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4723 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4730 if (do_dynamic
&& dynamic_addr
)
4731 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4732 dynamic_addr
, (long) dynamic_size
);
4734 printf (_(" Tag Type Name/Value\n"));
4736 for (i
= 0, entry
= dynamic_segment
;
4745 print_vma (entry
->d_tag
, FULL_HEX
);
4746 dtype
= get_dynamic_type (entry
->d_tag
);
4747 printf (" (%s)%*s", dtype
,
4748 ((is_32bit_elf
? 27 : 19)
4749 - (int) strlen (dtype
)),
4753 switch (entry
->d_tag
)
4757 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4767 switch (entry
->d_tag
)
4770 printf (_("Auxiliary library"));
4774 printf (_("Filter library"));
4778 printf (_("Configuration file"));
4782 printf (_("Dependency audit library"));
4786 printf (_("Audit library"));
4790 if (dynamic_strings
)
4791 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4795 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4804 printf (_("Flags:"));
4806 if (entry
->d_un
.d_val
== 0)
4807 printf (_(" None\n"));
4810 unsigned long int val
= entry
->d_un
.d_val
;
4812 if (val
& DTF_1_PARINIT
)
4814 printf (" PARINIT");
4815 val
^= DTF_1_PARINIT
;
4817 if (val
& DTF_1_CONFEXP
)
4819 printf (" CONFEXP");
4820 val
^= DTF_1_CONFEXP
;
4823 printf (" %lx", val
);
4832 printf (_("Flags:"));
4834 if (entry
->d_un
.d_val
== 0)
4835 printf (_(" None\n"));
4838 unsigned long int val
= entry
->d_un
.d_val
;
4840 if (val
& DF_P1_LAZYLOAD
)
4842 printf (" LAZYLOAD");
4843 val
^= DF_P1_LAZYLOAD
;
4845 if (val
& DF_P1_GROUPPERM
)
4847 printf (" GROUPPERM");
4848 val
^= DF_P1_GROUPPERM
;
4851 printf (" %lx", val
);
4860 printf (_("Flags:"));
4861 if (entry
->d_un
.d_val
== 0)
4862 printf (_(" None\n"));
4865 unsigned long int val
= entry
->d_un
.d_val
;
4872 if (val
& DF_1_GLOBAL
)
4877 if (val
& DF_1_GROUP
)
4882 if (val
& DF_1_NODELETE
)
4884 printf (" NODELETE");
4885 val
^= DF_1_NODELETE
;
4887 if (val
& DF_1_LOADFLTR
)
4889 printf (" LOADFLTR");
4890 val
^= DF_1_LOADFLTR
;
4892 if (val
& DF_1_INITFIRST
)
4894 printf (" INITFIRST");
4895 val
^= DF_1_INITFIRST
;
4897 if (val
& DF_1_NOOPEN
)
4902 if (val
& DF_1_ORIGIN
)
4907 if (val
& DF_1_DIRECT
)
4912 if (val
& DF_1_TRANS
)
4917 if (val
& DF_1_INTERPOSE
)
4919 printf (" INTERPOSE");
4920 val
^= DF_1_INTERPOSE
;
4922 if (val
& DF_1_NODEFLIB
)
4924 printf (" NODEFLIB");
4925 val
^= DF_1_NODEFLIB
;
4927 if (val
& DF_1_NODUMP
)
4932 if (val
& DF_1_CONLFAT
)
4934 printf (" CONLFAT");
4935 val
^= DF_1_CONLFAT
;
4938 printf (" %lx", val
);
4946 puts (get_dynamic_type (entry
->d_un
.d_val
));
4966 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4972 if (dynamic_strings
== NULL
)
4975 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4979 switch (entry
->d_tag
)
4982 printf (_("Shared library: [%s]"), name
);
4984 if (strcmp (name
, program_interpreter
) == 0)
4985 printf (_(" program interpreter"));
4989 printf (_("Library soname: [%s]"), name
);
4993 printf (_("Library rpath: [%s]"), name
);
4997 printf (_("Library runpath: [%s]"), name
);
5001 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5006 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5022 case DT_INIT_ARRAYSZ
:
5023 case DT_FINI_ARRAYSZ
:
5024 case DT_GNU_CONFLICTSZ
:
5025 case DT_GNU_LIBLISTSZ
:
5028 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5029 printf (" (bytes)\n");
5039 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5052 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5056 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5060 printf (_("Not needed object: [%s]\n"), name
);
5065 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5071 /* The value of this entry is ignored. */
5076 case DT_GNU_PRELINKED
:
5080 time_t time
= entry
->d_un
.d_val
;
5082 tmp
= gmtime (&time
);
5083 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5084 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5085 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5091 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5092 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5097 switch (elf_header
.e_machine
)
5100 case EM_MIPS_RS3_LE
:
5101 dynamic_segment_mips_val (entry
);
5104 dynamic_segment_parisc_val (entry
);
5107 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5119 get_ver_flags (flags
)
5122 static char buff
[32];
5129 if (flags
& VER_FLG_BASE
)
5130 strcat (buff
, "BASE ");
5132 if (flags
& VER_FLG_WEAK
)
5134 if (flags
& VER_FLG_BASE
)
5135 strcat (buff
, "| ");
5137 strcat (buff
, "WEAK ");
5140 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5141 strcat (buff
, "| <unknown>");
5146 /* Display the contents of the version sections. */
5148 process_version_sections (file
)
5151 Elf_Internal_Shdr
*section
;
5158 for (i
= 0, section
= section_headers
;
5159 i
< elf_header
.e_shnum
;
5162 switch (section
->sh_type
)
5164 case SHT_GNU_verdef
:
5166 Elf_External_Verdef
*edefs
;
5173 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5174 SECTION_NAME (section
), section
->sh_info
);
5176 printf (_(" Addr: 0x"));
5177 printf_vma (section
->sh_addr
);
5178 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5179 (unsigned long) section
->sh_offset
, section
->sh_link
,
5180 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5182 edefs
= ((Elf_External_Verdef
*)
5183 get_data (NULL
, file
, section
->sh_offset
,
5185 _("version definition section")));
5189 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5192 Elf_External_Verdef
*edef
;
5193 Elf_Internal_Verdef ent
;
5194 Elf_External_Verdaux
*eaux
;
5195 Elf_Internal_Verdaux aux
;
5199 vstart
= ((char *) edefs
) + idx
;
5201 edef
= (Elf_External_Verdef
*) vstart
;
5203 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5204 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5205 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5206 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5207 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5208 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5209 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5211 printf (_(" %#06x: Rev: %d Flags: %s"),
5212 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5214 printf (_(" Index: %d Cnt: %d "),
5215 ent
.vd_ndx
, ent
.vd_cnt
);
5217 vstart
+= ent
.vd_aux
;
5219 eaux
= (Elf_External_Verdaux
*) vstart
;
5221 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5222 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5224 if (dynamic_strings
)
5225 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5227 printf (_("Name index: %ld\n"), aux
.vda_name
);
5229 isum
= idx
+ ent
.vd_aux
;
5231 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5233 isum
+= aux
.vda_next
;
5234 vstart
+= aux
.vda_next
;
5236 eaux
= (Elf_External_Verdaux
*) vstart
;
5238 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5239 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5241 if (dynamic_strings
)
5242 printf (_(" %#06x: Parent %d: %s\n"),
5243 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5245 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5246 isum
, j
, aux
.vda_name
);
5256 case SHT_GNU_verneed
:
5258 Elf_External_Verneed
*eneed
;
5264 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5265 SECTION_NAME (section
), section
->sh_info
);
5267 printf (_(" Addr: 0x"));
5268 printf_vma (section
->sh_addr
);
5269 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5270 (unsigned long) section
->sh_offset
, section
->sh_link
,
5271 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5273 eneed
= ((Elf_External_Verneed
*)
5274 get_data (NULL
, file
, section
->sh_offset
,
5275 section
->sh_size
, _("version need section")));
5279 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5281 Elf_External_Verneed
*entry
;
5282 Elf_Internal_Verneed ent
;
5287 vstart
= ((char *) eneed
) + idx
;
5289 entry
= (Elf_External_Verneed
*) vstart
;
5291 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5292 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5293 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5294 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5295 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5297 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5299 if (dynamic_strings
)
5300 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5302 printf (_(" File: %lx"), ent
.vn_file
);
5304 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5306 vstart
+= ent
.vn_aux
;
5308 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5310 Elf_External_Vernaux
*eaux
;
5311 Elf_Internal_Vernaux aux
;
5313 eaux
= (Elf_External_Vernaux
*) vstart
;
5315 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5316 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5317 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5318 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5319 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5321 if (dynamic_strings
)
5322 printf (_(" %#06x: Name: %s"),
5323 isum
, dynamic_strings
+ aux
.vna_name
);
5325 printf (_(" %#06x: Name index: %lx"),
5326 isum
, aux
.vna_name
);
5328 printf (_(" Flags: %s Version: %d\n"),
5329 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5331 isum
+= aux
.vna_next
;
5332 vstart
+= aux
.vna_next
;
5342 case SHT_GNU_versym
:
5344 Elf_Internal_Shdr
*link_section
;
5347 unsigned char *edata
;
5348 unsigned short *data
;
5350 Elf_Internal_Sym
*symbols
;
5351 Elf_Internal_Shdr
*string_sec
;
5353 link_section
= SECTION_HEADER (section
->sh_link
);
5354 total
= section
->sh_size
/ section
->sh_entsize
;
5358 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5360 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5362 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5363 string_sec
->sh_size
,
5364 _("version string table"));
5368 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5369 SECTION_NAME (section
), total
);
5371 printf (_(" Addr: "));
5372 printf_vma (section
->sh_addr
);
5373 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5374 (unsigned long) section
->sh_offset
, section
->sh_link
,
5375 SECTION_NAME (link_section
));
5379 get_data (NULL
, file
,
5380 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
5381 total
* sizeof (short), _("version symbol data")));
5388 data
= (unsigned short *) malloc (total
* sizeof (short));
5390 for (cnt
= total
; cnt
--;)
5391 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5396 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5399 int check_def
, check_need
;
5402 printf (" %03x:", cnt
);
5404 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5405 switch (data
[cnt
+ j
])
5408 fputs (_(" 0 (*local*) "), stdout
);
5412 fputs (_(" 1 (*global*) "), stdout
);
5416 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5417 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5421 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5424 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5431 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5433 Elf_Internal_Verneed ivn
;
5434 unsigned long offset
;
5436 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5441 Elf_Internal_Vernaux ivna
;
5442 Elf_External_Verneed evn
;
5443 Elf_External_Vernaux evna
;
5444 unsigned long a_off
;
5446 get_data (&evn
, file
, offset
, sizeof (evn
),
5449 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5450 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5452 a_off
= offset
+ ivn
.vn_aux
;
5456 get_data (&evna
, file
, a_off
, sizeof (evna
),
5457 _("version need aux (2)"));
5459 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5460 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5462 a_off
+= ivna
.vna_next
;
5464 while (ivna
.vna_other
!= data
[cnt
+ j
]
5465 && ivna
.vna_next
!= 0);
5467 if (ivna
.vna_other
== data
[cnt
+ j
])
5469 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5471 name
= strtab
+ ivna
.vna_name
;
5472 nn
+= printf ("(%s%-*s",
5474 12 - (int) strlen (name
),
5480 offset
+= ivn
.vn_next
;
5482 while (ivn
.vn_next
);
5485 if (check_def
&& data
[cnt
+ j
] != 0x8001
5486 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5488 Elf_Internal_Verdef ivd
;
5489 Elf_External_Verdef evd
;
5490 unsigned long offset
;
5492 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5497 get_data (&evd
, file
, offset
, sizeof (evd
),
5500 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5501 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5503 offset
+= ivd
.vd_next
;
5505 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5506 && ivd
.vd_next
!= 0);
5508 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5510 Elf_External_Verdaux evda
;
5511 Elf_Internal_Verdaux ivda
;
5513 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5515 get_data (&evda
, file
,
5516 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5517 sizeof (evda
), _("version def aux"));
5519 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5521 name
= strtab
+ ivda
.vda_name
;
5522 nn
+= printf ("(%s%-*s",
5524 12 - (int) strlen (name
),
5530 printf ("%*c", 18 - nn
, ' ');
5548 printf (_("\nNo version information found in this file.\n"));
5554 get_symbol_binding (binding
)
5555 unsigned int binding
;
5557 static char buff
[32];
5561 case STB_LOCAL
: return "LOCAL";
5562 case STB_GLOBAL
: return "GLOBAL";
5563 case STB_WEAK
: return "WEAK";
5565 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5566 sprintf (buff
, _("<processor specific>: %d"), binding
);
5567 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5568 sprintf (buff
, _("<OS specific>: %d"), binding
);
5570 sprintf (buff
, _("<unknown>: %d"), binding
);
5576 get_symbol_type (type
)
5579 static char buff
[32];
5583 case STT_NOTYPE
: return "NOTYPE";
5584 case STT_OBJECT
: return "OBJECT";
5585 case STT_FUNC
: return "FUNC";
5586 case STT_SECTION
: return "SECTION";
5587 case STT_FILE
: return "FILE";
5588 case STT_COMMON
: return "COMMON";
5589 case STT_TLS
: return "TLS";
5591 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5593 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5594 return "THUMB_FUNC";
5596 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5599 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5600 return "PARISC_MILLI";
5602 sprintf (buff
, _("<processor specific>: %d"), type
);
5604 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5606 if (elf_header
.e_machine
== EM_PARISC
)
5608 if (type
== STT_HP_OPAQUE
)
5610 if (type
== STT_HP_STUB
)
5614 sprintf (buff
, _("<OS specific>: %d"), type
);
5617 sprintf (buff
, _("<unknown>: %d"), type
);
5623 get_symbol_visibility (visibility
)
5624 unsigned int visibility
;
5628 case STV_DEFAULT
: return "DEFAULT";
5629 case STV_INTERNAL
: return "INTERNAL";
5630 case STV_HIDDEN
: return "HIDDEN";
5631 case STV_PROTECTED
: return "PROTECTED";
5637 get_symbol_index_type (type
)
5640 static char buff
[32];
5644 case SHN_UNDEF
: return "UND";
5645 case SHN_ABS
: return "ABS";
5646 case SHN_COMMON
: return "COM";
5648 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5649 sprintf (buff
, "PRC[0x%04x]", type
);
5650 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5651 sprintf (buff
, "OS [0x%04x]", type
);
5652 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5653 sprintf (buff
, "RSV[0x%04x]", type
);
5655 sprintf (buff
, "%3d", type
);
5663 get_dynamic_data (file
, number
)
5665 unsigned int number
;
5667 unsigned char *e_data
;
5670 e_data
= (unsigned char *) malloc (number
* 4);
5674 error (_("Out of memory\n"));
5678 if (fread (e_data
, 4, number
, file
) != number
)
5680 error (_("Unable to read in dynamic data\n"));
5684 i_data
= (int *) malloc (number
* sizeof (*i_data
));
5688 error (_("Out of memory\n"));
5694 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5701 /* Dump the symbol table. */
5703 process_symbol_table (file
)
5706 Elf_Internal_Shdr
*section
;
5707 unsigned char nb
[4];
5708 unsigned char nc
[4];
5711 int *buckets
= NULL
;
5714 if (! do_syms
&& !do_histogram
)
5717 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5720 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5722 error (_("Unable to seek to start of dynamic information"));
5726 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5728 error (_("Failed to read in number of buckets\n"));
5732 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5734 error (_("Failed to read in number of chains\n"));
5738 nbuckets
= byte_get (nb
, 4);
5739 nchains
= byte_get (nc
, 4);
5741 buckets
= get_dynamic_data (file
, nbuckets
);
5742 chains
= get_dynamic_data (file
, nchains
);
5744 if (buckets
== NULL
|| chains
== NULL
)
5749 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5754 printf (_("\nSymbol table for image:\n"));
5756 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5758 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5760 for (hn
= 0; hn
< nbuckets
; hn
++)
5765 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5767 Elf_Internal_Sym
*psym
;
5769 psym
= dynamic_symbols
+ si
;
5771 printf (" %3d %3d: ", si
, hn
);
5772 print_vma (psym
->st_value
, LONG_HEX
);
5774 print_vma (psym
->st_size
, DEC_5
);
5776 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5777 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5778 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5779 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5780 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5785 else if (do_syms
&& !do_using_dynamic
)
5789 for (i
= 0, section
= section_headers
;
5790 i
< elf_header
.e_shnum
;
5795 Elf_Internal_Sym
*symtab
;
5796 Elf_Internal_Sym
*psym
;
5799 if ( section
->sh_type
!= SHT_SYMTAB
5800 && section
->sh_type
!= SHT_DYNSYM
)
5803 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5804 SECTION_NAME (section
),
5805 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5807 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5809 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5811 symtab
= GET_ELF_SYMBOLS (file
, section
);
5815 if (section
->sh_link
== elf_header
.e_shstrndx
)
5816 strtab
= string_table
;
5819 Elf_Internal_Shdr
*string_sec
;
5821 string_sec
= SECTION_HEADER (section
->sh_link
);
5823 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5824 string_sec
->sh_size
,
5828 for (si
= 0, psym
= symtab
;
5829 si
< section
->sh_size
/ section
->sh_entsize
;
5832 printf ("%6d: ", si
);
5833 print_vma (psym
->st_value
, LONG_HEX
);
5835 print_vma (psym
->st_size
, DEC_5
);
5836 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5837 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5838 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5839 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5840 print_symbol (25, strtab
+ psym
->st_name
);
5842 if (section
->sh_type
== SHT_DYNSYM
&&
5843 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5845 unsigned char data
[2];
5846 unsigned short vers_data
;
5847 unsigned long offset
;
5851 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5854 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5855 sizeof (data
), _("version data"));
5857 vers_data
= byte_get (data
, 2);
5859 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5862 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5864 if ((vers_data
& 0x8000) || vers_data
> 1)
5866 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5867 && (is_nobits
|| ! check_def
))
5869 Elf_External_Verneed evn
;
5870 Elf_Internal_Verneed ivn
;
5871 Elf_Internal_Vernaux ivna
;
5873 /* We must test both. */
5874 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5879 unsigned long vna_off
;
5881 get_data (&evn
, file
, offset
, sizeof (evn
),
5884 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5885 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5887 vna_off
= offset
+ ivn
.vn_aux
;
5891 Elf_External_Vernaux evna
;
5893 get_data (&evna
, file
, vna_off
,
5895 _("version need aux (3)"));
5897 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5898 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5899 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5901 vna_off
+= ivna
.vna_next
;
5903 while (ivna
.vna_other
!= vers_data
5904 && ivna
.vna_next
!= 0);
5906 if (ivna
.vna_other
== vers_data
)
5909 offset
+= ivn
.vn_next
;
5911 while (ivn
.vn_next
!= 0);
5913 if (ivna
.vna_other
== vers_data
)
5916 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5919 else if (! is_nobits
)
5920 error (_("bad dynamic symbol"));
5927 if (vers_data
!= 0x8001
5928 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5930 Elf_Internal_Verdef ivd
;
5931 Elf_Internal_Verdaux ivda
;
5932 Elf_External_Verdaux evda
;
5933 unsigned long offset
;
5936 = (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5941 Elf_External_Verdef evd
;
5943 get_data (&evd
, file
, offset
, sizeof (evd
),
5946 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5947 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5948 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5950 offset
+= ivd
.vd_next
;
5952 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5953 && ivd
.vd_next
!= 0);
5955 offset
-= ivd
.vd_next
;
5956 offset
+= ivd
.vd_aux
;
5958 get_data (&evda
, file
, offset
, sizeof (evda
),
5959 _("version def aux"));
5961 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5963 if (psym
->st_name
!= ivda
.vda_name
)
5964 printf ((vers_data
& 0x8000)
5966 strtab
+ ivda
.vda_name
);
5976 if (strtab
!= string_table
)
5982 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5984 if (do_histogram
&& buckets
!= NULL
)
5991 int nzero_counts
= 0;
5994 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5996 printf (_(" Length Number %% of total Coverage\n"));
5998 lengths
= (int *) calloc (nbuckets
, sizeof (int));
5999 if (lengths
== NULL
)
6001 error (_("Out of memory"));
6004 for (hn
= 0; hn
< nbuckets
; ++hn
)
6009 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6012 if (maxlength
< ++lengths
[hn
])
6017 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
6020 error (_("Out of memory"));
6024 for (hn
= 0; hn
< nbuckets
; ++hn
)
6025 ++counts
[lengths
[hn
]];
6029 printf (" 0 %-10d (%5.1f%%)\n",
6030 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6031 for (si
= 1; si
<= maxlength
; ++si
)
6033 nzero_counts
+= counts
[si
] * si
;
6034 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6035 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6036 (nzero_counts
* 100.0) / nsyms
);
6044 if (buckets
!= NULL
)
6054 process_syminfo (file
)
6055 FILE *file ATTRIBUTE_UNUSED
;
6059 if (dynamic_syminfo
== NULL
6061 /* No syminfo, this is ok. */
6064 /* There better should be a dynamic symbol section. */
6065 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6069 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6070 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6072 printf (_(" Num: Name BoundTo Flags\n"));
6073 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6075 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6077 printf ("%4d: ", i
);
6078 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6081 switch (dynamic_syminfo
[i
].si_boundto
)
6083 case SYMINFO_BT_SELF
:
6084 fputs ("SELF ", stdout
);
6086 case SYMINFO_BT_PARENT
:
6087 fputs ("PARENT ", stdout
);
6090 if (dynamic_syminfo
[i
].si_boundto
> 0
6091 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6096 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6100 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6104 if (flags
& SYMINFO_FLG_DIRECT
)
6106 if (flags
& SYMINFO_FLG_PASSTHRU
)
6107 printf (" PASSTHRU");
6108 if (flags
& SYMINFO_FLG_COPY
)
6110 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6111 printf (" LAZYLOAD");
6119 #ifdef SUPPORT_DISASSEMBLY
6121 disassemble_section (section
, file
)
6122 Elf_Internal_Shdr
*section
;
6125 printf (_("\nAssembly dump of section %s\n"),
6126 SECTION_NAME (section
));
6128 /* XXX -- to be done --- XXX */
6135 dump_section (section
, file
)
6136 Elf_Internal_Shdr
*section
;
6139 bfd_size_type bytes
;
6141 unsigned char *data
;
6142 unsigned char *start
;
6144 bytes
= section
->sh_size
;
6148 printf (_("\nSection '%s' has no data to dump.\n"),
6149 SECTION_NAME (section
));
6153 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6155 addr
= section
->sh_addr
;
6157 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
6170 lbytes
= (bytes
> 16 ? 16 : bytes
);
6172 printf (" 0x%8.8lx ", (unsigned long) addr
);
6174 switch (elf_header
.e_ident
[EI_DATA
])
6178 for (j
= 15; j
>= 0; j
--)
6181 printf ("%2.2x", data
[j
]);
6191 for (j
= 0; j
< 16; j
++)
6194 printf ("%2.2x", data
[j
]);
6204 for (j
= 0; j
< lbytes
; j
++)
6207 if (k
>= ' ' && k
< 0x80)
6226 static unsigned long int
6227 read_leb128 (data
, length_return
, sign
)
6228 unsigned char *data
;
6232 unsigned long int result
= 0;
6233 unsigned int num_read
= 0;
6242 result
|= (byte
& 0x7f) << shift
;
6247 while (byte
& 0x80);
6249 if (length_return
!= NULL
)
6250 *length_return
= num_read
;
6252 if (sign
&& (shift
< 32) && (byte
& 0x40))
6253 result
|= -1 << shift
;
6258 typedef struct State_Machine_Registers
6260 unsigned long address
;
6263 unsigned int column
;
6267 /* This variable hold the number of the last entry seen
6268 in the File Table. */
6269 unsigned int last_file_entry
;
6272 static SMR state_machine_regs
;
6275 reset_state_machine (is_stmt
)
6278 state_machine_regs
.address
= 0;
6279 state_machine_regs
.file
= 1;
6280 state_machine_regs
.line
= 1;
6281 state_machine_regs
.column
= 0;
6282 state_machine_regs
.is_stmt
= is_stmt
;
6283 state_machine_regs
.basic_block
= 0;
6284 state_machine_regs
.end_sequence
= 0;
6285 state_machine_regs
.last_file_entry
= 0;
6288 /* Handled an extend line op. Returns true if this is the end
6291 process_extended_line_op (data
, is_stmt
, pointer_size
)
6292 unsigned char *data
;
6296 unsigned char op_code
;
6299 unsigned char *name
;
6302 len
= read_leb128 (data
, & bytes_read
, 0);
6307 warn (_("badly formed extended line op encountered!\n"));
6314 printf (_(" Extended opcode %d: "), op_code
);
6318 case DW_LNE_end_sequence
:
6319 printf (_("End of Sequence\n\n"));
6320 reset_state_machine (is_stmt
);
6323 case DW_LNE_set_address
:
6324 adr
= byte_get (data
, pointer_size
);
6325 printf (_("set Address to 0x%lx\n"), adr
);
6326 state_machine_regs
.address
= adr
;
6329 case DW_LNE_define_file
:
6330 printf (_(" define new File Table entry\n"));
6331 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6333 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6335 data
+= strlen ((char *) data
) + 1;
6336 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6338 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6340 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6341 printf (_("%s\n\n"), name
);
6345 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6352 /* Size of pointers in the .debug_line section. This information is not
6353 really present in that section. It's obtained before dumping the debug
6354 sections by doing some pre-scan of the .debug_info section. */
6355 static int debug_line_pointer_size
= 4;
6358 display_debug_lines (section
, start
, file
)
6359 Elf_Internal_Shdr
*section
;
6360 unsigned char * start
;
6361 FILE *file ATTRIBUTE_UNUSED
;
6363 DWARF2_External_LineInfo
*external
;
6364 DWARF2_Internal_LineInfo info
;
6365 unsigned char *standard_opcodes
;
6366 unsigned char *data
= start
;
6367 unsigned char *end
= start
+ section
->sh_size
;
6368 unsigned char *end_of_sequence
;
6371 printf (_("\nDump of debug contents of section %s:\n\n"),
6372 SECTION_NAME (section
));
6376 external
= (DWARF2_External_LineInfo
*) data
;
6378 /* Check the length of the block. */
6379 info
.li_length
= BYTE_GET (external
->li_length
);
6381 if (info
.li_length
== 0xffffffff)
6383 warn (_("64-bit DWARF line info is not supported yet.\n"));
6387 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
6390 (_("The line info appears to be corrupt - the section is too small\n"));
6394 /* Check its version number. */
6395 info
.li_version
= BYTE_GET (external
->li_version
);
6396 if (info
.li_version
!= 2)
6398 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6402 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
6403 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
6404 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
6405 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
6406 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
6407 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
6409 /* Sign extend the line base field. */
6410 info
.li_line_base
<<= 24;
6411 info
.li_line_base
>>= 24;
6413 printf (_(" Length: %ld\n"), info
.li_length
);
6414 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6415 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6416 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6417 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6418 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6419 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6420 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6422 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
6424 reset_state_machine (info
.li_default_is_stmt
);
6426 /* Display the contents of the Opcodes table. */
6427 standard_opcodes
= data
+ sizeof (*external
);
6429 printf (_("\n Opcodes:\n"));
6431 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6432 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6434 /* Display the contents of the Directory table. */
6435 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6438 printf (_("\n The Directory Table is empty.\n"));
6441 printf (_("\n The Directory Table:\n"));
6445 printf (_(" %s\n"), data
);
6447 data
+= strlen ((char *) data
) + 1;
6451 /* Skip the NUL at the end of the table. */
6454 /* Display the contents of the File Name table. */
6456 printf (_("\n The File Name Table is empty.\n"));
6459 printf (_("\n The File Name Table:\n"));
6460 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6464 unsigned char *name
;
6467 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6470 data
+= strlen ((char *) data
) + 1;
6472 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6474 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6476 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6478 printf (_("%s\n"), name
);
6482 /* Skip the NUL at the end of the table. */
6485 /* Now display the statements. */
6486 printf (_("\n Line Number Statements:\n"));
6489 while (data
< end_of_sequence
)
6491 unsigned char op_code
;
6497 if (op_code
>= info
.li_opcode_base
)
6499 op_code
-= info
.li_opcode_base
;
6500 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6501 state_machine_regs
.address
+= adv
;
6502 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6503 op_code
, adv
, state_machine_regs
.address
);
6504 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6505 state_machine_regs
.line
+= adv
;
6506 printf (_(" and Line by %d to %d\n"),
6507 adv
, state_machine_regs
.line
);
6509 else switch (op_code
)
6511 case DW_LNS_extended_op
:
6512 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6513 debug_line_pointer_size
);
6517 printf (_(" Copy\n"));
6520 case DW_LNS_advance_pc
:
6521 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6523 state_machine_regs
.address
+= adv
;
6524 printf (_(" Advance PC by %d to %lx\n"), adv
,
6525 state_machine_regs
.address
);
6528 case DW_LNS_advance_line
:
6529 adv
= read_leb128 (data
, & bytes_read
, 1);
6531 state_machine_regs
.line
+= adv
;
6532 printf (_(" Advance Line by %d to %d\n"), adv
,
6533 state_machine_regs
.line
);
6536 case DW_LNS_set_file
:
6537 adv
= read_leb128 (data
, & bytes_read
, 0);
6539 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6541 state_machine_regs
.file
= adv
;
6544 case DW_LNS_set_column
:
6545 adv
= read_leb128 (data
, & bytes_read
, 0);
6547 printf (_(" Set column to %d\n"), adv
);
6548 state_machine_regs
.column
= adv
;
6551 case DW_LNS_negate_stmt
:
6552 adv
= state_machine_regs
.is_stmt
;
6554 printf (_(" Set is_stmt to %d\n"), adv
);
6555 state_machine_regs
.is_stmt
= adv
;
6558 case DW_LNS_set_basic_block
:
6559 printf (_(" Set basic block\n"));
6560 state_machine_regs
.basic_block
= 1;
6563 case DW_LNS_const_add_pc
:
6564 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6565 * info
.li_min_insn_length
);
6566 state_machine_regs
.address
+= adv
;
6567 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6568 state_machine_regs
.address
);
6571 case DW_LNS_fixed_advance_pc
:
6572 adv
= byte_get (data
, 2);
6574 state_machine_regs
.address
+= adv
;
6575 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6576 adv
, state_machine_regs
.address
);
6579 case DW_LNS_set_prologue_end
:
6580 printf (_(" Set prologue_end to true\n"));
6583 case DW_LNS_set_epilogue_begin
:
6584 printf (_(" Set epilogue_begin to true\n"));
6587 case DW_LNS_set_isa
:
6588 adv
= read_leb128 (data
, & bytes_read
, 0);
6590 printf (_(" Set ISA to %d\n"), adv
);
6594 printf (_(" Unknown opcode %d with operands: "), op_code
);
6597 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6599 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6600 i
== 1 ? "" : ", ");
6615 display_debug_pubnames (section
, start
, file
)
6616 Elf_Internal_Shdr
*section
;
6617 unsigned char *start
;
6618 FILE *file ATTRIBUTE_UNUSED
;
6620 DWARF2_External_PubNames
*external
;
6621 DWARF2_Internal_PubNames pubnames
;
6624 end
= start
+ section
->sh_size
;
6626 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6630 unsigned char *data
;
6631 unsigned long offset
;
6633 external
= (DWARF2_External_PubNames
*) start
;
6635 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6636 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6637 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6638 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6640 data
= start
+ sizeof (*external
);
6641 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6643 if (pubnames
.pn_length
== 0xffffffff)
6645 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6649 if (pubnames
.pn_version
!= 2)
6651 static int warned
= 0;
6655 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6662 printf (_(" Length: %ld\n"),
6663 pubnames
.pn_length
);
6664 printf (_(" Version: %d\n"),
6665 pubnames
.pn_version
);
6666 printf (_(" Offset into .debug_info section: %ld\n"),
6667 pubnames
.pn_offset
);
6668 printf (_(" Size of area in .debug_info section: %ld\n"),
6671 printf (_("\n Offset\tName\n"));
6675 offset
= byte_get (data
, 4);
6680 printf (" %ld\t\t%s\n", offset
, data
);
6681 data
+= strlen ((char *) data
) + 1;
6684 while (offset
!= 0);
6697 case DW_TAG_padding
: return "DW_TAG_padding";
6698 case DW_TAG_array_type
: return "DW_TAG_array_type";
6699 case DW_TAG_class_type
: return "DW_TAG_class_type";
6700 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6701 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6702 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6703 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6704 case DW_TAG_label
: return "DW_TAG_label";
6705 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6706 case DW_TAG_member
: return "DW_TAG_member";
6707 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6708 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6709 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6710 case DW_TAG_string_type
: return "DW_TAG_string_type";
6711 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6712 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6713 case DW_TAG_typedef
: return "DW_TAG_typedef";
6714 case DW_TAG_union_type
: return "DW_TAG_union_type";
6715 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6716 case DW_TAG_variant
: return "DW_TAG_variant";
6717 case DW_TAG_common_block
: return "DW_TAG_common_block";
6718 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6719 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6720 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6721 case DW_TAG_module
: return "DW_TAG_module";
6722 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6723 case DW_TAG_set_type
: return "DW_TAG_set_type";
6724 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6725 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6726 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6727 case DW_TAG_base_type
: return "DW_TAG_base_type";
6728 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6729 case DW_TAG_const_type
: return "DW_TAG_const_type";
6730 case DW_TAG_constant
: return "DW_TAG_constant";
6731 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6732 case DW_TAG_file_type
: return "DW_TAG_file_type";
6733 case DW_TAG_friend
: return "DW_TAG_friend";
6734 case DW_TAG_namelist
: return "DW_TAG_namelist";
6735 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6736 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6737 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6738 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6739 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6740 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6741 case DW_TAG_try_block
: return "DW_TAG_try_block";
6742 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6743 case DW_TAG_variable
: return "DW_TAG_variable";
6744 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6745 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6746 case DW_TAG_format_label
: return "DW_TAG_format_label";
6747 case DW_TAG_function_template
: return "DW_TAG_function_template";
6748 case DW_TAG_class_template
: return "DW_TAG_class_template";
6749 /* DWARF 2.1 values. */
6750 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6751 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6752 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6753 case DW_TAG_namespace
: return "DW_TAG_namespace";
6754 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6755 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6756 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6757 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6759 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6760 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6761 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6764 static char buffer
[100];
6766 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6773 get_AT_name (attribute
)
6774 unsigned long attribute
;
6778 case DW_AT_sibling
: return "DW_AT_sibling";
6779 case DW_AT_location
: return "DW_AT_location";
6780 case DW_AT_name
: return "DW_AT_name";
6781 case DW_AT_ordering
: return "DW_AT_ordering";
6782 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6783 case DW_AT_byte_size
: return "DW_AT_byte_size";
6784 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6785 case DW_AT_bit_size
: return "DW_AT_bit_size";
6786 case DW_AT_element_list
: return "DW_AT_element_list";
6787 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6788 case DW_AT_low_pc
: return "DW_AT_low_pc";
6789 case DW_AT_high_pc
: return "DW_AT_high_pc";
6790 case DW_AT_language
: return "DW_AT_language";
6791 case DW_AT_member
: return "DW_AT_member";
6792 case DW_AT_discr
: return "DW_AT_discr";
6793 case DW_AT_discr_value
: return "DW_AT_discr_value";
6794 case DW_AT_visibility
: return "DW_AT_visibility";
6795 case DW_AT_import
: return "DW_AT_import";
6796 case DW_AT_string_length
: return "DW_AT_string_length";
6797 case DW_AT_common_reference
: return "DW_AT_common_reference";
6798 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6799 case DW_AT_const_value
: return "DW_AT_const_value";
6800 case DW_AT_containing_type
: return "DW_AT_containing_type";
6801 case DW_AT_default_value
: return "DW_AT_default_value";
6802 case DW_AT_inline
: return "DW_AT_inline";
6803 case DW_AT_is_optional
: return "DW_AT_is_optional";
6804 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6805 case DW_AT_producer
: return "DW_AT_producer";
6806 case DW_AT_prototyped
: return "DW_AT_prototyped";
6807 case DW_AT_return_addr
: return "DW_AT_return_addr";
6808 case DW_AT_start_scope
: return "DW_AT_start_scope";
6809 case DW_AT_stride_size
: return "DW_AT_stride_size";
6810 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6811 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6812 case DW_AT_accessibility
: return "DW_AT_accessibility";
6813 case DW_AT_address_class
: return "DW_AT_address_class";
6814 case DW_AT_artificial
: return "DW_AT_artificial";
6815 case DW_AT_base_types
: return "DW_AT_base_types";
6816 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6817 case DW_AT_count
: return "DW_AT_count";
6818 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6819 case DW_AT_decl_column
: return "DW_AT_decl_column";
6820 case DW_AT_decl_file
: return "DW_AT_decl_file";
6821 case DW_AT_decl_line
: return "DW_AT_decl_line";
6822 case DW_AT_declaration
: return "DW_AT_declaration";
6823 case DW_AT_discr_list
: return "DW_AT_discr_list";
6824 case DW_AT_encoding
: return "DW_AT_encoding";
6825 case DW_AT_external
: return "DW_AT_external";
6826 case DW_AT_frame_base
: return "DW_AT_frame_base";
6827 case DW_AT_friend
: return "DW_AT_friend";
6828 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6829 case DW_AT_macro_info
: return "DW_AT_macro_info";
6830 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6831 case DW_AT_priority
: return "DW_AT_priority";
6832 case DW_AT_segment
: return "DW_AT_segment";
6833 case DW_AT_specification
: return "DW_AT_specification";
6834 case DW_AT_static_link
: return "DW_AT_static_link";
6835 case DW_AT_type
: return "DW_AT_type";
6836 case DW_AT_use_location
: return "DW_AT_use_location";
6837 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6838 case DW_AT_virtuality
: return "DW_AT_virtuality";
6839 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6840 /* DWARF 2.1 values. */
6841 case DW_AT_allocated
: return "DW_AT_allocated";
6842 case DW_AT_associated
: return "DW_AT_associated";
6843 case DW_AT_data_location
: return "DW_AT_data_location";
6844 case DW_AT_stride
: return "DW_AT_stride";
6845 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6846 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6847 case DW_AT_extension
: return "DW_AT_extension";
6848 case DW_AT_ranges
: return "DW_AT_ranges";
6849 case DW_AT_trampoline
: return "DW_AT_trampoline";
6850 case DW_AT_call_column
: return "DW_AT_call_column";
6851 case DW_AT_call_file
: return "DW_AT_call_file";
6852 case DW_AT_call_line
: return "DW_AT_call_line";
6853 /* SGI/MIPS extensions. */
6854 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6855 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6856 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6857 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6858 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6859 case DW_AT_MIPS_software_pipeline_depth
:
6860 return "DW_AT_MIPS_software_pipeline_depth";
6861 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6862 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6863 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6864 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6865 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6866 /* GNU extensions. */
6867 case DW_AT_sf_names
: return "DW_AT_sf_names";
6868 case DW_AT_src_info
: return "DW_AT_src_info";
6869 case DW_AT_mac_info
: return "DW_AT_mac_info";
6870 case DW_AT_src_coords
: return "DW_AT_src_coords";
6871 case DW_AT_body_begin
: return "DW_AT_body_begin";
6872 case DW_AT_body_end
: return "DW_AT_body_end";
6873 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
6874 /* UPC extension. */
6875 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
6878 static char buffer
[100];
6880 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6887 get_FORM_name (form
)
6892 case DW_FORM_addr
: return "DW_FORM_addr";
6893 case DW_FORM_block2
: return "DW_FORM_block2";
6894 case DW_FORM_block4
: return "DW_FORM_block4";
6895 case DW_FORM_data2
: return "DW_FORM_data2";
6896 case DW_FORM_data4
: return "DW_FORM_data4";
6897 case DW_FORM_data8
: return "DW_FORM_data8";
6898 case DW_FORM_string
: return "DW_FORM_string";
6899 case DW_FORM_block
: return "DW_FORM_block";
6900 case DW_FORM_block1
: return "DW_FORM_block1";
6901 case DW_FORM_data1
: return "DW_FORM_data1";
6902 case DW_FORM_flag
: return "DW_FORM_flag";
6903 case DW_FORM_sdata
: return "DW_FORM_sdata";
6904 case DW_FORM_strp
: return "DW_FORM_strp";
6905 case DW_FORM_udata
: return "DW_FORM_udata";
6906 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6907 case DW_FORM_ref1
: return "DW_FORM_ref1";
6908 case DW_FORM_ref2
: return "DW_FORM_ref2";
6909 case DW_FORM_ref4
: return "DW_FORM_ref4";
6910 case DW_FORM_ref8
: return "DW_FORM_ref8";
6911 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6912 case DW_FORM_indirect
: return "DW_FORM_indirect";
6915 static char buffer
[100];
6917 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6923 /* FIXME: There are better and more effiecint ways to handle
6924 these structures. For now though, I just want something that
6925 is simple to implement. */
6926 typedef struct abbrev_attr
6928 unsigned long attribute
;
6930 struct abbrev_attr
*next
;
6934 typedef struct abbrev_entry
6936 unsigned long entry
;
6939 struct abbrev_attr
*first_attr
;
6940 struct abbrev_attr
*last_attr
;
6941 struct abbrev_entry
*next
;
6945 static abbrev_entry
*first_abbrev
= NULL
;
6946 static abbrev_entry
*last_abbrev
= NULL
;
6951 abbrev_entry
*abbrev
;
6953 for (abbrev
= first_abbrev
; abbrev
;)
6955 abbrev_entry
*next
= abbrev
->next
;
6958 for (attr
= abbrev
->first_attr
; attr
;)
6960 abbrev_attr
*next
= attr
->next
;
6970 last_abbrev
= first_abbrev
= NULL
;
6974 add_abbrev (number
, tag
, children
)
6975 unsigned long number
;
6979 abbrev_entry
*entry
;
6981 entry
= (abbrev_entry
*) malloc (sizeof (*entry
));
6987 entry
->entry
= number
;
6989 entry
->children
= children
;
6990 entry
->first_attr
= NULL
;
6991 entry
->last_attr
= NULL
;
6994 if (first_abbrev
== NULL
)
6995 first_abbrev
= entry
;
6997 last_abbrev
->next
= entry
;
6999 last_abbrev
= entry
;
7003 add_abbrev_attr (attribute
, form
)
7004 unsigned long attribute
;
7009 attr
= (abbrev_attr
*) malloc (sizeof (*attr
));
7015 attr
->attribute
= attribute
;
7019 if (last_abbrev
->first_attr
== NULL
)
7020 last_abbrev
->first_attr
= attr
;
7022 last_abbrev
->last_attr
->next
= attr
;
7024 last_abbrev
->last_attr
= attr
;
7027 /* Processes the (partial) contents of a .debug_abbrev section.
7028 Returns NULL if the end of the section was encountered.
7029 Returns the address after the last byte read if the end of
7030 an abbreviation set was found. */
7032 static unsigned char *
7033 process_abbrev_section (start
, end
)
7034 unsigned char *start
;
7037 if (first_abbrev
!= NULL
)
7043 unsigned long entry
;
7045 unsigned long attribute
;
7048 entry
= read_leb128 (start
, & bytes_read
, 0);
7049 start
+= bytes_read
;
7051 /* A single zero is supposed to end the section according
7052 to the standard. If there's more, then signal that to
7055 return start
== end
? NULL
: start
;
7057 tag
= read_leb128 (start
, & bytes_read
, 0);
7058 start
+= bytes_read
;
7060 children
= *start
++;
7062 add_abbrev (entry
, tag
, children
);
7068 attribute
= read_leb128 (start
, & bytes_read
, 0);
7069 start
+= bytes_read
;
7071 form
= read_leb128 (start
, & bytes_read
, 0);
7072 start
+= bytes_read
;
7075 add_abbrev_attr (attribute
, form
);
7077 while (attribute
!= 0);
7085 display_debug_macinfo (section
, start
, file
)
7086 Elf_Internal_Shdr
*section
;
7087 unsigned char *start
;
7088 FILE *file ATTRIBUTE_UNUSED
;
7090 unsigned char *end
= start
+ section
->sh_size
;
7091 unsigned char *curr
= start
;
7092 unsigned int bytes_read
;
7093 enum dwarf_macinfo_record_type op
;
7095 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7099 unsigned int lineno
;
7107 case DW_MACINFO_start_file
:
7109 unsigned int filenum
;
7111 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7113 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7116 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7120 case DW_MACINFO_end_file
:
7121 printf (_(" DW_MACINFO_end_file\n"));
7124 case DW_MACINFO_define
:
7125 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7128 curr
+= strlen (string
) + 1;
7129 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7132 case DW_MACINFO_undef
:
7133 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7136 curr
+= strlen (string
) + 1;
7137 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7140 case DW_MACINFO_vendor_ext
:
7142 unsigned int constant
;
7144 constant
= read_leb128 (curr
, & bytes_read
, 0);
7147 curr
+= strlen (string
) + 1;
7148 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7159 display_debug_abbrev (section
, start
, file
)
7160 Elf_Internal_Shdr
*section
;
7161 unsigned char *start
;
7162 FILE *file ATTRIBUTE_UNUSED
;
7164 abbrev_entry
*entry
;
7165 unsigned char *end
= start
+ section
->sh_size
;
7167 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7171 start
= process_abbrev_section (start
, end
);
7173 if (first_abbrev
== NULL
)
7176 printf (_(" Number TAG\n"));
7178 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7182 printf (_(" %ld %s [%s]\n"),
7184 get_TAG_name (entry
->tag
),
7185 entry
->children
? _("has children") : _("no children"));
7187 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7189 printf (_(" %-18s %s\n"),
7190 get_AT_name (attr
->attribute
),
7191 get_FORM_name (attr
->form
));
7205 static unsigned char *
7206 display_block (data
, length
)
7207 unsigned char *data
;
7208 unsigned long length
;
7210 printf (_(" %lu byte block: "), length
);
7213 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7219 decode_location_expression (data
, pointer_size
, length
)
7220 unsigned char * data
;
7221 unsigned int pointer_size
;
7222 unsigned long length
;
7226 unsigned long uvalue
;
7227 unsigned char *end
= data
+ length
;
7236 printf ("DW_OP_addr: %lx",
7237 (unsigned long) byte_get (data
, pointer_size
));
7238 data
+= pointer_size
;
7241 printf ("DW_OP_deref");
7244 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7247 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7250 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7254 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7258 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7262 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7266 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7267 (unsigned long) byte_get (data
+ 4, 4));
7271 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7272 (long) byte_get (data
+ 4, 4));
7276 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7280 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7284 printf ("DW_OP_dup");
7287 printf ("DW_OP_drop");
7290 printf ("DW_OP_over");
7293 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7296 printf ("DW_OP_swap");
7299 printf ("DW_OP_rot");
7302 printf ("DW_OP_xderef");
7305 printf ("DW_OP_abs");
7308 printf ("DW_OP_and");
7311 printf ("DW_OP_div");
7314 printf ("DW_OP_minus");
7317 printf ("DW_OP_mod");
7320 printf ("DW_OP_mul");
7323 printf ("DW_OP_neg");
7326 printf ("DW_OP_not");
7329 printf ("DW_OP_or");
7332 printf ("DW_OP_plus");
7334 case DW_OP_plus_uconst
:
7335 printf ("DW_OP_plus_uconst: %lu",
7336 read_leb128 (data
, &bytes_read
, 0));
7340 printf ("DW_OP_shl");
7343 printf ("DW_OP_shr");
7346 printf ("DW_OP_shra");
7349 printf ("DW_OP_xor");
7352 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7356 printf ("DW_OP_eq");
7359 printf ("DW_OP_ge");
7362 printf ("DW_OP_gt");
7365 printf ("DW_OP_le");
7368 printf ("DW_OP_lt");
7371 printf ("DW_OP_ne");
7374 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7410 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7445 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7480 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7481 read_leb128 (data
, &bytes_read
, 1));
7486 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7490 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7494 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7496 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7497 read_leb128 (data
, &bytes_read
, 1));
7501 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7504 case DW_OP_deref_size
:
7505 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7507 case DW_OP_xderef_size
:
7508 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7511 printf ("DW_OP_nop");
7514 /* DWARF 3 extensions. */
7515 case DW_OP_push_object_address
:
7516 printf ("DW_OP_push_object_address");
7519 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7523 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7526 case DW_OP_call_ref
:
7527 printf ("DW_OP_call_ref");
7530 /* GNU extensions. */
7531 case DW_OP_GNU_push_tls_address
:
7532 printf ("DW_OP_GNU_push_tls_address");
7536 if (op
>= DW_OP_lo_user
7537 && op
<= DW_OP_hi_user
)
7538 printf (_("(User defined location op)"));
7540 printf (_("(Unknown location op)"));
7541 /* No way to tell where the next op is, so just bail. */
7545 /* Separate the ops. */
7550 static const char *debug_loc_contents
;
7551 static bfd_vma debug_loc_size
;
7554 load_debug_loc (file
)
7557 Elf_Internal_Shdr
*sec
;
7560 /* If it is already loaded, do nothing. */
7561 if (debug_loc_contents
!= NULL
)
7564 /* Locate the .debug_loc section. */
7565 for (i
= 0, sec
= section_headers
;
7566 i
< elf_header
.e_shnum
;
7568 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7571 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7574 debug_loc_size
= sec
->sh_size
;
7576 debug_loc_contents
= ((char *)
7577 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7578 _("debug_loc section data")));
7584 if (debug_loc_contents
== NULL
)
7587 free ((char *) debug_loc_contents
);
7588 debug_loc_contents
= NULL
;
7594 display_debug_loc (section
, start
, file
)
7595 Elf_Internal_Shdr
*section
;
7596 unsigned char *start
;
7597 FILE *file ATTRIBUTE_UNUSED
;
7599 unsigned char *section_end
;
7600 unsigned long bytes
;
7601 unsigned char *section_begin
= start
;
7604 addr
= section
->sh_addr
;
7605 bytes
= section
->sh_size
;
7606 section_end
= start
+ bytes
;
7610 printf (_("\nThe .debug_loc section is empty.\n"));
7614 printf (_("Contents of the .debug_loc section:\n\n"));
7615 printf (_("\n Offset Begin End Expression\n"));
7617 while (start
< section_end
)
7619 unsigned long begin
;
7621 unsigned short length
;
7622 unsigned long offset
;
7624 offset
= start
- section_begin
;
7628 /* Normally, the lists in the debug_loc section are related to a
7629 given compilation unit, and thus, we would use the
7630 pointer size of that compilation unit. However, since we are
7631 displaying it seperately here, we either have to store
7632 pointer sizes of all compilation units, or assume they don't
7633 change. We assume, like the debug_line display, that
7634 it doesn't change. */
7635 begin
= byte_get (start
, debug_line_pointer_size
);
7636 start
+= debug_line_pointer_size
;
7637 end
= byte_get (start
, debug_line_pointer_size
);
7638 start
+= debug_line_pointer_size
;
7640 if (begin
== 0 && end
== 0)
7646 length
= byte_get (start
, 2);
7649 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7650 decode_location_expression (start
, debug_line_pointer_size
, length
);
7660 static const char *debug_str_contents
;
7661 static bfd_vma debug_str_size
;
7664 load_debug_str (file
)
7667 Elf_Internal_Shdr
*sec
;
7670 /* If it is already loaded, do nothing. */
7671 if (debug_str_contents
!= NULL
)
7674 /* Locate the .debug_str section. */
7675 for (i
= 0, sec
= section_headers
;
7676 i
< elf_header
.e_shnum
;
7678 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7681 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7684 debug_str_size
= sec
->sh_size
;
7686 debug_str_contents
= ((char *)
7687 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7688 _("debug_str section data")));
7694 if (debug_str_contents
== NULL
)
7697 free ((char *) debug_str_contents
);
7698 debug_str_contents
= NULL
;
7703 fetch_indirect_string (offset
)
7704 unsigned long offset
;
7706 if (debug_str_contents
== NULL
)
7707 return _("<no .debug_str section>");
7709 if (offset
> debug_str_size
)
7710 return _("<offset is too big>");
7712 return debug_str_contents
+ offset
;
7716 display_debug_str (section
, start
, file
)
7717 Elf_Internal_Shdr
*section
;
7718 unsigned char *start
;
7719 FILE *file ATTRIBUTE_UNUSED
;
7721 unsigned long bytes
;
7724 addr
= section
->sh_addr
;
7725 bytes
= section
->sh_size
;
7729 printf (_("\nThe .debug_str section is empty.\n"));
7733 printf (_("Contents of the .debug_str section:\n\n"));
7741 lbytes
= (bytes
> 16 ? 16 : bytes
);
7743 printf (" 0x%8.8lx ", (unsigned long) addr
);
7745 for (j
= 0; j
< 16; j
++)
7748 printf ("%2.2x", start
[j
]);
7756 for (j
= 0; j
< lbytes
; j
++)
7759 if (k
>= ' ' && k
< 0x80)
7775 static unsigned char *
7776 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7777 unsigned long attribute
;
7779 unsigned char *data
;
7780 unsigned long cu_offset
;
7781 unsigned long pointer_size
;
7783 unsigned long uvalue
= 0;
7784 unsigned char *block_start
= NULL
;
7792 case DW_FORM_ref_addr
:
7794 uvalue
= byte_get (data
, pointer_size
);
7795 data
+= pointer_size
;
7799 uvalue
= byte_get (data
, /* offset_size */ 4);
7800 data
+= /* offset_size */ 4;
7806 uvalue
= byte_get (data
++, 1);
7811 uvalue
= byte_get (data
, 2);
7817 uvalue
= byte_get (data
, 4);
7822 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7826 case DW_FORM_ref_udata
:
7828 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7832 case DW_FORM_indirect
:
7833 form
= read_leb128 (data
, & bytes_read
, 0);
7835 printf (" %s", get_FORM_name (form
));
7836 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7842 case DW_FORM_ref_addr
:
7843 printf (" <#%lx>", uvalue
);
7849 case DW_FORM_ref_udata
:
7850 printf (" <%lx>", uvalue
+ cu_offset
);
7854 printf (" %#lx", uvalue
);
7862 printf (" %ld", uvalue
);
7867 uvalue
= byte_get (data
, 4);
7868 printf (" %lx", uvalue
);
7869 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7873 case DW_FORM_string
:
7874 printf (" %s", data
);
7875 data
+= strlen ((char *) data
) + 1;
7879 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7880 block_start
= data
+ bytes_read
;
7881 data
= display_block (block_start
, uvalue
);
7884 case DW_FORM_block1
:
7885 uvalue
= byte_get (data
, 1);
7886 block_start
= data
+ 1;
7887 data
= display_block (block_start
, uvalue
);
7890 case DW_FORM_block2
:
7891 uvalue
= byte_get (data
, 2);
7892 block_start
= data
+ 2;
7893 data
= display_block (block_start
, uvalue
);
7896 case DW_FORM_block4
:
7897 uvalue
= byte_get (data
, 4);
7898 block_start
= data
+ 4;
7899 data
= display_block (block_start
, uvalue
);
7903 printf (_(" (indirect string, offset: 0x%lx): %s"),
7904 uvalue
, fetch_indirect_string (uvalue
));
7907 case DW_FORM_indirect
:
7908 /* Handled above. */
7912 warn (_("Unrecognized form: %d\n"), form
);
7916 /* For some attributes we can display futher information. */
7925 case DW_INL_not_inlined
:
7926 printf (_("(not inlined)"));
7928 case DW_INL_inlined
:
7929 printf (_("(inlined)"));
7931 case DW_INL_declared_not_inlined
:
7932 printf (_("(declared as inline but ignored)"));
7934 case DW_INL_declared_inlined
:
7935 printf (_("(declared as inline and inlined)"));
7938 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
7943 case DW_AT_language
:
7946 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7947 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7948 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7949 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7950 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7951 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7952 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7953 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7954 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7955 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7956 /* DWARF 2.1 values. */
7957 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7958 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7959 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7960 /* MIPS extension. */
7961 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7962 /* UPC extension. */
7963 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
7965 printf ("(Unknown: %lx)", uvalue
);
7970 case DW_AT_encoding
:
7973 case DW_ATE_void
: printf ("(void)"); break;
7974 case DW_ATE_address
: printf ("(machine address)"); break;
7975 case DW_ATE_boolean
: printf ("(boolean)"); break;
7976 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7977 case DW_ATE_float
: printf ("(float)"); break;
7978 case DW_ATE_signed
: printf ("(signed)"); break;
7979 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7980 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7981 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7982 /* DWARF 2.1 value. */
7983 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7985 if (uvalue
>= DW_ATE_lo_user
7986 && uvalue
<= DW_ATE_hi_user
)
7987 printf ("(user defined type)");
7989 printf ("(unknown type)");
7994 case DW_AT_accessibility
:
7997 case DW_ACCESS_public
: printf ("(public)"); break;
7998 case DW_ACCESS_protected
: printf ("(protected)"); break;
7999 case DW_ACCESS_private
: printf ("(private)"); break;
8001 printf ("(unknown accessibility)");
8006 case DW_AT_visibility
:
8009 case DW_VIS_local
: printf ("(local)"); break;
8010 case DW_VIS_exported
: printf ("(exported)"); break;
8011 case DW_VIS_qualified
: printf ("(qualified)"); break;
8012 default: printf ("(unknown visibility)"); break;
8016 case DW_AT_virtuality
:
8019 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8020 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8021 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8022 default: printf ("(unknown virtuality)"); break;
8026 case DW_AT_identifier_case
:
8029 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8030 case DW_ID_up_case
: printf ("(up_case)"); break;
8031 case DW_ID_down_case
: printf ("(down_case)"); break;
8032 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8033 default: printf ("(unknown case)"); break;
8037 case DW_AT_calling_convention
:
8040 case DW_CC_normal
: printf ("(normal)"); break;
8041 case DW_CC_program
: printf ("(program)"); break;
8042 case DW_CC_nocall
: printf ("(nocall)"); break;
8044 if (uvalue
>= DW_CC_lo_user
8045 && uvalue
<= DW_CC_hi_user
)
8046 printf ("(user defined)");
8048 printf ("(unknown convention)");
8052 case DW_AT_ordering
:
8055 case -1: printf ("(undefined)"); break;
8056 case 0: printf ("(row major)"); break;
8057 case 1: printf ("(column major)"); break;
8061 case DW_AT_frame_base
:
8062 case DW_AT_location
:
8063 case DW_AT_data_member_location
:
8064 case DW_AT_vtable_elem_location
:
8065 case DW_AT_allocated
:
8066 case DW_AT_associated
:
8067 case DW_AT_data_location
:
8069 case DW_AT_upper_bound
:
8070 case DW_AT_lower_bound
:
8074 decode_location_expression (block_start
, pointer_size
, uvalue
);
8077 else if (form
== DW_FORM_data4
)
8080 printf ("location list");
8092 static unsigned char *
8093 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
8094 unsigned long attribute
;
8096 unsigned char *data
;
8097 unsigned long cu_offset
;
8098 unsigned long pointer_size
;
8100 printf (" %-18s:", get_AT_name (attribute
));
8101 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8108 display_debug_info (section
, start
, file
)
8109 Elf_Internal_Shdr
*section
;
8110 unsigned char *start
;
8113 unsigned char *end
= start
+ section
->sh_size
;
8114 unsigned char *section_begin
= start
;
8116 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8118 load_debug_str (file
);
8119 load_debug_loc (file
);
8123 DWARF2_External_CompUnit
*external
;
8124 DWARF2_Internal_CompUnit compunit
;
8125 Elf_Internal_Shdr
*relsec
;
8126 unsigned char *tags
;
8129 unsigned long cu_offset
;
8131 external
= (DWARF2_External_CompUnit
*) start
;
8133 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
8134 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
8135 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
8136 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8138 if (compunit
.cu_length
== 0xffffffff)
8140 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8144 /* Check for RELA relocations in the
8145 abbrev_offset address, and apply them. */
8146 for (relsec
= section_headers
;
8147 relsec
< section_headers
+ elf_header
.e_shnum
;
8150 unsigned long nrelas
;
8151 Elf_Internal_Rela
*rela
, *rp
;
8152 Elf_Internal_Shdr
*symsec
;
8153 Elf_Internal_Sym
*symtab
;
8154 Elf_Internal_Sym
*sym
;
8156 if (relsec
->sh_type
!= SHT_RELA
8157 || SECTION_HEADER (relsec
->sh_info
) != section
8158 || relsec
->sh_size
== 0)
8161 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8165 symsec
= SECTION_HEADER (relsec
->sh_link
);
8166 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8168 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8171 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
8177 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8179 if (ELF32_R_SYM (rp
->r_info
) != 0
8180 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8182 warn (_("Skipping unexpected symbol type %u\n"),
8183 ELF32_ST_TYPE (sym
->st_info
));
8189 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8191 if (ELF64_R_SYM (rp
->r_info
) != 0
8192 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8194 warn (_("Skipping unexpected symbol type %u\n"),
8195 ELF64_ST_TYPE (sym
->st_info
));
8200 compunit
.cu_abbrev_offset
= rp
->r_addend
;
8208 tags
= start
+ sizeof (*external
);
8209 cu_offset
= start
- section_begin
;
8210 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
8212 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8213 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8214 printf (_(" Version: %d\n"), compunit
.cu_version
);
8215 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8216 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8218 if (compunit
.cu_version
!= 2)
8220 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8226 /* Read in the abbrevs used by this compilation unit. */
8228 Elf_Internal_Shdr
*sec
;
8229 unsigned char *begin
;
8231 /* Locate the .debug_abbrev section and process it. */
8232 for (i
= 0, sec
= section_headers
;
8233 i
< elf_header
.e_shnum
;
8235 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8238 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8240 warn (_("Unable to locate .debug_abbrev section!\n"));
8244 begin
= ((unsigned char *)
8245 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8246 _("debug_abbrev section data")));
8250 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8251 begin
+ sec
->sh_size
);
8257 while (tags
< start
)
8260 unsigned long abbrev_number
;
8261 abbrev_entry
*entry
;
8264 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8267 /* A null DIE marks the end of a list of children. */
8268 if (abbrev_number
== 0)
8274 /* Scan through the abbreviation list until we reach the
8276 for (entry
= first_abbrev
;
8277 entry
&& entry
->entry
!= abbrev_number
;
8278 entry
= entry
->next
)
8283 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8288 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8290 (unsigned long) (tags
- section_begin
- bytes_read
),
8292 get_TAG_name (entry
->tag
));
8294 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8295 tags
= read_and_display_attr (attr
->attribute
,
8298 compunit
.cu_pointer_size
);
8300 if (entry
->children
)
8314 display_debug_aranges (section
, start
, file
)
8315 Elf_Internal_Shdr
*section
;
8316 unsigned char *start
;
8317 FILE *file ATTRIBUTE_UNUSED
;
8319 unsigned char *end
= start
+ section
->sh_size
;
8321 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8325 DWARF2_External_ARange
*external
;
8326 DWARF2_Internal_ARange arange
;
8327 unsigned char *ranges
;
8328 unsigned long length
;
8329 unsigned long address
;
8332 external
= (DWARF2_External_ARange
*) start
;
8334 arange
.ar_length
= BYTE_GET (external
->ar_length
);
8335 arange
.ar_version
= BYTE_GET (external
->ar_version
);
8336 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
8337 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
8338 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
8340 if (arange
.ar_length
== 0xffffffff)
8342 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8346 if (arange
.ar_version
!= 2)
8348 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8352 printf (_(" Length: %ld\n"), arange
.ar_length
);
8353 printf (_(" Version: %d\n"), arange
.ar_version
);
8354 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8355 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8356 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8358 printf (_("\n Address Length\n"));
8360 ranges
= start
+ sizeof (*external
);
8362 /* Must pad to an alignment boundary that is twice the pointer size. */
8363 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
8365 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8369 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8371 ranges
+= arange
.ar_pointer_size
;
8373 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8375 ranges
+= arange
.ar_pointer_size
;
8377 /* A pair of zeros marks the end of the list. */
8378 if (address
== 0 && length
== 0)
8381 printf (" %8.8lx %lu\n", address
, length
);
8384 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
8392 typedef struct Frame_Chunk
8394 struct Frame_Chunk
*next
;
8395 unsigned char *chunk_start
;
8397 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8398 short int *col_type
;
8401 unsigned int code_factor
;
8403 unsigned long pc_begin
;
8404 unsigned long pc_range
;
8408 unsigned char fde_encoding
;
8412 /* A marker for a col_type that means this column was never referenced
8413 in the frame info. */
8414 #define DW_CFA_unreferenced (-1)
8416 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
8417 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
8418 static int size_of_encoded_value
PARAMS ((int));
8421 frame_need_space (fc
, reg
)
8425 int prev
= fc
->ncols
;
8427 if (reg
< fc
->ncols
)
8430 fc
->ncols
= reg
+ 1;
8431 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
8432 fc
->ncols
* sizeof (short int));
8433 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
8434 fc
->ncols
* sizeof (int));
8436 while (prev
< fc
->ncols
)
8438 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8439 fc
->col_offset
[prev
] = 0;
8445 frame_display_row (fc
, need_col_headers
, max_regs
)
8447 int *need_col_headers
;
8453 if (*max_regs
< fc
->ncols
)
8454 *max_regs
= fc
->ncols
;
8456 if (*need_col_headers
)
8458 *need_col_headers
= 0;
8460 printf (" LOC CFA ");
8462 for (r
= 0; r
< *max_regs
; r
++)
8463 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8468 printf ("r%-4d", r
);
8474 printf ("%08lx ", fc
->pc_begin
);
8475 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8476 printf ("%-8s ", tmp
);
8478 for (r
= 0; r
< fc
->ncols
; r
++)
8480 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8482 switch (fc
->col_type
[r
])
8484 case DW_CFA_undefined
:
8487 case DW_CFA_same_value
:
8491 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8493 case DW_CFA_register
:
8494 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8497 strcpy (tmp
, "n/a");
8500 printf ("%-5s", tmp
);
8507 size_of_encoded_value (encoding
)
8510 switch (encoding
& 0x7)
8513 case 0: return is_32bit_elf
? 4 : 8;
8520 #define GET(N) byte_get (start, N); start += N
8521 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8522 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8525 display_debug_frames (section
, start
, file
)
8526 Elf_Internal_Shdr
*section
;
8527 unsigned char *start
;
8528 FILE *file ATTRIBUTE_UNUSED
;
8530 unsigned char *end
= start
+ section
->sh_size
;
8531 unsigned char *section_start
= start
;
8532 Frame_Chunk
*chunks
= 0;
8533 Frame_Chunk
*remembered_state
= 0;
8535 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8538 int addr_size
= is_32bit_elf
? 4 : 8;
8540 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8544 unsigned char *saved_start
;
8545 unsigned char *block_end
;
8546 unsigned long length
;
8547 unsigned long cie_id
;
8550 int need_col_headers
= 1;
8551 unsigned char *augmentation_data
= NULL
;
8552 unsigned long augmentation_data_len
= 0;
8553 int encoded_ptr_size
= addr_size
;
8555 saved_start
= start
;
8556 length
= byte_get (start
, 4); start
+= 4;
8560 printf ("\n%08lx ZERO terminator\n\n",
8561 (unsigned long)(saved_start
- section_start
));
8565 if (length
== 0xffffffff)
8567 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8571 block_end
= saved_start
+ length
+ 4;
8572 cie_id
= byte_get (start
, 4); start
+= 4;
8574 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8578 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8579 memset (fc
, 0, sizeof (Frame_Chunk
));
8583 fc
->chunk_start
= saved_start
;
8585 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8586 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8587 frame_need_space (fc
, max_regs
-1);
8591 fc
->augmentation
= start
;
8592 start
= strchr (start
, '\0') + 1;
8594 if (fc
->augmentation
[0] == 'z')
8596 fc
->code_factor
= LEB ();
8597 fc
->data_factor
= SLEB ();
8598 fc
->ra
= byte_get (start
, 1); start
+= 1;
8599 augmentation_data_len
= LEB ();
8600 augmentation_data
= start
;
8601 start
+= augmentation_data_len
;
8603 else if (strcmp (fc
->augmentation
, "eh") == 0)
8606 fc
->code_factor
= LEB ();
8607 fc
->data_factor
= SLEB ();
8608 fc
->ra
= byte_get (start
, 1); start
+= 1;
8612 fc
->code_factor
= LEB ();
8613 fc
->data_factor
= SLEB ();
8614 fc
->ra
= byte_get (start
, 1); start
+= 1;
8618 if (do_debug_frames_interp
)
8619 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8620 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8621 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8625 printf ("\n%08lx %08lx %08lx CIE\n",
8626 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8627 printf (" Version: %d\n", version
);
8628 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8629 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8630 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8631 printf (" Return address column: %d\n", fc
->ra
);
8633 if (augmentation_data_len
)
8636 printf (" Augmentation data: ");
8637 for (i
= 0; i
< augmentation_data_len
; ++i
)
8638 printf (" %02x", augmentation_data
[i
]);
8644 if (augmentation_data_len
)
8646 unsigned char *p
, *q
;
8647 p
= fc
->augmentation
+ 1;
8648 q
= augmentation_data
;
8655 q
+= 1 + size_of_encoded_value (*q
);
8657 fc
->fde_encoding
= *q
++;
8663 if (fc
->fde_encoding
)
8664 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8667 frame_need_space (fc
, fc
->ra
);
8671 unsigned char *look_for
;
8672 static Frame_Chunk fde_fc
;
8675 memset (fc
, 0, sizeof (Frame_Chunk
));
8677 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8679 for (cie
= chunks
; cie
; cie
= cie
->next
)
8680 if (cie
->chunk_start
== look_for
)
8685 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8686 cie_id
, saved_start
);
8689 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8690 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8691 frame_need_space (fc
, max_regs
- 1);
8693 fc
->augmentation
= "";
8694 fc
->fde_encoding
= 0;
8698 fc
->ncols
= cie
->ncols
;
8699 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8700 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8701 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8702 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8703 fc
->augmentation
= cie
->augmentation
;
8704 fc
->code_factor
= cie
->code_factor
;
8705 fc
->data_factor
= cie
->data_factor
;
8706 fc
->cfa_reg
= cie
->cfa_reg
;
8707 fc
->cfa_offset
= cie
->cfa_offset
;
8709 frame_need_space (fc
, max_regs
-1);
8710 fc
->fde_encoding
= cie
->fde_encoding
;
8713 if (fc
->fde_encoding
)
8714 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8716 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8717 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8718 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
8719 start
+= encoded_ptr_size
;
8720 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8721 start
+= encoded_ptr_size
;
8723 if (cie
->augmentation
[0] == 'z')
8725 augmentation_data_len
= LEB ();
8726 augmentation_data
= start
;
8727 start
+= augmentation_data_len
;
8730 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8731 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8732 (unsigned long)(cie
->chunk_start
- section_start
),
8733 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8734 if (! do_debug_frames_interp
&& augmentation_data_len
)
8737 printf (" Augmentation data: ");
8738 for (i
= 0; i
< augmentation_data_len
; ++i
)
8739 printf (" %02x", augmentation_data
[i
]);
8745 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8746 about to interpret instructions for the chunk. */
8748 if (do_debug_frames_interp
)
8750 /* Start by making a pass over the chunk, allocating storage
8751 and taking note of what registers are used. */
8752 unsigned char *tmp
= start
;
8754 while (start
< block_end
)
8764 /* Warning: if you add any more cases to this switch, be
8765 sure to add them to the corresponding switch below. */
8768 case DW_CFA_advance_loc
:
8772 frame_need_space (fc
, opa
);
8773 fc
->col_type
[opa
] = DW_CFA_undefined
;
8775 case DW_CFA_restore
:
8776 frame_need_space (fc
, opa
);
8777 fc
->col_type
[opa
] = DW_CFA_undefined
;
8779 case DW_CFA_set_loc
:
8780 start
+= encoded_ptr_size
;
8782 case DW_CFA_advance_loc1
:
8785 case DW_CFA_advance_loc2
:
8788 case DW_CFA_advance_loc4
:
8791 case DW_CFA_offset_extended
:
8792 reg
= LEB (); LEB ();
8793 frame_need_space (fc
, reg
);
8794 fc
->col_type
[reg
] = DW_CFA_undefined
;
8796 case DW_CFA_restore_extended
:
8798 frame_need_space (fc
, reg
);
8799 fc
->col_type
[reg
] = DW_CFA_undefined
;
8801 case DW_CFA_undefined
:
8803 frame_need_space (fc
, reg
);
8804 fc
->col_type
[reg
] = DW_CFA_undefined
;
8806 case DW_CFA_same_value
:
8808 frame_need_space (fc
, reg
);
8809 fc
->col_type
[reg
] = DW_CFA_undefined
;
8811 case DW_CFA_register
:
8812 reg
= LEB (); LEB ();
8813 frame_need_space (fc
, reg
);
8814 fc
->col_type
[reg
] = DW_CFA_undefined
;
8816 case DW_CFA_def_cfa
:
8819 case DW_CFA_def_cfa_register
:
8822 case DW_CFA_def_cfa_offset
:
8825 case DW_CFA_offset_extended_sf
:
8826 reg
= LEB (); SLEB ();
8827 frame_need_space (fc
, reg
);
8828 fc
->col_type
[reg
] = DW_CFA_undefined
;
8830 case DW_CFA_def_cfa_sf
:
8833 case DW_CFA_def_cfa_offset_sf
:
8836 case DW_CFA_GNU_args_size
:
8839 case DW_CFA_GNU_negative_offset_extended
:
8840 reg
= LEB (); LEB ();
8841 frame_need_space (fc
, reg
);
8842 fc
->col_type
[reg
] = DW_CFA_undefined
;
8851 /* Now we know what registers are used, make a second pass over
8852 the chunk, this time actually printing out the info. */
8854 while (start
< block_end
)
8857 unsigned long ul
, reg
, roffs
;
8866 /* Warning: if you add any more cases to this switch, be
8867 sure to add them to the corresponding switch above. */
8870 case DW_CFA_advance_loc
:
8871 if (do_debug_frames_interp
)
8872 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8874 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8875 opa
* fc
->code_factor
,
8876 fc
->pc_begin
+ opa
* fc
->code_factor
);
8877 fc
->pc_begin
+= opa
* fc
->code_factor
;
8882 if (! do_debug_frames_interp
)
8883 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8884 opa
, roffs
* fc
->data_factor
);
8885 fc
->col_type
[opa
] = DW_CFA_offset
;
8886 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8889 case DW_CFA_restore
:
8890 if (! do_debug_frames_interp
)
8891 printf (" DW_CFA_restore: r%d\n", opa
);
8892 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8893 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8896 case DW_CFA_set_loc
:
8897 vma
= byte_get (start
, encoded_ptr_size
);
8898 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8899 vma
+= section
->sh_addr
+ (start
- section_start
);
8900 start
+= encoded_ptr_size
;
8901 if (do_debug_frames_interp
)
8902 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8904 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8908 case DW_CFA_advance_loc1
:
8909 ofs
= byte_get (start
, 1); start
+= 1;
8910 if (do_debug_frames_interp
)
8911 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8913 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8914 ofs
* fc
->code_factor
,
8915 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8916 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8919 case DW_CFA_advance_loc2
:
8920 ofs
= byte_get (start
, 2); start
+= 2;
8921 if (do_debug_frames_interp
)
8922 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8924 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8925 ofs
* fc
->code_factor
,
8926 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8927 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8930 case DW_CFA_advance_loc4
:
8931 ofs
= byte_get (start
, 4); start
+= 4;
8932 if (do_debug_frames_interp
)
8933 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8935 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8936 ofs
* fc
->code_factor
,
8937 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8938 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8941 case DW_CFA_offset_extended
:
8944 if (! do_debug_frames_interp
)
8945 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8946 reg
, roffs
* fc
->data_factor
);
8947 fc
->col_type
[reg
] = DW_CFA_offset
;
8948 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8951 case DW_CFA_restore_extended
:
8953 if (! do_debug_frames_interp
)
8954 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8955 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8956 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8959 case DW_CFA_undefined
:
8961 if (! do_debug_frames_interp
)
8962 printf (" DW_CFA_undefined: r%ld\n", reg
);
8963 fc
->col_type
[reg
] = DW_CFA_undefined
;
8964 fc
->col_offset
[reg
] = 0;
8967 case DW_CFA_same_value
:
8969 if (! do_debug_frames_interp
)
8970 printf (" DW_CFA_same_value: r%ld\n", reg
);
8971 fc
->col_type
[reg
] = DW_CFA_same_value
;
8972 fc
->col_offset
[reg
] = 0;
8975 case DW_CFA_register
:
8978 if (! do_debug_frames_interp
)
8979 printf (" DW_CFA_register: r%ld\n", reg
);
8980 fc
->col_type
[reg
] = DW_CFA_register
;
8981 fc
->col_offset
[reg
] = roffs
;
8984 case DW_CFA_remember_state
:
8985 if (! do_debug_frames_interp
)
8986 printf (" DW_CFA_remember_state\n");
8987 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8988 rs
->ncols
= fc
->ncols
;
8989 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8990 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8991 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8992 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8993 rs
->next
= remembered_state
;
8994 remembered_state
= rs
;
8997 case DW_CFA_restore_state
:
8998 if (! do_debug_frames_interp
)
8999 printf (" DW_CFA_restore_state\n");
9000 rs
= remembered_state
;
9001 remembered_state
= rs
->next
;
9002 frame_need_space (fc
, rs
->ncols
-1);
9003 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9004 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9005 free (rs
->col_type
);
9006 free (rs
->col_offset
);
9010 case DW_CFA_def_cfa
:
9011 fc
->cfa_reg
= LEB ();
9012 fc
->cfa_offset
= LEB ();
9013 if (! do_debug_frames_interp
)
9014 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9015 fc
->cfa_reg
, fc
->cfa_offset
);
9018 case DW_CFA_def_cfa_register
:
9019 fc
->cfa_reg
= LEB ();
9020 if (! do_debug_frames_interp
)
9021 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9024 case DW_CFA_def_cfa_offset
:
9025 fc
->cfa_offset
= LEB ();
9026 if (! do_debug_frames_interp
)
9027 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9031 if (! do_debug_frames_interp
)
9032 printf (" DW_CFA_nop\n");
9035 case DW_CFA_offset_extended_sf
:
9038 frame_need_space (fc
, reg
);
9039 if (! do_debug_frames_interp
)
9040 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9041 reg
, l
* fc
->data_factor
);
9042 fc
->col_type
[reg
] = DW_CFA_offset
;
9043 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9046 case DW_CFA_def_cfa_sf
:
9047 fc
->cfa_reg
= LEB ();
9048 fc
->cfa_offset
= SLEB ();
9049 if (! do_debug_frames_interp
)
9050 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9051 fc
->cfa_reg
, fc
->cfa_offset
);
9054 case DW_CFA_def_cfa_offset_sf
:
9055 fc
->cfa_offset
= SLEB ();
9056 if (! do_debug_frames_interp
)
9057 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9060 case DW_CFA_GNU_window_save
:
9061 if (! do_debug_frames_interp
)
9062 printf (" DW_CFA_GNU_window_save\n");
9065 case DW_CFA_GNU_args_size
:
9067 if (! do_debug_frames_interp
)
9068 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9071 case DW_CFA_GNU_negative_offset_extended
:
9074 frame_need_space (fc
, reg
);
9075 if (! do_debug_frames_interp
)
9076 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9077 reg
, l
* fc
->data_factor
);
9078 fc
->col_type
[reg
] = DW_CFA_offset
;
9079 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9082 /* FIXME: How do we handle these? */
9083 case DW_CFA_def_cfa_expression
:
9084 fprintf (stderr
, "unsupported DW_CFA_def_cfa_expression\n");
9088 case DW_CFA_expression
:
9089 fprintf (stderr
, "unsupported DW_CFA_expression\n");
9094 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9099 if (do_debug_frames_interp
)
9100 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9115 display_debug_not_supported (section
, start
, file
)
9116 Elf_Internal_Shdr
*section
;
9117 unsigned char *start ATTRIBUTE_UNUSED
;
9118 FILE *file ATTRIBUTE_UNUSED
;
9120 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9121 SECTION_NAME (section
));
9126 /* Pre-scan the .debug_info section to record the size of address.
9127 When dumping the .debug_line, we use that size information, assuming
9128 that all compilation units have the same address size. */
9130 prescan_debug_info (section
, start
, file
)
9131 Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
;
9132 unsigned char *start
;
9133 FILE *file ATTRIBUTE_UNUSED
;
9135 DWARF2_External_CompUnit
*external
;
9137 external
= (DWARF2_External_CompUnit
*) start
;
9139 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
9143 /* A structure containing the name of a debug section and a pointer
9144 to a function that can decode it. The third field is a prescan
9145 function to be run over the section before displaying any of the
9149 const char *const name
;
9150 int (*display
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9151 int (*prescan
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9155 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9156 { ".debug_aranges", display_debug_aranges
, NULL
},
9157 { ".debug_frame", display_debug_frames
, NULL
},
9158 { ".debug_info", display_debug_info
, prescan_debug_info
},
9159 { ".debug_line", display_debug_lines
, NULL
},
9160 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9161 { ".eh_frame", display_debug_frames
, NULL
},
9162 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9163 { ".debug_str", display_debug_str
, NULL
},
9164 { ".debug_loc", display_debug_loc
, NULL
},
9165 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9166 { ".debug_ranges", display_debug_not_supported
, NULL
},
9167 { ".debug_static_func", display_debug_not_supported
, NULL
},
9168 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9169 { ".debug_types", display_debug_not_supported
, NULL
},
9170 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9174 display_debug_section (section
, file
)
9175 Elf_Internal_Shdr
*section
;
9178 char *name
= SECTION_NAME (section
);
9179 bfd_size_type length
;
9180 unsigned char *start
;
9183 length
= section
->sh_size
;
9186 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9190 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
9191 _("debug section data"));
9195 /* See if we know how to display the contents of this section. */
9196 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9197 name
= ".debug_info";
9199 for (i
= NUM_ELEM (debug_displays
); i
--;)
9200 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9202 debug_displays
[i
].display (section
, start
, file
);
9207 printf (_("Unrecognized debug section: %s\n"), name
);
9211 /* If we loaded in the abbrev section at some point,
9212 we must release it here. */
9219 process_section_contents (file
)
9222 Elf_Internal_Shdr
*section
;
9228 /* Pre-scan the debug sections to find some debug information not
9229 present in some of them. For the .debug_line, we must find out the
9230 size of address (specified in .debug_info and .debug_aranges). */
9231 for (i
= 0, section
= section_headers
;
9232 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9235 char *name
= SECTION_NAME (section
);
9238 if (section
->sh_size
== 0)
9241 /* See if there is some pre-scan operation for this section. */
9242 for (j
= NUM_ELEM (debug_displays
); j
--;)
9243 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9245 if (debug_displays
[j
].prescan
!= NULL
)
9247 bfd_size_type length
;
9248 unsigned char *start
;
9250 length
= section
->sh_size
;
9251 start
= ((unsigned char *)
9252 get_data (NULL
, file
, section
->sh_offset
, length
,
9253 _("debug section data")));
9257 debug_displays
[j
].prescan (section
, start
, file
);
9265 for (i
= 0, section
= section_headers
;
9266 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9269 #ifdef SUPPORT_DISASSEMBLY
9270 if (dump_sects
[i
] & DISASS_DUMP
)
9271 disassemble_section (section
, file
);
9273 if (dump_sects
[i
] & HEX_DUMP
)
9274 dump_section (section
, file
);
9276 if (dump_sects
[i
] & DEBUG_DUMP
)
9277 display_debug_section (section
, file
);
9280 if (i
< num_dump_sects
)
9281 warn (_("Some sections were not dumped because they do not exist!\n"));
9287 process_mips_fpe_exception (mask
)
9293 if (mask
& OEX_FPU_INEX
)
9294 fputs ("INEX", stdout
), first
= 0;
9295 if (mask
& OEX_FPU_UFLO
)
9296 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9297 if (mask
& OEX_FPU_OFLO
)
9298 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9299 if (mask
& OEX_FPU_DIV0
)
9300 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9301 if (mask
& OEX_FPU_INVAL
)
9302 printf ("%sINVAL", first
? "" : "|");
9305 fputs ("0", stdout
);
9309 process_mips_specific (file
)
9312 Elf_Internal_Dyn
*entry
;
9313 size_t liblist_offset
= 0;
9314 size_t liblistno
= 0;
9315 size_t conflictsno
= 0;
9316 size_t options_offset
= 0;
9317 size_t conflicts_offset
= 0;
9319 /* We have a lot of special sections. Thanks SGI! */
9320 if (dynamic_segment
== NULL
)
9321 /* No information available. */
9324 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9325 switch (entry
->d_tag
)
9327 case DT_MIPS_LIBLIST
:
9328 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
9330 case DT_MIPS_LIBLISTNO
:
9331 liblistno
= entry
->d_un
.d_val
;
9333 case DT_MIPS_OPTIONS
:
9334 options_offset
= entry
->d_un
.d_val
- loadaddr
;
9336 case DT_MIPS_CONFLICT
:
9337 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
9339 case DT_MIPS_CONFLICTNO
:
9340 conflictsno
= entry
->d_un
.d_val
;
9346 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9348 Elf32_External_Lib
*elib
;
9351 elib
= ((Elf32_External_Lib
*)
9352 get_data (NULL
, file
, liblist_offset
,
9353 liblistno
* sizeof (Elf32_External_Lib
),
9357 printf ("\nSection '.liblist' contains %lu entries:\n",
9358 (unsigned long) liblistno
);
9359 fputs (" Library Time Stamp Checksum Version Flags\n",
9362 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9369 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9370 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9371 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9372 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9373 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9375 tmp
= gmtime (&time
);
9376 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9377 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9378 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9380 printf ("%3lu: ", (unsigned long) cnt
);
9381 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9382 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9385 if (liblist
.l_flags
== 0)
9396 { " EXACT_MATCH", LL_EXACT_MATCH
},
9397 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9398 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9399 { " EXPORTS", LL_EXPORTS
},
9400 { " DELAY_LOAD", LL_DELAY_LOAD
},
9401 { " DELTA", LL_DELTA
}
9403 int flags
= liblist
.l_flags
;
9407 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9409 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9411 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9412 flags
^= l_flags_vals
[fcnt
].bit
;
9415 printf (" %#x", (unsigned int) flags
);
9425 if (options_offset
!= 0)
9427 Elf_External_Options
*eopt
;
9428 Elf_Internal_Shdr
*sect
= section_headers
;
9429 Elf_Internal_Options
*iopt
;
9430 Elf_Internal_Options
*option
;
9434 /* Find the section header so that we get the size. */
9435 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9438 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
9439 sect
->sh_size
, _("options"));
9442 iopt
= ((Elf_Internal_Options
*)
9443 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
)));
9446 error (_("Out of memory"));
9453 while (offset
< sect
->sh_size
)
9455 Elf_External_Options
*eoption
;
9457 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9459 option
->kind
= BYTE_GET (eoption
->kind
);
9460 option
->size
= BYTE_GET (eoption
->size
);
9461 option
->section
= BYTE_GET (eoption
->section
);
9462 option
->info
= BYTE_GET (eoption
->info
);
9464 offset
+= option
->size
;
9470 printf (_("\nSection '%s' contains %d entries:\n"),
9471 SECTION_NAME (sect
), cnt
);
9479 switch (option
->kind
)
9482 /* This shouldn't happen. */
9483 printf (" NULL %d %lx", option
->section
, option
->info
);
9486 printf (" REGINFO ");
9487 if (elf_header
.e_machine
== EM_MIPS
)
9490 Elf32_External_RegInfo
*ereg
;
9491 Elf32_RegInfo reginfo
;
9493 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9494 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9495 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9496 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9497 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9498 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9499 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9501 printf ("GPR %08lx GP 0x%lx\n",
9503 (unsigned long) reginfo
.ri_gp_value
);
9504 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9505 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9506 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9511 Elf64_External_RegInfo
*ereg
;
9512 Elf64_Internal_RegInfo reginfo
;
9514 ereg
= (Elf64_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_GET8 (ereg
->ri_gp_value
);
9522 printf ("GPR %08lx GP 0x",
9523 reginfo
.ri_gprmask
);
9524 printf_vma (reginfo
.ri_gp_value
);
9527 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9528 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9529 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9533 case ODK_EXCEPTIONS
:
9534 fputs (" EXCEPTIONS fpe_min(", stdout
);
9535 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9536 fputs (") fpe_max(", stdout
);
9537 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9538 fputs (")", stdout
);
9540 if (option
->info
& OEX_PAGE0
)
9541 fputs (" PAGE0", stdout
);
9542 if (option
->info
& OEX_SMM
)
9543 fputs (" SMM", stdout
);
9544 if (option
->info
& OEX_FPDBUG
)
9545 fputs (" FPDBUG", stdout
);
9546 if (option
->info
& OEX_DISMISS
)
9547 fputs (" DISMISS", stdout
);
9550 fputs (" PAD ", stdout
);
9551 if (option
->info
& OPAD_PREFIX
)
9552 fputs (" PREFIX", stdout
);
9553 if (option
->info
& OPAD_POSTFIX
)
9554 fputs (" POSTFIX", stdout
);
9555 if (option
->info
& OPAD_SYMBOL
)
9556 fputs (" SYMBOL", stdout
);
9559 fputs (" HWPATCH ", stdout
);
9560 if (option
->info
& OHW_R4KEOP
)
9561 fputs (" R4KEOP", stdout
);
9562 if (option
->info
& OHW_R8KPFETCH
)
9563 fputs (" R8KPFETCH", stdout
);
9564 if (option
->info
& OHW_R5KEOP
)
9565 fputs (" R5KEOP", stdout
);
9566 if (option
->info
& OHW_R5KCVTL
)
9567 fputs (" R5KCVTL", stdout
);
9570 fputs (" FILL ", stdout
);
9571 /* XXX Print content of info word? */
9574 fputs (" TAGS ", stdout
);
9575 /* XXX Print content of info word? */
9578 fputs (" HWAND ", stdout
);
9579 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9580 fputs (" R4KEOP_CHECKED", stdout
);
9581 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9582 fputs (" R4KEOP_CLEAN", stdout
);
9585 fputs (" HWOR ", stdout
);
9586 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9587 fputs (" R4KEOP_CHECKED", stdout
);
9588 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9589 fputs (" R4KEOP_CLEAN", stdout
);
9592 printf (" GP_GROUP %#06lx self-contained %#06lx",
9593 option
->info
& OGP_GROUP
,
9594 (option
->info
& OGP_SELF
) >> 16);
9597 printf (" IDENT %#06lx self-contained %#06lx",
9598 option
->info
& OGP_GROUP
,
9599 (option
->info
& OGP_SELF
) >> 16);
9602 /* This shouldn't happen. */
9603 printf (" %3d ??? %d %lx",
9604 option
->kind
, option
->section
, option
->info
);
9608 len
= sizeof (*eopt
);
9609 while (len
< option
->size
)
9610 if (((char *) option
)[len
] >= ' '
9611 && ((char *) option
)[len
] < 0x7f)
9612 printf ("%c", ((char *) option
)[len
++]);
9614 printf ("\\%03o", ((char *) option
)[len
++]);
9616 fputs ("\n", stdout
);
9624 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9626 Elf32_Conflict
*iconf
;
9629 if (dynamic_symbols
== NULL
)
9631 error (_("conflict list found without a dynamic symbol table"));
9635 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
9638 error (_("Out of memory"));
9644 Elf32_External_Conflict
*econf32
;
9646 econf32
= ((Elf32_External_Conflict
*)
9647 get_data (NULL
, file
, conflicts_offset
,
9648 conflictsno
* sizeof (*econf32
),
9653 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9654 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9660 Elf64_External_Conflict
*econf64
;
9662 econf64
= ((Elf64_External_Conflict
*)
9663 get_data (NULL
, file
, conflicts_offset
,
9664 conflictsno
* sizeof (*econf64
),
9669 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9670 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9675 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9676 (long) conflictsno
);
9677 puts (_(" Num: Index Value Name"));
9679 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9681 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9683 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9684 print_vma (psym
->st_value
, FULL_HEX
);
9686 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9697 process_gnu_liblist (file
)
9700 Elf_Internal_Shdr
*section
, *string_sec
;
9701 Elf32_External_Lib
*elib
;
9709 for (i
= 0, section
= section_headers
;
9710 i
< elf_header
.e_shnum
;
9713 switch (section
->sh_type
)
9715 case SHT_GNU_LIBLIST
:
9716 elib
= ((Elf32_External_Lib
*)
9717 get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
9722 string_sec
= SECTION_HEADER (section
->sh_link
);
9724 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
9725 string_sec
->sh_size
,
9726 _("liblist string table"));
9729 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9735 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9736 SECTION_NAME (section
),
9737 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9739 puts (" Library Time Stamp Checksum Version Flags");
9741 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9749 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9750 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9751 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9752 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9753 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9755 tmp
= gmtime (&time
);
9756 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9757 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9758 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9760 printf ("%3lu: ", (unsigned long) cnt
);
9762 printf ("%-20s", strtab
+ liblist
.l_name
);
9764 printf ("%-20.20s", strtab
+ liblist
.l_name
);
9765 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9766 liblist
.l_version
, liblist
.l_flags
);
9777 get_note_type (e_type
)
9780 static char buff
[64];
9784 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9785 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9786 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9787 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9788 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9789 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9790 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9791 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9792 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9793 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9794 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9796 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9802 get_netbsd_elfcore_note_type (e_type
)
9805 static char buff
[64];
9807 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9809 /* NetBSD core "procinfo" structure. */
9810 return _("NetBSD procinfo structure");
9813 /* As of Jan 2002 there are no other machine-independent notes
9814 defined for NetBSD core files. If the note type is less
9815 than the start of the machine-dependent note types, we don't
9818 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9820 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9824 switch (elf_header
.e_machine
)
9826 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9827 and PT_GETFPREGS == mach+2. */
9832 case EM_SPARC32PLUS
:
9836 case NT_NETBSDCORE_FIRSTMACH
+0:
9837 return _("PT_GETREGS (reg structure)");
9838 case NT_NETBSDCORE_FIRSTMACH
+2:
9839 return _("PT_GETFPREGS (fpreg structure)");
9845 /* On all other arch's, PT_GETREGS == mach+1 and
9846 PT_GETFPREGS == mach+3. */
9850 case NT_NETBSDCORE_FIRSTMACH
+1:
9851 return _("PT_GETREGS (reg structure)");
9852 case NT_NETBSDCORE_FIRSTMACH
+3:
9853 return _("PT_GETFPREGS (fpreg structure)");
9859 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9863 /* Note that by the ELF standard, the name field is already null byte
9864 terminated, and namesz includes the terminating null byte.
9865 I.E. the value of namesz for the name "FSF" is 4.
9867 If the value of namesz is zero, there is no name present. */
9869 process_note (pnote
)
9870 Elf_Internal_Note
*pnote
;
9874 if (pnote
->namesz
== 0)
9876 /* If there is no note name, then use the default set of
9877 note type strings. */
9878 nt
= get_note_type (pnote
->type
);
9880 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9882 /* NetBSD-specific core file notes. */
9883 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9887 /* Don't recognize this note name; just use the default set of
9888 note type strings. */
9889 nt
= get_note_type (pnote
->type
);
9892 printf (" %s\t\t0x%08lx\t%s\n",
9893 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9900 process_corefile_note_segment (file
, offset
, length
)
9905 Elf_External_Note
*pnotes
;
9906 Elf_External_Note
*external
;
9912 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9919 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9920 (unsigned long) offset
, (unsigned long) length
);
9921 printf (_(" Owner\t\tData size\tDescription\n"));
9923 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9925 Elf_External_Note
*next
;
9926 Elf_Internal_Note inote
;
9929 inote
.type
= BYTE_GET (external
->type
);
9930 inote
.namesz
= BYTE_GET (external
->namesz
);
9931 inote
.namedata
= external
->name
;
9932 inote
.descsz
= BYTE_GET (external
->descsz
);
9933 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9934 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9936 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9938 if (((char *) next
) > (((char *) pnotes
) + length
))
9940 warn (_("corrupt note found at offset %x into core notes\n"),
9941 ((char *) external
) - ((char *) pnotes
));
9942 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9943 inote
.type
, inote
.namesz
, inote
.descsz
);
9949 /* Verify that name is null terminated. It appears that at least
9950 one version of Linux (RedHat 6.0) generates corefiles that don't
9951 comply with the ELF spec by failing to include the null byte in
9953 if (inote
.namedata
[inote
.namesz
] != '\0')
9955 temp
= malloc (inote
.namesz
+ 1);
9959 error (_("Out of memory\n"));
9964 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9965 temp
[inote
.namesz
] = 0;
9967 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9968 inote
.namedata
= temp
;
9971 res
&= process_note (& inote
);
9986 process_corefile_note_segments (file
)
9989 Elf_Internal_Phdr
*program_headers
;
9990 Elf_Internal_Phdr
*segment
;
9994 program_headers
= (Elf_Internal_Phdr
*) malloc
9995 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
9997 if (program_headers
== NULL
)
9999 error (_("Out of memory\n"));
10004 i
= get_32bit_program_headers (file
, program_headers
);
10006 i
= get_64bit_program_headers (file
, program_headers
);
10010 free (program_headers
);
10014 for (i
= 0, segment
= program_headers
;
10015 i
< elf_header
.e_phnum
;
10018 if (segment
->p_type
== PT_NOTE
)
10019 res
&= process_corefile_note_segment (file
,
10020 (bfd_vma
) segment
->p_offset
,
10021 (bfd_vma
) segment
->p_filesz
);
10024 free (program_headers
);
10030 process_corefile_contents (file
)
10033 /* If we have not been asked to display the notes then do nothing. */
10037 /* If file is not a core file then exit. */
10038 if (elf_header
.e_type
!= ET_CORE
)
10041 /* No program headers means no NOTE segment. */
10042 if (elf_header
.e_phnum
== 0)
10044 printf (_("No note segments present in the core file.\n"));
10048 return process_corefile_note_segments (file
);
10052 process_arch_specific (file
)
10058 switch (elf_header
.e_machine
)
10061 case EM_MIPS_RS3_LE
:
10062 return process_mips_specific (file
);
10071 get_file_header (file
)
10074 /* Read in the identity array. */
10075 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10078 /* Determine how to read the rest of the header. */
10079 switch (elf_header
.e_ident
[EI_DATA
])
10081 default: /* fall through */
10082 case ELFDATANONE
: /* fall through */
10083 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
10084 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
10087 /* For now we only support 32 bit and 64 bit ELF files. */
10088 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10090 /* Read in the rest of the header. */
10093 Elf32_External_Ehdr ehdr32
;
10095 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10098 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10099 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10100 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10101 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10102 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10103 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10104 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10105 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10106 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10107 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10108 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10109 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10110 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10114 Elf64_External_Ehdr ehdr64
;
10116 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10117 we will not be able to cope with the 64bit data found in
10118 64 ELF files. Detect this now and abort before we start
10119 overwritting things. */
10120 if (sizeof (bfd_vma
) < 8)
10122 error (_("This instance of readelf has been built without support for a\n\
10123 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10127 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10130 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10131 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10132 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10133 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10134 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10135 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10136 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10137 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10138 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10139 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10140 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10141 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10142 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10145 if (elf_header
.e_shoff
)
10147 /* There may be some extensions in the first section header. Don't
10148 bomb if we can't read it. */
10150 get_32bit_section_headers (file
, 1);
10152 get_64bit_section_headers (file
, 1);
10159 process_file (file_name
)
10163 struct stat statbuf
;
10166 if (stat (file_name
, & statbuf
) < 0)
10168 error (_("Cannot stat input file %s.\n"), file_name
);
10172 file
= fopen (file_name
, "rb");
10175 error (_("Input file %s not found.\n"), file_name
);
10179 if (! get_file_header (file
))
10181 error (_("%s: Failed to read file header\n"), file_name
);
10186 /* Initialise per file variables. */
10187 for (i
= NUM_ELEM (version_info
); i
--;)
10188 version_info
[i
] = 0;
10190 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10191 dynamic_info
[i
] = 0;
10193 /* Process the file. */
10195 printf (_("\nFile: %s\n"), file_name
);
10197 if (! process_file_header ())
10203 if (! process_section_headers (file
))
10205 /* Without loaded section headers we
10206 cannot process lots of things. */
10207 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10209 if (! do_using_dynamic
)
10210 do_syms
= do_reloc
= 0;
10213 if (process_program_headers (file
))
10214 process_dynamic_segment (file
);
10216 process_relocs (file
);
10218 process_unwind (file
);
10220 process_symbol_table (file
);
10222 process_syminfo (file
);
10224 process_version_sections (file
);
10226 process_section_contents (file
);
10228 process_corefile_contents (file
);
10230 process_gnu_liblist (file
);
10232 process_arch_specific (file
);
10236 if (section_headers
)
10238 free (section_headers
);
10239 section_headers
= NULL
;
10244 free (string_table
);
10245 string_table
= NULL
;
10246 string_table_length
= 0;
10249 if (dynamic_strings
)
10251 free (dynamic_strings
);
10252 dynamic_strings
= NULL
;
10255 if (dynamic_symbols
)
10257 free (dynamic_symbols
);
10258 dynamic_symbols
= NULL
;
10259 num_dynamic_syms
= 0;
10262 if (dynamic_syminfo
)
10264 free (dynamic_syminfo
);
10265 dynamic_syminfo
= NULL
;
10271 #ifdef SUPPORT_DISASSEMBLY
10272 /* Needed by the i386 disassembler. For extra credit, someone could
10273 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10277 print_address (unsigned int addr
, FILE *outfile
)
10279 fprintf (outfile
,"0x%8.8x", addr
);
10282 /* Needed by the i386 disassembler. */
10284 db_task_printsym (unsigned int addr
)
10286 print_address (addr
, stderr
);
10290 int main
PARAMS ((int, char **));
10298 char *cmdline_dump_sects
= NULL
;
10299 unsigned num_cmdline_dump_sects
= 0;
10301 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10302 setlocale (LC_MESSAGES
, "");
10304 #if defined (HAVE_SETLOCALE)
10305 setlocale (LC_CTYPE
, "");
10307 bindtextdomain (PACKAGE
, LOCALEDIR
);
10308 textdomain (PACKAGE
);
10310 parse_args (argc
, argv
);
10312 if (optind
< (argc
- 1))
10315 /* When processing more than one file remember the dump requests
10316 issued on command line to reset them after each file. */
10317 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10319 cmdline_dump_sects
= malloc (num_dump_sects
);
10320 if (cmdline_dump_sects
== NULL
)
10321 error (_("Out of memory allocating dump request table."));
10324 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10325 num_cmdline_dump_sects
= num_dump_sects
;
10330 while (optind
< argc
)
10332 err
|= process_file (argv
[optind
++]);
10334 /* Reset dump requests. */
10335 if (optind
< argc
&& dump_sects
!= NULL
)
10337 num_dump_sects
= num_cmdline_dump_sects
;
10338 if (num_cmdline_dump_sects
> 0)
10339 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10343 if (dump_sects
!= NULL
)
10345 if (cmdline_dump_sects
!= NULL
)
10346 free (cmdline_dump_sects
);