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_OPENVMS
: return "VMS - OpenVMS";
2834 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2835 case ELFOSABI_AROS
: return "Amiga Research OS";
2836 case ELFOSABI_STANDALONE
: return _("Standalone App");
2837 case ELFOSABI_ARM
: return "ARM";
2839 sprintf (buff
, _("<unknown: %x>"), osabi
);
2844 /* Decode the data held in 'elf_header'. */
2846 process_file_header ()
2848 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2849 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
2850 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
2851 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
2854 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2862 printf (_("ELF Header:\n"));
2863 printf (_(" Magic: "));
2864 for (i
= 0; i
< EI_NIDENT
; i
++)
2865 printf ("%2.2x ", elf_header
.e_ident
[i
]);
2867 printf (_(" Class: %s\n"),
2868 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
2869 printf (_(" Data: %s\n"),
2870 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
2871 printf (_(" Version: %d %s\n"),
2872 elf_header
.e_ident
[EI_VERSION
],
2873 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
2875 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
2878 printf (_(" OS/ABI: %s\n"),
2879 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
2880 printf (_(" ABI Version: %d\n"),
2881 elf_header
.e_ident
[EI_ABIVERSION
]);
2882 printf (_(" Type: %s\n"),
2883 get_file_type (elf_header
.e_type
));
2884 printf (_(" Machine: %s\n"),
2885 get_machine_name (elf_header
.e_machine
));
2886 printf (_(" Version: 0x%lx\n"),
2887 (unsigned long) elf_header
.e_version
);
2889 printf (_(" Entry point address: "));
2890 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
2891 printf (_("\n Start of program headers: "));
2892 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
2893 printf (_(" (bytes into file)\n Start of section headers: "));
2894 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
2895 printf (_(" (bytes into file)\n"));
2897 printf (_(" Flags: 0x%lx%s\n"),
2898 (unsigned long) elf_header
.e_flags
,
2899 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
2900 printf (_(" Size of this header: %ld (bytes)\n"),
2901 (long) elf_header
.e_ehsize
);
2902 printf (_(" Size of program headers: %ld (bytes)\n"),
2903 (long) elf_header
.e_phentsize
);
2904 printf (_(" Number of program headers: %ld\n"),
2905 (long) elf_header
.e_phnum
);
2906 printf (_(" Size of section headers: %ld (bytes)\n"),
2907 (long) elf_header
.e_shentsize
);
2908 printf (_(" Number of section headers: %ld"),
2909 (long) elf_header
.e_shnum
);
2910 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
2911 printf (" (%ld)", (long) section_headers
[0].sh_size
);
2912 putc ('\n', stdout
);
2913 printf (_(" Section header string table index: %ld"),
2914 (long) elf_header
.e_shstrndx
);
2915 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
2916 printf (" (%ld)", (long) section_headers
[0].sh_link
);
2917 putc ('\n', stdout
);
2920 if (section_headers
!= NULL
)
2922 if (elf_header
.e_shnum
== 0)
2923 elf_header
.e_shnum
= section_headers
[0].sh_size
;
2924 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
2925 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
2926 free (section_headers
);
2927 section_headers
= NULL
;
2935 get_32bit_program_headers (file
, program_headers
)
2937 Elf_Internal_Phdr
*program_headers
;
2939 Elf32_External_Phdr
*phdrs
;
2940 Elf32_External_Phdr
*external
;
2941 Elf_Internal_Phdr
*internal
;
2944 phdrs
= ((Elf32_External_Phdr
*)
2945 get_data (NULL
, file
, elf_header
.e_phoff
,
2946 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2947 _("program headers")));
2951 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2952 i
< elf_header
.e_phnum
;
2953 i
++, internal
++, external
++)
2955 internal
->p_type
= BYTE_GET (external
->p_type
);
2956 internal
->p_offset
= BYTE_GET (external
->p_offset
);
2957 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
2958 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
2959 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
2960 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
2961 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2962 internal
->p_align
= BYTE_GET (external
->p_align
);
2971 get_64bit_program_headers (file
, program_headers
)
2973 Elf_Internal_Phdr
*program_headers
;
2975 Elf64_External_Phdr
*phdrs
;
2976 Elf64_External_Phdr
*external
;
2977 Elf_Internal_Phdr
*internal
;
2980 phdrs
= ((Elf64_External_Phdr
*)
2981 get_data (NULL
, file
, elf_header
.e_phoff
,
2982 elf_header
.e_phentsize
* elf_header
.e_phnum
,
2983 _("program headers")));
2987 for (i
= 0, internal
= program_headers
, external
= phdrs
;
2988 i
< elf_header
.e_phnum
;
2989 i
++, internal
++, external
++)
2991 internal
->p_type
= BYTE_GET (external
->p_type
);
2992 internal
->p_flags
= BYTE_GET (external
->p_flags
);
2993 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
2994 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
2995 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
2996 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
2997 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
2998 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3006 /* Returns 1 if the program headers were loaded. */
3009 process_program_headers (file
)
3012 Elf_Internal_Phdr
*program_headers
;
3013 Elf_Internal_Phdr
*segment
;
3016 if (elf_header
.e_phnum
== 0)
3019 printf (_("\nThere are no program headers in this file.\n"));
3023 if (do_segments
&& !do_header
)
3025 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3026 printf (_("Entry point "));
3027 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3028 printf (_("\nThere are %d program headers, starting at offset "),
3029 elf_header
.e_phnum
);
3030 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3034 program_headers
= (Elf_Internal_Phdr
*) malloc
3035 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3037 if (program_headers
== NULL
)
3039 error (_("Out of memory\n"));
3044 i
= get_32bit_program_headers (file
, program_headers
);
3046 i
= get_64bit_program_headers (file
, program_headers
);
3050 free (program_headers
);
3056 if (elf_header
.e_phnum
> 1)
3057 printf (_("\nProgram Headers:\n"));
3059 printf (_("\nProgram Headers:\n"));
3063 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3066 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3070 (_(" Type Offset VirtAddr PhysAddr\n"));
3072 (_(" FileSiz MemSiz Flags Align\n"));
3080 for (i
= 0, segment
= program_headers
;
3081 i
< elf_header
.e_phnum
;
3086 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3090 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3091 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3092 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3093 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3094 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3096 (segment
->p_flags
& PF_R
? 'R' : ' '),
3097 (segment
->p_flags
& PF_W
? 'W' : ' '),
3098 (segment
->p_flags
& PF_X
? 'E' : ' '));
3099 printf ("%#lx", (unsigned long) segment
->p_align
);
3103 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3104 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3107 print_vma (segment
->p_offset
, FULL_HEX
);
3111 print_vma (segment
->p_vaddr
, FULL_HEX
);
3113 print_vma (segment
->p_paddr
, FULL_HEX
);
3116 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3117 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3120 print_vma (segment
->p_filesz
, FULL_HEX
);
3124 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3125 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3128 print_vma (segment
->p_offset
, FULL_HEX
);
3132 (segment
->p_flags
& PF_R
? 'R' : ' '),
3133 (segment
->p_flags
& PF_W
? 'W' : ' '),
3134 (segment
->p_flags
& PF_X
? 'E' : ' '));
3136 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3137 printf ("%#lx", (unsigned long) segment
->p_align
);
3140 print_vma (segment
->p_align
, PREFIX_HEX
);
3145 print_vma (segment
->p_offset
, FULL_HEX
);
3147 print_vma (segment
->p_vaddr
, FULL_HEX
);
3149 print_vma (segment
->p_paddr
, FULL_HEX
);
3151 print_vma (segment
->p_filesz
, FULL_HEX
);
3153 print_vma (segment
->p_memsz
, FULL_HEX
);
3155 (segment
->p_flags
& PF_R
? 'R' : ' '),
3156 (segment
->p_flags
& PF_W
? 'W' : ' '),
3157 (segment
->p_flags
& PF_X
? 'E' : ' '));
3158 print_vma (segment
->p_align
, HEX
);
3162 switch (segment
->p_type
)
3167 unsigned long align_mask
= -segment
->p_align
;
3169 if (align_mask
== 0)
3171 loadaddr
= ((segment
->p_vaddr
& align_mask
)
3172 - (segment
->p_offset
& align_mask
));
3178 error (_("more than one dynamic segment\n"));
3180 dynamic_addr
= segment
->p_offset
;
3181 dynamic_size
= segment
->p_filesz
;
3185 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
3186 error (_("Unable to find program interpreter name\n"));
3189 program_interpreter
[0] = 0;
3190 fscanf (file
, "%63s", program_interpreter
);
3193 printf (_("\n [Requesting program interpreter: %s]"),
3194 program_interpreter
);
3200 putc ('\n', stdout
);
3209 if (do_segments
&& section_headers
!= NULL
)
3211 printf (_("\n Section to Segment mapping:\n"));
3212 printf (_(" Segment Sections...\n"));
3214 assert (string_table
!= NULL
);
3216 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3219 Elf_Internal_Shdr
*section
;
3221 segment
= program_headers
+ i
;
3222 section
= section_headers
;
3224 printf (" %2.2d ", i
);
3226 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3228 if (section
->sh_size
> 0
3229 /* Compare allocated sections by VMA, unallocated
3230 sections by file offset. */
3231 && (section
->sh_flags
& SHF_ALLOC
3232 ? (section
->sh_addr
>= segment
->p_vaddr
3233 && section
->sh_addr
+ section
->sh_size
3234 <= segment
->p_vaddr
+ segment
->p_memsz
)
3235 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3236 && (section
->sh_offset
+ section
->sh_size
3237 <= segment
->p_offset
+ segment
->p_filesz
))))
3238 printf ("%s ", SECTION_NAME (section
));
3245 free (program_headers
);
3252 get_32bit_section_headers (file
, num
)
3256 Elf32_External_Shdr
*shdrs
;
3257 Elf_Internal_Shdr
*internal
;
3260 shdrs
= ((Elf32_External_Shdr
*)
3261 get_data (NULL
, file
, elf_header
.e_shoff
,
3262 elf_header
.e_shentsize
* num
,
3263 _("section headers")));
3267 section_headers
= ((Elf_Internal_Shdr
*)
3268 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3270 if (section_headers
== NULL
)
3272 error (_("Out of memory\n"));
3276 for (i
= 0, internal
= section_headers
;
3280 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3281 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3282 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3283 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3284 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3285 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3286 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3287 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3288 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3289 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3298 get_64bit_section_headers (file
, num
)
3302 Elf64_External_Shdr
*shdrs
;
3303 Elf_Internal_Shdr
*internal
;
3306 shdrs
= ((Elf64_External_Shdr
*)
3307 get_data (NULL
, file
, elf_header
.e_shoff
,
3308 elf_header
.e_shentsize
* num
,
3309 _("section headers")));
3313 section_headers
= ((Elf_Internal_Shdr
*)
3314 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3316 if (section_headers
== NULL
)
3318 error (_("Out of memory\n"));
3322 for (i
= 0, internal
= section_headers
;
3326 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3327 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3328 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3329 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3330 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3331 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3332 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3333 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3334 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3335 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3343 static Elf_Internal_Sym
*
3344 get_32bit_elf_symbols (file
, section
)
3346 Elf_Internal_Shdr
*section
;
3348 unsigned long number
;
3349 Elf32_External_Sym
*esyms
;
3350 Elf_External_Sym_Shndx
*shndx
;
3351 Elf_Internal_Sym
*isyms
;
3352 Elf_Internal_Sym
*psym
;
3355 esyms
= ((Elf32_External_Sym
*)
3356 get_data (NULL
, file
, section
->sh_offset
,
3357 section
->sh_size
, _("symbols")));
3362 if (symtab_shndx_hdr
!= NULL
3363 && (symtab_shndx_hdr
->sh_link
3364 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3366 shndx
= ((Elf_External_Sym_Shndx
*)
3367 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3368 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3376 number
= section
->sh_size
/ section
->sh_entsize
;
3377 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3381 error (_("Out of memory\n"));
3388 for (j
= 0, psym
= isyms
;
3392 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3393 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3394 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3395 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3396 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3398 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3399 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3400 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3410 static Elf_Internal_Sym
*
3411 get_64bit_elf_symbols (file
, section
)
3413 Elf_Internal_Shdr
*section
;
3415 unsigned long number
;
3416 Elf64_External_Sym
*esyms
;
3417 Elf_External_Sym_Shndx
*shndx
;
3418 Elf_Internal_Sym
*isyms
;
3419 Elf_Internal_Sym
*psym
;
3422 esyms
= ((Elf64_External_Sym
*)
3423 get_data (NULL
, file
, section
->sh_offset
,
3424 section
->sh_size
, _("symbols")));
3429 if (symtab_shndx_hdr
!= NULL
3430 && (symtab_shndx_hdr
->sh_link
3431 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3433 shndx
= ((Elf_External_Sym_Shndx
*)
3434 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3435 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3443 number
= section
->sh_size
/ section
->sh_entsize
;
3444 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3448 error (_("Out of memory\n"));
3455 for (j
= 0, psym
= isyms
;
3459 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3460 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3461 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3462 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3463 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3465 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3466 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3467 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3478 get_elf_section_flags (sh_flags
)
3481 static char buff
[32];
3489 flag
= sh_flags
& - sh_flags
;
3494 case SHF_WRITE
: strcat (buff
, "W"); break;
3495 case SHF_ALLOC
: strcat (buff
, "A"); break;
3496 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3497 case SHF_MERGE
: strcat (buff
, "M"); break;
3498 case SHF_STRINGS
: strcat (buff
, "S"); break;
3499 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3500 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3501 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3502 case SHF_GROUP
: strcat (buff
, "G"); break;
3503 case SHF_TLS
: strcat (buff
, "T"); break;
3506 if (flag
& SHF_MASKOS
)
3509 sh_flags
&= ~ SHF_MASKOS
;
3511 else if (flag
& SHF_MASKPROC
)
3514 sh_flags
&= ~ SHF_MASKPROC
;
3526 process_section_headers (file
)
3529 Elf_Internal_Shdr
*section
;
3532 section_headers
= NULL
;
3534 if (elf_header
.e_shnum
== 0)
3537 printf (_("\nThere are no sections in this file.\n"));
3542 if (do_sections
&& !do_header
)
3543 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3544 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3548 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3551 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3554 /* Read in the string table, so that we have names to display. */
3555 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3557 if (section
->sh_size
!= 0)
3559 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3560 section
->sh_size
, _("string table"));
3562 string_table_length
= section
->sh_size
;
3565 /* Scan the sections for the dynamic symbol table
3566 and dynamic string table and debug sections. */
3567 dynamic_symbols
= NULL
;
3568 dynamic_strings
= NULL
;
3569 dynamic_syminfo
= NULL
;
3570 symtab_shndx_hdr
= NULL
;
3572 for (i
= 0, section
= section_headers
;
3573 i
< elf_header
.e_shnum
;
3576 char *name
= SECTION_NAME (section
);
3578 if (section
->sh_type
== SHT_DYNSYM
)
3580 if (dynamic_symbols
!= NULL
)
3582 error (_("File contains multiple dynamic symbol tables\n"));
3586 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3587 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3589 else if (section
->sh_type
== SHT_STRTAB
3590 && strcmp (name
, ".dynstr") == 0)
3592 if (dynamic_strings
!= NULL
)
3594 error (_("File contains multiple dynamic string tables\n"));
3598 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3600 _("dynamic strings"));
3602 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3604 if (symtab_shndx_hdr
!= NULL
)
3606 error (_("File contains multiple symtab shndx tables\n"));
3609 symtab_shndx_hdr
= section
;
3611 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3612 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3613 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3615 && strncmp (name
, ".debug_", 7) == 0)
3620 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3621 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3622 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3623 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3624 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3625 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3626 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3627 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3628 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3630 request_dump (i
, DEBUG_DUMP
);
3632 /* linkonce section to be combined with .debug_info at link time. */
3633 else if ((do_debugging
|| do_debug_info
)
3634 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3635 request_dump (i
, DEBUG_DUMP
);
3636 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3637 request_dump (i
, DEBUG_DUMP
);
3643 if (elf_header
.e_shnum
> 1)
3644 printf (_("\nSection Headers:\n"));
3646 printf (_("\nSection Header:\n"));
3650 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3653 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3656 printf (_(" [Nr] Name Type Address Offset\n"));
3657 printf (_(" Size EntSize Flags Link Info Align\n"));
3660 for (i
= 0, section
= section_headers
;
3661 i
< elf_header
.e_shnum
;
3664 printf (" [%2u] %-17.17s %-15.15s ",
3665 SECTION_HEADER_NUM (i
),
3666 SECTION_NAME (section
),
3667 get_section_type_name (section
->sh_type
));
3671 print_vma (section
->sh_addr
, LONG_HEX
);
3673 printf ( " %6.6lx %6.6lx %2.2lx",
3674 (unsigned long) section
->sh_offset
,
3675 (unsigned long) section
->sh_size
,
3676 (unsigned long) section
->sh_entsize
);
3678 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3680 printf ("%2ld %3lx %2ld\n",
3681 (unsigned long) section
->sh_link
,
3682 (unsigned long) section
->sh_info
,
3683 (unsigned long) section
->sh_addralign
);
3687 print_vma (section
->sh_addr
, LONG_HEX
);
3689 if ((long) section
->sh_offset
== section
->sh_offset
)
3690 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3694 print_vma (section
->sh_offset
, LONG_HEX
);
3697 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3698 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3702 print_vma (section
->sh_size
, LONG_HEX
);
3705 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3706 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3710 print_vma (section
->sh_entsize
, LONG_HEX
);
3713 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3715 printf ("%2ld %3lx ",
3716 (unsigned long) section
->sh_link
,
3717 (unsigned long) section
->sh_info
);
3719 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3720 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3723 print_vma (section
->sh_addralign
, DEC
);
3730 print_vma (section
->sh_addr
, LONG_HEX
);
3731 if ((long) section
->sh_offset
== section
->sh_offset
)
3732 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3736 print_vma (section
->sh_offset
, LONG_HEX
);
3739 print_vma (section
->sh_size
, LONG_HEX
);
3741 print_vma (section
->sh_entsize
, LONG_HEX
);
3743 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3745 printf (" %2ld %3lx %ld\n",
3746 (unsigned long) section
->sh_link
,
3747 (unsigned long) section
->sh_info
,
3748 (unsigned long) section
->sh_addralign
);
3752 printf (_("Key to Flags:\n\
3753 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3754 I (info), L (link order), G (group), x (unknown)\n\
3755 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3760 /* Process the reloc section. */
3762 process_relocs (file
)
3765 unsigned long rel_size
;
3766 unsigned long rel_offset
;
3772 if (do_using_dynamic
)
3774 int is_rela
= FALSE
;
3779 if (dynamic_info
[DT_REL
])
3781 rel_offset
= dynamic_info
[DT_REL
];
3782 rel_size
= dynamic_info
[DT_RELSZ
];
3785 else if (dynamic_info
[DT_RELA
])
3787 rel_offset
= dynamic_info
[DT_RELA
];
3788 rel_size
= dynamic_info
[DT_RELASZ
];
3791 else if (dynamic_info
[DT_JMPREL
])
3793 rel_offset
= dynamic_info
[DT_JMPREL
];
3794 rel_size
= dynamic_info
[DT_PLTRELSZ
];
3796 switch (dynamic_info
[DT_PLTREL
])
3813 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3814 rel_offset
, rel_size
);
3816 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3817 dynamic_symbols
, num_dynamic_syms
, dynamic_strings
,
3821 printf (_("\nThere are no dynamic relocations in this file.\n"));
3825 Elf_Internal_Shdr
*section
;
3829 for (i
= 0, section
= section_headers
;
3830 i
< elf_header
.e_shnum
;
3833 if ( section
->sh_type
!= SHT_RELA
3834 && section
->sh_type
!= SHT_REL
)
3837 rel_offset
= section
->sh_offset
;
3838 rel_size
= section
->sh_size
;
3842 Elf_Internal_Shdr
*strsec
;
3843 Elf_Internal_Sym
*symtab
;
3846 unsigned long nsyms
;
3848 printf (_("\nRelocation section "));
3850 if (string_table
== NULL
)
3851 printf ("%d", section
->sh_name
);
3853 printf (_("'%s'"), SECTION_NAME (section
));
3855 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3856 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
3861 if (section
->sh_link
)
3863 Elf_Internal_Shdr
*symsec
;
3865 symsec
= SECTION_HEADER (section
->sh_link
);
3866 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
3867 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
3872 strsec
= SECTION_HEADER (symsec
->sh_link
);
3874 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
3878 is_rela
= section
->sh_type
== SHT_RELA
;
3880 dump_relocations (file
, rel_offset
, rel_size
,
3881 symtab
, nsyms
, strtab
, is_rela
);
3893 printf (_("\nThere are no relocations in this file.\n"));
3899 #include "unwind-ia64.h"
3901 /* An absolute address consists of a section and an offset. If the
3902 section is NULL, the offset itself is the address, otherwise, the
3903 address equals to LOAD_ADDRESS(section) + offset. */
3907 unsigned short section
;
3913 struct unw_table_entry
3915 struct absaddr start
;
3917 struct absaddr info
;
3919 *table
; /* Unwind table. */
3920 unsigned long table_len
; /* Length of unwind table. */
3921 unsigned char *info
; /* Unwind info. */
3922 unsigned long info_size
; /* Size of unwind info. */
3923 bfd_vma info_addr
; /* starting address of unwind info. */
3924 bfd_vma seg_base
; /* Starting address of segment. */
3925 Elf_Internal_Sym
*symtab
; /* The symbol table. */
3926 unsigned long nsyms
; /* Number of symbols. */
3927 char *strtab
; /* The string table. */
3928 unsigned long strtab_size
; /* Size of string table. */
3931 static void find_symbol_for_address
3932 PARAMS ((struct unw_aux_info
*, struct absaddr
, const char **, bfd_vma
*));
3933 static void dump_ia64_unwind
3934 PARAMS ((struct unw_aux_info
*));
3935 static int slurp_ia64_unwind_table
3936 PARAMS ((FILE *, struct unw_aux_info
*, Elf_Internal_Shdr
*));
3939 find_symbol_for_address (aux
, addr
, symname
, offset
)
3940 struct unw_aux_info
*aux
;
3941 struct absaddr addr
;
3942 const char **symname
;
3945 bfd_vma dist
= (bfd_vma
) 0x100000;
3946 Elf_Internal_Sym
*sym
, *best
= NULL
;
3949 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
3951 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
3952 && sym
->st_name
!= 0
3953 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
3954 && addr
.offset
>= sym
->st_value
3955 && addr
.offset
- sym
->st_value
< dist
)
3958 dist
= addr
.offset
- sym
->st_value
;
3965 *symname
= (best
->st_name
>= aux
->strtab_size
3966 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
3971 *offset
= addr
.offset
;
3975 dump_ia64_unwind (aux
)
3976 struct unw_aux_info
*aux
;
3979 struct unw_table_entry
*tp
;
3982 addr_size
= is_32bit_elf
? 4 : 8;
3984 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
3988 const unsigned char *dp
;
3989 const unsigned char *head
;
3990 const char *procname
;
3992 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
3994 fputs ("\n<", stdout
);
3998 fputs (procname
, stdout
);
4001 printf ("+%lx", (unsigned long) offset
);
4004 fputs (">: [", stdout
);
4005 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4006 fputc ('-', stdout
);
4007 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4008 printf ("], info at +0x%lx\n",
4009 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4011 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4012 stamp
= BYTE_GET8 ((unsigned char *) head
);
4014 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4015 (unsigned) UNW_VER (stamp
),
4016 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4017 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4018 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4019 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4021 if (UNW_VER (stamp
) != 1)
4023 printf ("\tUnknown version.\n");
4028 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4029 dp
= unw_decode (dp
, in_body
, & in_body
);
4034 slurp_ia64_unwind_table (file
, aux
, sec
)
4036 struct unw_aux_info
*aux
;
4037 Elf_Internal_Shdr
*sec
;
4039 unsigned long size
, addr_size
, nrelas
, i
;
4040 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
4041 struct unw_table_entry
*tep
;
4042 Elf_Internal_Shdr
*relsec
;
4043 Elf_Internal_Rela
*rela
, *rp
;
4044 unsigned char *table
, *tp
;
4045 Elf_Internal_Sym
*sym
;
4046 const char *relname
;
4049 addr_size
= is_32bit_elf
? 4 : 8;
4051 /* First, find the starting address of the segment that includes
4054 if (elf_header
.e_phnum
)
4056 prog_hdrs
= (Elf_Internal_Phdr
*)
4057 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
4060 result
= get_32bit_program_headers (file
, prog_hdrs
);
4062 result
= get_64bit_program_headers (file
, prog_hdrs
);
4070 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
4072 if (seg
->p_type
!= PT_LOAD
)
4075 if (sec
->sh_addr
>= seg
->p_vaddr
4076 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4078 aux
->seg_base
= seg
->p_vaddr
;
4086 /* Second, build the unwind table from the contents of the unwind section: */
4087 size
= sec
->sh_size
;
4088 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4089 size
, _("unwind table"));
4093 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4094 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4096 tep
->start
.section
= SHN_UNDEF
;
4097 tep
->end
.section
= SHN_UNDEF
;
4098 tep
->info
.section
= SHN_UNDEF
;
4101 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4102 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4103 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4107 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4108 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4109 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4111 tep
->start
.offset
+= aux
->seg_base
;
4112 tep
->end
.offset
+= aux
->seg_base
;
4113 tep
->info
.offset
+= aux
->seg_base
;
4117 /* Third, apply any relocations to the unwind table: */
4119 for (relsec
= section_headers
;
4120 relsec
< section_headers
+ elf_header
.e_shnum
;
4123 if (relsec
->sh_type
!= SHT_RELA
4124 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4127 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4131 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4135 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4136 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4138 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4140 warn (_("Skipping unexpected symbol type %u\n"),
4141 ELF32_ST_TYPE (sym
->st_info
));
4147 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4148 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4150 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4152 warn (_("Skipping unexpected symbol type %u\n"),
4153 ELF64_ST_TYPE (sym
->st_info
));
4158 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4160 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4164 i
= rp
->r_offset
/ (3 * addr_size
);
4166 switch (rp
->r_offset
/addr_size
% 3)
4169 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4170 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4173 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4174 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4177 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4178 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4188 aux
->table_len
= size
/ (3 * addr_size
);
4193 process_unwind (file
)
4196 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4197 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4198 struct unw_aux_info aux
;
4203 if (elf_header
.e_machine
!= EM_IA_64
)
4205 printf (_("\nThere are no unwind sections in this file.\n"));
4209 memset (& aux
, 0, sizeof (aux
));
4211 addr_size
= is_32bit_elf
? 4 : 8;
4213 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4215 if (sec
->sh_type
== SHT_SYMTAB
)
4217 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4218 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4220 strsec
= SECTION_HEADER (sec
->sh_link
);
4221 aux
.strtab_size
= strsec
->sh_size
;
4222 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4223 aux
.strtab_size
, _("string table"));
4225 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4230 printf (_("\nThere are no unwind sections in this file.\n"));
4232 while (unwcount
-- > 0)
4237 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4238 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4239 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4246 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4248 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4251 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4252 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4253 suffix
= SECTION_NAME (unwsec
) + len
;
4254 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4256 if (strncmp (SECTION_NAME (sec
),
4257 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4258 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4263 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4264 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4265 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4266 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4268 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4270 suffix
= SECTION_NAME (unwsec
) + len
;
4271 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4273 if (strncmp (SECTION_NAME (sec
),
4274 ELF_STRING_ia64_unwind_info
, len2
) == 0
4275 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4279 if (i
== elf_header
.e_shnum
)
4281 printf (_("\nCould not find unwind info section for "));
4283 if (string_table
== NULL
)
4284 printf ("%d", unwsec
->sh_name
);
4286 printf (_("'%s'"), SECTION_NAME (unwsec
));
4290 aux
.info_size
= sec
->sh_size
;
4291 aux
.info_addr
= sec
->sh_addr
;
4292 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4293 aux
.info_size
, _("unwind info"));
4295 printf (_("\nUnwind section "));
4297 if (string_table
== NULL
)
4298 printf ("%d", unwsec
->sh_name
);
4300 printf (_("'%s'"), SECTION_NAME (unwsec
));
4302 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4303 (unsigned long) unwsec
->sh_offset
,
4304 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4306 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4308 if (aux
.table_len
> 0)
4309 dump_ia64_unwind (& aux
);
4312 free ((char *) aux
.table
);
4314 free ((char *) aux
.info
);
4323 free ((char *) aux
.strtab
);
4329 dynamic_segment_mips_val (entry
)
4330 Elf_Internal_Dyn
*entry
;
4332 switch (entry
->d_tag
)
4335 if (entry
->d_un
.d_val
== 0)
4339 static const char * opts
[] =
4341 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4342 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4343 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4344 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4349 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4350 if (entry
->d_un
.d_val
& (1 << cnt
))
4352 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4359 case DT_MIPS_IVERSION
:
4360 if (dynamic_strings
!= NULL
)
4361 printf ("Interface Version: %s\n",
4362 dynamic_strings
+ entry
->d_un
.d_val
);
4364 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4367 case DT_MIPS_TIME_STAMP
:
4372 time_t time
= entry
->d_un
.d_val
;
4373 tmp
= gmtime (&time
);
4374 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4375 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4376 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4377 printf ("Time Stamp: %s\n", timebuf
);
4381 case DT_MIPS_RLD_VERSION
:
4382 case DT_MIPS_LOCAL_GOTNO
:
4383 case DT_MIPS_CONFLICTNO
:
4384 case DT_MIPS_LIBLISTNO
:
4385 case DT_MIPS_SYMTABNO
:
4386 case DT_MIPS_UNREFEXTNO
:
4387 case DT_MIPS_HIPAGENO
:
4388 case DT_MIPS_DELTA_CLASS_NO
:
4389 case DT_MIPS_DELTA_INSTANCE_NO
:
4390 case DT_MIPS_DELTA_RELOC_NO
:
4391 case DT_MIPS_DELTA_SYM_NO
:
4392 case DT_MIPS_DELTA_CLASSSYM_NO
:
4393 case DT_MIPS_COMPACT_SIZE
:
4394 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4398 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4404 dynamic_segment_parisc_val (entry
)
4405 Elf_Internal_Dyn
*entry
;
4407 switch (entry
->d_tag
)
4409 case DT_HP_DLD_FLAGS
:
4418 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4419 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4420 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4421 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4422 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4423 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4424 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4425 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4426 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4427 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4428 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4432 bfd_vma val
= entry
->d_un
.d_val
;
4434 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4435 if (val
& flags
[cnt
].bit
)
4439 fputs (flags
[cnt
].str
, stdout
);
4441 val
^= flags
[cnt
].bit
;
4444 if (val
!= 0 || first
)
4448 print_vma (val
, HEX
);
4454 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4461 get_32bit_dynamic_segment (file
)
4464 Elf32_External_Dyn
*edyn
;
4465 Elf_Internal_Dyn
*entry
;
4468 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4469 dynamic_size
, _("dynamic segment"));
4473 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4474 how large this .dynamic is now. We can do this even before the byte
4475 swapping since the DT_NULL tag is recognizable. */
4477 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4480 dynamic_segment
= (Elf_Internal_Dyn
*)
4481 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4483 if (dynamic_segment
== NULL
)
4485 error (_("Out of memory\n"));
4490 for (i
= 0, entry
= dynamic_segment
;
4494 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4495 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4504 get_64bit_dynamic_segment (file
)
4507 Elf64_External_Dyn
*edyn
;
4508 Elf_Internal_Dyn
*entry
;
4511 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4512 dynamic_size
, _("dynamic segment"));
4516 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4517 how large this .dynamic is now. We can do this even before the byte
4518 swapping since the DT_NULL tag is recognizable. */
4520 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4523 dynamic_segment
= (Elf_Internal_Dyn
*)
4524 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4526 if (dynamic_segment
== NULL
)
4528 error (_("Out of memory\n"));
4533 for (i
= 0, entry
= dynamic_segment
;
4537 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4538 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4547 get_dynamic_flags (flags
)
4550 static char buff
[128];
4558 flag
= flags
& - flags
;
4566 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4567 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4568 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4569 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4570 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4571 default: strcpy (p
, "unknown"); break;
4574 p
= strchr (p
, '\0');
4579 /* Parse and display the contents of the dynamic segment. */
4581 process_dynamic_segment (file
)
4584 Elf_Internal_Dyn
*entry
;
4587 if (dynamic_size
== 0)
4590 printf (_("\nThere is no dynamic segment in this file.\n"));
4597 if (! get_32bit_dynamic_segment (file
))
4600 else if (! get_64bit_dynamic_segment (file
))
4603 /* Find the appropriate symbol table. */
4604 if (dynamic_symbols
== NULL
)
4606 for (i
= 0, entry
= dynamic_segment
;
4610 Elf_Internal_Shdr section
;
4612 if (entry
->d_tag
!= DT_SYMTAB
)
4615 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4617 /* Since we do not know how big the symbol table is,
4618 we default to reading in the entire file (!) and
4619 processing that. This is overkill, I know, but it
4621 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4623 if (fseek (file
, 0, SEEK_END
))
4624 error (_("Unable to seek to end of file!"));
4626 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4628 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4630 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4632 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4633 if (num_dynamic_syms
< 1)
4635 error (_("Unable to determine the number of symbols to load\n"));
4639 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4643 /* Similarly find a string table. */
4644 if (dynamic_strings
== NULL
)
4646 for (i
= 0, entry
= dynamic_segment
;
4650 unsigned long offset
;
4653 if (entry
->d_tag
!= DT_STRTAB
)
4656 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4658 /* Since we do not know how big the string table is,
4659 we default to reading in the entire file (!) and
4660 processing that. This is overkill, I know, but it
4663 offset
= entry
->d_un
.d_val
- loadaddr
;
4664 if (fseek (file
, 0, SEEK_END
))
4665 error (_("Unable to seek to end of file\n"));
4666 str_tab_len
= ftell (file
) - offset
;
4668 if (str_tab_len
< 1)
4671 (_("Unable to determine the length of the dynamic string table\n"));
4675 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4676 _("dynamic string table"));
4681 /* And find the syminfo section if available. */
4682 if (dynamic_syminfo
== NULL
)
4684 unsigned long syminsz
= 0;
4686 for (i
= 0, entry
= dynamic_segment
;
4690 if (entry
->d_tag
== DT_SYMINENT
)
4692 /* Note: these braces are necessary to avoid a syntax
4693 error from the SunOS4 C compiler. */
4694 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4696 else if (entry
->d_tag
== DT_SYMINSZ
)
4697 syminsz
= entry
->d_un
.d_val
;
4698 else if (entry
->d_tag
== DT_SYMINFO
)
4699 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4702 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4704 Elf_External_Syminfo
*extsyminfo
;
4705 Elf_Internal_Syminfo
*syminfo
;
4707 /* There is a syminfo section. Read the data. */
4708 extsyminfo
= ((Elf_External_Syminfo
*)
4709 get_data (NULL
, file
, dynamic_syminfo_offset
,
4710 syminsz
, _("symbol information")));
4714 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4715 if (dynamic_syminfo
== NULL
)
4717 error (_("Out of memory\n"));
4721 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4722 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4725 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4726 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4733 if (do_dynamic
&& dynamic_addr
)
4734 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4735 dynamic_addr
, (long) dynamic_size
);
4737 printf (_(" Tag Type Name/Value\n"));
4739 for (i
= 0, entry
= dynamic_segment
;
4748 print_vma (entry
->d_tag
, FULL_HEX
);
4749 dtype
= get_dynamic_type (entry
->d_tag
);
4750 printf (" (%s)%*s", dtype
,
4751 ((is_32bit_elf
? 27 : 19)
4752 - (int) strlen (dtype
)),
4756 switch (entry
->d_tag
)
4760 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4770 switch (entry
->d_tag
)
4773 printf (_("Auxiliary library"));
4777 printf (_("Filter library"));
4781 printf (_("Configuration file"));
4785 printf (_("Dependency audit library"));
4789 printf (_("Audit library"));
4793 if (dynamic_strings
)
4794 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4798 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4807 printf (_("Flags:"));
4809 if (entry
->d_un
.d_val
== 0)
4810 printf (_(" None\n"));
4813 unsigned long int val
= entry
->d_un
.d_val
;
4815 if (val
& DTF_1_PARINIT
)
4817 printf (" PARINIT");
4818 val
^= DTF_1_PARINIT
;
4820 if (val
& DTF_1_CONFEXP
)
4822 printf (" CONFEXP");
4823 val
^= DTF_1_CONFEXP
;
4826 printf (" %lx", val
);
4835 printf (_("Flags:"));
4837 if (entry
->d_un
.d_val
== 0)
4838 printf (_(" None\n"));
4841 unsigned long int val
= entry
->d_un
.d_val
;
4843 if (val
& DF_P1_LAZYLOAD
)
4845 printf (" LAZYLOAD");
4846 val
^= DF_P1_LAZYLOAD
;
4848 if (val
& DF_P1_GROUPPERM
)
4850 printf (" GROUPPERM");
4851 val
^= DF_P1_GROUPPERM
;
4854 printf (" %lx", val
);
4863 printf (_("Flags:"));
4864 if (entry
->d_un
.d_val
== 0)
4865 printf (_(" None\n"));
4868 unsigned long int val
= entry
->d_un
.d_val
;
4875 if (val
& DF_1_GLOBAL
)
4880 if (val
& DF_1_GROUP
)
4885 if (val
& DF_1_NODELETE
)
4887 printf (" NODELETE");
4888 val
^= DF_1_NODELETE
;
4890 if (val
& DF_1_LOADFLTR
)
4892 printf (" LOADFLTR");
4893 val
^= DF_1_LOADFLTR
;
4895 if (val
& DF_1_INITFIRST
)
4897 printf (" INITFIRST");
4898 val
^= DF_1_INITFIRST
;
4900 if (val
& DF_1_NOOPEN
)
4905 if (val
& DF_1_ORIGIN
)
4910 if (val
& DF_1_DIRECT
)
4915 if (val
& DF_1_TRANS
)
4920 if (val
& DF_1_INTERPOSE
)
4922 printf (" INTERPOSE");
4923 val
^= DF_1_INTERPOSE
;
4925 if (val
& DF_1_NODEFLIB
)
4927 printf (" NODEFLIB");
4928 val
^= DF_1_NODEFLIB
;
4930 if (val
& DF_1_NODUMP
)
4935 if (val
& DF_1_CONLFAT
)
4937 printf (" CONLFAT");
4938 val
^= DF_1_CONLFAT
;
4941 printf (" %lx", val
);
4949 puts (get_dynamic_type (entry
->d_un
.d_val
));
4969 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
4975 if (dynamic_strings
== NULL
)
4978 name
= dynamic_strings
+ entry
->d_un
.d_val
;
4982 switch (entry
->d_tag
)
4985 printf (_("Shared library: [%s]"), name
);
4987 if (strcmp (name
, program_interpreter
) == 0)
4988 printf (_(" program interpreter"));
4992 printf (_("Library soname: [%s]"), name
);
4996 printf (_("Library rpath: [%s]"), name
);
5000 printf (_("Library runpath: [%s]"), name
);
5004 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5009 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5025 case DT_INIT_ARRAYSZ
:
5026 case DT_FINI_ARRAYSZ
:
5027 case DT_GNU_CONFLICTSZ
:
5028 case DT_GNU_LIBLISTSZ
:
5031 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5032 printf (" (bytes)\n");
5042 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5055 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5059 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5063 printf (_("Not needed object: [%s]\n"), name
);
5068 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5074 /* The value of this entry is ignored. */
5079 case DT_GNU_PRELINKED
:
5083 time_t time
= entry
->d_un
.d_val
;
5085 tmp
= gmtime (&time
);
5086 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5087 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5088 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5094 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5095 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5100 switch (elf_header
.e_machine
)
5103 case EM_MIPS_RS3_LE
:
5104 dynamic_segment_mips_val (entry
);
5107 dynamic_segment_parisc_val (entry
);
5110 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5122 get_ver_flags (flags
)
5125 static char buff
[32];
5132 if (flags
& VER_FLG_BASE
)
5133 strcat (buff
, "BASE ");
5135 if (flags
& VER_FLG_WEAK
)
5137 if (flags
& VER_FLG_BASE
)
5138 strcat (buff
, "| ");
5140 strcat (buff
, "WEAK ");
5143 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5144 strcat (buff
, "| <unknown>");
5149 /* Display the contents of the version sections. */
5151 process_version_sections (file
)
5154 Elf_Internal_Shdr
*section
;
5161 for (i
= 0, section
= section_headers
;
5162 i
< elf_header
.e_shnum
;
5165 switch (section
->sh_type
)
5167 case SHT_GNU_verdef
:
5169 Elf_External_Verdef
*edefs
;
5176 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5177 SECTION_NAME (section
), section
->sh_info
);
5179 printf (_(" Addr: 0x"));
5180 printf_vma (section
->sh_addr
);
5181 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5182 (unsigned long) section
->sh_offset
, section
->sh_link
,
5183 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5185 edefs
= ((Elf_External_Verdef
*)
5186 get_data (NULL
, file
, section
->sh_offset
,
5188 _("version definition section")));
5192 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5195 Elf_External_Verdef
*edef
;
5196 Elf_Internal_Verdef ent
;
5197 Elf_External_Verdaux
*eaux
;
5198 Elf_Internal_Verdaux aux
;
5202 vstart
= ((char *) edefs
) + idx
;
5204 edef
= (Elf_External_Verdef
*) vstart
;
5206 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5207 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5208 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5209 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5210 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5211 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5212 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5214 printf (_(" %#06x: Rev: %d Flags: %s"),
5215 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5217 printf (_(" Index: %d Cnt: %d "),
5218 ent
.vd_ndx
, ent
.vd_cnt
);
5220 vstart
+= ent
.vd_aux
;
5222 eaux
= (Elf_External_Verdaux
*) vstart
;
5224 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5225 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5227 if (dynamic_strings
)
5228 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5230 printf (_("Name index: %ld\n"), aux
.vda_name
);
5232 isum
= idx
+ ent
.vd_aux
;
5234 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5236 isum
+= aux
.vda_next
;
5237 vstart
+= aux
.vda_next
;
5239 eaux
= (Elf_External_Verdaux
*) vstart
;
5241 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5242 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5244 if (dynamic_strings
)
5245 printf (_(" %#06x: Parent %d: %s\n"),
5246 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5248 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5249 isum
, j
, aux
.vda_name
);
5259 case SHT_GNU_verneed
:
5261 Elf_External_Verneed
*eneed
;
5267 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5268 SECTION_NAME (section
), section
->sh_info
);
5270 printf (_(" Addr: 0x"));
5271 printf_vma (section
->sh_addr
);
5272 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5273 (unsigned long) section
->sh_offset
, section
->sh_link
,
5274 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5276 eneed
= ((Elf_External_Verneed
*)
5277 get_data (NULL
, file
, section
->sh_offset
,
5278 section
->sh_size
, _("version need section")));
5282 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5284 Elf_External_Verneed
*entry
;
5285 Elf_Internal_Verneed ent
;
5290 vstart
= ((char *) eneed
) + idx
;
5292 entry
= (Elf_External_Verneed
*) vstart
;
5294 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5295 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5296 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5297 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5298 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5300 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5302 if (dynamic_strings
)
5303 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5305 printf (_(" File: %lx"), ent
.vn_file
);
5307 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5309 vstart
+= ent
.vn_aux
;
5311 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5313 Elf_External_Vernaux
*eaux
;
5314 Elf_Internal_Vernaux aux
;
5316 eaux
= (Elf_External_Vernaux
*) vstart
;
5318 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5319 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5320 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5321 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5322 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5324 if (dynamic_strings
)
5325 printf (_(" %#06x: Name: %s"),
5326 isum
, dynamic_strings
+ aux
.vna_name
);
5328 printf (_(" %#06x: Name index: %lx"),
5329 isum
, aux
.vna_name
);
5331 printf (_(" Flags: %s Version: %d\n"),
5332 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5334 isum
+= aux
.vna_next
;
5335 vstart
+= aux
.vna_next
;
5345 case SHT_GNU_versym
:
5347 Elf_Internal_Shdr
*link_section
;
5350 unsigned char *edata
;
5351 unsigned short *data
;
5353 Elf_Internal_Sym
*symbols
;
5354 Elf_Internal_Shdr
*string_sec
;
5356 link_section
= SECTION_HEADER (section
->sh_link
);
5357 total
= section
->sh_size
/ section
->sh_entsize
;
5361 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5363 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5365 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5366 string_sec
->sh_size
,
5367 _("version string table"));
5371 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5372 SECTION_NAME (section
), total
);
5374 printf (_(" Addr: "));
5375 printf_vma (section
->sh_addr
);
5376 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5377 (unsigned long) section
->sh_offset
, section
->sh_link
,
5378 SECTION_NAME (link_section
));
5382 get_data (NULL
, file
,
5383 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
5384 total
* sizeof (short), _("version symbol data")));
5391 data
= (unsigned short *) malloc (total
* sizeof (short));
5393 for (cnt
= total
; cnt
--;)
5394 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5399 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5402 int check_def
, check_need
;
5405 printf (" %03x:", cnt
);
5407 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5408 switch (data
[cnt
+ j
])
5411 fputs (_(" 0 (*local*) "), stdout
);
5415 fputs (_(" 1 (*global*) "), stdout
);
5419 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5420 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5424 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5427 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5434 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5436 Elf_Internal_Verneed ivn
;
5437 unsigned long offset
;
5439 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5444 Elf_Internal_Vernaux ivna
;
5445 Elf_External_Verneed evn
;
5446 Elf_External_Vernaux evna
;
5447 unsigned long a_off
;
5449 get_data (&evn
, file
, offset
, sizeof (evn
),
5452 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5453 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5455 a_off
= offset
+ ivn
.vn_aux
;
5459 get_data (&evna
, file
, a_off
, sizeof (evna
),
5460 _("version need aux (2)"));
5462 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5463 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5465 a_off
+= ivna
.vna_next
;
5467 while (ivna
.vna_other
!= data
[cnt
+ j
]
5468 && ivna
.vna_next
!= 0);
5470 if (ivna
.vna_other
== data
[cnt
+ j
])
5472 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5474 name
= strtab
+ ivna
.vna_name
;
5475 nn
+= printf ("(%s%-*s",
5477 12 - (int) strlen (name
),
5483 offset
+= ivn
.vn_next
;
5485 while (ivn
.vn_next
);
5488 if (check_def
&& data
[cnt
+ j
] != 0x8001
5489 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5491 Elf_Internal_Verdef ivd
;
5492 Elf_External_Verdef evd
;
5493 unsigned long offset
;
5495 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5500 get_data (&evd
, file
, offset
, sizeof (evd
),
5503 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5504 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5506 offset
+= ivd
.vd_next
;
5508 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5509 && ivd
.vd_next
!= 0);
5511 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5513 Elf_External_Verdaux evda
;
5514 Elf_Internal_Verdaux ivda
;
5516 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5518 get_data (&evda
, file
,
5519 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5520 sizeof (evda
), _("version def aux"));
5522 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5524 name
= strtab
+ ivda
.vda_name
;
5525 nn
+= printf ("(%s%-*s",
5527 12 - (int) strlen (name
),
5533 printf ("%*c", 18 - nn
, ' ');
5551 printf (_("\nNo version information found in this file.\n"));
5557 get_symbol_binding (binding
)
5558 unsigned int binding
;
5560 static char buff
[32];
5564 case STB_LOCAL
: return "LOCAL";
5565 case STB_GLOBAL
: return "GLOBAL";
5566 case STB_WEAK
: return "WEAK";
5568 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5569 sprintf (buff
, _("<processor specific>: %d"), binding
);
5570 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5571 sprintf (buff
, _("<OS specific>: %d"), binding
);
5573 sprintf (buff
, _("<unknown>: %d"), binding
);
5579 get_symbol_type (type
)
5582 static char buff
[32];
5586 case STT_NOTYPE
: return "NOTYPE";
5587 case STT_OBJECT
: return "OBJECT";
5588 case STT_FUNC
: return "FUNC";
5589 case STT_SECTION
: return "SECTION";
5590 case STT_FILE
: return "FILE";
5591 case STT_COMMON
: return "COMMON";
5592 case STT_TLS
: return "TLS";
5594 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5596 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5597 return "THUMB_FUNC";
5599 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5602 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5603 return "PARISC_MILLI";
5605 sprintf (buff
, _("<processor specific>: %d"), type
);
5607 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5609 if (elf_header
.e_machine
== EM_PARISC
)
5611 if (type
== STT_HP_OPAQUE
)
5613 if (type
== STT_HP_STUB
)
5617 sprintf (buff
, _("<OS specific>: %d"), type
);
5620 sprintf (buff
, _("<unknown>: %d"), type
);
5626 get_symbol_visibility (visibility
)
5627 unsigned int visibility
;
5631 case STV_DEFAULT
: return "DEFAULT";
5632 case STV_INTERNAL
: return "INTERNAL";
5633 case STV_HIDDEN
: return "HIDDEN";
5634 case STV_PROTECTED
: return "PROTECTED";
5640 get_symbol_index_type (type
)
5643 static char buff
[32];
5647 case SHN_UNDEF
: return "UND";
5648 case SHN_ABS
: return "ABS";
5649 case SHN_COMMON
: return "COM";
5651 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5652 sprintf (buff
, "PRC[0x%04x]", type
);
5653 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5654 sprintf (buff
, "OS [0x%04x]", type
);
5655 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5656 sprintf (buff
, "RSV[0x%04x]", type
);
5658 sprintf (buff
, "%3d", type
);
5666 get_dynamic_data (file
, number
)
5668 unsigned int number
;
5670 unsigned char *e_data
;
5673 e_data
= (unsigned char *) malloc (number
* 4);
5677 error (_("Out of memory\n"));
5681 if (fread (e_data
, 4, number
, file
) != number
)
5683 error (_("Unable to read in dynamic data\n"));
5687 i_data
= (int *) malloc (number
* sizeof (*i_data
));
5691 error (_("Out of memory\n"));
5697 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5704 /* Dump the symbol table. */
5706 process_symbol_table (file
)
5709 Elf_Internal_Shdr
*section
;
5710 unsigned char nb
[4];
5711 unsigned char nc
[4];
5714 int *buckets
= NULL
;
5717 if (! do_syms
&& !do_histogram
)
5720 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5723 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5725 error (_("Unable to seek to start of dynamic information"));
5729 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5731 error (_("Failed to read in number of buckets\n"));
5735 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5737 error (_("Failed to read in number of chains\n"));
5741 nbuckets
= byte_get (nb
, 4);
5742 nchains
= byte_get (nc
, 4);
5744 buckets
= get_dynamic_data (file
, nbuckets
);
5745 chains
= get_dynamic_data (file
, nchains
);
5747 if (buckets
== NULL
|| chains
== NULL
)
5752 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5757 printf (_("\nSymbol table for image:\n"));
5759 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5761 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5763 for (hn
= 0; hn
< nbuckets
; hn
++)
5768 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5770 Elf_Internal_Sym
*psym
;
5772 psym
= dynamic_symbols
+ si
;
5774 printf (" %3d %3d: ", si
, hn
);
5775 print_vma (psym
->st_value
, LONG_HEX
);
5777 print_vma (psym
->st_size
, DEC_5
);
5779 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5780 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5781 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5782 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5783 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5788 else if (do_syms
&& !do_using_dynamic
)
5792 for (i
= 0, section
= section_headers
;
5793 i
< elf_header
.e_shnum
;
5798 Elf_Internal_Sym
*symtab
;
5799 Elf_Internal_Sym
*psym
;
5802 if ( section
->sh_type
!= SHT_SYMTAB
5803 && section
->sh_type
!= SHT_DYNSYM
)
5806 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5807 SECTION_NAME (section
),
5808 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5810 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5812 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5814 symtab
= GET_ELF_SYMBOLS (file
, section
);
5818 if (section
->sh_link
== elf_header
.e_shstrndx
)
5819 strtab
= string_table
;
5822 Elf_Internal_Shdr
*string_sec
;
5824 string_sec
= SECTION_HEADER (section
->sh_link
);
5826 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5827 string_sec
->sh_size
,
5831 for (si
= 0, psym
= symtab
;
5832 si
< section
->sh_size
/ section
->sh_entsize
;
5835 printf ("%6d: ", si
);
5836 print_vma (psym
->st_value
, LONG_HEX
);
5838 print_vma (psym
->st_size
, DEC_5
);
5839 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5840 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5841 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5842 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
5843 print_symbol (25, strtab
+ psym
->st_name
);
5845 if (section
->sh_type
== SHT_DYNSYM
&&
5846 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
5848 unsigned char data
[2];
5849 unsigned short vers_data
;
5850 unsigned long offset
;
5854 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
5857 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
5858 sizeof (data
), _("version data"));
5860 vers_data
= byte_get (data
, 2);
5862 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
5865 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
5867 if ((vers_data
& 0x8000) || vers_data
> 1)
5869 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5870 && (is_nobits
|| ! check_def
))
5872 Elf_External_Verneed evn
;
5873 Elf_Internal_Verneed ivn
;
5874 Elf_Internal_Vernaux ivna
;
5876 /* We must test both. */
5877 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5882 unsigned long vna_off
;
5884 get_data (&evn
, file
, offset
, sizeof (evn
),
5887 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5888 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5890 vna_off
= offset
+ ivn
.vn_aux
;
5894 Elf_External_Vernaux evna
;
5896 get_data (&evna
, file
, vna_off
,
5898 _("version need aux (3)"));
5900 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5901 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5902 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5904 vna_off
+= ivna
.vna_next
;
5906 while (ivna
.vna_other
!= vers_data
5907 && ivna
.vna_next
!= 0);
5909 if (ivna
.vna_other
== vers_data
)
5912 offset
+= ivn
.vn_next
;
5914 while (ivn
.vn_next
!= 0);
5916 if (ivna
.vna_other
== vers_data
)
5919 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
5922 else if (! is_nobits
)
5923 error (_("bad dynamic symbol"));
5930 if (vers_data
!= 0x8001
5931 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5933 Elf_Internal_Verdef ivd
;
5934 Elf_Internal_Verdaux ivda
;
5935 Elf_External_Verdaux evda
;
5936 unsigned long offset
;
5939 = (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5944 Elf_External_Verdef evd
;
5946 get_data (&evd
, file
, offset
, sizeof (evd
),
5949 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5950 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5951 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5953 offset
+= ivd
.vd_next
;
5955 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
5956 && ivd
.vd_next
!= 0);
5958 offset
-= ivd
.vd_next
;
5959 offset
+= ivd
.vd_aux
;
5961 get_data (&evda
, file
, offset
, sizeof (evda
),
5962 _("version def aux"));
5964 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5966 if (psym
->st_name
!= ivda
.vda_name
)
5967 printf ((vers_data
& 0x8000)
5969 strtab
+ ivda
.vda_name
);
5979 if (strtab
!= string_table
)
5985 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5987 if (do_histogram
&& buckets
!= NULL
)
5994 int nzero_counts
= 0;
5997 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5999 printf (_(" Length Number %% of total Coverage\n"));
6001 lengths
= (int *) calloc (nbuckets
, sizeof (int));
6002 if (lengths
== NULL
)
6004 error (_("Out of memory"));
6007 for (hn
= 0; hn
< nbuckets
; ++hn
)
6012 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6015 if (maxlength
< ++lengths
[hn
])
6020 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
6023 error (_("Out of memory"));
6027 for (hn
= 0; hn
< nbuckets
; ++hn
)
6028 ++counts
[lengths
[hn
]];
6032 printf (" 0 %-10d (%5.1f%%)\n",
6033 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6034 for (si
= 1; si
<= maxlength
; ++si
)
6036 nzero_counts
+= counts
[si
] * si
;
6037 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6038 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6039 (nzero_counts
* 100.0) / nsyms
);
6047 if (buckets
!= NULL
)
6057 process_syminfo (file
)
6058 FILE *file ATTRIBUTE_UNUSED
;
6062 if (dynamic_syminfo
== NULL
6064 /* No syminfo, this is ok. */
6067 /* There better should be a dynamic symbol section. */
6068 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6072 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6073 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6075 printf (_(" Num: Name BoundTo Flags\n"));
6076 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6078 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6080 printf ("%4d: ", i
);
6081 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6084 switch (dynamic_syminfo
[i
].si_boundto
)
6086 case SYMINFO_BT_SELF
:
6087 fputs ("SELF ", stdout
);
6089 case SYMINFO_BT_PARENT
:
6090 fputs ("PARENT ", stdout
);
6093 if (dynamic_syminfo
[i
].si_boundto
> 0
6094 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6099 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6103 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6107 if (flags
& SYMINFO_FLG_DIRECT
)
6109 if (flags
& SYMINFO_FLG_PASSTHRU
)
6110 printf (" PASSTHRU");
6111 if (flags
& SYMINFO_FLG_COPY
)
6113 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6114 printf (" LAZYLOAD");
6122 #ifdef SUPPORT_DISASSEMBLY
6124 disassemble_section (section
, file
)
6125 Elf_Internal_Shdr
*section
;
6128 printf (_("\nAssembly dump of section %s\n"),
6129 SECTION_NAME (section
));
6131 /* XXX -- to be done --- XXX */
6138 dump_section (section
, file
)
6139 Elf_Internal_Shdr
*section
;
6142 bfd_size_type bytes
;
6144 unsigned char *data
;
6145 unsigned char *start
;
6147 bytes
= section
->sh_size
;
6151 printf (_("\nSection '%s' has no data to dump.\n"),
6152 SECTION_NAME (section
));
6156 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6158 addr
= section
->sh_addr
;
6160 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
6173 lbytes
= (bytes
> 16 ? 16 : bytes
);
6175 printf (" 0x%8.8lx ", (unsigned long) addr
);
6177 switch (elf_header
.e_ident
[EI_DATA
])
6181 for (j
= 15; j
>= 0; j
--)
6184 printf ("%2.2x", data
[j
]);
6194 for (j
= 0; j
< 16; j
++)
6197 printf ("%2.2x", data
[j
]);
6207 for (j
= 0; j
< lbytes
; j
++)
6210 if (k
>= ' ' && k
< 0x80)
6229 static unsigned long int
6230 read_leb128 (data
, length_return
, sign
)
6231 unsigned char *data
;
6235 unsigned long int result
= 0;
6236 unsigned int num_read
= 0;
6245 result
|= (byte
& 0x7f) << shift
;
6250 while (byte
& 0x80);
6252 if (length_return
!= NULL
)
6253 *length_return
= num_read
;
6255 if (sign
&& (shift
< 32) && (byte
& 0x40))
6256 result
|= -1 << shift
;
6261 typedef struct State_Machine_Registers
6263 unsigned long address
;
6266 unsigned int column
;
6270 /* This variable hold the number of the last entry seen
6271 in the File Table. */
6272 unsigned int last_file_entry
;
6275 static SMR state_machine_regs
;
6278 reset_state_machine (is_stmt
)
6281 state_machine_regs
.address
= 0;
6282 state_machine_regs
.file
= 1;
6283 state_machine_regs
.line
= 1;
6284 state_machine_regs
.column
= 0;
6285 state_machine_regs
.is_stmt
= is_stmt
;
6286 state_machine_regs
.basic_block
= 0;
6287 state_machine_regs
.end_sequence
= 0;
6288 state_machine_regs
.last_file_entry
= 0;
6291 /* Handled an extend line op. Returns true if this is the end
6294 process_extended_line_op (data
, is_stmt
, pointer_size
)
6295 unsigned char *data
;
6299 unsigned char op_code
;
6302 unsigned char *name
;
6305 len
= read_leb128 (data
, & bytes_read
, 0);
6310 warn (_("badly formed extended line op encountered!\n"));
6317 printf (_(" Extended opcode %d: "), op_code
);
6321 case DW_LNE_end_sequence
:
6322 printf (_("End of Sequence\n\n"));
6323 reset_state_machine (is_stmt
);
6326 case DW_LNE_set_address
:
6327 adr
= byte_get (data
, pointer_size
);
6328 printf (_("set Address to 0x%lx\n"), adr
);
6329 state_machine_regs
.address
= adr
;
6332 case DW_LNE_define_file
:
6333 printf (_(" define new File Table entry\n"));
6334 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6336 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6338 data
+= strlen ((char *) data
) + 1;
6339 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6341 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6343 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6344 printf (_("%s\n\n"), name
);
6348 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6355 /* Size of pointers in the .debug_line section. This information is not
6356 really present in that section. It's obtained before dumping the debug
6357 sections by doing some pre-scan of the .debug_info section. */
6358 static int debug_line_pointer_size
= 4;
6361 display_debug_lines (section
, start
, file
)
6362 Elf_Internal_Shdr
*section
;
6363 unsigned char * start
;
6364 FILE *file ATTRIBUTE_UNUSED
;
6366 DWARF2_External_LineInfo
*external
;
6367 DWARF2_Internal_LineInfo info
;
6368 unsigned char *standard_opcodes
;
6369 unsigned char *data
= start
;
6370 unsigned char *end
= start
+ section
->sh_size
;
6371 unsigned char *end_of_sequence
;
6374 printf (_("\nDump of debug contents of section %s:\n\n"),
6375 SECTION_NAME (section
));
6379 external
= (DWARF2_External_LineInfo
*) data
;
6381 /* Check the length of the block. */
6382 info
.li_length
= BYTE_GET (external
->li_length
);
6384 if (info
.li_length
== 0xffffffff)
6386 warn (_("64-bit DWARF line info is not supported yet.\n"));
6390 if (info
.li_length
+ sizeof (external
->li_length
) > section
->sh_size
)
6393 (_("The line info appears to be corrupt - the section is too small\n"));
6397 /* Check its version number. */
6398 info
.li_version
= BYTE_GET (external
->li_version
);
6399 if (info
.li_version
!= 2)
6401 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6405 info
.li_prologue_length
= BYTE_GET (external
->li_prologue_length
);
6406 info
.li_min_insn_length
= BYTE_GET (external
->li_min_insn_length
);
6407 info
.li_default_is_stmt
= BYTE_GET (external
->li_default_is_stmt
);
6408 info
.li_line_base
= BYTE_GET (external
->li_line_base
);
6409 info
.li_line_range
= BYTE_GET (external
->li_line_range
);
6410 info
.li_opcode_base
= BYTE_GET (external
->li_opcode_base
);
6412 /* Sign extend the line base field. */
6413 info
.li_line_base
<<= 24;
6414 info
.li_line_base
>>= 24;
6416 printf (_(" Length: %ld\n"), info
.li_length
);
6417 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6418 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6419 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6420 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6421 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6422 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6423 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6425 end_of_sequence
= data
+ info
.li_length
+ sizeof (external
->li_length
);
6427 reset_state_machine (info
.li_default_is_stmt
);
6429 /* Display the contents of the Opcodes table. */
6430 standard_opcodes
= data
+ sizeof (*external
);
6432 printf (_("\n Opcodes:\n"));
6434 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6435 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6437 /* Display the contents of the Directory table. */
6438 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6441 printf (_("\n The Directory Table is empty.\n"));
6444 printf (_("\n The Directory Table:\n"));
6448 printf (_(" %s\n"), data
);
6450 data
+= strlen ((char *) data
) + 1;
6454 /* Skip the NUL at the end of the table. */
6457 /* Display the contents of the File Name table. */
6459 printf (_("\n The File Name Table is empty.\n"));
6462 printf (_("\n The File Name Table:\n"));
6463 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6467 unsigned char *name
;
6470 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6473 data
+= strlen ((char *) data
) + 1;
6475 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6477 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6479 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6481 printf (_("%s\n"), name
);
6485 /* Skip the NUL at the end of the table. */
6488 /* Now display the statements. */
6489 printf (_("\n Line Number Statements:\n"));
6492 while (data
< end_of_sequence
)
6494 unsigned char op_code
;
6500 if (op_code
>= info
.li_opcode_base
)
6502 op_code
-= info
.li_opcode_base
;
6503 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6504 state_machine_regs
.address
+= adv
;
6505 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6506 op_code
, adv
, state_machine_regs
.address
);
6507 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6508 state_machine_regs
.line
+= adv
;
6509 printf (_(" and Line by %d to %d\n"),
6510 adv
, state_machine_regs
.line
);
6512 else switch (op_code
)
6514 case DW_LNS_extended_op
:
6515 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6516 debug_line_pointer_size
);
6520 printf (_(" Copy\n"));
6523 case DW_LNS_advance_pc
:
6524 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6526 state_machine_regs
.address
+= adv
;
6527 printf (_(" Advance PC by %d to %lx\n"), adv
,
6528 state_machine_regs
.address
);
6531 case DW_LNS_advance_line
:
6532 adv
= read_leb128 (data
, & bytes_read
, 1);
6534 state_machine_regs
.line
+= adv
;
6535 printf (_(" Advance Line by %d to %d\n"), adv
,
6536 state_machine_regs
.line
);
6539 case DW_LNS_set_file
:
6540 adv
= read_leb128 (data
, & bytes_read
, 0);
6542 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6544 state_machine_regs
.file
= adv
;
6547 case DW_LNS_set_column
:
6548 adv
= read_leb128 (data
, & bytes_read
, 0);
6550 printf (_(" Set column to %d\n"), adv
);
6551 state_machine_regs
.column
= adv
;
6554 case DW_LNS_negate_stmt
:
6555 adv
= state_machine_regs
.is_stmt
;
6557 printf (_(" Set is_stmt to %d\n"), adv
);
6558 state_machine_regs
.is_stmt
= adv
;
6561 case DW_LNS_set_basic_block
:
6562 printf (_(" Set basic block\n"));
6563 state_machine_regs
.basic_block
= 1;
6566 case DW_LNS_const_add_pc
:
6567 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6568 * info
.li_min_insn_length
);
6569 state_machine_regs
.address
+= adv
;
6570 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6571 state_machine_regs
.address
);
6574 case DW_LNS_fixed_advance_pc
:
6575 adv
= byte_get (data
, 2);
6577 state_machine_regs
.address
+= adv
;
6578 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6579 adv
, state_machine_regs
.address
);
6582 case DW_LNS_set_prologue_end
:
6583 printf (_(" Set prologue_end to true\n"));
6586 case DW_LNS_set_epilogue_begin
:
6587 printf (_(" Set epilogue_begin to true\n"));
6590 case DW_LNS_set_isa
:
6591 adv
= read_leb128 (data
, & bytes_read
, 0);
6593 printf (_(" Set ISA to %d\n"), adv
);
6597 printf (_(" Unknown opcode %d with operands: "), op_code
);
6600 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6602 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6603 i
== 1 ? "" : ", ");
6618 display_debug_pubnames (section
, start
, file
)
6619 Elf_Internal_Shdr
*section
;
6620 unsigned char *start
;
6621 FILE *file ATTRIBUTE_UNUSED
;
6623 DWARF2_External_PubNames
*external
;
6624 DWARF2_Internal_PubNames pubnames
;
6627 end
= start
+ section
->sh_size
;
6629 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6633 unsigned char *data
;
6634 unsigned long offset
;
6636 external
= (DWARF2_External_PubNames
*) start
;
6638 pubnames
.pn_length
= BYTE_GET (external
->pn_length
);
6639 pubnames
.pn_version
= BYTE_GET (external
->pn_version
);
6640 pubnames
.pn_offset
= BYTE_GET (external
->pn_offset
);
6641 pubnames
.pn_size
= BYTE_GET (external
->pn_size
);
6643 data
= start
+ sizeof (*external
);
6644 start
+= pubnames
.pn_length
+ sizeof (external
->pn_length
);
6646 if (pubnames
.pn_length
== 0xffffffff)
6648 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6652 if (pubnames
.pn_version
!= 2)
6654 static int warned
= 0;
6658 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6665 printf (_(" Length: %ld\n"),
6666 pubnames
.pn_length
);
6667 printf (_(" Version: %d\n"),
6668 pubnames
.pn_version
);
6669 printf (_(" Offset into .debug_info section: %ld\n"),
6670 pubnames
.pn_offset
);
6671 printf (_(" Size of area in .debug_info section: %ld\n"),
6674 printf (_("\n Offset\tName\n"));
6678 offset
= byte_get (data
, 4);
6683 printf (" %ld\t\t%s\n", offset
, data
);
6684 data
+= strlen ((char *) data
) + 1;
6687 while (offset
!= 0);
6700 case DW_TAG_padding
: return "DW_TAG_padding";
6701 case DW_TAG_array_type
: return "DW_TAG_array_type";
6702 case DW_TAG_class_type
: return "DW_TAG_class_type";
6703 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6704 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6705 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6706 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6707 case DW_TAG_label
: return "DW_TAG_label";
6708 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6709 case DW_TAG_member
: return "DW_TAG_member";
6710 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6711 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6712 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6713 case DW_TAG_string_type
: return "DW_TAG_string_type";
6714 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6715 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6716 case DW_TAG_typedef
: return "DW_TAG_typedef";
6717 case DW_TAG_union_type
: return "DW_TAG_union_type";
6718 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6719 case DW_TAG_variant
: return "DW_TAG_variant";
6720 case DW_TAG_common_block
: return "DW_TAG_common_block";
6721 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6722 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6723 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6724 case DW_TAG_module
: return "DW_TAG_module";
6725 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6726 case DW_TAG_set_type
: return "DW_TAG_set_type";
6727 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6728 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6729 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6730 case DW_TAG_base_type
: return "DW_TAG_base_type";
6731 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6732 case DW_TAG_const_type
: return "DW_TAG_const_type";
6733 case DW_TAG_constant
: return "DW_TAG_constant";
6734 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6735 case DW_TAG_file_type
: return "DW_TAG_file_type";
6736 case DW_TAG_friend
: return "DW_TAG_friend";
6737 case DW_TAG_namelist
: return "DW_TAG_namelist";
6738 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6739 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6740 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6741 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6742 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6743 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6744 case DW_TAG_try_block
: return "DW_TAG_try_block";
6745 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6746 case DW_TAG_variable
: return "DW_TAG_variable";
6747 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6748 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6749 case DW_TAG_format_label
: return "DW_TAG_format_label";
6750 case DW_TAG_function_template
: return "DW_TAG_function_template";
6751 case DW_TAG_class_template
: return "DW_TAG_class_template";
6752 /* DWARF 2.1 values. */
6753 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6754 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6755 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6756 case DW_TAG_namespace
: return "DW_TAG_namespace";
6757 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6758 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6759 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6760 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6762 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6763 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6764 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6767 static char buffer
[100];
6769 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6776 get_AT_name (attribute
)
6777 unsigned long attribute
;
6781 case DW_AT_sibling
: return "DW_AT_sibling";
6782 case DW_AT_location
: return "DW_AT_location";
6783 case DW_AT_name
: return "DW_AT_name";
6784 case DW_AT_ordering
: return "DW_AT_ordering";
6785 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6786 case DW_AT_byte_size
: return "DW_AT_byte_size";
6787 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6788 case DW_AT_bit_size
: return "DW_AT_bit_size";
6789 case DW_AT_element_list
: return "DW_AT_element_list";
6790 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6791 case DW_AT_low_pc
: return "DW_AT_low_pc";
6792 case DW_AT_high_pc
: return "DW_AT_high_pc";
6793 case DW_AT_language
: return "DW_AT_language";
6794 case DW_AT_member
: return "DW_AT_member";
6795 case DW_AT_discr
: return "DW_AT_discr";
6796 case DW_AT_discr_value
: return "DW_AT_discr_value";
6797 case DW_AT_visibility
: return "DW_AT_visibility";
6798 case DW_AT_import
: return "DW_AT_import";
6799 case DW_AT_string_length
: return "DW_AT_string_length";
6800 case DW_AT_common_reference
: return "DW_AT_common_reference";
6801 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
6802 case DW_AT_const_value
: return "DW_AT_const_value";
6803 case DW_AT_containing_type
: return "DW_AT_containing_type";
6804 case DW_AT_default_value
: return "DW_AT_default_value";
6805 case DW_AT_inline
: return "DW_AT_inline";
6806 case DW_AT_is_optional
: return "DW_AT_is_optional";
6807 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
6808 case DW_AT_producer
: return "DW_AT_producer";
6809 case DW_AT_prototyped
: return "DW_AT_prototyped";
6810 case DW_AT_return_addr
: return "DW_AT_return_addr";
6811 case DW_AT_start_scope
: return "DW_AT_start_scope";
6812 case DW_AT_stride_size
: return "DW_AT_stride_size";
6813 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
6814 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
6815 case DW_AT_accessibility
: return "DW_AT_accessibility";
6816 case DW_AT_address_class
: return "DW_AT_address_class";
6817 case DW_AT_artificial
: return "DW_AT_artificial";
6818 case DW_AT_base_types
: return "DW_AT_base_types";
6819 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
6820 case DW_AT_count
: return "DW_AT_count";
6821 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
6822 case DW_AT_decl_column
: return "DW_AT_decl_column";
6823 case DW_AT_decl_file
: return "DW_AT_decl_file";
6824 case DW_AT_decl_line
: return "DW_AT_decl_line";
6825 case DW_AT_declaration
: return "DW_AT_declaration";
6826 case DW_AT_discr_list
: return "DW_AT_discr_list";
6827 case DW_AT_encoding
: return "DW_AT_encoding";
6828 case DW_AT_external
: return "DW_AT_external";
6829 case DW_AT_frame_base
: return "DW_AT_frame_base";
6830 case DW_AT_friend
: return "DW_AT_friend";
6831 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
6832 case DW_AT_macro_info
: return "DW_AT_macro_info";
6833 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
6834 case DW_AT_priority
: return "DW_AT_priority";
6835 case DW_AT_segment
: return "DW_AT_segment";
6836 case DW_AT_specification
: return "DW_AT_specification";
6837 case DW_AT_static_link
: return "DW_AT_static_link";
6838 case DW_AT_type
: return "DW_AT_type";
6839 case DW_AT_use_location
: return "DW_AT_use_location";
6840 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
6841 case DW_AT_virtuality
: return "DW_AT_virtuality";
6842 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
6843 /* DWARF 2.1 values. */
6844 case DW_AT_allocated
: return "DW_AT_allocated";
6845 case DW_AT_associated
: return "DW_AT_associated";
6846 case DW_AT_data_location
: return "DW_AT_data_location";
6847 case DW_AT_stride
: return "DW_AT_stride";
6848 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
6849 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
6850 case DW_AT_extension
: return "DW_AT_extension";
6851 case DW_AT_ranges
: return "DW_AT_ranges";
6852 case DW_AT_trampoline
: return "DW_AT_trampoline";
6853 case DW_AT_call_column
: return "DW_AT_call_column";
6854 case DW_AT_call_file
: return "DW_AT_call_file";
6855 case DW_AT_call_line
: return "DW_AT_call_line";
6856 /* SGI/MIPS extensions. */
6857 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
6858 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
6859 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
6860 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
6861 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
6862 case DW_AT_MIPS_software_pipeline_depth
:
6863 return "DW_AT_MIPS_software_pipeline_depth";
6864 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
6865 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
6866 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
6867 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
6868 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
6869 /* GNU extensions. */
6870 case DW_AT_sf_names
: return "DW_AT_sf_names";
6871 case DW_AT_src_info
: return "DW_AT_src_info";
6872 case DW_AT_mac_info
: return "DW_AT_mac_info";
6873 case DW_AT_src_coords
: return "DW_AT_src_coords";
6874 case DW_AT_body_begin
: return "DW_AT_body_begin";
6875 case DW_AT_body_end
: return "DW_AT_body_end";
6876 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
6877 /* UPC extension. */
6878 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
6881 static char buffer
[100];
6883 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
6890 get_FORM_name (form
)
6895 case DW_FORM_addr
: return "DW_FORM_addr";
6896 case DW_FORM_block2
: return "DW_FORM_block2";
6897 case DW_FORM_block4
: return "DW_FORM_block4";
6898 case DW_FORM_data2
: return "DW_FORM_data2";
6899 case DW_FORM_data4
: return "DW_FORM_data4";
6900 case DW_FORM_data8
: return "DW_FORM_data8";
6901 case DW_FORM_string
: return "DW_FORM_string";
6902 case DW_FORM_block
: return "DW_FORM_block";
6903 case DW_FORM_block1
: return "DW_FORM_block1";
6904 case DW_FORM_data1
: return "DW_FORM_data1";
6905 case DW_FORM_flag
: return "DW_FORM_flag";
6906 case DW_FORM_sdata
: return "DW_FORM_sdata";
6907 case DW_FORM_strp
: return "DW_FORM_strp";
6908 case DW_FORM_udata
: return "DW_FORM_udata";
6909 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
6910 case DW_FORM_ref1
: return "DW_FORM_ref1";
6911 case DW_FORM_ref2
: return "DW_FORM_ref2";
6912 case DW_FORM_ref4
: return "DW_FORM_ref4";
6913 case DW_FORM_ref8
: return "DW_FORM_ref8";
6914 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
6915 case DW_FORM_indirect
: return "DW_FORM_indirect";
6918 static char buffer
[100];
6920 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
6926 /* FIXME: There are better and more effiecint ways to handle
6927 these structures. For now though, I just want something that
6928 is simple to implement. */
6929 typedef struct abbrev_attr
6931 unsigned long attribute
;
6933 struct abbrev_attr
*next
;
6937 typedef struct abbrev_entry
6939 unsigned long entry
;
6942 struct abbrev_attr
*first_attr
;
6943 struct abbrev_attr
*last_attr
;
6944 struct abbrev_entry
*next
;
6948 static abbrev_entry
*first_abbrev
= NULL
;
6949 static abbrev_entry
*last_abbrev
= NULL
;
6954 abbrev_entry
*abbrev
;
6956 for (abbrev
= first_abbrev
; abbrev
;)
6958 abbrev_entry
*next
= abbrev
->next
;
6961 for (attr
= abbrev
->first_attr
; attr
;)
6963 abbrev_attr
*next
= attr
->next
;
6973 last_abbrev
= first_abbrev
= NULL
;
6977 add_abbrev (number
, tag
, children
)
6978 unsigned long number
;
6982 abbrev_entry
*entry
;
6984 entry
= (abbrev_entry
*) malloc (sizeof (*entry
));
6990 entry
->entry
= number
;
6992 entry
->children
= children
;
6993 entry
->first_attr
= NULL
;
6994 entry
->last_attr
= NULL
;
6997 if (first_abbrev
== NULL
)
6998 first_abbrev
= entry
;
7000 last_abbrev
->next
= entry
;
7002 last_abbrev
= entry
;
7006 add_abbrev_attr (attribute
, form
)
7007 unsigned long attribute
;
7012 attr
= (abbrev_attr
*) malloc (sizeof (*attr
));
7018 attr
->attribute
= attribute
;
7022 if (last_abbrev
->first_attr
== NULL
)
7023 last_abbrev
->first_attr
= attr
;
7025 last_abbrev
->last_attr
->next
= attr
;
7027 last_abbrev
->last_attr
= attr
;
7030 /* Processes the (partial) contents of a .debug_abbrev section.
7031 Returns NULL if the end of the section was encountered.
7032 Returns the address after the last byte read if the end of
7033 an abbreviation set was found. */
7035 static unsigned char *
7036 process_abbrev_section (start
, end
)
7037 unsigned char *start
;
7040 if (first_abbrev
!= NULL
)
7046 unsigned long entry
;
7048 unsigned long attribute
;
7051 entry
= read_leb128 (start
, & bytes_read
, 0);
7052 start
+= bytes_read
;
7054 /* A single zero is supposed to end the section according
7055 to the standard. If there's more, then signal that to
7058 return start
== end
? NULL
: start
;
7060 tag
= read_leb128 (start
, & bytes_read
, 0);
7061 start
+= bytes_read
;
7063 children
= *start
++;
7065 add_abbrev (entry
, tag
, children
);
7071 attribute
= read_leb128 (start
, & bytes_read
, 0);
7072 start
+= bytes_read
;
7074 form
= read_leb128 (start
, & bytes_read
, 0);
7075 start
+= bytes_read
;
7078 add_abbrev_attr (attribute
, form
);
7080 while (attribute
!= 0);
7088 display_debug_macinfo (section
, start
, file
)
7089 Elf_Internal_Shdr
*section
;
7090 unsigned char *start
;
7091 FILE *file ATTRIBUTE_UNUSED
;
7093 unsigned char *end
= start
+ section
->sh_size
;
7094 unsigned char *curr
= start
;
7095 unsigned int bytes_read
;
7096 enum dwarf_macinfo_record_type op
;
7098 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7102 unsigned int lineno
;
7110 case DW_MACINFO_start_file
:
7112 unsigned int filenum
;
7114 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7116 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7119 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7123 case DW_MACINFO_end_file
:
7124 printf (_(" DW_MACINFO_end_file\n"));
7127 case DW_MACINFO_define
:
7128 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7131 curr
+= strlen (string
) + 1;
7132 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7135 case DW_MACINFO_undef
:
7136 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7139 curr
+= strlen (string
) + 1;
7140 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7143 case DW_MACINFO_vendor_ext
:
7145 unsigned int constant
;
7147 constant
= read_leb128 (curr
, & bytes_read
, 0);
7150 curr
+= strlen (string
) + 1;
7151 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7162 display_debug_abbrev (section
, start
, file
)
7163 Elf_Internal_Shdr
*section
;
7164 unsigned char *start
;
7165 FILE *file ATTRIBUTE_UNUSED
;
7167 abbrev_entry
*entry
;
7168 unsigned char *end
= start
+ section
->sh_size
;
7170 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7174 start
= process_abbrev_section (start
, end
);
7176 if (first_abbrev
== NULL
)
7179 printf (_(" Number TAG\n"));
7181 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7185 printf (_(" %ld %s [%s]\n"),
7187 get_TAG_name (entry
->tag
),
7188 entry
->children
? _("has children") : _("no children"));
7190 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7192 printf (_(" %-18s %s\n"),
7193 get_AT_name (attr
->attribute
),
7194 get_FORM_name (attr
->form
));
7208 static unsigned char *
7209 display_block (data
, length
)
7210 unsigned char *data
;
7211 unsigned long length
;
7213 printf (_(" %lu byte block: "), length
);
7216 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7222 decode_location_expression (data
, pointer_size
, length
)
7223 unsigned char * data
;
7224 unsigned int pointer_size
;
7225 unsigned long length
;
7229 unsigned long uvalue
;
7230 unsigned char *end
= data
+ length
;
7239 printf ("DW_OP_addr: %lx",
7240 (unsigned long) byte_get (data
, pointer_size
));
7241 data
+= pointer_size
;
7244 printf ("DW_OP_deref");
7247 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7250 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7253 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7257 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7261 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7265 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7269 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7270 (unsigned long) byte_get (data
+ 4, 4));
7274 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7275 (long) byte_get (data
+ 4, 4));
7279 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7283 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7287 printf ("DW_OP_dup");
7290 printf ("DW_OP_drop");
7293 printf ("DW_OP_over");
7296 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7299 printf ("DW_OP_swap");
7302 printf ("DW_OP_rot");
7305 printf ("DW_OP_xderef");
7308 printf ("DW_OP_abs");
7311 printf ("DW_OP_and");
7314 printf ("DW_OP_div");
7317 printf ("DW_OP_minus");
7320 printf ("DW_OP_mod");
7323 printf ("DW_OP_mul");
7326 printf ("DW_OP_neg");
7329 printf ("DW_OP_not");
7332 printf ("DW_OP_or");
7335 printf ("DW_OP_plus");
7337 case DW_OP_plus_uconst
:
7338 printf ("DW_OP_plus_uconst: %lu",
7339 read_leb128 (data
, &bytes_read
, 0));
7343 printf ("DW_OP_shl");
7346 printf ("DW_OP_shr");
7349 printf ("DW_OP_shra");
7352 printf ("DW_OP_xor");
7355 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7359 printf ("DW_OP_eq");
7362 printf ("DW_OP_ge");
7365 printf ("DW_OP_gt");
7368 printf ("DW_OP_le");
7371 printf ("DW_OP_lt");
7374 printf ("DW_OP_ne");
7377 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7413 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7448 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7483 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7484 read_leb128 (data
, &bytes_read
, 1));
7489 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7493 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7497 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7499 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7500 read_leb128 (data
, &bytes_read
, 1));
7504 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7507 case DW_OP_deref_size
:
7508 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7510 case DW_OP_xderef_size
:
7511 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7514 printf ("DW_OP_nop");
7517 /* DWARF 3 extensions. */
7518 case DW_OP_push_object_address
:
7519 printf ("DW_OP_push_object_address");
7522 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7526 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7529 case DW_OP_call_ref
:
7530 printf ("DW_OP_call_ref");
7533 /* GNU extensions. */
7534 case DW_OP_GNU_push_tls_address
:
7535 printf ("DW_OP_GNU_push_tls_address");
7539 if (op
>= DW_OP_lo_user
7540 && op
<= DW_OP_hi_user
)
7541 printf (_("(User defined location op)"));
7543 printf (_("(Unknown location op)"));
7544 /* No way to tell where the next op is, so just bail. */
7548 /* Separate the ops. */
7553 static const char *debug_loc_contents
;
7554 static bfd_vma debug_loc_size
;
7557 load_debug_loc (file
)
7560 Elf_Internal_Shdr
*sec
;
7563 /* If it is already loaded, do nothing. */
7564 if (debug_loc_contents
!= NULL
)
7567 /* Locate the .debug_loc section. */
7568 for (i
= 0, sec
= section_headers
;
7569 i
< elf_header
.e_shnum
;
7571 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7574 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7577 debug_loc_size
= sec
->sh_size
;
7579 debug_loc_contents
= ((char *)
7580 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7581 _("debug_loc section data")));
7587 if (debug_loc_contents
== NULL
)
7590 free ((char *) debug_loc_contents
);
7591 debug_loc_contents
= NULL
;
7597 display_debug_loc (section
, start
, file
)
7598 Elf_Internal_Shdr
*section
;
7599 unsigned char *start
;
7600 FILE *file ATTRIBUTE_UNUSED
;
7602 unsigned char *section_end
;
7603 unsigned long bytes
;
7604 unsigned char *section_begin
= start
;
7607 addr
= section
->sh_addr
;
7608 bytes
= section
->sh_size
;
7609 section_end
= start
+ bytes
;
7613 printf (_("\nThe .debug_loc section is empty.\n"));
7617 printf (_("Contents of the .debug_loc section:\n\n"));
7618 printf (_("\n Offset Begin End Expression\n"));
7620 while (start
< section_end
)
7622 unsigned long begin
;
7624 unsigned short length
;
7625 unsigned long offset
;
7627 offset
= start
- section_begin
;
7631 /* Normally, the lists in the debug_loc section are related to a
7632 given compilation unit, and thus, we would use the pointer size
7633 of that compilation unit. However, since we are displaying it
7634 seperately here, we either have to store pointer sizes of all
7635 compilation units, or assume they don't change. We assume,
7636 like the debug_line display, that it doesn't change. */
7637 begin
= byte_get (start
, debug_line_pointer_size
);
7638 start
+= debug_line_pointer_size
;
7639 end
= byte_get (start
, debug_line_pointer_size
);
7640 start
+= debug_line_pointer_size
;
7642 if (begin
== 0 && end
== 0)
7645 /* For now, skip any base address specifiers. */
7646 if (begin
== 0xffffffff)
7652 length
= byte_get (start
, 2);
7655 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7656 decode_location_expression (start
, debug_line_pointer_size
, length
);
7666 static const char *debug_str_contents
;
7667 static bfd_vma debug_str_size
;
7670 load_debug_str (file
)
7673 Elf_Internal_Shdr
*sec
;
7676 /* If it is already loaded, do nothing. */
7677 if (debug_str_contents
!= NULL
)
7680 /* Locate the .debug_str section. */
7681 for (i
= 0, sec
= section_headers
;
7682 i
< elf_header
.e_shnum
;
7684 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7687 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7690 debug_str_size
= sec
->sh_size
;
7692 debug_str_contents
= ((char *)
7693 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7694 _("debug_str section data")));
7700 if (debug_str_contents
== NULL
)
7703 free ((char *) debug_str_contents
);
7704 debug_str_contents
= NULL
;
7709 fetch_indirect_string (offset
)
7710 unsigned long offset
;
7712 if (debug_str_contents
== NULL
)
7713 return _("<no .debug_str section>");
7715 if (offset
> debug_str_size
)
7716 return _("<offset is too big>");
7718 return debug_str_contents
+ offset
;
7722 display_debug_str (section
, start
, file
)
7723 Elf_Internal_Shdr
*section
;
7724 unsigned char *start
;
7725 FILE *file ATTRIBUTE_UNUSED
;
7727 unsigned long bytes
;
7730 addr
= section
->sh_addr
;
7731 bytes
= section
->sh_size
;
7735 printf (_("\nThe .debug_str section is empty.\n"));
7739 printf (_("Contents of the .debug_str section:\n\n"));
7747 lbytes
= (bytes
> 16 ? 16 : bytes
);
7749 printf (" 0x%8.8lx ", (unsigned long) addr
);
7751 for (j
= 0; j
< 16; j
++)
7754 printf ("%2.2x", start
[j
]);
7762 for (j
= 0; j
< lbytes
; j
++)
7765 if (k
>= ' ' && k
< 0x80)
7781 static unsigned char *
7782 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
)
7783 unsigned long attribute
;
7785 unsigned char *data
;
7786 unsigned long cu_offset
;
7787 unsigned long pointer_size
;
7789 unsigned long uvalue
= 0;
7790 unsigned char *block_start
= NULL
;
7798 case DW_FORM_ref_addr
:
7800 uvalue
= byte_get (data
, pointer_size
);
7801 data
+= pointer_size
;
7805 uvalue
= byte_get (data
, /* offset_size */ 4);
7806 data
+= /* offset_size */ 4;
7812 uvalue
= byte_get (data
++, 1);
7817 uvalue
= byte_get (data
, 2);
7823 uvalue
= byte_get (data
, 4);
7828 uvalue
= read_leb128 (data
, & bytes_read
, 1);
7832 case DW_FORM_ref_udata
:
7834 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7838 case DW_FORM_indirect
:
7839 form
= read_leb128 (data
, & bytes_read
, 0);
7841 printf (" %s", get_FORM_name (form
));
7842 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
7848 case DW_FORM_ref_addr
:
7849 printf (" <#%lx>", uvalue
);
7855 case DW_FORM_ref_udata
:
7856 printf (" <%lx>", uvalue
+ cu_offset
);
7860 printf (" %#lx", uvalue
);
7868 printf (" %ld", uvalue
);
7873 uvalue
= byte_get (data
, 4);
7874 printf (" %lx", uvalue
);
7875 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
7879 case DW_FORM_string
:
7880 printf (" %s", data
);
7881 data
+= strlen ((char *) data
) + 1;
7885 uvalue
= read_leb128 (data
, & bytes_read
, 0);
7886 block_start
= data
+ bytes_read
;
7887 data
= display_block (block_start
, uvalue
);
7890 case DW_FORM_block1
:
7891 uvalue
= byte_get (data
, 1);
7892 block_start
= data
+ 1;
7893 data
= display_block (block_start
, uvalue
);
7896 case DW_FORM_block2
:
7897 uvalue
= byte_get (data
, 2);
7898 block_start
= data
+ 2;
7899 data
= display_block (block_start
, uvalue
);
7902 case DW_FORM_block4
:
7903 uvalue
= byte_get (data
, 4);
7904 block_start
= data
+ 4;
7905 data
= display_block (block_start
, uvalue
);
7909 printf (_(" (indirect string, offset: 0x%lx): %s"),
7910 uvalue
, fetch_indirect_string (uvalue
));
7913 case DW_FORM_indirect
:
7914 /* Handled above. */
7918 warn (_("Unrecognized form: %d\n"), form
);
7922 /* For some attributes we can display futher information. */
7931 case DW_INL_not_inlined
:
7932 printf (_("(not inlined)"));
7934 case DW_INL_inlined
:
7935 printf (_("(inlined)"));
7937 case DW_INL_declared_not_inlined
:
7938 printf (_("(declared as inline but ignored)"));
7940 case DW_INL_declared_inlined
:
7941 printf (_("(declared as inline and inlined)"));
7944 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
7949 case DW_AT_language
:
7952 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
7953 case DW_LANG_C89
: printf ("(ANSI C)"); break;
7954 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
7955 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
7956 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
7957 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
7958 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
7959 case DW_LANG_Ada83
: printf ("(Ada)"); break;
7960 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
7961 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
7962 /* DWARF 2.1 values. */
7963 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
7964 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
7965 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
7966 /* MIPS extension. */
7967 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
7968 /* UPC extension. */
7969 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
7971 printf ("(Unknown: %lx)", uvalue
);
7976 case DW_AT_encoding
:
7979 case DW_ATE_void
: printf ("(void)"); break;
7980 case DW_ATE_address
: printf ("(machine address)"); break;
7981 case DW_ATE_boolean
: printf ("(boolean)"); break;
7982 case DW_ATE_complex_float
: printf ("(complex float)"); break;
7983 case DW_ATE_float
: printf ("(float)"); break;
7984 case DW_ATE_signed
: printf ("(signed)"); break;
7985 case DW_ATE_signed_char
: printf ("(signed char)"); break;
7986 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
7987 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
7988 /* DWARF 2.1 value. */
7989 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
7991 if (uvalue
>= DW_ATE_lo_user
7992 && uvalue
<= DW_ATE_hi_user
)
7993 printf ("(user defined type)");
7995 printf ("(unknown type)");
8000 case DW_AT_accessibility
:
8003 case DW_ACCESS_public
: printf ("(public)"); break;
8004 case DW_ACCESS_protected
: printf ("(protected)"); break;
8005 case DW_ACCESS_private
: printf ("(private)"); break;
8007 printf ("(unknown accessibility)");
8012 case DW_AT_visibility
:
8015 case DW_VIS_local
: printf ("(local)"); break;
8016 case DW_VIS_exported
: printf ("(exported)"); break;
8017 case DW_VIS_qualified
: printf ("(qualified)"); break;
8018 default: printf ("(unknown visibility)"); break;
8022 case DW_AT_virtuality
:
8025 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8026 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8027 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8028 default: printf ("(unknown virtuality)"); break;
8032 case DW_AT_identifier_case
:
8035 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8036 case DW_ID_up_case
: printf ("(up_case)"); break;
8037 case DW_ID_down_case
: printf ("(down_case)"); break;
8038 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8039 default: printf ("(unknown case)"); break;
8043 case DW_AT_calling_convention
:
8046 case DW_CC_normal
: printf ("(normal)"); break;
8047 case DW_CC_program
: printf ("(program)"); break;
8048 case DW_CC_nocall
: printf ("(nocall)"); break;
8050 if (uvalue
>= DW_CC_lo_user
8051 && uvalue
<= DW_CC_hi_user
)
8052 printf ("(user defined)");
8054 printf ("(unknown convention)");
8058 case DW_AT_ordering
:
8061 case -1: printf ("(undefined)"); break;
8062 case 0: printf ("(row major)"); break;
8063 case 1: printf ("(column major)"); break;
8067 case DW_AT_frame_base
:
8068 case DW_AT_location
:
8069 case DW_AT_data_member_location
:
8070 case DW_AT_vtable_elem_location
:
8071 case DW_AT_allocated
:
8072 case DW_AT_associated
:
8073 case DW_AT_data_location
:
8075 case DW_AT_upper_bound
:
8076 case DW_AT_lower_bound
:
8080 decode_location_expression (block_start
, pointer_size
, uvalue
);
8083 else if (form
== DW_FORM_data4
)
8086 printf ("location list");
8098 static unsigned char *
8099 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
)
8100 unsigned long attribute
;
8102 unsigned char *data
;
8103 unsigned long cu_offset
;
8104 unsigned long pointer_size
;
8106 printf (" %-18s:", get_AT_name (attribute
));
8107 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8114 display_debug_info (section
, start
, file
)
8115 Elf_Internal_Shdr
*section
;
8116 unsigned char *start
;
8119 unsigned char *end
= start
+ section
->sh_size
;
8120 unsigned char *section_begin
= start
;
8122 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8124 load_debug_str (file
);
8125 load_debug_loc (file
);
8129 DWARF2_External_CompUnit
*external
;
8130 DWARF2_Internal_CompUnit compunit
;
8131 Elf_Internal_Shdr
*relsec
;
8132 unsigned char *tags
;
8135 unsigned long cu_offset
;
8137 external
= (DWARF2_External_CompUnit
*) start
;
8139 compunit
.cu_length
= BYTE_GET (external
->cu_length
);
8140 compunit
.cu_version
= BYTE_GET (external
->cu_version
);
8141 compunit
.cu_abbrev_offset
= BYTE_GET (external
->cu_abbrev_offset
);
8142 compunit
.cu_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
8144 if (compunit
.cu_length
== 0xffffffff)
8146 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8150 /* Check for RELA relocations in the
8151 abbrev_offset address, and apply them. */
8152 for (relsec
= section_headers
;
8153 relsec
< section_headers
+ elf_header
.e_shnum
;
8156 unsigned long nrelas
;
8157 Elf_Internal_Rela
*rela
, *rp
;
8158 Elf_Internal_Shdr
*symsec
;
8159 Elf_Internal_Sym
*symtab
;
8160 Elf_Internal_Sym
*sym
;
8162 if (relsec
->sh_type
!= SHT_RELA
8163 || SECTION_HEADER (relsec
->sh_info
) != section
8164 || relsec
->sh_size
== 0)
8167 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8171 symsec
= SECTION_HEADER (relsec
->sh_link
);
8172 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8174 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8177 != (bfd_vma
) ((unsigned char *) &external
->cu_abbrev_offset
8183 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8185 if (ELF32_R_SYM (rp
->r_info
) != 0
8186 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8188 warn (_("Skipping unexpected symbol type %u\n"),
8189 ELF32_ST_TYPE (sym
->st_info
));
8195 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8197 if (ELF64_R_SYM (rp
->r_info
) != 0
8198 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8200 warn (_("Skipping unexpected symbol type %u\n"),
8201 ELF64_ST_TYPE (sym
->st_info
));
8206 compunit
.cu_abbrev_offset
= rp
->r_addend
;
8214 tags
= start
+ sizeof (*external
);
8215 cu_offset
= start
- section_begin
;
8216 start
+= compunit
.cu_length
+ sizeof (external
->cu_length
);
8218 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8219 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8220 printf (_(" Version: %d\n"), compunit
.cu_version
);
8221 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8222 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8224 if (compunit
.cu_version
!= 2)
8226 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8232 /* Read in the abbrevs used by this compilation unit. */
8234 Elf_Internal_Shdr
*sec
;
8235 unsigned char *begin
;
8237 /* Locate the .debug_abbrev section and process it. */
8238 for (i
= 0, sec
= section_headers
;
8239 i
< elf_header
.e_shnum
;
8241 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8244 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8246 warn (_("Unable to locate .debug_abbrev section!\n"));
8250 begin
= ((unsigned char *)
8251 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8252 _("debug_abbrev section data")));
8256 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8257 begin
+ sec
->sh_size
);
8263 while (tags
< start
)
8266 unsigned long abbrev_number
;
8267 abbrev_entry
*entry
;
8270 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8273 /* A null DIE marks the end of a list of children. */
8274 if (abbrev_number
== 0)
8280 /* Scan through the abbreviation list until we reach the
8282 for (entry
= first_abbrev
;
8283 entry
&& entry
->entry
!= abbrev_number
;
8284 entry
= entry
->next
)
8289 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8294 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8296 (unsigned long) (tags
- section_begin
- bytes_read
),
8298 get_TAG_name (entry
->tag
));
8300 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8301 tags
= read_and_display_attr (attr
->attribute
,
8304 compunit
.cu_pointer_size
);
8306 if (entry
->children
)
8320 display_debug_aranges (section
, start
, file
)
8321 Elf_Internal_Shdr
*section
;
8322 unsigned char *start
;
8323 FILE *file ATTRIBUTE_UNUSED
;
8325 unsigned char *end
= start
+ section
->sh_size
;
8327 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8331 DWARF2_External_ARange
*external
;
8332 DWARF2_Internal_ARange arange
;
8333 unsigned char *ranges
;
8334 unsigned long length
;
8335 unsigned long address
;
8338 external
= (DWARF2_External_ARange
*) start
;
8340 arange
.ar_length
= BYTE_GET (external
->ar_length
);
8341 arange
.ar_version
= BYTE_GET (external
->ar_version
);
8342 arange
.ar_info_offset
= BYTE_GET (external
->ar_info_offset
);
8343 arange
.ar_pointer_size
= BYTE_GET (external
->ar_pointer_size
);
8344 arange
.ar_segment_size
= BYTE_GET (external
->ar_segment_size
);
8346 if (arange
.ar_length
== 0xffffffff)
8348 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8352 if (arange
.ar_version
!= 2)
8354 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8358 printf (_(" Length: %ld\n"), arange
.ar_length
);
8359 printf (_(" Version: %d\n"), arange
.ar_version
);
8360 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8361 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8362 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8364 printf (_("\n Address Length\n"));
8366 ranges
= start
+ sizeof (*external
);
8368 /* Must pad to an alignment boundary that is twice the pointer size. */
8369 excess
= sizeof (*external
) % (2 * arange
.ar_pointer_size
);
8371 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8375 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8377 ranges
+= arange
.ar_pointer_size
;
8379 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8381 ranges
+= arange
.ar_pointer_size
;
8383 /* A pair of zeros marks the end of the list. */
8384 if (address
== 0 && length
== 0)
8387 printf (" %8.8lx %lu\n", address
, length
);
8390 start
+= arange
.ar_length
+ sizeof (external
->ar_length
);
8398 typedef struct Frame_Chunk
8400 struct Frame_Chunk
*next
;
8401 unsigned char *chunk_start
;
8403 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8404 short int *col_type
;
8407 unsigned int code_factor
;
8409 unsigned long pc_begin
;
8410 unsigned long pc_range
;
8414 unsigned char fde_encoding
;
8418 /* A marker for a col_type that means this column was never referenced
8419 in the frame info. */
8420 #define DW_CFA_unreferenced (-1)
8422 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
8423 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
8424 static int size_of_encoded_value
PARAMS ((int));
8427 frame_need_space (fc
, reg
)
8431 int prev
= fc
->ncols
;
8433 if (reg
< fc
->ncols
)
8436 fc
->ncols
= reg
+ 1;
8437 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
8438 fc
->ncols
* sizeof (short int));
8439 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
8440 fc
->ncols
* sizeof (int));
8442 while (prev
< fc
->ncols
)
8444 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8445 fc
->col_offset
[prev
] = 0;
8451 frame_display_row (fc
, need_col_headers
, max_regs
)
8453 int *need_col_headers
;
8459 if (*max_regs
< fc
->ncols
)
8460 *max_regs
= fc
->ncols
;
8462 if (*need_col_headers
)
8464 *need_col_headers
= 0;
8466 printf (" LOC CFA ");
8468 for (r
= 0; r
< *max_regs
; r
++)
8469 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8474 printf ("r%-4d", r
);
8480 printf ("%08lx ", fc
->pc_begin
);
8481 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8482 printf ("%-8s ", tmp
);
8484 for (r
= 0; r
< fc
->ncols
; r
++)
8486 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8488 switch (fc
->col_type
[r
])
8490 case DW_CFA_undefined
:
8493 case DW_CFA_same_value
:
8497 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8499 case DW_CFA_register
:
8500 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8503 strcpy (tmp
, "n/a");
8506 printf ("%-5s", tmp
);
8513 size_of_encoded_value (encoding
)
8516 switch (encoding
& 0x7)
8519 case 0: return is_32bit_elf
? 4 : 8;
8526 #define GET(N) byte_get (start, N); start += N
8527 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8528 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8531 display_debug_frames (section
, start
, file
)
8532 Elf_Internal_Shdr
*section
;
8533 unsigned char *start
;
8534 FILE *file ATTRIBUTE_UNUSED
;
8536 unsigned char *end
= start
+ section
->sh_size
;
8537 unsigned char *section_start
= start
;
8538 Frame_Chunk
*chunks
= 0;
8539 Frame_Chunk
*remembered_state
= 0;
8541 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8544 int addr_size
= is_32bit_elf
? 4 : 8;
8546 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8550 unsigned char *saved_start
;
8551 unsigned char *block_end
;
8552 unsigned long length
;
8553 unsigned long cie_id
;
8556 int need_col_headers
= 1;
8557 unsigned char *augmentation_data
= NULL
;
8558 unsigned long augmentation_data_len
= 0;
8559 int encoded_ptr_size
= addr_size
;
8561 saved_start
= start
;
8562 length
= byte_get (start
, 4); start
+= 4;
8566 printf ("\n%08lx ZERO terminator\n\n",
8567 (unsigned long)(saved_start
- section_start
));
8571 if (length
== 0xffffffff)
8573 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8577 block_end
= saved_start
+ length
+ 4;
8578 cie_id
= byte_get (start
, 4); start
+= 4;
8580 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8584 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8585 memset (fc
, 0, sizeof (Frame_Chunk
));
8589 fc
->chunk_start
= saved_start
;
8591 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8592 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8593 frame_need_space (fc
, max_regs
-1);
8597 fc
->augmentation
= start
;
8598 start
= strchr (start
, '\0') + 1;
8600 if (fc
->augmentation
[0] == 'z')
8602 fc
->code_factor
= LEB ();
8603 fc
->data_factor
= SLEB ();
8604 fc
->ra
= byte_get (start
, 1); start
+= 1;
8605 augmentation_data_len
= LEB ();
8606 augmentation_data
= start
;
8607 start
+= augmentation_data_len
;
8609 else if (strcmp (fc
->augmentation
, "eh") == 0)
8612 fc
->code_factor
= LEB ();
8613 fc
->data_factor
= SLEB ();
8614 fc
->ra
= byte_get (start
, 1); start
+= 1;
8618 fc
->code_factor
= LEB ();
8619 fc
->data_factor
= SLEB ();
8620 fc
->ra
= byte_get (start
, 1); start
+= 1;
8624 if (do_debug_frames_interp
)
8625 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8626 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8627 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8631 printf ("\n%08lx %08lx %08lx CIE\n",
8632 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8633 printf (" Version: %d\n", version
);
8634 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8635 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8636 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8637 printf (" Return address column: %d\n", fc
->ra
);
8639 if (augmentation_data_len
)
8642 printf (" Augmentation data: ");
8643 for (i
= 0; i
< augmentation_data_len
; ++i
)
8644 printf (" %02x", augmentation_data
[i
]);
8650 if (augmentation_data_len
)
8652 unsigned char *p
, *q
;
8653 p
= fc
->augmentation
+ 1;
8654 q
= augmentation_data
;
8661 q
+= 1 + size_of_encoded_value (*q
);
8663 fc
->fde_encoding
= *q
++;
8669 if (fc
->fde_encoding
)
8670 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8673 frame_need_space (fc
, fc
->ra
);
8677 unsigned char *look_for
;
8678 static Frame_Chunk fde_fc
;
8681 memset (fc
, 0, sizeof (Frame_Chunk
));
8683 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8685 for (cie
= chunks
; cie
; cie
= cie
->next
)
8686 if (cie
->chunk_start
== look_for
)
8691 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8692 cie_id
, saved_start
);
8695 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8696 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8697 frame_need_space (fc
, max_regs
- 1);
8699 fc
->augmentation
= "";
8700 fc
->fde_encoding
= 0;
8704 fc
->ncols
= cie
->ncols
;
8705 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
8706 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
8707 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
8708 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
8709 fc
->augmentation
= cie
->augmentation
;
8710 fc
->code_factor
= cie
->code_factor
;
8711 fc
->data_factor
= cie
->data_factor
;
8712 fc
->cfa_reg
= cie
->cfa_reg
;
8713 fc
->cfa_offset
= cie
->cfa_offset
;
8715 frame_need_space (fc
, max_regs
-1);
8716 fc
->fde_encoding
= cie
->fde_encoding
;
8719 if (fc
->fde_encoding
)
8720 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8722 fc
->pc_begin
= byte_get (start
, encoded_ptr_size
);
8723 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8724 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
8725 start
+= encoded_ptr_size
;
8726 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
8727 start
+= encoded_ptr_size
;
8729 if (cie
->augmentation
[0] == 'z')
8731 augmentation_data_len
= LEB ();
8732 augmentation_data
= start
;
8733 start
+= augmentation_data_len
;
8736 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8737 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8738 (unsigned long)(cie
->chunk_start
- section_start
),
8739 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
8740 if (! do_debug_frames_interp
&& augmentation_data_len
)
8743 printf (" Augmentation data: ");
8744 for (i
= 0; i
< augmentation_data_len
; ++i
)
8745 printf (" %02x", augmentation_data
[i
]);
8751 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8752 about to interpret instructions for the chunk. */
8754 if (do_debug_frames_interp
)
8756 /* Start by making a pass over the chunk, allocating storage
8757 and taking note of what registers are used. */
8758 unsigned char *tmp
= start
;
8760 while (start
< block_end
)
8770 /* Warning: if you add any more cases to this switch, be
8771 sure to add them to the corresponding switch below. */
8774 case DW_CFA_advance_loc
:
8778 frame_need_space (fc
, opa
);
8779 fc
->col_type
[opa
] = DW_CFA_undefined
;
8781 case DW_CFA_restore
:
8782 frame_need_space (fc
, opa
);
8783 fc
->col_type
[opa
] = DW_CFA_undefined
;
8785 case DW_CFA_set_loc
:
8786 start
+= encoded_ptr_size
;
8788 case DW_CFA_advance_loc1
:
8791 case DW_CFA_advance_loc2
:
8794 case DW_CFA_advance_loc4
:
8797 case DW_CFA_offset_extended
:
8798 reg
= LEB (); LEB ();
8799 frame_need_space (fc
, reg
);
8800 fc
->col_type
[reg
] = DW_CFA_undefined
;
8802 case DW_CFA_restore_extended
:
8804 frame_need_space (fc
, reg
);
8805 fc
->col_type
[reg
] = DW_CFA_undefined
;
8807 case DW_CFA_undefined
:
8809 frame_need_space (fc
, reg
);
8810 fc
->col_type
[reg
] = DW_CFA_undefined
;
8812 case DW_CFA_same_value
:
8814 frame_need_space (fc
, reg
);
8815 fc
->col_type
[reg
] = DW_CFA_undefined
;
8817 case DW_CFA_register
:
8818 reg
= LEB (); LEB ();
8819 frame_need_space (fc
, reg
);
8820 fc
->col_type
[reg
] = DW_CFA_undefined
;
8822 case DW_CFA_def_cfa
:
8825 case DW_CFA_def_cfa_register
:
8828 case DW_CFA_def_cfa_offset
:
8831 case DW_CFA_offset_extended_sf
:
8832 reg
= LEB (); SLEB ();
8833 frame_need_space (fc
, reg
);
8834 fc
->col_type
[reg
] = DW_CFA_undefined
;
8836 case DW_CFA_def_cfa_sf
:
8839 case DW_CFA_def_cfa_offset_sf
:
8842 case DW_CFA_GNU_args_size
:
8845 case DW_CFA_GNU_negative_offset_extended
:
8846 reg
= LEB (); LEB ();
8847 frame_need_space (fc
, reg
);
8848 fc
->col_type
[reg
] = DW_CFA_undefined
;
8857 /* Now we know what registers are used, make a second pass over
8858 the chunk, this time actually printing out the info. */
8860 while (start
< block_end
)
8863 unsigned long ul
, reg
, roffs
;
8872 /* Warning: if you add any more cases to this switch, be
8873 sure to add them to the corresponding switch above. */
8876 case DW_CFA_advance_loc
:
8877 if (do_debug_frames_interp
)
8878 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8880 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8881 opa
* fc
->code_factor
,
8882 fc
->pc_begin
+ opa
* fc
->code_factor
);
8883 fc
->pc_begin
+= opa
* fc
->code_factor
;
8888 if (! do_debug_frames_interp
)
8889 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8890 opa
, roffs
* fc
->data_factor
);
8891 fc
->col_type
[opa
] = DW_CFA_offset
;
8892 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
8895 case DW_CFA_restore
:
8896 if (! do_debug_frames_interp
)
8897 printf (" DW_CFA_restore: r%d\n", opa
);
8898 fc
->col_type
[opa
] = cie
->col_type
[opa
];
8899 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
8902 case DW_CFA_set_loc
:
8903 vma
= byte_get (start
, encoded_ptr_size
);
8904 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
8905 vma
+= section
->sh_addr
+ (start
- section_start
);
8906 start
+= encoded_ptr_size
;
8907 if (do_debug_frames_interp
)
8908 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8910 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
8914 case DW_CFA_advance_loc1
:
8915 ofs
= byte_get (start
, 1); start
+= 1;
8916 if (do_debug_frames_interp
)
8917 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8919 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8920 ofs
* fc
->code_factor
,
8921 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8922 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8925 case DW_CFA_advance_loc2
:
8926 ofs
= byte_get (start
, 2); start
+= 2;
8927 if (do_debug_frames_interp
)
8928 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8930 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8931 ofs
* fc
->code_factor
,
8932 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8933 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8936 case DW_CFA_advance_loc4
:
8937 ofs
= byte_get (start
, 4); start
+= 4;
8938 if (do_debug_frames_interp
)
8939 frame_display_row (fc
, &need_col_headers
, &max_regs
);
8941 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8942 ofs
* fc
->code_factor
,
8943 fc
->pc_begin
+ ofs
* fc
->code_factor
);
8944 fc
->pc_begin
+= ofs
* fc
->code_factor
;
8947 case DW_CFA_offset_extended
:
8950 if (! do_debug_frames_interp
)
8951 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8952 reg
, roffs
* fc
->data_factor
);
8953 fc
->col_type
[reg
] = DW_CFA_offset
;
8954 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
8957 case DW_CFA_restore_extended
:
8959 if (! do_debug_frames_interp
)
8960 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
8961 fc
->col_type
[reg
] = cie
->col_type
[reg
];
8962 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
8965 case DW_CFA_undefined
:
8967 if (! do_debug_frames_interp
)
8968 printf (" DW_CFA_undefined: r%ld\n", reg
);
8969 fc
->col_type
[reg
] = DW_CFA_undefined
;
8970 fc
->col_offset
[reg
] = 0;
8973 case DW_CFA_same_value
:
8975 if (! do_debug_frames_interp
)
8976 printf (" DW_CFA_same_value: r%ld\n", reg
);
8977 fc
->col_type
[reg
] = DW_CFA_same_value
;
8978 fc
->col_offset
[reg
] = 0;
8981 case DW_CFA_register
:
8984 if (! do_debug_frames_interp
)
8985 printf (" DW_CFA_register: r%ld\n", reg
);
8986 fc
->col_type
[reg
] = DW_CFA_register
;
8987 fc
->col_offset
[reg
] = roffs
;
8990 case DW_CFA_remember_state
:
8991 if (! do_debug_frames_interp
)
8992 printf (" DW_CFA_remember_state\n");
8993 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8994 rs
->ncols
= fc
->ncols
;
8995 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
8996 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
8997 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
8998 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
8999 rs
->next
= remembered_state
;
9000 remembered_state
= rs
;
9003 case DW_CFA_restore_state
:
9004 if (! do_debug_frames_interp
)
9005 printf (" DW_CFA_restore_state\n");
9006 rs
= remembered_state
;
9007 remembered_state
= rs
->next
;
9008 frame_need_space (fc
, rs
->ncols
-1);
9009 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9010 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9011 free (rs
->col_type
);
9012 free (rs
->col_offset
);
9016 case DW_CFA_def_cfa
:
9017 fc
->cfa_reg
= LEB ();
9018 fc
->cfa_offset
= LEB ();
9019 if (! do_debug_frames_interp
)
9020 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9021 fc
->cfa_reg
, fc
->cfa_offset
);
9024 case DW_CFA_def_cfa_register
:
9025 fc
->cfa_reg
= LEB ();
9026 if (! do_debug_frames_interp
)
9027 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9030 case DW_CFA_def_cfa_offset
:
9031 fc
->cfa_offset
= LEB ();
9032 if (! do_debug_frames_interp
)
9033 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9037 if (! do_debug_frames_interp
)
9038 printf (" DW_CFA_nop\n");
9041 case DW_CFA_offset_extended_sf
:
9044 frame_need_space (fc
, reg
);
9045 if (! do_debug_frames_interp
)
9046 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9047 reg
, l
* fc
->data_factor
);
9048 fc
->col_type
[reg
] = DW_CFA_offset
;
9049 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9052 case DW_CFA_def_cfa_sf
:
9053 fc
->cfa_reg
= LEB ();
9054 fc
->cfa_offset
= SLEB ();
9055 if (! do_debug_frames_interp
)
9056 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9057 fc
->cfa_reg
, fc
->cfa_offset
);
9060 case DW_CFA_def_cfa_offset_sf
:
9061 fc
->cfa_offset
= SLEB ();
9062 if (! do_debug_frames_interp
)
9063 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9066 case DW_CFA_GNU_window_save
:
9067 if (! do_debug_frames_interp
)
9068 printf (" DW_CFA_GNU_window_save\n");
9071 case DW_CFA_GNU_args_size
:
9073 if (! do_debug_frames_interp
)
9074 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9077 case DW_CFA_GNU_negative_offset_extended
:
9080 frame_need_space (fc
, reg
);
9081 if (! do_debug_frames_interp
)
9082 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9083 reg
, l
* fc
->data_factor
);
9084 fc
->col_type
[reg
] = DW_CFA_offset
;
9085 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9088 /* FIXME: How do we handle these? */
9089 case DW_CFA_def_cfa_expression
:
9090 fprintf (stderr
, "unsupported DW_CFA_def_cfa_expression\n");
9094 case DW_CFA_expression
:
9095 fprintf (stderr
, "unsupported DW_CFA_expression\n");
9100 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9105 if (do_debug_frames_interp
)
9106 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9121 display_debug_not_supported (section
, start
, file
)
9122 Elf_Internal_Shdr
*section
;
9123 unsigned char *start ATTRIBUTE_UNUSED
;
9124 FILE *file ATTRIBUTE_UNUSED
;
9126 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9127 SECTION_NAME (section
));
9132 /* Pre-scan the .debug_info section to record the size of address.
9133 When dumping the .debug_line, we use that size information, assuming
9134 that all compilation units have the same address size. */
9136 prescan_debug_info (section
, start
, file
)
9137 Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
;
9138 unsigned char *start
;
9139 FILE *file ATTRIBUTE_UNUSED
;
9141 DWARF2_External_CompUnit
*external
;
9143 external
= (DWARF2_External_CompUnit
*) start
;
9145 debug_line_pointer_size
= BYTE_GET (external
->cu_pointer_size
);
9149 /* A structure containing the name of a debug section and a pointer
9150 to a function that can decode it. The third field is a prescan
9151 function to be run over the section before displaying any of the
9155 const char *const name
;
9156 int (*display
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9157 int (*prescan
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9161 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9162 { ".debug_aranges", display_debug_aranges
, NULL
},
9163 { ".debug_frame", display_debug_frames
, NULL
},
9164 { ".debug_info", display_debug_info
, prescan_debug_info
},
9165 { ".debug_line", display_debug_lines
, NULL
},
9166 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9167 { ".eh_frame", display_debug_frames
, NULL
},
9168 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9169 { ".debug_str", display_debug_str
, NULL
},
9170 { ".debug_loc", display_debug_loc
, NULL
},
9171 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9172 { ".debug_ranges", display_debug_not_supported
, NULL
},
9173 { ".debug_static_func", display_debug_not_supported
, NULL
},
9174 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9175 { ".debug_types", display_debug_not_supported
, NULL
},
9176 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9180 display_debug_section (section
, file
)
9181 Elf_Internal_Shdr
*section
;
9184 char *name
= SECTION_NAME (section
);
9185 bfd_size_type length
;
9186 unsigned char *start
;
9189 length
= section
->sh_size
;
9192 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9196 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
9197 _("debug section data"));
9201 /* See if we know how to display the contents of this section. */
9202 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9203 name
= ".debug_info";
9205 for (i
= NUM_ELEM (debug_displays
); i
--;)
9206 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9208 debug_displays
[i
].display (section
, start
, file
);
9213 printf (_("Unrecognized debug section: %s\n"), name
);
9217 /* If we loaded in the abbrev section at some point,
9218 we must release it here. */
9225 process_section_contents (file
)
9228 Elf_Internal_Shdr
*section
;
9234 /* Pre-scan the debug sections to find some debug information not
9235 present in some of them. For the .debug_line, we must find out the
9236 size of address (specified in .debug_info and .debug_aranges). */
9237 for (i
= 0, section
= section_headers
;
9238 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9241 char *name
= SECTION_NAME (section
);
9244 if (section
->sh_size
== 0)
9247 /* See if there is some pre-scan operation for this section. */
9248 for (j
= NUM_ELEM (debug_displays
); j
--;)
9249 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9251 if (debug_displays
[j
].prescan
!= NULL
)
9253 bfd_size_type length
;
9254 unsigned char *start
;
9256 length
= section
->sh_size
;
9257 start
= ((unsigned char *)
9258 get_data (NULL
, file
, section
->sh_offset
, length
,
9259 _("debug section data")));
9263 debug_displays
[j
].prescan (section
, start
, file
);
9271 for (i
= 0, section
= section_headers
;
9272 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9275 #ifdef SUPPORT_DISASSEMBLY
9276 if (dump_sects
[i
] & DISASS_DUMP
)
9277 disassemble_section (section
, file
);
9279 if (dump_sects
[i
] & HEX_DUMP
)
9280 dump_section (section
, file
);
9282 if (dump_sects
[i
] & DEBUG_DUMP
)
9283 display_debug_section (section
, file
);
9286 if (i
< num_dump_sects
)
9287 warn (_("Some sections were not dumped because they do not exist!\n"));
9293 process_mips_fpe_exception (mask
)
9299 if (mask
& OEX_FPU_INEX
)
9300 fputs ("INEX", stdout
), first
= 0;
9301 if (mask
& OEX_FPU_UFLO
)
9302 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9303 if (mask
& OEX_FPU_OFLO
)
9304 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9305 if (mask
& OEX_FPU_DIV0
)
9306 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9307 if (mask
& OEX_FPU_INVAL
)
9308 printf ("%sINVAL", first
? "" : "|");
9311 fputs ("0", stdout
);
9315 process_mips_specific (file
)
9318 Elf_Internal_Dyn
*entry
;
9319 size_t liblist_offset
= 0;
9320 size_t liblistno
= 0;
9321 size_t conflictsno
= 0;
9322 size_t options_offset
= 0;
9323 size_t conflicts_offset
= 0;
9325 /* We have a lot of special sections. Thanks SGI! */
9326 if (dynamic_segment
== NULL
)
9327 /* No information available. */
9330 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9331 switch (entry
->d_tag
)
9333 case DT_MIPS_LIBLIST
:
9334 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
9336 case DT_MIPS_LIBLISTNO
:
9337 liblistno
= entry
->d_un
.d_val
;
9339 case DT_MIPS_OPTIONS
:
9340 options_offset
= entry
->d_un
.d_val
- loadaddr
;
9342 case DT_MIPS_CONFLICT
:
9343 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
9345 case DT_MIPS_CONFLICTNO
:
9346 conflictsno
= entry
->d_un
.d_val
;
9352 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9354 Elf32_External_Lib
*elib
;
9357 elib
= ((Elf32_External_Lib
*)
9358 get_data (NULL
, file
, liblist_offset
,
9359 liblistno
* sizeof (Elf32_External_Lib
),
9363 printf ("\nSection '.liblist' contains %lu entries:\n",
9364 (unsigned long) liblistno
);
9365 fputs (" Library Time Stamp Checksum Version Flags\n",
9368 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9375 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9376 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9377 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9378 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9379 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9381 tmp
= gmtime (&time
);
9382 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9383 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9384 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9386 printf ("%3lu: ", (unsigned long) cnt
);
9387 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9388 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9391 if (liblist
.l_flags
== 0)
9402 { " EXACT_MATCH", LL_EXACT_MATCH
},
9403 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9404 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9405 { " EXPORTS", LL_EXPORTS
},
9406 { " DELAY_LOAD", LL_DELAY_LOAD
},
9407 { " DELTA", LL_DELTA
}
9409 int flags
= liblist
.l_flags
;
9413 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9415 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9417 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9418 flags
^= l_flags_vals
[fcnt
].bit
;
9421 printf (" %#x", (unsigned int) flags
);
9431 if (options_offset
!= 0)
9433 Elf_External_Options
*eopt
;
9434 Elf_Internal_Shdr
*sect
= section_headers
;
9435 Elf_Internal_Options
*iopt
;
9436 Elf_Internal_Options
*option
;
9440 /* Find the section header so that we get the size. */
9441 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9444 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
9445 sect
->sh_size
, _("options"));
9448 iopt
= ((Elf_Internal_Options
*)
9449 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
)));
9452 error (_("Out of memory"));
9459 while (offset
< sect
->sh_size
)
9461 Elf_External_Options
*eoption
;
9463 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9465 option
->kind
= BYTE_GET (eoption
->kind
);
9466 option
->size
= BYTE_GET (eoption
->size
);
9467 option
->section
= BYTE_GET (eoption
->section
);
9468 option
->info
= BYTE_GET (eoption
->info
);
9470 offset
+= option
->size
;
9476 printf (_("\nSection '%s' contains %d entries:\n"),
9477 SECTION_NAME (sect
), cnt
);
9485 switch (option
->kind
)
9488 /* This shouldn't happen. */
9489 printf (" NULL %d %lx", option
->section
, option
->info
);
9492 printf (" REGINFO ");
9493 if (elf_header
.e_machine
== EM_MIPS
)
9496 Elf32_External_RegInfo
*ereg
;
9497 Elf32_RegInfo reginfo
;
9499 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9500 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9501 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9502 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9503 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9504 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9505 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9507 printf ("GPR %08lx GP 0x%lx\n",
9509 (unsigned long) reginfo
.ri_gp_value
);
9510 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9511 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9512 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9517 Elf64_External_RegInfo
*ereg
;
9518 Elf64_Internal_RegInfo reginfo
;
9520 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9521 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9522 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9523 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9524 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9525 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9526 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9528 printf ("GPR %08lx GP 0x",
9529 reginfo
.ri_gprmask
);
9530 printf_vma (reginfo
.ri_gp_value
);
9533 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9534 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9535 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9539 case ODK_EXCEPTIONS
:
9540 fputs (" EXCEPTIONS fpe_min(", stdout
);
9541 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9542 fputs (") fpe_max(", stdout
);
9543 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9544 fputs (")", stdout
);
9546 if (option
->info
& OEX_PAGE0
)
9547 fputs (" PAGE0", stdout
);
9548 if (option
->info
& OEX_SMM
)
9549 fputs (" SMM", stdout
);
9550 if (option
->info
& OEX_FPDBUG
)
9551 fputs (" FPDBUG", stdout
);
9552 if (option
->info
& OEX_DISMISS
)
9553 fputs (" DISMISS", stdout
);
9556 fputs (" PAD ", stdout
);
9557 if (option
->info
& OPAD_PREFIX
)
9558 fputs (" PREFIX", stdout
);
9559 if (option
->info
& OPAD_POSTFIX
)
9560 fputs (" POSTFIX", stdout
);
9561 if (option
->info
& OPAD_SYMBOL
)
9562 fputs (" SYMBOL", stdout
);
9565 fputs (" HWPATCH ", stdout
);
9566 if (option
->info
& OHW_R4KEOP
)
9567 fputs (" R4KEOP", stdout
);
9568 if (option
->info
& OHW_R8KPFETCH
)
9569 fputs (" R8KPFETCH", stdout
);
9570 if (option
->info
& OHW_R5KEOP
)
9571 fputs (" R5KEOP", stdout
);
9572 if (option
->info
& OHW_R5KCVTL
)
9573 fputs (" R5KCVTL", stdout
);
9576 fputs (" FILL ", stdout
);
9577 /* XXX Print content of info word? */
9580 fputs (" TAGS ", stdout
);
9581 /* XXX Print content of info word? */
9584 fputs (" HWAND ", stdout
);
9585 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9586 fputs (" R4KEOP_CHECKED", stdout
);
9587 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9588 fputs (" R4KEOP_CLEAN", stdout
);
9591 fputs (" HWOR ", stdout
);
9592 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9593 fputs (" R4KEOP_CHECKED", stdout
);
9594 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9595 fputs (" R4KEOP_CLEAN", stdout
);
9598 printf (" GP_GROUP %#06lx self-contained %#06lx",
9599 option
->info
& OGP_GROUP
,
9600 (option
->info
& OGP_SELF
) >> 16);
9603 printf (" IDENT %#06lx self-contained %#06lx",
9604 option
->info
& OGP_GROUP
,
9605 (option
->info
& OGP_SELF
) >> 16);
9608 /* This shouldn't happen. */
9609 printf (" %3d ??? %d %lx",
9610 option
->kind
, option
->section
, option
->info
);
9614 len
= sizeof (*eopt
);
9615 while (len
< option
->size
)
9616 if (((char *) option
)[len
] >= ' '
9617 && ((char *) option
)[len
] < 0x7f)
9618 printf ("%c", ((char *) option
)[len
++]);
9620 printf ("\\%03o", ((char *) option
)[len
++]);
9622 fputs ("\n", stdout
);
9630 if (conflicts_offset
!= 0 && conflictsno
!= 0)
9632 Elf32_Conflict
*iconf
;
9635 if (dynamic_symbols
== NULL
)
9637 error (_("conflict list found without a dynamic symbol table"));
9641 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
9644 error (_("Out of memory"));
9650 Elf32_External_Conflict
*econf32
;
9652 econf32
= ((Elf32_External_Conflict
*)
9653 get_data (NULL
, file
, conflicts_offset
,
9654 conflictsno
* sizeof (*econf32
),
9659 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9660 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
9666 Elf64_External_Conflict
*econf64
;
9668 econf64
= ((Elf64_External_Conflict
*)
9669 get_data (NULL
, file
, conflicts_offset
,
9670 conflictsno
* sizeof (*econf64
),
9675 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9676 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
9681 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9682 (long) conflictsno
);
9683 puts (_(" Num: Index Value Name"));
9685 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
9687 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
9689 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
9690 print_vma (psym
->st_value
, FULL_HEX
);
9692 print_symbol (25, dynamic_strings
+ psym
->st_name
);
9703 process_gnu_liblist (file
)
9706 Elf_Internal_Shdr
*section
, *string_sec
;
9707 Elf32_External_Lib
*elib
;
9715 for (i
= 0, section
= section_headers
;
9716 i
< elf_header
.e_shnum
;
9719 switch (section
->sh_type
)
9721 case SHT_GNU_LIBLIST
:
9722 elib
= ((Elf32_External_Lib
*)
9723 get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
9728 string_sec
= SECTION_HEADER (section
->sh_link
);
9730 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
9731 string_sec
->sh_size
,
9732 _("liblist string table"));
9735 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
9741 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9742 SECTION_NAME (section
),
9743 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
9745 puts (" Library Time Stamp Checksum Version Flags");
9747 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
9755 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9756 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9757 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9758 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9759 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9761 tmp
= gmtime (&time
);
9762 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9763 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9764 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9766 printf ("%3lu: ", (unsigned long) cnt
);
9768 printf ("%-20s", strtab
+ liblist
.l_name
);
9770 printf ("%-20.20s", strtab
+ liblist
.l_name
);
9771 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
9772 liblist
.l_version
, liblist
.l_flags
);
9783 get_note_type (e_type
)
9786 static char buff
[64];
9790 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
9791 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
9792 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
9793 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
9794 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
9795 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
9796 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
9797 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
9798 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9799 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9800 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9802 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9808 get_netbsd_elfcore_note_type (e_type
)
9811 static char buff
[64];
9813 if (e_type
== NT_NETBSDCORE_PROCINFO
)
9815 /* NetBSD core "procinfo" structure. */
9816 return _("NetBSD procinfo structure");
9819 /* As of Jan 2002 there are no other machine-independent notes
9820 defined for NetBSD core files. If the note type is less
9821 than the start of the machine-dependent note types, we don't
9824 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
9826 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
9830 switch (elf_header
.e_machine
)
9832 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9833 and PT_GETFPREGS == mach+2. */
9838 case EM_SPARC32PLUS
:
9842 case NT_NETBSDCORE_FIRSTMACH
+0:
9843 return _("PT_GETREGS (reg structure)");
9844 case NT_NETBSDCORE_FIRSTMACH
+2:
9845 return _("PT_GETFPREGS (fpreg structure)");
9851 /* On all other arch's, PT_GETREGS == mach+1 and
9852 PT_GETFPREGS == mach+3. */
9856 case NT_NETBSDCORE_FIRSTMACH
+1:
9857 return _("PT_GETREGS (reg structure)");
9858 case NT_NETBSDCORE_FIRSTMACH
+3:
9859 return _("PT_GETFPREGS (fpreg structure)");
9865 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
9869 /* Note that by the ELF standard, the name field is already null byte
9870 terminated, and namesz includes the terminating null byte.
9871 I.E. the value of namesz for the name "FSF" is 4.
9873 If the value of namesz is zero, there is no name present. */
9875 process_note (pnote
)
9876 Elf_Internal_Note
*pnote
;
9880 if (pnote
->namesz
== 0)
9882 /* If there is no note name, then use the default set of
9883 note type strings. */
9884 nt
= get_note_type (pnote
->type
);
9886 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
9888 /* NetBSD-specific core file notes. */
9889 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
9893 /* Don't recognize this note name; just use the default set of
9894 note type strings. */
9895 nt
= get_note_type (pnote
->type
);
9898 printf (" %s\t\t0x%08lx\t%s\n",
9899 pnote
->namesz
? pnote
->namedata
: "(NONE)",
9906 process_corefile_note_segment (file
, offset
, length
)
9911 Elf_External_Note
*pnotes
;
9912 Elf_External_Note
*external
;
9918 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
9925 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9926 (unsigned long) offset
, (unsigned long) length
);
9927 printf (_(" Owner\t\tData size\tDescription\n"));
9929 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
9931 Elf_External_Note
*next
;
9932 Elf_Internal_Note inote
;
9935 inote
.type
= BYTE_GET (external
->type
);
9936 inote
.namesz
= BYTE_GET (external
->namesz
);
9937 inote
.namedata
= external
->name
;
9938 inote
.descsz
= BYTE_GET (external
->descsz
);
9939 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
9940 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
9942 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
9944 if (((char *) next
) > (((char *) pnotes
) + length
))
9946 warn (_("corrupt note found at offset %x into core notes\n"),
9947 ((char *) external
) - ((char *) pnotes
));
9948 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9949 inote
.type
, inote
.namesz
, inote
.descsz
);
9955 /* Verify that name is null terminated. It appears that at least
9956 one version of Linux (RedHat 6.0) generates corefiles that don't
9957 comply with the ELF spec by failing to include the null byte in
9959 if (inote
.namedata
[inote
.namesz
] != '\0')
9961 temp
= malloc (inote
.namesz
+ 1);
9965 error (_("Out of memory\n"));
9970 strncpy (temp
, inote
.namedata
, inote
.namesz
);
9971 temp
[inote
.namesz
] = 0;
9973 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9974 inote
.namedata
= temp
;
9977 res
&= process_note (& inote
);
9992 process_corefile_note_segments (file
)
9995 Elf_Internal_Phdr
*program_headers
;
9996 Elf_Internal_Phdr
*segment
;
10000 program_headers
= (Elf_Internal_Phdr
*) malloc
10001 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
10003 if (program_headers
== NULL
)
10005 error (_("Out of memory\n"));
10010 i
= get_32bit_program_headers (file
, program_headers
);
10012 i
= get_64bit_program_headers (file
, program_headers
);
10016 free (program_headers
);
10020 for (i
= 0, segment
= program_headers
;
10021 i
< elf_header
.e_phnum
;
10024 if (segment
->p_type
== PT_NOTE
)
10025 res
&= process_corefile_note_segment (file
,
10026 (bfd_vma
) segment
->p_offset
,
10027 (bfd_vma
) segment
->p_filesz
);
10030 free (program_headers
);
10036 process_corefile_contents (file
)
10039 /* If we have not been asked to display the notes then do nothing. */
10043 /* If file is not a core file then exit. */
10044 if (elf_header
.e_type
!= ET_CORE
)
10047 /* No program headers means no NOTE segment. */
10048 if (elf_header
.e_phnum
== 0)
10050 printf (_("No note segments present in the core file.\n"));
10054 return process_corefile_note_segments (file
);
10058 process_arch_specific (file
)
10064 switch (elf_header
.e_machine
)
10067 case EM_MIPS_RS3_LE
:
10068 return process_mips_specific (file
);
10077 get_file_header (file
)
10080 /* Read in the identity array. */
10081 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10084 /* Determine how to read the rest of the header. */
10085 switch (elf_header
.e_ident
[EI_DATA
])
10087 default: /* fall through */
10088 case ELFDATANONE
: /* fall through */
10089 case ELFDATA2LSB
: byte_get
= byte_get_little_endian
; break;
10090 case ELFDATA2MSB
: byte_get
= byte_get_big_endian
; break;
10093 /* For now we only support 32 bit and 64 bit ELF files. */
10094 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10096 /* Read in the rest of the header. */
10099 Elf32_External_Ehdr ehdr32
;
10101 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10104 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10105 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10106 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10107 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10108 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10109 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10110 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10111 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10112 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10113 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10114 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10115 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10116 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10120 Elf64_External_Ehdr ehdr64
;
10122 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10123 we will not be able to cope with the 64bit data found in
10124 64 ELF files. Detect this now and abort before we start
10125 overwritting things. */
10126 if (sizeof (bfd_vma
) < 8)
10128 error (_("This instance of readelf has been built without support for a\n\
10129 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10133 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10136 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10137 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10138 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10139 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10140 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10141 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10142 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10143 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10144 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10145 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10146 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10147 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10148 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10151 if (elf_header
.e_shoff
)
10153 /* There may be some extensions in the first section header. Don't
10154 bomb if we can't read it. */
10156 get_32bit_section_headers (file
, 1);
10158 get_64bit_section_headers (file
, 1);
10165 process_file (file_name
)
10169 struct stat statbuf
;
10172 if (stat (file_name
, & statbuf
) < 0)
10174 error (_("Cannot stat input file %s.\n"), file_name
);
10178 file
= fopen (file_name
, "rb");
10181 error (_("Input file %s not found.\n"), file_name
);
10185 if (! get_file_header (file
))
10187 error (_("%s: Failed to read file header\n"), file_name
);
10192 /* Initialise per file variables. */
10193 for (i
= NUM_ELEM (version_info
); i
--;)
10194 version_info
[i
] = 0;
10196 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10197 dynamic_info
[i
] = 0;
10199 /* Process the file. */
10201 printf (_("\nFile: %s\n"), file_name
);
10203 if (! process_file_header ())
10209 if (! process_section_headers (file
))
10211 /* Without loaded section headers we
10212 cannot process lots of things. */
10213 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10215 if (! do_using_dynamic
)
10216 do_syms
= do_reloc
= 0;
10219 if (process_program_headers (file
))
10220 process_dynamic_segment (file
);
10222 process_relocs (file
);
10224 process_unwind (file
);
10226 process_symbol_table (file
);
10228 process_syminfo (file
);
10230 process_version_sections (file
);
10232 process_section_contents (file
);
10234 process_corefile_contents (file
);
10236 process_gnu_liblist (file
);
10238 process_arch_specific (file
);
10242 if (section_headers
)
10244 free (section_headers
);
10245 section_headers
= NULL
;
10250 free (string_table
);
10251 string_table
= NULL
;
10252 string_table_length
= 0;
10255 if (dynamic_strings
)
10257 free (dynamic_strings
);
10258 dynamic_strings
= NULL
;
10261 if (dynamic_symbols
)
10263 free (dynamic_symbols
);
10264 dynamic_symbols
= NULL
;
10265 num_dynamic_syms
= 0;
10268 if (dynamic_syminfo
)
10270 free (dynamic_syminfo
);
10271 dynamic_syminfo
= NULL
;
10277 #ifdef SUPPORT_DISASSEMBLY
10278 /* Needed by the i386 disassembler. For extra credit, someone could
10279 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10283 print_address (unsigned int addr
, FILE *outfile
)
10285 fprintf (outfile
,"0x%8.8x", addr
);
10288 /* Needed by the i386 disassembler. */
10290 db_task_printsym (unsigned int addr
)
10292 print_address (addr
, stderr
);
10296 int main
PARAMS ((int, char **));
10304 char *cmdline_dump_sects
= NULL
;
10305 unsigned num_cmdline_dump_sects
= 0;
10307 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10308 setlocale (LC_MESSAGES
, "");
10310 #if defined (HAVE_SETLOCALE)
10311 setlocale (LC_CTYPE
, "");
10313 bindtextdomain (PACKAGE
, LOCALEDIR
);
10314 textdomain (PACKAGE
);
10316 parse_args (argc
, argv
);
10318 if (optind
< (argc
- 1))
10321 /* When processing more than one file remember the dump requests
10322 issued on command line to reset them after each file. */
10323 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10325 cmdline_dump_sects
= malloc (num_dump_sects
);
10326 if (cmdline_dump_sects
== NULL
)
10327 error (_("Out of memory allocating dump request table."));
10330 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10331 num_cmdline_dump_sects
= num_dump_sects
;
10336 while (optind
< argc
)
10338 err
|= process_file (argv
[optind
++]);
10340 /* Reset dump requests. */
10341 if (optind
< argc
&& dump_sects
!= NULL
)
10343 num_dump_sects
= num_cmdline_dump_sects
;
10344 if (num_cmdline_dump_sects
> 0)
10345 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10349 if (dump_sects
!= NULL
)
10351 if (cmdline_dump_sects
!= NULL
)
10352 free (cmdline_dump_sects
);