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"
91 #include "elf/xtensa.h"
95 #include "libiberty.h"
97 char *program_name
= "readelf";
98 unsigned long dynamic_addr
;
99 bfd_size_type dynamic_size
;
100 char *dynamic_strings
;
102 unsigned long string_table_length
;
103 unsigned long num_dynamic_syms
;
104 Elf_Internal_Sym
*dynamic_symbols
;
105 Elf_Internal_Syminfo
*dynamic_syminfo
;
106 unsigned long dynamic_syminfo_offset
;
107 unsigned int dynamic_syminfo_nent
;
108 char program_interpreter
[64];
109 long dynamic_info
[DT_JMPREL
+ 1];
110 long version_info
[16];
112 Elf_Internal_Ehdr elf_header
;
113 Elf_Internal_Shdr
*section_headers
;
114 Elf_Internal_Dyn
*dynamic_segment
;
115 Elf_Internal_Shdr
*symtab_shndx_hdr
;
123 int do_using_dynamic
;
131 int do_debug_abbrevs
;
133 int do_debug_pubnames
;
134 int do_debug_aranges
;
136 int do_debug_frames_interp
;
137 int do_debug_macinfo
;
144 /* A dynamic array of flags indicating which sections require dumping. */
145 char *dump_sects
= NULL
;
146 unsigned int num_dump_sects
= 0;
148 #define HEX_DUMP (1 << 0)
149 #define DISASS_DUMP (1 << 1)
150 #define DEBUG_DUMP (1 << 2)
152 /* How to rpint a vma value. */
153 typedef enum print_mode
165 /* Forward declarations for dumb compilers. */
166 static void print_vma
167 PARAMS ((bfd_vma
, print_mode
));
168 static void print_symbol
169 PARAMS ((int, const char *));
170 static bfd_vma (*byte_get
)
171 PARAMS ((unsigned char *, int));
172 static bfd_vma byte_get_little_endian
173 PARAMS ((unsigned char *, int));
174 static bfd_vma byte_get_big_endian
175 PARAMS ((unsigned char *, int));
176 static bfd_vma byte_get_signed
177 PARAMS ((unsigned char *, int));
178 static void (*byte_put
)
179 PARAMS ((unsigned char *, bfd_vma
, int));
180 static void byte_put_little_endian
181 PARAMS ((unsigned char *, bfd_vma
, int));
182 static void byte_put_big_endian
183 PARAMS ((unsigned char *, bfd_vma
, int));
184 static const char *get_mips_dynamic_type
185 PARAMS ((unsigned long));
186 static const char *get_sparc64_dynamic_type
187 PARAMS ((unsigned long));
188 static const char *get_ppc64_dynamic_type
189 PARAMS ((unsigned long));
190 static const char *get_parisc_dynamic_type
191 PARAMS ((unsigned long));
192 static const char *get_ia64_dynamic_type
193 PARAMS ((unsigned long));
194 static const char *get_dynamic_type
195 PARAMS ((unsigned long));
196 static int slurp_rela_relocs
197 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**,
199 static int slurp_rel_relocs
200 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela
**,
202 static int dump_relocations
203 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym
*,
204 unsigned long, char *, int));
205 static char *get_file_type
207 static char *get_machine_name
209 static void decode_ARM_machine_flags
210 PARAMS ((unsigned, char[]));
211 static char *get_machine_flags
212 PARAMS ((unsigned, unsigned));
213 static const char *get_mips_segment_type
214 PARAMS ((unsigned long));
215 static const char *get_parisc_segment_type
216 PARAMS ((unsigned long));
217 static const char *get_ia64_segment_type
218 PARAMS ((unsigned long));
219 static const char *get_segment_type
220 PARAMS ((unsigned long));
221 static const char *get_mips_section_type_name
222 PARAMS ((unsigned int));
223 static const char *get_parisc_section_type_name
224 PARAMS ((unsigned int));
225 static const char *get_ia64_section_type_name
226 PARAMS ((unsigned int));
227 static const char *get_section_type_name
228 PARAMS ((unsigned int));
229 static const char *get_symbol_binding
230 PARAMS ((unsigned int));
231 static const char *get_symbol_type
232 PARAMS ((unsigned int));
233 static const char *get_symbol_visibility
234 PARAMS ((unsigned int));
235 static const char *get_symbol_index_type
236 PARAMS ((unsigned int));
237 static const char *get_dynamic_flags
241 static void parse_args
242 PARAMS ((int, char **));
243 static int process_file_header
245 static int process_program_headers
247 static int process_section_headers
249 static int process_unwind
251 static void dynamic_segment_mips_val
252 PARAMS ((Elf_Internal_Dyn
*));
253 static void dynamic_segment_parisc_val
254 PARAMS ((Elf_Internal_Dyn
*));
255 static void dynamic_segment_ia64_val
256 PARAMS ((Elf_Internal_Dyn
*));
257 static int process_dynamic_segment
259 static int process_symbol_table
261 static int process_syminfo
263 static int process_section_contents
265 static void process_mips_fpe_exception
267 static int process_mips_specific
269 static int process_file
271 static int process_relocs
273 static int process_version_sections
275 static char *get_ver_flags
276 PARAMS ((unsigned int));
277 static int get_32bit_section_headers
278 PARAMS ((FILE *, unsigned int));
279 static int get_64bit_section_headers
280 PARAMS ((FILE *, unsigned int));
281 static int get_32bit_program_headers
282 PARAMS ((FILE *, Elf_Internal_Phdr
*));
283 static int get_64bit_program_headers
284 PARAMS ((FILE *, Elf_Internal_Phdr
*));
285 static int get_file_header
287 static Elf_Internal_Sym
*get_32bit_elf_symbols
288 PARAMS ((FILE *, Elf_Internal_Shdr
*));
289 static Elf_Internal_Sym
*get_64bit_elf_symbols
290 PARAMS ((FILE *, Elf_Internal_Shdr
*));
291 static const char *get_elf_section_flags
293 static int *get_dynamic_data
294 PARAMS ((FILE *, unsigned int));
295 static int get_32bit_dynamic_segment
297 static int get_64bit_dynamic_segment
299 #ifdef SUPPORT_DISASSEMBLY
300 static int disassemble_section
301 PARAMS ((Elf_Internal_Shdr
*, FILE *));
303 static int dump_section
304 PARAMS ((Elf_Internal_Shdr
*, FILE *));
305 static int display_debug_section
306 PARAMS ((Elf_Internal_Shdr
*, FILE *));
307 static int display_debug_info
308 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
309 static int display_debug_not_supported
310 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
311 static int prescan_debug_info
312 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
313 static int display_debug_lines
314 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
315 static int display_debug_pubnames
316 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
317 static int display_debug_abbrev
318 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
319 static int display_debug_aranges
320 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
321 static int display_debug_frames
322 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
323 static int display_debug_macinfo
324 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
325 static int display_debug_str
326 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
327 static int display_debug_loc
328 PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
329 static unsigned char *process_abbrev_section
330 PARAMS ((unsigned char *, unsigned char *));
331 static void load_debug_str
333 static void free_debug_str
335 static const char *fetch_indirect_string
336 PARAMS ((unsigned long));
337 static void load_debug_loc
339 static void free_debug_loc
341 static unsigned long read_leb128
342 PARAMS ((unsigned char *, int *, int));
343 static int process_extended_line_op
344 PARAMS ((unsigned char *, int, int));
345 static void reset_state_machine
347 static char *get_TAG_name
348 PARAMS ((unsigned long));
349 static char *get_AT_name
350 PARAMS ((unsigned long));
351 static char *get_FORM_name
352 PARAMS ((unsigned long));
353 static void free_abbrevs
355 static void add_abbrev
356 PARAMS ((unsigned long, unsigned long, int));
357 static void add_abbrev_attr
358 PARAMS ((unsigned long, unsigned long));
359 static unsigned char *read_and_display_attr
360 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
361 unsigned long, unsigned long, int));
362 static unsigned char *read_and_display_attr_value
363 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
364 unsigned long, unsigned long, int));
365 static unsigned char *display_block
366 PARAMS ((unsigned char *, unsigned long));
367 static void decode_location_expression
368 PARAMS ((unsigned char *, unsigned int, unsigned long));
369 static void request_dump
370 PARAMS ((unsigned int, int));
371 static const char *get_elf_class
372 PARAMS ((unsigned int));
373 static const char *get_data_encoding
374 PARAMS ((unsigned int));
375 static const char *get_osabi_name
376 PARAMS ((unsigned int));
377 static int guess_is_rela
378 PARAMS ((unsigned long));
379 static const char *get_note_type
380 PARAMS ((unsigned int));
381 static const char *get_netbsd_elfcore_note_type
382 PARAMS ((unsigned int));
383 static int process_note
384 PARAMS ((Elf_Internal_Note
*));
385 static int process_corefile_note_segment
386 PARAMS ((FILE *, bfd_vma
, bfd_vma
));
387 static int process_corefile_note_segments
389 static int process_corefile_contents
391 static int process_arch_specific
393 static int process_gnu_liblist
396 typedef int Elf32_Word
;
400 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
401 ((X)->sh_name >= string_table_length \
402 ? "<corrupt>" : string_table + (X)->sh_name))
404 /* Given st_shndx I, map to section_headers index. */
405 #define SECTION_HEADER_INDEX(I) \
406 ((I) < SHN_LORESERVE \
408 : ((I) <= SHN_HIRESERVE \
410 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
412 /* Reverse of the above. */
413 #define SECTION_HEADER_NUM(N) \
414 ((N) < SHN_LORESERVE \
416 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
418 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
420 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
422 #define BYTE_GET(field) byte_get (field, sizeof (field))
424 /* If we can support a 64 bit data type then BFD64 should be defined
425 and sizeof (bfd_vma) == 8. In this case when translating from an
426 external 8 byte field to an internal field, we can assume that the
427 internal field is also 8 bytes wide and so we can extract all the data.
428 If, however, BFD64 is not defined, then we must assume that the
429 internal data structure only has 4 byte wide fields that are the
430 equivalent of the 8 byte wide external counterparts, and so we must
431 truncate the data. */
433 #define BYTE_GET8(field) byte_get (field, -8)
435 #define BYTE_GET8(field) byte_get (field, 8)
438 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
440 #define GET_ELF_SYMBOLS(file, section) \
441 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
442 : get_64bit_elf_symbols (file, section))
446 error
VPARAMS ((const char *message
, ...))
448 VA_OPEN (args
, message
);
449 VA_FIXEDARG (args
, const char *, message
);
451 fprintf (stderr
, _("%s: Error: "), program_name
);
452 vfprintf (stderr
, message
, args
);
457 warn
VPARAMS ((const char *message
, ...))
459 VA_OPEN (args
, message
);
460 VA_FIXEDARG (args
, const char *, message
);
462 fprintf (stderr
, _("%s: Warning: "), program_name
);
463 vfprintf (stderr
, message
, args
);
467 static PTR get_data
PARAMS ((PTR
, FILE *, long, size_t, const char *));
470 get_data (var
, file
, offset
, size
, reason
)
482 if (fseek (file
, offset
, SEEK_SET
))
484 error (_("Unable to seek to %x for %s\n"), offset
, reason
);
491 mvar
= (PTR
) malloc (size
);
495 error (_("Out of memory allocating %d bytes for %s\n"),
501 if (fread (mvar
, size
, 1, file
) != 1)
503 error (_("Unable to read in %d bytes of %s\n"), size
, reason
);
513 byte_get_little_endian (field
, size
)
514 unsigned char *field
;
523 return ((unsigned int) (field
[0]))
524 | (((unsigned int) (field
[1])) << 8);
528 /* We want to extract data from an 8 byte wide field and
529 place it into a 4 byte wide field. Since this is a little
530 endian source we can just use the 4 byte extraction code. */
534 return ((unsigned long) (field
[0]))
535 | (((unsigned long) (field
[1])) << 8)
536 | (((unsigned long) (field
[2])) << 16)
537 | (((unsigned long) (field
[3])) << 24);
542 /* This is a special case, generated by the BYTE_GET8 macro.
543 It means that we are loading an 8 byte value from a field
544 in an external structure into an 8 byte value in a field
545 in an internal strcuture. */
546 return ((bfd_vma
) (field
[0]))
547 | (((bfd_vma
) (field
[1])) << 8)
548 | (((bfd_vma
) (field
[2])) << 16)
549 | (((bfd_vma
) (field
[3])) << 24)
550 | (((bfd_vma
) (field
[4])) << 32)
551 | (((bfd_vma
) (field
[5])) << 40)
552 | (((bfd_vma
) (field
[6])) << 48)
553 | (((bfd_vma
) (field
[7])) << 56);
556 error (_("Unhandled data length: %d\n"), size
);
562 byte_get_signed (field
, size
)
563 unsigned char *field
;
566 bfd_vma x
= byte_get (field
, size
);
571 return (x
^ 0x80) - 0x80;
573 return (x
^ 0x8000) - 0x8000;
575 return (x
^ 0x80000000) - 0x80000000;
585 byte_put_little_endian (field
, value
, size
)
586 unsigned char * field
;
593 field
[7] = (((value
>> 24) >> 24) >> 8) & 0xff;
594 field
[6] = ((value
>> 24) >> 24) & 0xff;
595 field
[5] = ((value
>> 24) >> 16) & 0xff;
596 field
[4] = ((value
>> 24) >> 8) & 0xff;
599 field
[3] = (value
>> 24) & 0xff;
600 field
[2] = (value
>> 16) & 0xff;
603 field
[1] = (value
>> 8) & 0xff;
606 field
[0] = value
& 0xff;
610 error (_("Unhandled data length: %d\n"), size
);
615 /* Print a VMA value. */
617 print_vma (vma
, mode
)
627 case FULL_HEX
: printf ("0x"); /* drop through */
628 case LONG_HEX
: printf ("%8.8lx", (unsigned long) vma
); break;
629 case PREFIX_HEX
: printf ("0x"); /* drop through */
630 case HEX
: printf ("%lx", (unsigned long) vma
); break;
631 case DEC
: printf ("%ld", (unsigned long) vma
); break;
632 case DEC_5
: printf ("%5ld", (long) vma
); break;
633 case UNSIGNED
: printf ("%lu", (unsigned long) vma
); break;
654 #if BFD_HOST_64BIT_LONG
657 if (_bfd_int64_high (vma
))
658 printf ("%lx%8.8lx", _bfd_int64_high (vma
), _bfd_int64_low (vma
));
660 printf ("%lx", _bfd_int64_low (vma
));
665 #if BFD_HOST_64BIT_LONG
668 if (_bfd_int64_high (vma
))
670 printf ("++%ld", _bfd_int64_low (vma
));
672 printf ("%ld", _bfd_int64_low (vma
));
677 #if BFD_HOST_64BIT_LONG
678 printf ("%5ld", vma
);
680 if (_bfd_int64_high (vma
))
682 printf ("++%ld", _bfd_int64_low (vma
));
684 printf ("%5ld", _bfd_int64_low (vma
));
689 #if BFD_HOST_64BIT_LONG
692 if (_bfd_int64_high (vma
))
694 printf ("++%lu", _bfd_int64_low (vma
));
696 printf ("%lu", _bfd_int64_low (vma
));
704 /* Display a symbol on stdout. If do_wide is not true then
705 format the symbol to be at most WIDTH characters,
706 truncating as necessary. If WIDTH is negative then
707 format the string to be exactly - WIDTH characters,
708 truncating or padding as necessary. */
711 print_symbol (width
, symbol
)
716 printf ("%s", symbol
);
718 printf ("%-*.*s", width
, width
, symbol
);
720 printf ("%-.*s", width
, symbol
);
724 byte_get_big_endian (field
, size
)
725 unsigned char *field
;
734 return ((unsigned int) (field
[1])) | (((int) (field
[0])) << 8);
737 return ((unsigned long) (field
[3]))
738 | (((unsigned long) (field
[2])) << 8)
739 | (((unsigned long) (field
[1])) << 16)
740 | (((unsigned long) (field
[0])) << 24);
744 /* Although we are extracing data from an 8 byte wide field, we
745 are returning only 4 bytes of data. */
746 return ((unsigned long) (field
[7]))
747 | (((unsigned long) (field
[6])) << 8)
748 | (((unsigned long) (field
[5])) << 16)
749 | (((unsigned long) (field
[4])) << 24);
753 /* This is a special case, generated by the BYTE_GET8 macro.
754 It means that we are loading an 8 byte value from a field
755 in an external structure into an 8 byte value in a field
756 in an internal strcuture. */
757 return ((bfd_vma
) (field
[7]))
758 | (((bfd_vma
) (field
[6])) << 8)
759 | (((bfd_vma
) (field
[5])) << 16)
760 | (((bfd_vma
) (field
[4])) << 24)
761 | (((bfd_vma
) (field
[3])) << 32)
762 | (((bfd_vma
) (field
[2])) << 40)
763 | (((bfd_vma
) (field
[1])) << 48)
764 | (((bfd_vma
) (field
[0])) << 56);
768 error (_("Unhandled data length: %d\n"), size
);
774 byte_put_big_endian (field
, value
, size
)
775 unsigned char * field
;
782 field
[7] = value
& 0xff;
783 field
[6] = (value
>> 8) & 0xff;
784 field
[5] = (value
>> 16) & 0xff;
785 field
[4] = (value
>> 24) & 0xff;
790 field
[3] = value
& 0xff;
791 field
[2] = (value
>> 8) & 0xff;
795 field
[1] = value
& 0xff;
799 field
[0] = value
& 0xff;
803 error (_("Unhandled data length: %d\n"), size
);
808 /* Guess the relocation size commonly used by the specific machines. */
811 guess_is_rela (e_machine
)
812 unsigned long e_machine
;
816 /* Targets that use REL relocations. */
832 /* Targets that use RELA relocations. */
847 case EM_CYGNUS_MN10200
:
849 case EM_CYGNUS_MN10300
:
894 warn (_("Don't know about relocations on this machine architecture\n"));
900 slurp_rela_relocs (file
, rel_offset
, rel_size
, relasp
, nrelasp
)
902 unsigned long rel_offset
;
903 unsigned long rel_size
;
904 Elf_Internal_Rela
**relasp
;
905 unsigned long *nrelasp
;
907 Elf_Internal_Rela
*relas
;
908 unsigned long nrelas
;
913 Elf32_External_Rela
*erelas
;
915 erelas
= (Elf32_External_Rela
*) get_data (NULL
, file
, rel_offset
,
916 rel_size
, _("relocs"));
920 nrelas
= rel_size
/ sizeof (Elf32_External_Rela
);
922 relas
= (Elf_Internal_Rela
*)
923 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
927 error(_("out of memory parsing relocs"));
931 for (i
= 0; i
< nrelas
; i
++)
933 relas
[i
].r_offset
= BYTE_GET (erelas
[i
].r_offset
);
934 relas
[i
].r_info
= BYTE_GET (erelas
[i
].r_info
);
935 relas
[i
].r_addend
= BYTE_GET (erelas
[i
].r_addend
);
942 Elf64_External_Rela
*erelas
;
944 erelas
= (Elf64_External_Rela
*) get_data (NULL
, file
, rel_offset
,
945 rel_size
, _("relocs"));
949 nrelas
= rel_size
/ sizeof (Elf64_External_Rela
);
951 relas
= (Elf_Internal_Rela
*)
952 malloc (nrelas
* sizeof (Elf_Internal_Rela
));
956 error(_("out of memory parsing relocs"));
960 for (i
= 0; i
< nrelas
; i
++)
962 relas
[i
].r_offset
= BYTE_GET8 (erelas
[i
].r_offset
);
963 relas
[i
].r_info
= BYTE_GET8 (erelas
[i
].r_info
);
964 relas
[i
].r_addend
= BYTE_GET8 (erelas
[i
].r_addend
);
975 slurp_rel_relocs (file
, rel_offset
, rel_size
, relsp
, nrelsp
)
977 unsigned long rel_offset
;
978 unsigned long rel_size
;
979 Elf_Internal_Rela
**relsp
;
980 unsigned long *nrelsp
;
982 Elf_Internal_Rela
*rels
;
988 Elf32_External_Rel
*erels
;
990 erels
= (Elf32_External_Rel
*) get_data (NULL
, file
, rel_offset
,
991 rel_size
, _("relocs"));
995 nrels
= rel_size
/ sizeof (Elf32_External_Rel
);
997 rels
= (Elf_Internal_Rela
*) malloc (nrels
* sizeof (Elf_Internal_Rela
));
1001 error(_("out of memory parsing relocs"));
1005 for (i
= 0; i
< nrels
; i
++)
1007 rels
[i
].r_offset
= BYTE_GET (erels
[i
].r_offset
);
1008 rels
[i
].r_info
= BYTE_GET (erels
[i
].r_info
);
1009 rels
[i
].r_addend
= 0;
1016 Elf64_External_Rel
*erels
;
1018 erels
= (Elf64_External_Rel
*) get_data (NULL
, file
, rel_offset
,
1019 rel_size
, _("relocs"));
1023 nrels
= rel_size
/ sizeof (Elf64_External_Rel
);
1025 rels
= (Elf_Internal_Rela
*) malloc (nrels
* sizeof (Elf_Internal_Rela
));
1029 error(_("out of memory parsing relocs"));
1033 for (i
= 0; i
< nrels
; i
++)
1035 rels
[i
].r_offset
= BYTE_GET8 (erels
[i
].r_offset
);
1036 rels
[i
].r_info
= BYTE_GET8 (erels
[i
].r_info
);
1037 rels
[i
].r_addend
= 0;
1047 /* Display the contents of the relocation data found at the specified offset. */
1050 dump_relocations (file
, rel_offset
, rel_size
, symtab
, nsyms
, strtab
, is_rela
)
1052 unsigned long rel_offset
;
1053 unsigned long rel_size
;
1054 Elf_Internal_Sym
*symtab
;
1055 unsigned long nsyms
;
1060 Elf_Internal_Rela
*rels
;
1063 if (is_rela
== UNKNOWN
)
1064 is_rela
= guess_is_rela (elf_header
.e_machine
);
1068 if (!slurp_rela_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1073 if (!slurp_rel_relocs (file
, rel_offset
, rel_size
, &rels
, &rel_size
))
1082 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
1084 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
1089 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
1091 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
1099 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
1101 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
1106 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
1108 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1112 for (i
= 0; i
< rel_size
; i
++)
1115 const char *rtype2
= NULL
;
1116 const char *rtype3
= NULL
;
1119 bfd_vma symtab_index
;
1121 bfd_vma type2
= (bfd_vma
) NULL
;
1122 bfd_vma type3
= (bfd_vma
) NULL
;
1124 offset
= rels
[i
].r_offset
;
1125 info
= rels
[i
].r_info
;
1129 type
= ELF32_R_TYPE (info
);
1130 symtab_index
= ELF32_R_SYM (info
);
1134 /* The #ifdef BFD64 below is to prevent a compile time warning.
1135 We know that if we do not have a 64 bit data type that we
1136 will never execute this code anyway. */
1138 if (elf_header
.e_machine
== EM_MIPS
)
1140 /* In little-endian objects, r_info isn't really a 64-bit
1141 little-endian value: it has a 32-bit little-endian
1142 symbol index followed by four individual byte fields.
1143 Reorder INFO accordingly. */
1144 if (elf_header
.e_ident
[EI_DATA
] != ELFDATA2MSB
)
1145 info
= (((info
& 0xffffffff) << 32)
1146 | ((info
>> 56) & 0xff)
1147 | ((info
>> 40) & 0xff00)
1148 | ((info
>> 24) & 0xff0000)
1149 | ((info
>> 8) & 0xff000000));
1150 type
= ELF64_MIPS_R_TYPE (info
);
1151 type2
= ELF64_MIPS_R_TYPE2 (info
);
1152 type3
= ELF64_MIPS_R_TYPE3 (info
);
1154 else if (elf_header
.e_machine
== EM_SPARCV9
)
1155 type
= ELF64_R_TYPE_ID (info
);
1157 type
= ELF64_R_TYPE (info
);
1159 symtab_index
= ELF64_R_SYM (info
);
1165 #ifdef _bfd_int64_low
1166 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset
), _bfd_int64_low (info
));
1168 printf ("%8.8lx %8.8lx ", offset
, info
);
1173 #ifdef _bfd_int64_low
1175 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1176 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1177 _bfd_int64_high (offset
),
1178 _bfd_int64_low (offset
),
1179 _bfd_int64_high (info
),
1180 _bfd_int64_low (info
));
1183 ? "%16.16lx %16.16lx "
1184 : "%12.12lx %12.12lx ",
1189 switch (elf_header
.e_machine
)
1196 case EM_CYGNUS_M32R
:
1197 rtype
= elf_m32r_reloc_type (type
);
1202 rtype
= elf_i386_reloc_type (type
);
1207 rtype
= elf_m68hc11_reloc_type (type
);
1211 rtype
= elf_m68k_reloc_type (type
);
1215 rtype
= elf_i960_reloc_type (type
);
1220 rtype
= elf_avr_reloc_type (type
);
1223 case EM_OLD_SPARCV9
:
1224 case EM_SPARC32PLUS
:
1227 rtype
= elf_sparc_reloc_type (type
);
1231 case EM_CYGNUS_V850
:
1232 rtype
= v850_reloc_type (type
);
1236 case EM_CYGNUS_D10V
:
1237 rtype
= elf_d10v_reloc_type (type
);
1241 case EM_CYGNUS_D30V
:
1242 rtype
= elf_d30v_reloc_type (type
);
1246 rtype
= elf_dlx_reloc_type (type
);
1250 rtype
= elf_sh_reloc_type (type
);
1254 case EM_CYGNUS_MN10300
:
1255 rtype
= elf_mn10300_reloc_type (type
);
1259 case EM_CYGNUS_MN10200
:
1260 rtype
= elf_mn10200_reloc_type (type
);
1264 case EM_CYGNUS_FR30
:
1265 rtype
= elf_fr30_reloc_type (type
);
1269 rtype
= elf_frv_reloc_type (type
);
1273 rtype
= elf_mcore_reloc_type (type
);
1277 rtype
= elf_mmix_reloc_type (type
);
1282 rtype
= elf_msp430_reloc_type (type
);
1286 rtype
= elf_ppc_reloc_type (type
);
1290 rtype
= elf_ppc64_reloc_type (type
);
1294 case EM_MIPS_RS3_LE
:
1295 rtype
= elf_mips_reloc_type (type
);
1298 rtype2
= elf_mips_reloc_type (type2
);
1299 rtype3
= elf_mips_reloc_type (type3
);
1304 rtype
= elf_alpha_reloc_type (type
);
1308 rtype
= elf_arm_reloc_type (type
);
1312 rtype
= elf_arc_reloc_type (type
);
1316 rtype
= elf_hppa_reloc_type (type
);
1322 rtype
= elf_h8_reloc_type (type
);
1327 rtype
= elf_or32_reloc_type (type
);
1332 rtype
= elf_pj_reloc_type (type
);
1335 rtype
= elf_ia64_reloc_type (type
);
1339 rtype
= elf_cris_reloc_type (type
);
1343 rtype
= elf_i860_reloc_type (type
);
1347 rtype
= elf_x86_64_reloc_type (type
);
1351 rtype
= i370_reloc_type (type
);
1356 rtype
= elf_s390_reloc_type (type
);
1360 rtype
= elf_xstormy16_reloc_type (type
);
1364 rtype
= elf_vax_reloc_type (type
);
1369 rtype
= elf_ip2k_reloc_type (type
);
1373 rtype
= elf_iq2000_reloc_type (type
);
1378 rtype
= elf_xtensa_reloc_type (type
);
1383 #ifdef _bfd_int64_low
1384 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type
));
1386 printf (_("unrecognized: %-7lx"), type
);
1389 printf (do_wide
? "%-22.22s" : "%-17.17s", rtype
);
1393 if (symtab
== NULL
|| symtab_index
>= nsyms
)
1394 printf (" bad symbol index: %08lx", (unsigned long) symtab_index
);
1397 Elf_Internal_Sym
*psym
;
1399 psym
= symtab
+ symtab_index
;
1402 print_vma (psym
->st_value
, LONG_HEX
);
1403 printf (is_32bit_elf
? " " : " ");
1405 if (psym
->st_name
== 0)
1407 const char *sec_name
= "<null>";
1410 if (ELF_ST_TYPE (psym
->st_info
) == STT_SECTION
)
1412 bfd_vma sec_index
= (bfd_vma
) -1;
1414 if (psym
->st_shndx
< SHN_LORESERVE
)
1415 sec_index
= psym
->st_shndx
;
1416 else if (psym
->st_shndx
> SHN_LORESERVE
)
1417 sec_index
= psym
->st_shndx
- (SHN_HIRESERVE
+ 1
1420 if (sec_index
!= (bfd_vma
) -1)
1421 sec_name
= SECTION_NAME (section_headers
+ sec_index
);
1422 else if (psym
->st_shndx
== SHN_ABS
)
1424 else if (psym
->st_shndx
== SHN_COMMON
)
1425 sec_name
= "COMMON";
1428 sprintf (name_buf
, "<section 0x%x>",
1429 (unsigned int) psym
->st_shndx
);
1430 sec_name
= name_buf
;
1433 print_symbol (22, sec_name
);
1435 else if (strtab
== NULL
)
1436 printf (_("<string table index %3ld>"), psym
->st_name
);
1438 print_symbol (22, strtab
+ psym
->st_name
);
1441 printf (" + %lx", (unsigned long) rels
[i
].r_addend
);
1446 printf ("%*c", is_32bit_elf
? (do_wide
? 34 : 28) : (do_wide
? 26 : 20), ' ');
1447 print_vma (rels
[i
].r_addend
, LONG_HEX
);
1450 if (elf_header
.e_machine
== EM_SPARCV9
1451 && !strcmp (rtype
, "R_SPARC_OLO10"))
1452 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info
));
1456 if (! is_32bit_elf
&& elf_header
.e_machine
== EM_MIPS
)
1458 printf (" Type2: ");
1461 #ifdef _bfd_int64_low
1462 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2
));
1464 printf (_("unrecognized: %-7lx"), type2
);
1467 printf ("%-17.17s", rtype2
);
1469 printf("\n Type3: ");
1472 #ifdef _bfd_int64_low
1473 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3
));
1475 printf (_("unrecognized: %-7lx"), type3
);
1478 printf ("%-17.17s", rtype3
);
1490 get_mips_dynamic_type (type
)
1495 case DT_MIPS_RLD_VERSION
: return "MIPS_RLD_VERSION";
1496 case DT_MIPS_TIME_STAMP
: return "MIPS_TIME_STAMP";
1497 case DT_MIPS_ICHECKSUM
: return "MIPS_ICHECKSUM";
1498 case DT_MIPS_IVERSION
: return "MIPS_IVERSION";
1499 case DT_MIPS_FLAGS
: return "MIPS_FLAGS";
1500 case DT_MIPS_BASE_ADDRESS
: return "MIPS_BASE_ADDRESS";
1501 case DT_MIPS_MSYM
: return "MIPS_MSYM";
1502 case DT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
1503 case DT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
1504 case DT_MIPS_LOCAL_GOTNO
: return "MIPS_LOCAL_GOTNO";
1505 case DT_MIPS_CONFLICTNO
: return "MIPS_CONFLICTNO";
1506 case DT_MIPS_LIBLISTNO
: return "MIPS_LIBLISTNO";
1507 case DT_MIPS_SYMTABNO
: return "MIPS_SYMTABNO";
1508 case DT_MIPS_UNREFEXTNO
: return "MIPS_UNREFEXTNO";
1509 case DT_MIPS_GOTSYM
: return "MIPS_GOTSYM";
1510 case DT_MIPS_HIPAGENO
: return "MIPS_HIPAGENO";
1511 case DT_MIPS_RLD_MAP
: return "MIPS_RLD_MAP";
1512 case DT_MIPS_DELTA_CLASS
: return "MIPS_DELTA_CLASS";
1513 case DT_MIPS_DELTA_CLASS_NO
: return "MIPS_DELTA_CLASS_NO";
1514 case DT_MIPS_DELTA_INSTANCE
: return "MIPS_DELTA_INSTANCE";
1515 case DT_MIPS_DELTA_INSTANCE_NO
: return "MIPS_DELTA_INSTANCE_NO";
1516 case DT_MIPS_DELTA_RELOC
: return "MIPS_DELTA_RELOC";
1517 case DT_MIPS_DELTA_RELOC_NO
: return "MIPS_DELTA_RELOC_NO";
1518 case DT_MIPS_DELTA_SYM
: return "MIPS_DELTA_SYM";
1519 case DT_MIPS_DELTA_SYM_NO
: return "MIPS_DELTA_SYM_NO";
1520 case DT_MIPS_DELTA_CLASSSYM
: return "MIPS_DELTA_CLASSSYM";
1521 case DT_MIPS_DELTA_CLASSSYM_NO
: return "MIPS_DELTA_CLASSSYM_NO";
1522 case DT_MIPS_CXX_FLAGS
: return "MIPS_CXX_FLAGS";
1523 case DT_MIPS_PIXIE_INIT
: return "MIPS_PIXIE_INIT";
1524 case DT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
1525 case DT_MIPS_LOCALPAGE_GOTIDX
: return "MIPS_LOCALPAGE_GOTIDX";
1526 case DT_MIPS_LOCAL_GOTIDX
: return "MIPS_LOCAL_GOTIDX";
1527 case DT_MIPS_HIDDEN_GOTIDX
: return "MIPS_HIDDEN_GOTIDX";
1528 case DT_MIPS_PROTECTED_GOTIDX
: return "MIPS_PROTECTED_GOTIDX";
1529 case DT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
1530 case DT_MIPS_INTERFACE
: return "MIPS_INTERFACE";
1531 case DT_MIPS_DYNSTR_ALIGN
: return "MIPS_DYNSTR_ALIGN";
1532 case DT_MIPS_INTERFACE_SIZE
: return "MIPS_INTERFACE_SIZE";
1533 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR
: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1534 case DT_MIPS_PERF_SUFFIX
: return "MIPS_PERF_SUFFIX";
1535 case DT_MIPS_COMPACT_SIZE
: return "MIPS_COMPACT_SIZE";
1536 case DT_MIPS_GP_VALUE
: return "MIPS_GP_VALUE";
1537 case DT_MIPS_AUX_DYNAMIC
: return "MIPS_AUX_DYNAMIC";
1544 get_sparc64_dynamic_type (type
)
1549 case DT_SPARC_REGISTER
: return "SPARC_REGISTER";
1556 get_ppc64_dynamic_type (type
)
1561 case DT_PPC64_GLINK
: return "PPC64_GLINK";
1562 case DT_PPC64_OPD
: return "PPC64_OPD";
1563 case DT_PPC64_OPDSZ
: return "PPC64_OPDSZ";
1570 get_parisc_dynamic_type (type
)
1575 case DT_HP_LOAD_MAP
: return "HP_LOAD_MAP";
1576 case DT_HP_DLD_FLAGS
: return "HP_DLD_FLAGS";
1577 case DT_HP_DLD_HOOK
: return "HP_DLD_HOOK";
1578 case DT_HP_UX10_INIT
: return "HP_UX10_INIT";
1579 case DT_HP_UX10_INITSZ
: return "HP_UX10_INITSZ";
1580 case DT_HP_PREINIT
: return "HP_PREINIT";
1581 case DT_HP_PREINITSZ
: return "HP_PREINITSZ";
1582 case DT_HP_NEEDED
: return "HP_NEEDED";
1583 case DT_HP_TIME_STAMP
: return "HP_TIME_STAMP";
1584 case DT_HP_CHECKSUM
: return "HP_CHECKSUM";
1585 case DT_HP_GST_SIZE
: return "HP_GST_SIZE";
1586 case DT_HP_GST_VERSION
: return "HP_GST_VERSION";
1587 case DT_HP_GST_HASHVAL
: return "HP_GST_HASHVAL";
1594 get_ia64_dynamic_type (type
)
1599 case DT_IA_64_PLT_RESERVE
: return "IA_64_PLT_RESERVE";
1606 get_dynamic_type (type
)
1609 static char buff
[32];
1613 case DT_NULL
: return "NULL";
1614 case DT_NEEDED
: return "NEEDED";
1615 case DT_PLTRELSZ
: return "PLTRELSZ";
1616 case DT_PLTGOT
: return "PLTGOT";
1617 case DT_HASH
: return "HASH";
1618 case DT_STRTAB
: return "STRTAB";
1619 case DT_SYMTAB
: return "SYMTAB";
1620 case DT_RELA
: return "RELA";
1621 case DT_RELASZ
: return "RELASZ";
1622 case DT_RELAENT
: return "RELAENT";
1623 case DT_STRSZ
: return "STRSZ";
1624 case DT_SYMENT
: return "SYMENT";
1625 case DT_INIT
: return "INIT";
1626 case DT_FINI
: return "FINI";
1627 case DT_SONAME
: return "SONAME";
1628 case DT_RPATH
: return "RPATH";
1629 case DT_SYMBOLIC
: return "SYMBOLIC";
1630 case DT_REL
: return "REL";
1631 case DT_RELSZ
: return "RELSZ";
1632 case DT_RELENT
: return "RELENT";
1633 case DT_PLTREL
: return "PLTREL";
1634 case DT_DEBUG
: return "DEBUG";
1635 case DT_TEXTREL
: return "TEXTREL";
1636 case DT_JMPREL
: return "JMPREL";
1637 case DT_BIND_NOW
: return "BIND_NOW";
1638 case DT_INIT_ARRAY
: return "INIT_ARRAY";
1639 case DT_FINI_ARRAY
: return "FINI_ARRAY";
1640 case DT_INIT_ARRAYSZ
: return "INIT_ARRAYSZ";
1641 case DT_FINI_ARRAYSZ
: return "FINI_ARRAYSZ";
1642 case DT_RUNPATH
: return "RUNPATH";
1643 case DT_FLAGS
: return "FLAGS";
1645 case DT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
1646 case DT_PREINIT_ARRAYSZ
: return "PREINIT_ARRAYSZ";
1648 case DT_CHECKSUM
: return "CHECKSUM";
1649 case DT_PLTPADSZ
: return "PLTPADSZ";
1650 case DT_MOVEENT
: return "MOVEENT";
1651 case DT_MOVESZ
: return "MOVESZ";
1652 case DT_FEATURE
: return "FEATURE";
1653 case DT_POSFLAG_1
: return "POSFLAG_1";
1654 case DT_SYMINSZ
: return "SYMINSZ";
1655 case DT_SYMINENT
: return "SYMINENT"; /* aka VALRNGHI */
1657 case DT_ADDRRNGLO
: return "ADDRRNGLO";
1658 case DT_CONFIG
: return "CONFIG";
1659 case DT_DEPAUDIT
: return "DEPAUDIT";
1660 case DT_AUDIT
: return "AUDIT";
1661 case DT_PLTPAD
: return "PLTPAD";
1662 case DT_MOVETAB
: return "MOVETAB";
1663 case DT_SYMINFO
: return "SYMINFO"; /* aka ADDRRNGHI */
1665 case DT_VERSYM
: return "VERSYM";
1667 case DT_RELACOUNT
: return "RELACOUNT";
1668 case DT_RELCOUNT
: return "RELCOUNT";
1669 case DT_FLAGS_1
: return "FLAGS_1";
1670 case DT_VERDEF
: return "VERDEF";
1671 case DT_VERDEFNUM
: return "VERDEFNUM";
1672 case DT_VERNEED
: return "VERNEED";
1673 case DT_VERNEEDNUM
: return "VERNEEDNUM";
1675 case DT_AUXILIARY
: return "AUXILIARY";
1676 case DT_USED
: return "USED";
1677 case DT_FILTER
: return "FILTER";
1679 case DT_GNU_PRELINKED
: return "GNU_PRELINKED";
1680 case DT_GNU_CONFLICT
: return "GNU_CONFLICT";
1681 case DT_GNU_CONFLICTSZ
: return "GNU_CONFLICTSZ";
1682 case DT_GNU_LIBLIST
: return "GNU_LIBLIST";
1683 case DT_GNU_LIBLISTSZ
: return "GNU_LIBLISTSZ";
1686 if ((type
>= DT_LOPROC
) && (type
<= DT_HIPROC
))
1690 switch (elf_header
.e_machine
)
1693 case EM_MIPS_RS3_LE
:
1694 result
= get_mips_dynamic_type (type
);
1697 result
= get_sparc64_dynamic_type (type
);
1700 result
= get_ppc64_dynamic_type (type
);
1703 result
= get_ia64_dynamic_type (type
);
1713 sprintf (buff
, _("Processor Specific: %lx"), type
);
1715 else if ((type
>= DT_LOOS
) && (type
<= DT_HIOS
))
1719 switch (elf_header
.e_machine
)
1722 result
= get_parisc_dynamic_type (type
);
1732 sprintf (buff
, _("Operating System specific: %lx"), type
);
1735 sprintf (buff
, _("<unknown>: %lx"), type
);
1742 get_file_type (e_type
)
1745 static char buff
[32];
1749 case ET_NONE
: return _("NONE (None)");
1750 case ET_REL
: return _("REL (Relocatable file)");
1751 case ET_EXEC
: return _("EXEC (Executable file)");
1752 case ET_DYN
: return _("DYN (Shared object file)");
1753 case ET_CORE
: return _("CORE (Core file)");
1756 if ((e_type
>= ET_LOPROC
) && (e_type
<= ET_HIPROC
))
1757 sprintf (buff
, _("Processor Specific: (%x)"), e_type
);
1758 else if ((e_type
>= ET_LOOS
) && (e_type
<= ET_HIOS
))
1759 sprintf (buff
, _("OS Specific: (%x)"), e_type
);
1761 sprintf (buff
, _("<unknown>: %x"), e_type
);
1767 get_machine_name (e_machine
)
1770 static char buff
[64]; /* XXX */
1774 case EM_NONE
: return _("None");
1775 case EM_M32
: return "WE32100";
1776 case EM_SPARC
: return "Sparc";
1777 case EM_386
: return "Intel 80386";
1778 case EM_68K
: return "MC68000";
1779 case EM_88K
: return "MC88000";
1780 case EM_486
: return "Intel 80486";
1781 case EM_860
: return "Intel 80860";
1782 case EM_MIPS
: return "MIPS R3000";
1783 case EM_S370
: return "IBM System/370";
1784 case EM_MIPS_RS3_LE
: return "MIPS R4000 big-endian";
1785 case EM_OLD_SPARCV9
: return "Sparc v9 (old)";
1786 case EM_PARISC
: return "HPPA";
1787 case EM_PPC_OLD
: return "Power PC (old)";
1788 case EM_SPARC32PLUS
: return "Sparc v8+" ;
1789 case EM_960
: return "Intel 90860";
1790 case EM_PPC
: return "PowerPC";
1791 case EM_PPC64
: return "PowerPC64";
1792 case EM_V800
: return "NEC V800";
1793 case EM_FR20
: return "Fujitsu FR20";
1794 case EM_RH32
: return "TRW RH32";
1795 case EM_MCORE
: return "MCORE";
1796 case EM_ARM
: return "ARM";
1797 case EM_OLD_ALPHA
: return "Digital Alpha (old)";
1798 case EM_SH
: return "Renesas / SuperH SH";
1799 case EM_SPARCV9
: return "Sparc v9";
1800 case EM_TRICORE
: return "Siemens Tricore";
1801 case EM_ARC
: return "ARC";
1802 case EM_H8_300
: return "Renesas H8/300";
1803 case EM_H8_300H
: return "Renesas H8/300H";
1804 case EM_H8S
: return "Renesas H8S";
1805 case EM_H8_500
: return "Renesas H8/500";
1806 case EM_IA_64
: return "Intel IA-64";
1807 case EM_MIPS_X
: return "Stanford MIPS-X";
1808 case EM_COLDFIRE
: return "Motorola Coldfire";
1809 case EM_68HC12
: return "Motorola M68HC12";
1810 case EM_ALPHA
: return "Alpha";
1811 case EM_CYGNUS_D10V
:
1812 case EM_D10V
: return "d10v";
1813 case EM_CYGNUS_D30V
:
1814 case EM_D30V
: return "d30v";
1815 case EM_CYGNUS_M32R
:
1816 case EM_M32R
: return "Renesas M32R (formerly Mitsubishi M32r)";
1817 case EM_CYGNUS_V850
:
1818 case EM_V850
: return "NEC v850";
1819 case EM_CYGNUS_MN10300
:
1820 case EM_MN10300
: return "mn10300";
1821 case EM_CYGNUS_MN10200
:
1822 case EM_MN10200
: return "mn10200";
1823 case EM_CYGNUS_FR30
:
1824 case EM_FR30
: return "Fujitsu FR30";
1825 case EM_CYGNUS_FRV
: return "Fujitsu FR-V";
1827 case EM_PJ
: return "picoJava";
1828 case EM_MMA
: return "Fujitsu Multimedia Accelerator";
1829 case EM_PCP
: return "Siemens PCP";
1830 case EM_NCPU
: return "Sony nCPU embedded RISC processor";
1831 case EM_NDR1
: return "Denso NDR1 microprocesspr";
1832 case EM_STARCORE
: return "Motorola Star*Core processor";
1833 case EM_ME16
: return "Toyota ME16 processor";
1834 case EM_ST100
: return "STMicroelectronics ST100 processor";
1835 case EM_TINYJ
: return "Advanced Logic Corp. TinyJ embedded processor";
1836 case EM_FX66
: return "Siemens FX66 microcontroller";
1837 case EM_ST9PLUS
: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1838 case EM_ST7
: return "STMicroelectronics ST7 8-bit microcontroller";
1839 case EM_68HC16
: return "Motorola MC68HC16 Microcontroller";
1840 case EM_68HC11
: return "Motorola MC68HC11 Microcontroller";
1841 case EM_68HC08
: return "Motorola MC68HC08 Microcontroller";
1842 case EM_68HC05
: return "Motorola MC68HC05 Microcontroller";
1843 case EM_SVX
: return "Silicon Graphics SVx";
1844 case EM_ST19
: return "STMicroelectronics ST19 8-bit microcontroller";
1845 case EM_VAX
: return "Digital VAX";
1847 case EM_AVR
: return "Atmel AVR 8-bit microcontroller";
1848 case EM_CRIS
: return "Axis Communications 32-bit embedded processor";
1849 case EM_JAVELIN
: return "Infineon Technologies 32-bit embedded cpu";
1850 case EM_FIREPATH
: return "Element 14 64-bit DSP processor";
1851 case EM_ZSP
: return "LSI Logic's 16-bit DSP processor";
1852 case EM_MMIX
: return "Donald Knuth's educational 64-bit processor";
1853 case EM_HUANY
: return "Harvard Universitys's machine-independent object format";
1854 case EM_PRISM
: return "Vitesse Prism";
1855 case EM_X86_64
: return "Advanced Micro Devices X86-64";
1857 case EM_S390
: return "IBM S/390";
1858 case EM_XSTORMY16
: return "Sanyo Xstormy16 CPU core";
1860 case EM_OR32
: return "OpenRISC";
1861 case EM_DLX
: return "OpenDLX";
1863 case EM_IP2K
: return "Ubicom IP2xxx 8-bit microcontrollers";
1864 case EM_IQ2000
: return "Vitesse IQ2000";
1866 case EM_XTENSA
: return "Tensilica Xtensa Processor";
1868 sprintf (buff
, _("<unknown>: %x"), e_machine
);
1874 decode_ARM_machine_flags (e_flags
, buf
)
1881 eabi
= EF_ARM_EABI_VERSION (e_flags
);
1882 e_flags
&= ~ EF_ARM_EABIMASK
;
1884 /* Handle "generic" ARM flags. */
1885 if (e_flags
& EF_ARM_RELEXEC
)
1887 strcat (buf
, ", relocatable executable");
1888 e_flags
&= ~ EF_ARM_RELEXEC
;
1891 if (e_flags
& EF_ARM_HASENTRY
)
1893 strcat (buf
, ", has entry point");
1894 e_flags
&= ~ EF_ARM_HASENTRY
;
1897 /* Now handle EABI specific flags. */
1901 strcat (buf
, ", <unrecognized EABI>");
1906 case EF_ARM_EABI_VER1
:
1907 strcat (buf
, ", Version1 EABI");
1912 /* Process flags one bit at a time. */
1913 flag
= e_flags
& - e_flags
;
1918 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1919 strcat (buf
, ", sorted symbol tables");
1929 case EF_ARM_EABI_VER2
:
1930 strcat (buf
, ", Version2 EABI");
1935 /* Process flags one bit at a time. */
1936 flag
= e_flags
& - e_flags
;
1941 case EF_ARM_SYMSARESORTED
: /* Conflicts with EF_ARM_INTERWORK. */
1942 strcat (buf
, ", sorted symbol tables");
1945 case EF_ARM_DYNSYMSUSESEGIDX
:
1946 strcat (buf
, ", dynamic symbols use segment index");
1949 case EF_ARM_MAPSYMSFIRST
:
1950 strcat (buf
, ", mapping symbols precede others");
1960 case EF_ARM_EABI_UNKNOWN
:
1961 strcat (buf
, ", GNU EABI");
1966 /* Process flags one bit at a time. */
1967 flag
= e_flags
& - e_flags
;
1972 case EF_ARM_INTERWORK
:
1973 strcat (buf
, ", interworking enabled");
1976 case EF_ARM_APCS_26
:
1977 strcat (buf
, ", uses APCS/26");
1980 case EF_ARM_APCS_FLOAT
:
1981 strcat (buf
, ", uses APCS/float");
1985 strcat (buf
, ", position independent");
1989 strcat (buf
, ", 8 bit structure alignment");
1992 case EF_ARM_NEW_ABI
:
1993 strcat (buf
, ", uses new ABI");
1996 case EF_ARM_OLD_ABI
:
1997 strcat (buf
, ", uses old ABI");
2000 case EF_ARM_SOFT_FLOAT
:
2001 strcat (buf
, ", software FP");
2004 case EF_ARM_MAVERICK_FLOAT
:
2005 strcat (buf
, ", Maverick FP");
2016 strcat (buf
,", <unknown>");
2020 get_machine_flags (e_flags
, e_machine
)
2024 static char buf
[1024];
2036 decode_ARM_machine_flags (e_flags
, buf
);
2040 if (e_flags
& EF_CPU32
)
2041 strcat (buf
, ", cpu32");
2042 if (e_flags
& EF_M68000
)
2043 strcat (buf
, ", m68000");
2047 if (e_flags
& EF_PPC_EMB
)
2048 strcat (buf
, ", emb");
2050 if (e_flags
& EF_PPC_RELOCATABLE
)
2051 strcat (buf
, ", relocatable");
2053 if (e_flags
& EF_PPC_RELOCATABLE_LIB
)
2054 strcat (buf
, ", relocatable-lib");
2058 case EM_CYGNUS_V850
:
2059 switch (e_flags
& EF_V850_ARCH
)
2062 strcat (buf
, ", v850e");
2065 strcat (buf
, ", v850");
2068 strcat (buf
, ", unknown v850 architecture variant");
2074 case EM_CYGNUS_M32R
:
2075 if ((e_flags
& EF_M32R_ARCH
) == E_M32R_ARCH
)
2076 strcat (buf
, ", m32r");
2081 case EM_MIPS_RS3_LE
:
2082 if (e_flags
& EF_MIPS_NOREORDER
)
2083 strcat (buf
, ", noreorder");
2085 if (e_flags
& EF_MIPS_PIC
)
2086 strcat (buf
, ", pic");
2088 if (e_flags
& EF_MIPS_CPIC
)
2089 strcat (buf
, ", cpic");
2091 if (e_flags
& EF_MIPS_UCODE
)
2092 strcat (buf
, ", ugen_reserved");
2094 if (e_flags
& EF_MIPS_ABI2
)
2095 strcat (buf
, ", abi2");
2097 if (e_flags
& EF_MIPS_OPTIONS_FIRST
)
2098 strcat (buf
, ", odk first");
2100 if (e_flags
& EF_MIPS_32BITMODE
)
2101 strcat (buf
, ", 32bitmode");
2103 switch ((e_flags
& EF_MIPS_MACH
))
2105 case E_MIPS_MACH_3900
: strcat (buf
, ", 3900"); break;
2106 case E_MIPS_MACH_4010
: strcat (buf
, ", 4010"); break;
2107 case E_MIPS_MACH_4100
: strcat (buf
, ", 4100"); break;
2108 case E_MIPS_MACH_4111
: strcat (buf
, ", 4111"); break;
2109 case E_MIPS_MACH_4120
: strcat (buf
, ", 4120"); break;
2110 case E_MIPS_MACH_4650
: strcat (buf
, ", 4650"); break;
2111 case E_MIPS_MACH_5400
: strcat (buf
, ", 5400"); break;
2112 case E_MIPS_MACH_5500
: strcat (buf
, ", 5500"); break;
2113 case E_MIPS_MACH_SB1
: strcat (buf
, ", sb1"); break;
2115 /* We simply ignore the field in this case to avoid confusion:
2116 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
2119 default: strcat (buf
, ", unknown CPU"); break;
2122 switch ((e_flags
& EF_MIPS_ABI
))
2124 case E_MIPS_ABI_O32
: strcat (buf
, ", o32"); break;
2125 case E_MIPS_ABI_O64
: strcat (buf
, ", o64"); break;
2126 case E_MIPS_ABI_EABI32
: strcat (buf
, ", eabi32"); break;
2127 case E_MIPS_ABI_EABI64
: strcat (buf
, ", eabi64"); break;
2129 /* We simply ignore the field in this case to avoid confusion:
2130 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
2131 This means it is likely to be an o32 file, but not for
2134 default: strcat (buf
, ", unknown ABI"); break;
2137 if (e_flags
& EF_MIPS_ARCH_ASE_MDMX
)
2138 strcat (buf
, ", mdmx");
2140 if (e_flags
& EF_MIPS_ARCH_ASE_M16
)
2141 strcat (buf
, ", mips16");
2143 switch ((e_flags
& EF_MIPS_ARCH
))
2145 case E_MIPS_ARCH_1
: strcat (buf
, ", mips1"); break;
2146 case E_MIPS_ARCH_2
: strcat (buf
, ", mips2"); break;
2147 case E_MIPS_ARCH_3
: strcat (buf
, ", mips3"); break;
2148 case E_MIPS_ARCH_4
: strcat (buf
, ", mips4"); break;
2149 case E_MIPS_ARCH_5
: strcat (buf
, ", mips5"); break;
2150 case E_MIPS_ARCH_32
: strcat (buf
, ", mips32"); break;
2151 case E_MIPS_ARCH_32R2
: strcat (buf
, ", mips32r2"); break;
2152 case E_MIPS_ARCH_64
: strcat (buf
, ", mips64"); break;
2153 default: strcat (buf
, ", unknown ISA"); break;
2159 if (e_flags
& EF_SPARC_32PLUS
)
2160 strcat (buf
, ", v8+");
2162 if (e_flags
& EF_SPARC_SUN_US1
)
2163 strcat (buf
, ", ultrasparcI");
2165 if (e_flags
& EF_SPARC_SUN_US3
)
2166 strcat (buf
, ", ultrasparcIII");
2168 if (e_flags
& EF_SPARC_HAL_R1
)
2169 strcat (buf
, ", halr1");
2171 if (e_flags
& EF_SPARC_LEDATA
)
2172 strcat (buf
, ", ledata");
2174 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_TSO
)
2175 strcat (buf
, ", tso");
2177 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_PSO
)
2178 strcat (buf
, ", pso");
2180 if ((e_flags
& EF_SPARCV9_MM
) == EF_SPARCV9_RMO
)
2181 strcat (buf
, ", rmo");
2185 switch (e_flags
& EF_PARISC_ARCH
)
2187 case EFA_PARISC_1_0
:
2188 strcpy (buf
, ", PA-RISC 1.0");
2190 case EFA_PARISC_1_1
:
2191 strcpy (buf
, ", PA-RISC 1.1");
2193 case EFA_PARISC_2_0
:
2194 strcpy (buf
, ", PA-RISC 2.0");
2199 if (e_flags
& EF_PARISC_TRAPNIL
)
2200 strcat (buf
, ", trapnil");
2201 if (e_flags
& EF_PARISC_EXT
)
2202 strcat (buf
, ", ext");
2203 if (e_flags
& EF_PARISC_LSB
)
2204 strcat (buf
, ", lsb");
2205 if (e_flags
& EF_PARISC_WIDE
)
2206 strcat (buf
, ", wide");
2207 if (e_flags
& EF_PARISC_NO_KABP
)
2208 strcat (buf
, ", no kabp");
2209 if (e_flags
& EF_PARISC_LAZYSWAP
)
2210 strcat (buf
, ", lazyswap");
2215 if ((e_flags
& EF_PICOJAVA_NEWCALLS
) == EF_PICOJAVA_NEWCALLS
)
2216 strcat (buf
, ", new calling convention");
2218 if ((e_flags
& EF_PICOJAVA_GNUCALLS
) == EF_PICOJAVA_GNUCALLS
)
2219 strcat (buf
, ", gnu calling convention");
2223 if ((e_flags
& EF_IA_64_ABI64
))
2224 strcat (buf
, ", 64-bit");
2226 strcat (buf
, ", 32-bit");
2227 if ((e_flags
& EF_IA_64_REDUCEDFP
))
2228 strcat (buf
, ", reduced fp model");
2229 if ((e_flags
& EF_IA_64_NOFUNCDESC_CONS_GP
))
2230 strcat (buf
, ", no function descriptors, constant gp");
2231 else if ((e_flags
& EF_IA_64_CONS_GP
))
2232 strcat (buf
, ", constant gp");
2233 if ((e_flags
& EF_IA_64_ABSOLUTE
))
2234 strcat (buf
, ", absolute");
2238 if ((e_flags
& EF_VAX_NONPIC
))
2239 strcat (buf
, ", non-PIC");
2240 if ((e_flags
& EF_VAX_DFLOAT
))
2241 strcat (buf
, ", D-Float");
2242 if ((e_flags
& EF_VAX_GFLOAT
))
2243 strcat (buf
, ", G-Float");
2252 get_mips_segment_type (type
)
2257 case PT_MIPS_REGINFO
:
2259 case PT_MIPS_RTPROC
:
2261 case PT_MIPS_OPTIONS
:
2271 get_parisc_segment_type (type
)
2276 case PT_HP_TLS
: return "HP_TLS";
2277 case PT_HP_CORE_NONE
: return "HP_CORE_NONE";
2278 case PT_HP_CORE_VERSION
: return "HP_CORE_VERSION";
2279 case PT_HP_CORE_KERNEL
: return "HP_CORE_KERNEL";
2280 case PT_HP_CORE_COMM
: return "HP_CORE_COMM";
2281 case PT_HP_CORE_PROC
: return "HP_CORE_PROC";
2282 case PT_HP_CORE_LOADABLE
: return "HP_CORE_LOADABLE";
2283 case PT_HP_CORE_STACK
: return "HP_CORE_STACK";
2284 case PT_HP_CORE_SHM
: return "HP_CORE_SHM";
2285 case PT_HP_CORE_MMF
: return "HP_CORE_MMF";
2286 case PT_HP_PARALLEL
: return "HP_PARALLEL";
2287 case PT_HP_FASTBIND
: return "HP_FASTBIND";
2288 case PT_PARISC_ARCHEXT
: return "PARISC_ARCHEXT";
2289 case PT_PARISC_UNWIND
: return "PARISC_UNWIND";
2298 get_ia64_segment_type (type
)
2303 case PT_IA_64_ARCHEXT
: return "IA_64_ARCHEXT";
2304 case PT_IA_64_UNWIND
: return "IA_64_UNWIND";
2305 case PT_HP_TLS
: return "HP_TLS";
2306 case PT_IA_64_HP_OPT_ANOT
: return "HP_OPT_ANNOT";
2307 case PT_IA_64_HP_HSL_ANOT
: return "HP_HSL_ANNOT";
2308 case PT_IA_64_HP_STACK
: return "HP_STACK";
2317 get_segment_type (p_type
)
2318 unsigned long p_type
;
2320 static char buff
[32];
2324 case PT_NULL
: return "NULL";
2325 case PT_LOAD
: return "LOAD";
2326 case PT_DYNAMIC
: return "DYNAMIC";
2327 case PT_INTERP
: return "INTERP";
2328 case PT_NOTE
: return "NOTE";
2329 case PT_SHLIB
: return "SHLIB";
2330 case PT_PHDR
: return "PHDR";
2331 case PT_TLS
: return "TLS";
2333 case PT_GNU_EH_FRAME
:
2334 return "GNU_EH_FRAME";
2335 case PT_GNU_STACK
: return "STACK";
2338 if ((p_type
>= PT_LOPROC
) && (p_type
<= PT_HIPROC
))
2342 switch (elf_header
.e_machine
)
2345 case EM_MIPS_RS3_LE
:
2346 result
= get_mips_segment_type (p_type
);
2349 result
= get_parisc_segment_type (p_type
);
2352 result
= get_ia64_segment_type (p_type
);
2362 sprintf (buff
, "LOPROC+%lx", p_type
- PT_LOPROC
);
2364 else if ((p_type
>= PT_LOOS
) && (p_type
<= PT_HIOS
))
2368 switch (elf_header
.e_machine
)
2371 result
= get_parisc_segment_type (p_type
);
2374 result
= get_ia64_segment_type (p_type
);
2384 sprintf (buff
, "LOOS+%lx", p_type
- PT_LOOS
);
2387 sprintf (buff
, _("<unknown>: %lx"), p_type
);
2394 get_mips_section_type_name (sh_type
)
2395 unsigned int sh_type
;
2399 case SHT_MIPS_LIBLIST
: return "MIPS_LIBLIST";
2400 case SHT_MIPS_MSYM
: return "MIPS_MSYM";
2401 case SHT_MIPS_CONFLICT
: return "MIPS_CONFLICT";
2402 case SHT_MIPS_GPTAB
: return "MIPS_GPTAB";
2403 case SHT_MIPS_UCODE
: return "MIPS_UCODE";
2404 case SHT_MIPS_DEBUG
: return "MIPS_DEBUG";
2405 case SHT_MIPS_REGINFO
: return "MIPS_REGINFO";
2406 case SHT_MIPS_PACKAGE
: return "MIPS_PACKAGE";
2407 case SHT_MIPS_PACKSYM
: return "MIPS_PACKSYM";
2408 case SHT_MIPS_RELD
: return "MIPS_RELD";
2409 case SHT_MIPS_IFACE
: return "MIPS_IFACE";
2410 case SHT_MIPS_CONTENT
: return "MIPS_CONTENT";
2411 case SHT_MIPS_OPTIONS
: return "MIPS_OPTIONS";
2412 case SHT_MIPS_SHDR
: return "MIPS_SHDR";
2413 case SHT_MIPS_FDESC
: return "MIPS_FDESC";
2414 case SHT_MIPS_EXTSYM
: return "MIPS_EXTSYM";
2415 case SHT_MIPS_DENSE
: return "MIPS_DENSE";
2416 case SHT_MIPS_PDESC
: return "MIPS_PDESC";
2417 case SHT_MIPS_LOCSYM
: return "MIPS_LOCSYM";
2418 case SHT_MIPS_AUXSYM
: return "MIPS_AUXSYM";
2419 case SHT_MIPS_OPTSYM
: return "MIPS_OPTSYM";
2420 case SHT_MIPS_LOCSTR
: return "MIPS_LOCSTR";
2421 case SHT_MIPS_LINE
: return "MIPS_LINE";
2422 case SHT_MIPS_RFDESC
: return "MIPS_RFDESC";
2423 case SHT_MIPS_DELTASYM
: return "MIPS_DELTASYM";
2424 case SHT_MIPS_DELTAINST
: return "MIPS_DELTAINST";
2425 case SHT_MIPS_DELTACLASS
: return "MIPS_DELTACLASS";
2426 case SHT_MIPS_DWARF
: return "MIPS_DWARF";
2427 case SHT_MIPS_DELTADECL
: return "MIPS_DELTADECL";
2428 case SHT_MIPS_SYMBOL_LIB
: return "MIPS_SYMBOL_LIB";
2429 case SHT_MIPS_EVENTS
: return "MIPS_EVENTS";
2430 case SHT_MIPS_TRANSLATE
: return "MIPS_TRANSLATE";
2431 case SHT_MIPS_PIXIE
: return "MIPS_PIXIE";
2432 case SHT_MIPS_XLATE
: return "MIPS_XLATE";
2433 case SHT_MIPS_XLATE_DEBUG
: return "MIPS_XLATE_DEBUG";
2434 case SHT_MIPS_WHIRL
: return "MIPS_WHIRL";
2435 case SHT_MIPS_EH_REGION
: return "MIPS_EH_REGION";
2436 case SHT_MIPS_XLATE_OLD
: return "MIPS_XLATE_OLD";
2437 case SHT_MIPS_PDR_EXCEPTION
: return "MIPS_PDR_EXCEPTION";
2445 get_parisc_section_type_name (sh_type
)
2446 unsigned int sh_type
;
2450 case SHT_PARISC_EXT
: return "PARISC_EXT";
2451 case SHT_PARISC_UNWIND
: return "PARISC_UNWIND";
2452 case SHT_PARISC_DOC
: return "PARISC_DOC";
2460 get_ia64_section_type_name (sh_type
)
2461 unsigned int sh_type
;
2463 /* If the top 8 bits are 0x78 the next 8 are the os/abi ID. */
2464 if ((sh_type
& 0xFF000000) == SHT_IA_64_LOPSREG
)
2465 return get_osabi_name ((sh_type
& 0x00FF0000) >> 16);
2469 case SHT_IA_64_EXT
: return "IA_64_EXT";
2470 case SHT_IA_64_UNWIND
: return "IA_64_UNWIND";
2471 case SHT_IA_64_PRIORITY_INIT
: return "IA_64_PRIORITY_INIT";
2479 get_section_type_name (sh_type
)
2480 unsigned int sh_type
;
2482 static char buff
[32];
2486 case SHT_NULL
: return "NULL";
2487 case SHT_PROGBITS
: return "PROGBITS";
2488 case SHT_SYMTAB
: return "SYMTAB";
2489 case SHT_STRTAB
: return "STRTAB";
2490 case SHT_RELA
: return "RELA";
2491 case SHT_HASH
: return "HASH";
2492 case SHT_DYNAMIC
: return "DYNAMIC";
2493 case SHT_NOTE
: return "NOTE";
2494 case SHT_NOBITS
: return "NOBITS";
2495 case SHT_REL
: return "REL";
2496 case SHT_SHLIB
: return "SHLIB";
2497 case SHT_DYNSYM
: return "DYNSYM";
2498 case SHT_INIT_ARRAY
: return "INIT_ARRAY";
2499 case SHT_FINI_ARRAY
: return "FINI_ARRAY";
2500 case SHT_PREINIT_ARRAY
: return "PREINIT_ARRAY";
2501 case SHT_GROUP
: return "GROUP";
2502 case SHT_SYMTAB_SHNDX
: return "SYMTAB SECTION INDICIES";
2503 case SHT_GNU_verdef
: return "VERDEF";
2504 case SHT_GNU_verneed
: return "VERNEED";
2505 case SHT_GNU_versym
: return "VERSYM";
2506 case 0x6ffffff0: return "VERSYM";
2507 case 0x6ffffffc: return "VERDEF";
2508 case 0x7ffffffd: return "AUXILIARY";
2509 case 0x7fffffff: return "FILTER";
2510 case SHT_GNU_LIBLIST
: return "GNU_LIBLIST";
2513 if ((sh_type
>= SHT_LOPROC
) && (sh_type
<= SHT_HIPROC
))
2517 switch (elf_header
.e_machine
)
2520 case EM_MIPS_RS3_LE
:
2521 result
= get_mips_section_type_name (sh_type
);
2524 result
= get_parisc_section_type_name (sh_type
);
2527 result
= get_ia64_section_type_name (sh_type
);
2537 sprintf (buff
, "LOPROC+%x", sh_type
- SHT_LOPROC
);
2539 else if ((sh_type
>= SHT_LOOS
) && (sh_type
<= SHT_HIOS
))
2540 sprintf (buff
, "LOOS+%x", sh_type
- SHT_LOOS
);
2541 else if ((sh_type
>= SHT_LOUSER
) && (sh_type
<= SHT_HIUSER
))
2542 sprintf (buff
, "LOUSER+%x", sh_type
- SHT_LOUSER
);
2544 sprintf (buff
, _("<unknown>: %x"), sh_type
);
2550 #define OPTION_DEBUG_DUMP 512
2552 struct option options
[] =
2554 {"all", no_argument
, 0, 'a'},
2555 {"file-header", no_argument
, 0, 'h'},
2556 {"program-headers", no_argument
, 0, 'l'},
2557 {"headers", no_argument
, 0, 'e'},
2558 {"histogram", no_argument
, 0, 'I'},
2559 {"segments", no_argument
, 0, 'l'},
2560 {"sections", no_argument
, 0, 'S'},
2561 {"section-headers", no_argument
, 0, 'S'},
2562 {"symbols", no_argument
, 0, 's'},
2563 {"syms", no_argument
, 0, 's'},
2564 {"relocs", no_argument
, 0, 'r'},
2565 {"notes", no_argument
, 0, 'n'},
2566 {"dynamic", no_argument
, 0, 'd'},
2567 {"arch-specific", no_argument
, 0, 'A'},
2568 {"version-info", no_argument
, 0, 'V'},
2569 {"use-dynamic", no_argument
, 0, 'D'},
2570 {"hex-dump", required_argument
, 0, 'x'},
2571 {"debug-dump", optional_argument
, 0, OPTION_DEBUG_DUMP
},
2572 {"unwind", no_argument
, 0, 'u'},
2573 #ifdef SUPPORT_DISASSEMBLY
2574 {"instruction-dump", required_argument
, 0, 'i'},
2577 {"version", no_argument
, 0, 'v'},
2578 {"wide", no_argument
, 0, 'W'},
2579 {"help", no_argument
, 0, 'H'},
2580 {0, no_argument
, 0, 0}
2586 fprintf (stdout
, _("Usage: readelf <option(s)> elf-file(s)\n"));
2587 fprintf (stdout
, _(" Display information about the contents of ELF format files\n"));
2588 fprintf (stdout
, _(" Options are:\n\
2589 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2590 -h --file-header Display the ELF file header\n\
2591 -l --program-headers Display the program headers\n\
2592 --segments An alias for --program-headers\n\
2593 -S --section-headers Display the sections' header\n\
2594 --sections An alias for --section-headers\n\
2595 -e --headers Equivalent to: -h -l -S\n\
2596 -s --syms Display the symbol table\n\
2597 --symbols An alias for --syms\n\
2598 -n --notes Display the core notes (if present)\n\
2599 -r --relocs Display the relocations (if present)\n\
2600 -u --unwind Display the unwind info (if present)\n\
2601 -d --dynamic Display the dynamic segment (if present)\n\
2602 -V --version-info Display the version sections (if present)\n\
2603 -A --arch-specific Display architecture specific information (if any).\n\
2604 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2605 -x --hex-dump=<number> Dump the contents of section <number>\n\
2606 -w[liaprmfFso] or\n\
2607 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2608 Display the contents of DWARF2 debug sections\n"));
2609 #ifdef SUPPORT_DISASSEMBLY
2610 fprintf (stdout
, _("\
2611 -i --instruction-dump=<number>\n\
2612 Disassemble the contents of section <number>\n"));
2614 fprintf (stdout
, _("\
2615 -I --histogram Display histogram of bucket list lengths\n\
2616 -W --wide Allow output width to exceed 80 characters\n\
2617 -H --help Display this information\n\
2618 -v --version Display the version number of readelf\n"));
2619 fprintf (stdout
, _("Report bugs to %s\n"), REPORT_BUGS_TO
);
2625 request_dump (section
, type
)
2626 unsigned int section
;
2629 if (section
>= num_dump_sects
)
2631 char *new_dump_sects
;
2633 new_dump_sects
= (char *) calloc (section
+ 1, 1);
2635 if (new_dump_sects
== NULL
)
2636 error (_("Out of memory allocating dump request table."));
2639 /* Copy current flag settings. */
2640 memcpy (new_dump_sects
, dump_sects
, num_dump_sects
);
2644 dump_sects
= new_dump_sects
;
2645 num_dump_sects
= section
+ 1;
2650 dump_sects
[section
] |= type
;
2656 parse_args (argc
, argv
)
2665 while ((c
= getopt_long
2666 (argc
, argv
, "ersuahnldSDAIw::x:i:vVWH", options
, NULL
)) != EOF
)
2733 section
= strtoul (optarg
, & cp
, 0);
2734 if (! *cp
&& section
>= 0)
2736 request_dump (section
, HEX_DUMP
);
2746 unsigned int index
= 0;
2750 while (optarg
[index
])
2751 switch (optarg
[index
++])
2760 do_debug_abbrevs
= 1;
2770 do_debug_pubnames
= 1;
2775 do_debug_aranges
= 1;
2779 do_debug_frames_interp
= 1;
2781 do_debug_frames
= 1;
2786 do_debug_macinfo
= 1;
2800 warn (_("Unrecognized debug option '%s'\n"), optarg
);
2805 case OPTION_DEBUG_DUMP
:
2811 static const char *debug_dump_opt
[]
2812 = { "line", "info", "abbrev", "pubnames", "ranges",
2813 "macro", "frames", "frames-interp", "str", "loc", NULL
};
2822 for (index
= 0; debug_dump_opt
[index
]; index
++)
2824 size_t len
= strlen (debug_dump_opt
[index
]);
2826 if (strncmp (p
, debug_dump_opt
[index
], len
) == 0
2827 && (p
[len
] == ',' || p
[len
] == '\0'))
2836 do_debug_abbrevs
= 1;
2847 do_debug_pubnames
= 1;
2851 do_debug_aranges
= 1;
2856 do_debug_frames_interp
= 1;
2857 do_debug_frames
= 1;
2861 do_debug_macinfo
= 1;
2874 if (debug_dump_opt
[index
] == NULL
)
2876 warn (_("Unrecognized debug option '%s'\n"), p
);
2877 p
= strchr (p
, ',');
2887 #ifdef SUPPORT_DISASSEMBLY
2890 section
= strtoul (optarg
, & cp
, 0);
2891 if (! *cp
&& section
>= 0)
2893 request_dump (section
, DISASS_DUMP
);
2899 print_version (program_name
);
2909 /* xgettext:c-format */
2910 error (_("Invalid option '-%c'\n"), c
);
2917 if (!do_dynamic
&& !do_syms
&& !do_reloc
&& !do_unwind
&& !do_sections
2918 && !do_segments
&& !do_header
&& !do_dump
&& !do_version
2919 && !do_histogram
&& !do_debugging
&& !do_arch
&& !do_notes
)
2923 warn (_("Nothing to do.\n"));
2929 get_elf_class (elf_class
)
2930 unsigned int elf_class
;
2932 static char buff
[32];
2936 case ELFCLASSNONE
: return _("none");
2937 case ELFCLASS32
: return "ELF32";
2938 case ELFCLASS64
: return "ELF64";
2940 sprintf (buff
, _("<unknown: %x>"), elf_class
);
2946 get_data_encoding (encoding
)
2947 unsigned int encoding
;
2949 static char buff
[32];
2953 case ELFDATANONE
: return _("none");
2954 case ELFDATA2LSB
: return _("2's complement, little endian");
2955 case ELFDATA2MSB
: return _("2's complement, big endian");
2957 sprintf (buff
, _("<unknown: %x>"), encoding
);
2963 get_osabi_name (osabi
)
2966 static char buff
[32];
2970 case ELFOSABI_NONE
: return "UNIX - System V";
2971 case ELFOSABI_HPUX
: return "UNIX - HP-UX";
2972 case ELFOSABI_NETBSD
: return "UNIX - NetBSD";
2973 case ELFOSABI_LINUX
: return "UNIX - Linux";
2974 case ELFOSABI_HURD
: return "GNU/Hurd";
2975 case ELFOSABI_SOLARIS
: return "UNIX - Solaris";
2976 case ELFOSABI_AIX
: return "UNIX - AIX";
2977 case ELFOSABI_IRIX
: return "UNIX - IRIX";
2978 case ELFOSABI_FREEBSD
: return "UNIX - FreeBSD";
2979 case ELFOSABI_TRU64
: return "UNIX - TRU64";
2980 case ELFOSABI_MODESTO
: return "Novell - Modesto";
2981 case ELFOSABI_OPENBSD
: return "UNIX - OpenBSD";
2982 case ELFOSABI_OPENVMS
: return "VMS - OpenVMS";
2983 case ELFOSABI_NSK
: return "HP - Non-Stop Kernel";
2984 case ELFOSABI_AROS
: return "Amiga Research OS";
2985 case ELFOSABI_STANDALONE
: return _("Standalone App");
2986 case ELFOSABI_ARM
: return "ARM";
2988 sprintf (buff
, _("<unknown: %x>"), osabi
);
2993 /* Decode the data held in 'elf_header'. */
2996 process_file_header ()
2998 if ( elf_header
.e_ident
[EI_MAG0
] != ELFMAG0
2999 || elf_header
.e_ident
[EI_MAG1
] != ELFMAG1
3000 || elf_header
.e_ident
[EI_MAG2
] != ELFMAG2
3001 || elf_header
.e_ident
[EI_MAG3
] != ELFMAG3
)
3004 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
3012 printf (_("ELF Header:\n"));
3013 printf (_(" Magic: "));
3014 for (i
= 0; i
< EI_NIDENT
; i
++)
3015 printf ("%2.2x ", elf_header
.e_ident
[i
]);
3017 printf (_(" Class: %s\n"),
3018 get_elf_class (elf_header
.e_ident
[EI_CLASS
]));
3019 printf (_(" Data: %s\n"),
3020 get_data_encoding (elf_header
.e_ident
[EI_DATA
]));
3021 printf (_(" Version: %d %s\n"),
3022 elf_header
.e_ident
[EI_VERSION
],
3023 (elf_header
.e_ident
[EI_VERSION
] == EV_CURRENT
3025 : (elf_header
.e_ident
[EI_VERSION
] != EV_NONE
3028 printf (_(" OS/ABI: %s\n"),
3029 get_osabi_name (elf_header
.e_ident
[EI_OSABI
]));
3030 printf (_(" ABI Version: %d\n"),
3031 elf_header
.e_ident
[EI_ABIVERSION
]);
3032 printf (_(" Type: %s\n"),
3033 get_file_type (elf_header
.e_type
));
3034 printf (_(" Machine: %s\n"),
3035 get_machine_name (elf_header
.e_machine
));
3036 printf (_(" Version: 0x%lx\n"),
3037 (unsigned long) elf_header
.e_version
);
3039 printf (_(" Entry point address: "));
3040 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3041 printf (_("\n Start of program headers: "));
3042 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3043 printf (_(" (bytes into file)\n Start of section headers: "));
3044 print_vma ((bfd_vma
) elf_header
.e_shoff
, DEC
);
3045 printf (_(" (bytes into file)\n"));
3047 printf (_(" Flags: 0x%lx%s\n"),
3048 (unsigned long) elf_header
.e_flags
,
3049 get_machine_flags (elf_header
.e_flags
, elf_header
.e_machine
));
3050 printf (_(" Size of this header: %ld (bytes)\n"),
3051 (long) elf_header
.e_ehsize
);
3052 printf (_(" Size of program headers: %ld (bytes)\n"),
3053 (long) elf_header
.e_phentsize
);
3054 printf (_(" Number of program headers: %ld\n"),
3055 (long) elf_header
.e_phnum
);
3056 printf (_(" Size of section headers: %ld (bytes)\n"),
3057 (long) elf_header
.e_shentsize
);
3058 printf (_(" Number of section headers: %ld"),
3059 (long) elf_header
.e_shnum
);
3060 if (section_headers
!= NULL
&& elf_header
.e_shnum
== 0)
3061 printf (" (%ld)", (long) section_headers
[0].sh_size
);
3062 putc ('\n', stdout
);
3063 printf (_(" Section header string table index: %ld"),
3064 (long) elf_header
.e_shstrndx
);
3065 if (section_headers
!= NULL
&& elf_header
.e_shstrndx
== SHN_XINDEX
)
3066 printf (" (%ld)", (long) section_headers
[0].sh_link
);
3067 putc ('\n', stdout
);
3070 if (section_headers
!= NULL
)
3072 if (elf_header
.e_shnum
== 0)
3073 elf_header
.e_shnum
= section_headers
[0].sh_size
;
3074 if (elf_header
.e_shstrndx
== SHN_XINDEX
)
3075 elf_header
.e_shstrndx
= section_headers
[0].sh_link
;
3076 free (section_headers
);
3077 section_headers
= NULL
;
3085 get_32bit_program_headers (file
, program_headers
)
3087 Elf_Internal_Phdr
*program_headers
;
3089 Elf32_External_Phdr
*phdrs
;
3090 Elf32_External_Phdr
*external
;
3091 Elf_Internal_Phdr
*internal
;
3094 phdrs
= ((Elf32_External_Phdr
*)
3095 get_data (NULL
, file
, elf_header
.e_phoff
,
3096 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3097 _("program headers")));
3101 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3102 i
< elf_header
.e_phnum
;
3103 i
++, internal
++, external
++)
3105 internal
->p_type
= BYTE_GET (external
->p_type
);
3106 internal
->p_offset
= BYTE_GET (external
->p_offset
);
3107 internal
->p_vaddr
= BYTE_GET (external
->p_vaddr
);
3108 internal
->p_paddr
= BYTE_GET (external
->p_paddr
);
3109 internal
->p_filesz
= BYTE_GET (external
->p_filesz
);
3110 internal
->p_memsz
= BYTE_GET (external
->p_memsz
);
3111 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3112 internal
->p_align
= BYTE_GET (external
->p_align
);
3121 get_64bit_program_headers (file
, program_headers
)
3123 Elf_Internal_Phdr
*program_headers
;
3125 Elf64_External_Phdr
*phdrs
;
3126 Elf64_External_Phdr
*external
;
3127 Elf_Internal_Phdr
*internal
;
3130 phdrs
= ((Elf64_External_Phdr
*)
3131 get_data (NULL
, file
, elf_header
.e_phoff
,
3132 elf_header
.e_phentsize
* elf_header
.e_phnum
,
3133 _("program headers")));
3137 for (i
= 0, internal
= program_headers
, external
= phdrs
;
3138 i
< elf_header
.e_phnum
;
3139 i
++, internal
++, external
++)
3141 internal
->p_type
= BYTE_GET (external
->p_type
);
3142 internal
->p_flags
= BYTE_GET (external
->p_flags
);
3143 internal
->p_offset
= BYTE_GET8 (external
->p_offset
);
3144 internal
->p_vaddr
= BYTE_GET8 (external
->p_vaddr
);
3145 internal
->p_paddr
= BYTE_GET8 (external
->p_paddr
);
3146 internal
->p_filesz
= BYTE_GET8 (external
->p_filesz
);
3147 internal
->p_memsz
= BYTE_GET8 (external
->p_memsz
);
3148 internal
->p_align
= BYTE_GET8 (external
->p_align
);
3156 /* Returns 1 if the program headers were loaded. */
3159 process_program_headers (file
)
3162 Elf_Internal_Phdr
*program_headers
;
3163 Elf_Internal_Phdr
*segment
;
3166 if (elf_header
.e_phnum
== 0)
3169 printf (_("\nThere are no program headers in this file.\n"));
3173 if (do_segments
&& !do_header
)
3175 printf (_("\nElf file type is %s\n"), get_file_type (elf_header
.e_type
));
3176 printf (_("Entry point "));
3177 print_vma ((bfd_vma
) elf_header
.e_entry
, PREFIX_HEX
);
3178 printf (_("\nThere are %d program headers, starting at offset "),
3179 elf_header
.e_phnum
);
3180 print_vma ((bfd_vma
) elf_header
.e_phoff
, DEC
);
3184 program_headers
= (Elf_Internal_Phdr
*) malloc
3185 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
3187 if (program_headers
== NULL
)
3189 error (_("Out of memory\n"));
3194 i
= get_32bit_program_headers (file
, program_headers
);
3196 i
= get_64bit_program_headers (file
, program_headers
);
3200 free (program_headers
);
3206 if (elf_header
.e_phnum
> 1)
3207 printf (_("\nProgram Headers:\n"));
3209 printf (_("\nProgram Headers:\n"));
3213 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3216 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3220 (_(" Type Offset VirtAddr PhysAddr\n"));
3222 (_(" FileSiz MemSiz Flags Align\n"));
3230 for (i
= 0, segment
= program_headers
;
3231 i
< elf_header
.e_phnum
;
3236 printf (" %-14.14s ", get_segment_type (segment
->p_type
));
3240 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3241 printf ("0x%8.8lx ", (unsigned long) segment
->p_vaddr
);
3242 printf ("0x%8.8lx ", (unsigned long) segment
->p_paddr
);
3243 printf ("0x%5.5lx ", (unsigned long) segment
->p_filesz
);
3244 printf ("0x%5.5lx ", (unsigned long) segment
->p_memsz
);
3246 (segment
->p_flags
& PF_R
? 'R' : ' '),
3247 (segment
->p_flags
& PF_W
? 'W' : ' '),
3248 (segment
->p_flags
& PF_X
? 'E' : ' '));
3249 printf ("%#lx", (unsigned long) segment
->p_align
);
3253 if ((unsigned long) segment
->p_offset
== segment
->p_offset
)
3254 printf ("0x%6.6lx ", (unsigned long) segment
->p_offset
);
3257 print_vma (segment
->p_offset
, FULL_HEX
);
3261 print_vma (segment
->p_vaddr
, FULL_HEX
);
3263 print_vma (segment
->p_paddr
, FULL_HEX
);
3266 if ((unsigned long) segment
->p_filesz
== segment
->p_filesz
)
3267 printf ("0x%6.6lx ", (unsigned long) segment
->p_filesz
);
3270 print_vma (segment
->p_filesz
, FULL_HEX
);
3274 if ((unsigned long) segment
->p_memsz
== segment
->p_memsz
)
3275 printf ("0x%6.6lx", (unsigned long) segment
->p_memsz
);
3278 print_vma (segment
->p_offset
, FULL_HEX
);
3282 (segment
->p_flags
& PF_R
? 'R' : ' '),
3283 (segment
->p_flags
& PF_W
? 'W' : ' '),
3284 (segment
->p_flags
& PF_X
? 'E' : ' '));
3286 if ((unsigned long) segment
->p_align
== segment
->p_align
)
3287 printf ("%#lx", (unsigned long) segment
->p_align
);
3290 print_vma (segment
->p_align
, PREFIX_HEX
);
3295 print_vma (segment
->p_offset
, FULL_HEX
);
3297 print_vma (segment
->p_vaddr
, FULL_HEX
);
3299 print_vma (segment
->p_paddr
, FULL_HEX
);
3301 print_vma (segment
->p_filesz
, FULL_HEX
);
3303 print_vma (segment
->p_memsz
, FULL_HEX
);
3305 (segment
->p_flags
& PF_R
? 'R' : ' '),
3306 (segment
->p_flags
& PF_W
? 'W' : ' '),
3307 (segment
->p_flags
& PF_X
? 'E' : ' '));
3308 print_vma (segment
->p_align
, HEX
);
3312 switch (segment
->p_type
)
3317 unsigned long align_mask
= -segment
->p_align
;
3319 if (align_mask
== 0)
3321 loadaddr
= ((segment
->p_vaddr
& align_mask
)
3322 - (segment
->p_offset
& align_mask
));
3328 error (_("more than one dynamic segment\n"));
3330 dynamic_addr
= segment
->p_offset
;
3331 dynamic_size
= segment
->p_filesz
;
3335 if (fseek (file
, (long) segment
->p_offset
, SEEK_SET
))
3336 error (_("Unable to find program interpreter name\n"));
3339 program_interpreter
[0] = 0;
3340 fscanf (file
, "%63s", program_interpreter
);
3343 printf (_("\n [Requesting program interpreter: %s]"),
3344 program_interpreter
);
3350 putc ('\n', stdout
);
3359 if (do_segments
&& section_headers
!= NULL
)
3361 printf (_("\n Section to Segment mapping:\n"));
3362 printf (_(" Segment Sections...\n"));
3364 assert (string_table
!= NULL
);
3366 for (i
= 0; i
< elf_header
.e_phnum
; i
++)
3369 Elf_Internal_Shdr
*section
;
3371 segment
= program_headers
+ i
;
3372 section
= section_headers
;
3374 printf (" %2.2d ", i
);
3376 for (j
= 1; j
< elf_header
.e_shnum
; j
++, section
++)
3378 if (section
->sh_size
> 0
3379 /* Compare allocated sections by VMA, unallocated
3380 sections by file offset. */
3381 && (section
->sh_flags
& SHF_ALLOC
3382 ? (section
->sh_addr
>= segment
->p_vaddr
3383 && section
->sh_addr
+ section
->sh_size
3384 <= segment
->p_vaddr
+ segment
->p_memsz
)
3385 : ((bfd_vma
) section
->sh_offset
>= segment
->p_offset
3386 && (section
->sh_offset
+ section
->sh_size
3387 <= segment
->p_offset
+ segment
->p_filesz
))))
3388 printf ("%s ", SECTION_NAME (section
));
3395 free (program_headers
);
3402 get_32bit_section_headers (file
, num
)
3406 Elf32_External_Shdr
*shdrs
;
3407 Elf_Internal_Shdr
*internal
;
3410 shdrs
= ((Elf32_External_Shdr
*)
3411 get_data (NULL
, file
, elf_header
.e_shoff
,
3412 elf_header
.e_shentsize
* num
,
3413 _("section headers")));
3417 section_headers
= ((Elf_Internal_Shdr
*)
3418 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3420 if (section_headers
== NULL
)
3422 error (_("Out of memory\n"));
3426 for (i
= 0, internal
= section_headers
;
3430 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3431 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3432 internal
->sh_flags
= BYTE_GET (shdrs
[i
].sh_flags
);
3433 internal
->sh_addr
= BYTE_GET (shdrs
[i
].sh_addr
);
3434 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3435 internal
->sh_size
= BYTE_GET (shdrs
[i
].sh_size
);
3436 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3437 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3438 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3439 internal
->sh_entsize
= BYTE_GET (shdrs
[i
].sh_entsize
);
3448 get_64bit_section_headers (file
, num
)
3452 Elf64_External_Shdr
*shdrs
;
3453 Elf_Internal_Shdr
*internal
;
3456 shdrs
= ((Elf64_External_Shdr
*)
3457 get_data (NULL
, file
, elf_header
.e_shoff
,
3458 elf_header
.e_shentsize
* num
,
3459 _("section headers")));
3463 section_headers
= ((Elf_Internal_Shdr
*)
3464 malloc (num
* sizeof (Elf_Internal_Shdr
)));
3466 if (section_headers
== NULL
)
3468 error (_("Out of memory\n"));
3472 for (i
= 0, internal
= section_headers
;
3476 internal
->sh_name
= BYTE_GET (shdrs
[i
].sh_name
);
3477 internal
->sh_type
= BYTE_GET (shdrs
[i
].sh_type
);
3478 internal
->sh_flags
= BYTE_GET8 (shdrs
[i
].sh_flags
);
3479 internal
->sh_addr
= BYTE_GET8 (shdrs
[i
].sh_addr
);
3480 internal
->sh_size
= BYTE_GET8 (shdrs
[i
].sh_size
);
3481 internal
->sh_entsize
= BYTE_GET8 (shdrs
[i
].sh_entsize
);
3482 internal
->sh_link
= BYTE_GET (shdrs
[i
].sh_link
);
3483 internal
->sh_info
= BYTE_GET (shdrs
[i
].sh_info
);
3484 internal
->sh_offset
= BYTE_GET (shdrs
[i
].sh_offset
);
3485 internal
->sh_addralign
= BYTE_GET (shdrs
[i
].sh_addralign
);
3493 static Elf_Internal_Sym
*
3494 get_32bit_elf_symbols (file
, section
)
3496 Elf_Internal_Shdr
*section
;
3498 unsigned long number
;
3499 Elf32_External_Sym
*esyms
;
3500 Elf_External_Sym_Shndx
*shndx
;
3501 Elf_Internal_Sym
*isyms
;
3502 Elf_Internal_Sym
*psym
;
3505 esyms
= ((Elf32_External_Sym
*)
3506 get_data (NULL
, file
, section
->sh_offset
,
3507 section
->sh_size
, _("symbols")));
3512 if (symtab_shndx_hdr
!= NULL
3513 && (symtab_shndx_hdr
->sh_link
3514 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3516 shndx
= ((Elf_External_Sym_Shndx
*)
3517 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3518 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3526 number
= section
->sh_size
/ section
->sh_entsize
;
3527 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3531 error (_("Out of memory\n"));
3538 for (j
= 0, psym
= isyms
;
3542 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3543 psym
->st_value
= BYTE_GET (esyms
[j
].st_value
);
3544 psym
->st_size
= BYTE_GET (esyms
[j
].st_size
);
3545 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3546 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3548 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3549 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3550 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3560 static Elf_Internal_Sym
*
3561 get_64bit_elf_symbols (file
, section
)
3563 Elf_Internal_Shdr
*section
;
3565 unsigned long number
;
3566 Elf64_External_Sym
*esyms
;
3567 Elf_External_Sym_Shndx
*shndx
;
3568 Elf_Internal_Sym
*isyms
;
3569 Elf_Internal_Sym
*psym
;
3572 esyms
= ((Elf64_External_Sym
*)
3573 get_data (NULL
, file
, section
->sh_offset
,
3574 section
->sh_size
, _("symbols")));
3579 if (symtab_shndx_hdr
!= NULL
3580 && (symtab_shndx_hdr
->sh_link
3581 == (unsigned long) SECTION_HEADER_NUM (section
- section_headers
)))
3583 shndx
= ((Elf_External_Sym_Shndx
*)
3584 get_data (NULL
, file
, symtab_shndx_hdr
->sh_offset
,
3585 symtab_shndx_hdr
->sh_size
, _("symtab shndx")));
3593 number
= section
->sh_size
/ section
->sh_entsize
;
3594 isyms
= (Elf_Internal_Sym
*) malloc (number
* sizeof (Elf_Internal_Sym
));
3598 error (_("Out of memory\n"));
3605 for (j
= 0, psym
= isyms
;
3609 psym
->st_name
= BYTE_GET (esyms
[j
].st_name
);
3610 psym
->st_info
= BYTE_GET (esyms
[j
].st_info
);
3611 psym
->st_other
= BYTE_GET (esyms
[j
].st_other
);
3612 psym
->st_shndx
= BYTE_GET (esyms
[j
].st_shndx
);
3613 if (psym
->st_shndx
== SHN_XINDEX
&& shndx
!= NULL
)
3615 = byte_get ((unsigned char *) &shndx
[j
], sizeof (shndx
[j
]));
3616 psym
->st_value
= BYTE_GET8 (esyms
[j
].st_value
);
3617 psym
->st_size
= BYTE_GET8 (esyms
[j
].st_size
);
3628 get_elf_section_flags (sh_flags
)
3631 static char buff
[32];
3639 flag
= sh_flags
& - sh_flags
;
3644 case SHF_WRITE
: strcat (buff
, "W"); break;
3645 case SHF_ALLOC
: strcat (buff
, "A"); break;
3646 case SHF_EXECINSTR
: strcat (buff
, "X"); break;
3647 case SHF_MERGE
: strcat (buff
, "M"); break;
3648 case SHF_STRINGS
: strcat (buff
, "S"); break;
3649 case SHF_INFO_LINK
: strcat (buff
, "I"); break;
3650 case SHF_LINK_ORDER
: strcat (buff
, "L"); break;
3651 case SHF_OS_NONCONFORMING
: strcat (buff
, "O"); break;
3652 case SHF_GROUP
: strcat (buff
, "G"); break;
3653 case SHF_TLS
: strcat (buff
, "T"); break;
3656 if (flag
& SHF_MASKOS
)
3659 sh_flags
&= ~ SHF_MASKOS
;
3661 else if (flag
& SHF_MASKPROC
)
3664 sh_flags
&= ~ SHF_MASKPROC
;
3676 process_section_headers (file
)
3679 Elf_Internal_Shdr
*section
;
3682 section_headers
= NULL
;
3684 if (elf_header
.e_shnum
== 0)
3687 printf (_("\nThere are no sections in this file.\n"));
3692 if (do_sections
&& !do_header
)
3693 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3694 elf_header
.e_shnum
, (unsigned long) elf_header
.e_shoff
);
3698 if (! get_32bit_section_headers (file
, elf_header
.e_shnum
))
3701 else if (! get_64bit_section_headers (file
, elf_header
.e_shnum
))
3704 /* Read in the string table, so that we have names to display. */
3705 section
= SECTION_HEADER (elf_header
.e_shstrndx
);
3707 if (section
->sh_size
!= 0)
3709 string_table
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3710 section
->sh_size
, _("string table"));
3712 string_table_length
= section
->sh_size
;
3715 /* Scan the sections for the dynamic symbol table
3716 and dynamic string table and debug sections. */
3717 dynamic_symbols
= NULL
;
3718 dynamic_strings
= NULL
;
3719 dynamic_syminfo
= NULL
;
3720 symtab_shndx_hdr
= NULL
;
3722 for (i
= 0, section
= section_headers
;
3723 i
< elf_header
.e_shnum
;
3726 char *name
= SECTION_NAME (section
);
3728 if (section
->sh_type
== SHT_DYNSYM
)
3730 if (dynamic_symbols
!= NULL
)
3732 error (_("File contains multiple dynamic symbol tables\n"));
3736 num_dynamic_syms
= section
->sh_size
/ section
->sh_entsize
;
3737 dynamic_symbols
= GET_ELF_SYMBOLS (file
, section
);
3739 else if (section
->sh_type
== SHT_STRTAB
3740 && strcmp (name
, ".dynstr") == 0)
3742 if (dynamic_strings
!= NULL
)
3744 error (_("File contains multiple dynamic string tables\n"));
3748 dynamic_strings
= (char *) get_data (NULL
, file
, section
->sh_offset
,
3750 _("dynamic strings"));
3752 else if (section
->sh_type
== SHT_SYMTAB_SHNDX
)
3754 if (symtab_shndx_hdr
!= NULL
)
3756 error (_("File contains multiple symtab shndx tables\n"));
3759 symtab_shndx_hdr
= section
;
3761 else if ((do_debugging
|| do_debug_info
|| do_debug_abbrevs
3762 || do_debug_lines
|| do_debug_pubnames
|| do_debug_aranges
3763 || do_debug_frames
|| do_debug_macinfo
|| do_debug_str
3765 && strncmp (name
, ".debug_", 7) == 0)
3770 || (do_debug_info
&& (strcmp (name
, "info") == 0))
3771 || (do_debug_abbrevs
&& (strcmp (name
, "abbrev") == 0))
3772 || (do_debug_lines
&& (strcmp (name
, "line") == 0))
3773 || (do_debug_pubnames
&& (strcmp (name
, "pubnames") == 0))
3774 || (do_debug_aranges
&& (strcmp (name
, "aranges") == 0))
3775 || (do_debug_frames
&& (strcmp (name
, "frame") == 0))
3776 || (do_debug_macinfo
&& (strcmp (name
, "macinfo") == 0))
3777 || (do_debug_str
&& (strcmp (name
, "str") == 0))
3778 || (do_debug_loc
&& (strcmp (name
, "loc") == 0))
3780 request_dump (i
, DEBUG_DUMP
);
3782 /* linkonce section to be combined with .debug_info at link time. */
3783 else if ((do_debugging
|| do_debug_info
)
3784 && strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
3785 request_dump (i
, DEBUG_DUMP
);
3786 else if (do_debug_frames
&& strcmp (name
, ".eh_frame") == 0)
3787 request_dump (i
, DEBUG_DUMP
);
3793 if (elf_header
.e_shnum
> 1)
3794 printf (_("\nSection Headers:\n"));
3796 printf (_("\nSection Header:\n"));
3800 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3803 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3806 printf (_(" [Nr] Name Type Address Offset\n"));
3807 printf (_(" Size EntSize Flags Link Info Align\n"));
3810 for (i
= 0, section
= section_headers
;
3811 i
< elf_header
.e_shnum
;
3814 printf (" [%2u] %-17.17s %-15.15s ",
3815 SECTION_HEADER_NUM (i
),
3816 SECTION_NAME (section
),
3817 get_section_type_name (section
->sh_type
));
3821 print_vma (section
->sh_addr
, LONG_HEX
);
3823 printf ( " %6.6lx %6.6lx %2.2lx",
3824 (unsigned long) section
->sh_offset
,
3825 (unsigned long) section
->sh_size
,
3826 (unsigned long) section
->sh_entsize
);
3828 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3830 printf ("%2ld %3lx %2ld\n",
3831 (unsigned long) section
->sh_link
,
3832 (unsigned long) section
->sh_info
,
3833 (unsigned long) section
->sh_addralign
);
3837 print_vma (section
->sh_addr
, LONG_HEX
);
3839 if ((long) section
->sh_offset
== section
->sh_offset
)
3840 printf (" %6.6lx", (unsigned long) section
->sh_offset
);
3844 print_vma (section
->sh_offset
, LONG_HEX
);
3847 if ((unsigned long) section
->sh_size
== section
->sh_size
)
3848 printf (" %6.6lx", (unsigned long) section
->sh_size
);
3852 print_vma (section
->sh_size
, LONG_HEX
);
3855 if ((unsigned long) section
->sh_entsize
== section
->sh_entsize
)
3856 printf (" %2.2lx", (unsigned long) section
->sh_entsize
);
3860 print_vma (section
->sh_entsize
, LONG_HEX
);
3863 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3865 printf ("%2ld %3lx ",
3866 (unsigned long) section
->sh_link
,
3867 (unsigned long) section
->sh_info
);
3869 if ((unsigned long) section
->sh_addralign
== section
->sh_addralign
)
3870 printf ("%2ld\n", (unsigned long) section
->sh_addralign
);
3873 print_vma (section
->sh_addralign
, DEC
);
3880 print_vma (section
->sh_addr
, LONG_HEX
);
3881 if ((long) section
->sh_offset
== section
->sh_offset
)
3882 printf (" %8.8lx", (unsigned long) section
->sh_offset
);
3886 print_vma (section
->sh_offset
, LONG_HEX
);
3889 print_vma (section
->sh_size
, LONG_HEX
);
3891 print_vma (section
->sh_entsize
, LONG_HEX
);
3893 printf (" %3s ", get_elf_section_flags (section
->sh_flags
));
3895 printf (" %2ld %3lx %ld\n",
3896 (unsigned long) section
->sh_link
,
3897 (unsigned long) section
->sh_info
,
3898 (unsigned long) section
->sh_addralign
);
3902 printf (_("Key to Flags:\n\
3903 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3904 I (info), L (link order), G (group), x (unknown)\n\
3905 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3916 } dynamic_relocations
[] =
3918 { "REL", DT_REL
, DT_RELSZ
, FALSE
},
3919 { "RELA", DT_RELA
, DT_RELASZ
, TRUE
},
3920 { "PLT", DT_JMPREL
, DT_PLTRELSZ
, UNKNOWN
}
3923 /* Process the reloc section. */
3925 process_relocs (file
)
3928 unsigned long rel_size
;
3929 unsigned long rel_offset
;
3935 if (do_using_dynamic
)
3939 int has_dynamic_reloc
;
3942 has_dynamic_reloc
= 0;
3944 for (i
= 0; i
< ARRAY_SIZE (dynamic_relocations
); i
++)
3946 is_rela
= dynamic_relocations
[i
].rela
;
3947 name
= dynamic_relocations
[i
].name
;
3948 rel_size
= dynamic_info
[dynamic_relocations
[i
].size
];
3949 rel_offset
= dynamic_info
[dynamic_relocations
[i
].reloc
];
3951 has_dynamic_reloc
|= rel_size
;
3953 if (is_rela
== UNKNOWN
)
3955 if (dynamic_relocations
[i
].reloc
== DT_JMPREL
)
3956 switch (dynamic_info
[DT_PLTREL
])
3970 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
3971 name
, rel_offset
, rel_size
);
3973 dump_relocations (file
, rel_offset
- loadaddr
, rel_size
,
3974 dynamic_symbols
, num_dynamic_syms
,
3975 dynamic_strings
, is_rela
);
3979 if (! has_dynamic_reloc
)
3980 printf (_("\nThere are no dynamic relocations in this file.\n"));
3984 Elf_Internal_Shdr
*section
;
3988 for (i
= 0, section
= section_headers
;
3989 i
< elf_header
.e_shnum
;
3992 if ( section
->sh_type
!= SHT_RELA
3993 && section
->sh_type
!= SHT_REL
)
3996 rel_offset
= section
->sh_offset
;
3997 rel_size
= section
->sh_size
;
4001 Elf_Internal_Shdr
*strsec
;
4002 Elf_Internal_Sym
*symtab
;
4005 unsigned long nsyms
;
4007 printf (_("\nRelocation section "));
4009 if (string_table
== NULL
)
4010 printf ("%d", section
->sh_name
);
4012 printf (_("'%s'"), SECTION_NAME (section
));
4014 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4015 rel_offset
, (unsigned long) (rel_size
/ section
->sh_entsize
));
4020 if (section
->sh_link
)
4022 Elf_Internal_Shdr
*symsec
;
4024 symsec
= SECTION_HEADER (section
->sh_link
);
4025 nsyms
= symsec
->sh_size
/ symsec
->sh_entsize
;
4026 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
4031 strsec
= SECTION_HEADER (symsec
->sh_link
);
4033 strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4037 is_rela
= section
->sh_type
== SHT_RELA
;
4039 dump_relocations (file
, rel_offset
, rel_size
,
4040 symtab
, nsyms
, strtab
, is_rela
);
4052 printf (_("\nThere are no relocations in this file.\n"));
4058 #include "unwind-ia64.h"
4060 /* An absolute address consists of a section and an offset. If the
4061 section is NULL, the offset itself is the address, otherwise, the
4062 address equals to LOAD_ADDRESS(section) + offset. */
4066 unsigned short section
;
4072 struct unw_table_entry
4074 struct absaddr start
;
4076 struct absaddr info
;
4078 *table
; /* Unwind table. */
4079 unsigned long table_len
; /* Length of unwind table. */
4080 unsigned char *info
; /* Unwind info. */
4081 unsigned long info_size
; /* Size of unwind info. */
4082 bfd_vma info_addr
; /* starting address of unwind info. */
4083 bfd_vma seg_base
; /* Starting address of segment. */
4084 Elf_Internal_Sym
*symtab
; /* The symbol table. */
4085 unsigned long nsyms
; /* Number of symbols. */
4086 char *strtab
; /* The string table. */
4087 unsigned long strtab_size
; /* Size of string table. */
4090 static void find_symbol_for_address
4091 PARAMS ((struct unw_aux_info
*, struct absaddr
, const char **, bfd_vma
*));
4092 static void dump_ia64_unwind
4093 PARAMS ((struct unw_aux_info
*));
4094 static int slurp_ia64_unwind_table
4095 PARAMS ((FILE *, struct unw_aux_info
*, Elf_Internal_Shdr
*));
4098 find_symbol_for_address (aux
, addr
, symname
, offset
)
4099 struct unw_aux_info
*aux
;
4100 struct absaddr addr
;
4101 const char **symname
;
4104 bfd_vma dist
= (bfd_vma
) 0x100000;
4105 Elf_Internal_Sym
*sym
, *best
= NULL
;
4108 for (i
= 0, sym
= aux
->symtab
; i
< aux
->nsyms
; ++i
, ++sym
)
4110 if (ELF_ST_TYPE (sym
->st_info
) == STT_FUNC
4111 && sym
->st_name
!= 0
4112 && (addr
.section
== SHN_UNDEF
|| addr
.section
== sym
->st_shndx
)
4113 && addr
.offset
>= sym
->st_value
4114 && addr
.offset
- sym
->st_value
< dist
)
4117 dist
= addr
.offset
- sym
->st_value
;
4124 *symname
= (best
->st_name
>= aux
->strtab_size
4125 ? "<corrupt>" : aux
->strtab
+ best
->st_name
);
4130 *offset
= addr
.offset
;
4134 dump_ia64_unwind (aux
)
4135 struct unw_aux_info
*aux
;
4138 struct unw_table_entry
*tp
;
4141 addr_size
= is_32bit_elf
? 4 : 8;
4143 for (tp
= aux
->table
; tp
< aux
->table
+ aux
->table_len
; ++tp
)
4147 const unsigned char *dp
;
4148 const unsigned char *head
;
4149 const char *procname
;
4151 find_symbol_for_address (aux
, tp
->start
, &procname
, &offset
);
4153 fputs ("\n<", stdout
);
4157 fputs (procname
, stdout
);
4160 printf ("+%lx", (unsigned long) offset
);
4163 fputs (">: [", stdout
);
4164 print_vma (tp
->start
.offset
, PREFIX_HEX
);
4165 fputc ('-', stdout
);
4166 print_vma (tp
->end
.offset
, PREFIX_HEX
);
4167 printf ("], info at +0x%lx\n",
4168 (unsigned long) (tp
->info
.offset
- aux
->seg_base
));
4170 head
= aux
->info
+ (tp
->info
.offset
- aux
->info_addr
);
4171 stamp
= BYTE_GET8 ((unsigned char *) head
);
4173 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4174 (unsigned) UNW_VER (stamp
),
4175 (unsigned long) ((stamp
& UNW_FLAG_MASK
) >> 32),
4176 UNW_FLAG_EHANDLER (stamp
) ? " ehandler" : "",
4177 UNW_FLAG_UHANDLER (stamp
) ? " uhandler" : "",
4178 (unsigned long) (addr_size
* UNW_LENGTH (stamp
)));
4180 if (UNW_VER (stamp
) != 1)
4182 printf ("\tUnknown version.\n");
4187 for (dp
= head
+ 8; dp
< head
+ 8 + addr_size
* UNW_LENGTH (stamp
);)
4188 dp
= unw_decode (dp
, in_body
, & in_body
);
4193 slurp_ia64_unwind_table (file
, aux
, sec
)
4195 struct unw_aux_info
*aux
;
4196 Elf_Internal_Shdr
*sec
;
4198 unsigned long size
, addr_size
, nrelas
, i
;
4199 Elf_Internal_Phdr
*prog_hdrs
, *seg
;
4200 struct unw_table_entry
*tep
;
4201 Elf_Internal_Shdr
*relsec
;
4202 Elf_Internal_Rela
*rela
, *rp
;
4203 unsigned char *table
, *tp
;
4204 Elf_Internal_Sym
*sym
;
4205 const char *relname
;
4208 addr_size
= is_32bit_elf
? 4 : 8;
4210 /* First, find the starting address of the segment that includes
4213 if (elf_header
.e_phnum
)
4215 prog_hdrs
= (Elf_Internal_Phdr
*)
4216 xmalloc (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
4219 result
= get_32bit_program_headers (file
, prog_hdrs
);
4221 result
= get_64bit_program_headers (file
, prog_hdrs
);
4229 for (seg
= prog_hdrs
; seg
< prog_hdrs
+ elf_header
.e_phnum
; ++seg
)
4231 if (seg
->p_type
!= PT_LOAD
)
4234 if (sec
->sh_addr
>= seg
->p_vaddr
4235 && (sec
->sh_addr
+ sec
->sh_size
<= seg
->p_vaddr
+ seg
->p_memsz
))
4237 aux
->seg_base
= seg
->p_vaddr
;
4245 /* Second, build the unwind table from the contents of the unwind section: */
4246 size
= sec
->sh_size
;
4247 table
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4248 size
, _("unwind table"));
4252 tep
= aux
->table
= xmalloc (size
/ (3 * addr_size
) * sizeof (aux
->table
[0]));
4253 for (tp
= table
; tp
< table
+ size
; tp
+= 3 * addr_size
, ++tep
)
4255 tep
->start
.section
= SHN_UNDEF
;
4256 tep
->end
.section
= SHN_UNDEF
;
4257 tep
->info
.section
= SHN_UNDEF
;
4260 tep
->start
.offset
= byte_get ((unsigned char *) tp
+ 0, 4);
4261 tep
->end
.offset
= byte_get ((unsigned char *) tp
+ 4, 4);
4262 tep
->info
.offset
= byte_get ((unsigned char *) tp
+ 8, 4);
4266 tep
->start
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 0);
4267 tep
->end
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 8);
4268 tep
->info
.offset
= BYTE_GET8 ((unsigned char *) tp
+ 16);
4270 tep
->start
.offset
+= aux
->seg_base
;
4271 tep
->end
.offset
+= aux
->seg_base
;
4272 tep
->info
.offset
+= aux
->seg_base
;
4276 /* Third, apply any relocations to the unwind table: */
4278 for (relsec
= section_headers
;
4279 relsec
< section_headers
+ elf_header
.e_shnum
;
4282 if (relsec
->sh_type
!= SHT_RELA
4283 || SECTION_HEADER (relsec
->sh_info
) != sec
)
4286 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
4290 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
4294 relname
= elf_ia64_reloc_type (ELF32_R_TYPE (rp
->r_info
));
4295 sym
= aux
->symtab
+ ELF32_R_SYM (rp
->r_info
);
4297 if (ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4299 warn (_("Skipping unexpected symbol type %u\n"),
4300 ELF32_ST_TYPE (sym
->st_info
));
4306 relname
= elf_ia64_reloc_type (ELF64_R_TYPE (rp
->r_info
));
4307 sym
= aux
->symtab
+ ELF64_R_SYM (rp
->r_info
);
4309 if (ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
4311 warn (_("Skipping unexpected symbol type %u\n"),
4312 ELF64_ST_TYPE (sym
->st_info
));
4317 if (strncmp (relname
, "R_IA64_SEGREL", 13) != 0)
4319 warn (_("Skipping unexpected relocation type %s\n"), relname
);
4323 i
= rp
->r_offset
/ (3 * addr_size
);
4325 switch (rp
->r_offset
/addr_size
% 3)
4328 aux
->table
[i
].start
.section
= sym
->st_shndx
;
4329 aux
->table
[i
].start
.offset
+= rp
->r_addend
;
4332 aux
->table
[i
].end
.section
= sym
->st_shndx
;
4333 aux
->table
[i
].end
.offset
+= rp
->r_addend
;
4336 aux
->table
[i
].info
.section
= sym
->st_shndx
;
4337 aux
->table
[i
].info
.offset
+= rp
->r_addend
;
4347 aux
->table_len
= size
/ (3 * addr_size
);
4352 process_unwind (file
)
4355 Elf_Internal_Shdr
*sec
, *unwsec
= NULL
, *strsec
;
4356 unsigned long i
, addr_size
, unwcount
= 0, unwstart
= 0;
4357 struct unw_aux_info aux
;
4362 if (elf_header
.e_machine
!= EM_IA_64
)
4364 printf (_("\nThere are no unwind sections in this file.\n"));
4368 memset (& aux
, 0, sizeof (aux
));
4370 addr_size
= is_32bit_elf
? 4 : 8;
4372 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
; ++i
, ++sec
)
4374 if (sec
->sh_type
== SHT_SYMTAB
)
4376 aux
.nsyms
= sec
->sh_size
/ sec
->sh_entsize
;
4377 aux
.symtab
= GET_ELF_SYMBOLS (file
, sec
);
4379 strsec
= SECTION_HEADER (sec
->sh_link
);
4380 aux
.strtab_size
= strsec
->sh_size
;
4381 aux
.strtab
= (char *) get_data (NULL
, file
, strsec
->sh_offset
,
4382 aux
.strtab_size
, _("string table"));
4384 else if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4389 printf (_("\nThere are no unwind sections in this file.\n"));
4391 while (unwcount
-- > 0)
4396 for (i
= unwstart
, sec
= section_headers
+ unwstart
;
4397 i
< elf_header
.e_shnum
; ++i
, ++sec
)
4398 if (sec
->sh_type
== SHT_IA_64_UNWIND
)
4405 len
= sizeof (ELF_STRING_ia64_unwind_once
) - 1;
4407 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind_once
,
4410 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4411 len2
= sizeof (ELF_STRING_ia64_unwind_info_once
) - 1;
4412 suffix
= SECTION_NAME (unwsec
) + len
;
4413 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4415 if (strncmp (SECTION_NAME (sec
),
4416 ELF_STRING_ia64_unwind_info_once
, len2
) == 0
4417 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4422 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4423 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4424 len
= sizeof (ELF_STRING_ia64_unwind
) - 1;
4425 len2
= sizeof (ELF_STRING_ia64_unwind_info
) - 1;
4427 if (strncmp (SECTION_NAME (unwsec
), ELF_STRING_ia64_unwind
,
4429 suffix
= SECTION_NAME (unwsec
) + len
;
4430 for (i
= 0, sec
= section_headers
; i
< elf_header
.e_shnum
;
4432 if (strncmp (SECTION_NAME (sec
),
4433 ELF_STRING_ia64_unwind_info
, len2
) == 0
4434 && strcmp (SECTION_NAME (sec
) + len2
, suffix
) == 0)
4438 if (i
== elf_header
.e_shnum
)
4440 printf (_("\nCould not find unwind info section for "));
4442 if (string_table
== NULL
)
4443 printf ("%d", unwsec
->sh_name
);
4445 printf (_("'%s'"), SECTION_NAME (unwsec
));
4449 aux
.info_size
= sec
->sh_size
;
4450 aux
.info_addr
= sec
->sh_addr
;
4451 aux
.info
= (char *) get_data (NULL
, file
, sec
->sh_offset
,
4452 aux
.info_size
, _("unwind info"));
4454 printf (_("\nUnwind section "));
4456 if (string_table
== NULL
)
4457 printf ("%d", unwsec
->sh_name
);
4459 printf (_("'%s'"), SECTION_NAME (unwsec
));
4461 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4462 (unsigned long) unwsec
->sh_offset
,
4463 (unsigned long) (unwsec
->sh_size
/ (3 * addr_size
)));
4465 (void) slurp_ia64_unwind_table (file
, & aux
, unwsec
);
4467 if (aux
.table_len
> 0)
4468 dump_ia64_unwind (& aux
);
4471 free ((char *) aux
.table
);
4473 free ((char *) aux
.info
);
4482 free ((char *) aux
.strtab
);
4488 dynamic_segment_mips_val (entry
)
4489 Elf_Internal_Dyn
*entry
;
4491 switch (entry
->d_tag
)
4494 if (entry
->d_un
.d_val
== 0)
4498 static const char * opts
[] =
4500 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4501 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4502 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4503 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4508 for (cnt
= 0; cnt
< NUM_ELEM (opts
); ++cnt
)
4509 if (entry
->d_un
.d_val
& (1 << cnt
))
4511 printf ("%s%s", first
? "" : " ", opts
[cnt
]);
4518 case DT_MIPS_IVERSION
:
4519 if (dynamic_strings
!= NULL
)
4520 printf ("Interface Version: %s\n",
4521 dynamic_strings
+ entry
->d_un
.d_val
);
4523 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4526 case DT_MIPS_TIME_STAMP
:
4531 time_t time
= entry
->d_un
.d_val
;
4532 tmp
= gmtime (&time
);
4533 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
4534 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
4535 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
4536 printf ("Time Stamp: %s\n", timebuf
);
4540 case DT_MIPS_RLD_VERSION
:
4541 case DT_MIPS_LOCAL_GOTNO
:
4542 case DT_MIPS_CONFLICTNO
:
4543 case DT_MIPS_LIBLISTNO
:
4544 case DT_MIPS_SYMTABNO
:
4545 case DT_MIPS_UNREFEXTNO
:
4546 case DT_MIPS_HIPAGENO
:
4547 case DT_MIPS_DELTA_CLASS_NO
:
4548 case DT_MIPS_DELTA_INSTANCE_NO
:
4549 case DT_MIPS_DELTA_RELOC_NO
:
4550 case DT_MIPS_DELTA_SYM_NO
:
4551 case DT_MIPS_DELTA_CLASSSYM_NO
:
4552 case DT_MIPS_COMPACT_SIZE
:
4553 printf ("%ld\n", (long) entry
->d_un
.d_ptr
);
4557 printf ("%#lx\n", (long) entry
->d_un
.d_ptr
);
4563 dynamic_segment_parisc_val (entry
)
4564 Elf_Internal_Dyn
*entry
;
4566 switch (entry
->d_tag
)
4568 case DT_HP_DLD_FLAGS
:
4577 { DT_HP_DEBUG_PRIVATE
, "HP_DEBUG_PRIVATE" },
4578 { DT_HP_DEBUG_CALLBACK
, "HP_DEBUG_CALLBACK" },
4579 { DT_HP_DEBUG_CALLBACK_BOR
, "HP_DEBUG_CALLBACK_BOR" },
4580 { DT_HP_NO_ENVVAR
, "HP_NO_ENVVAR" },
4581 { DT_HP_BIND_NOW
, "HP_BIND_NOW" },
4582 { DT_HP_BIND_NONFATAL
, "HP_BIND_NONFATAL" },
4583 { DT_HP_BIND_VERBOSE
, "HP_BIND_VERBOSE" },
4584 { DT_HP_BIND_RESTRICTED
, "HP_BIND_RESTRICTED" },
4585 { DT_HP_BIND_SYMBOLIC
, "HP_BIND_SYMBOLIC" },
4586 { DT_HP_RPATH_FIRST
, "HP_RPATH_FIRST" },
4587 { DT_HP_BIND_DEPTH_FIRST
, "HP_BIND_DEPTH_FIRST" }
4591 bfd_vma val
= entry
->d_un
.d_val
;
4593 for (cnt
= 0; cnt
< sizeof (flags
) / sizeof (flags
[0]); ++cnt
)
4594 if (val
& flags
[cnt
].bit
)
4598 fputs (flags
[cnt
].str
, stdout
);
4600 val
^= flags
[cnt
].bit
;
4603 if (val
!= 0 || first
)
4607 print_vma (val
, HEX
);
4613 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4620 dynamic_segment_ia64_val (entry
)
4621 Elf_Internal_Dyn
*entry
;
4623 switch (entry
->d_tag
)
4625 case DT_IA_64_PLT_RESERVE
:
4626 /* First 3 bytes reserved. */
4627 print_vma (entry
->d_un
.d_ptr
, PREFIX_HEX
);
4629 print_vma (entry
->d_un
.d_ptr
+ (3 * 8), PREFIX_HEX
);
4635 get_32bit_dynamic_segment (file
)
4638 Elf32_External_Dyn
*edyn
;
4639 Elf_Internal_Dyn
*entry
;
4642 edyn
= (Elf32_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4643 dynamic_size
, _("dynamic segment"));
4647 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4648 how large this .dynamic is now. We can do this even before the byte
4649 swapping since the DT_NULL tag is recognizable. */
4651 while (*(Elf32_Word
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4654 dynamic_segment
= (Elf_Internal_Dyn
*)
4655 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4657 if (dynamic_segment
== NULL
)
4659 error (_("Out of memory\n"));
4664 for (i
= 0, entry
= dynamic_segment
;
4668 entry
->d_tag
= BYTE_GET (edyn
[i
].d_tag
);
4669 entry
->d_un
.d_val
= BYTE_GET (edyn
[i
].d_un
.d_val
);
4678 get_64bit_dynamic_segment (file
)
4681 Elf64_External_Dyn
*edyn
;
4682 Elf_Internal_Dyn
*entry
;
4685 edyn
= (Elf64_External_Dyn
*) get_data (NULL
, file
, dynamic_addr
,
4686 dynamic_size
, _("dynamic segment"));
4690 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4691 how large this .dynamic is now. We can do this even before the byte
4692 swapping since the DT_NULL tag is recognizable. */
4694 while (*(bfd_vma
*) edyn
[dynamic_size
++].d_tag
!= DT_NULL
)
4697 dynamic_segment
= (Elf_Internal_Dyn
*)
4698 malloc (dynamic_size
* sizeof (Elf_Internal_Dyn
));
4700 if (dynamic_segment
== NULL
)
4702 error (_("Out of memory\n"));
4707 for (i
= 0, entry
= dynamic_segment
;
4711 entry
->d_tag
= BYTE_GET8 (edyn
[i
].d_tag
);
4712 entry
->d_un
.d_val
= BYTE_GET8 (edyn
[i
].d_un
.d_val
);
4721 get_dynamic_flags (flags
)
4724 static char buff
[128];
4732 flag
= flags
& - flags
;
4740 case DF_ORIGIN
: strcpy (p
, "ORIGIN"); break;
4741 case DF_SYMBOLIC
: strcpy (p
, "SYMBOLIC"); break;
4742 case DF_TEXTREL
: strcpy (p
, "TEXTREL"); break;
4743 case DF_BIND_NOW
: strcpy (p
, "BIND_NOW"); break;
4744 case DF_STATIC_TLS
: strcpy (p
, "STATIC_TLS"); break;
4745 default: strcpy (p
, "unknown"); break;
4748 p
= strchr (p
, '\0');
4753 /* Parse and display the contents of the dynamic segment. */
4755 process_dynamic_segment (file
)
4758 Elf_Internal_Dyn
*entry
;
4761 if (dynamic_size
== 0)
4764 printf (_("\nThere is no dynamic segment in this file.\n"));
4771 if (! get_32bit_dynamic_segment (file
))
4774 else if (! get_64bit_dynamic_segment (file
))
4777 /* Find the appropriate symbol table. */
4778 if (dynamic_symbols
== NULL
)
4780 for (i
= 0, entry
= dynamic_segment
;
4784 Elf_Internal_Shdr section
;
4786 if (entry
->d_tag
!= DT_SYMTAB
)
4789 dynamic_info
[DT_SYMTAB
] = entry
->d_un
.d_val
;
4791 /* Since we do not know how big the symbol table is,
4792 we default to reading in the entire file (!) and
4793 processing that. This is overkill, I know, but it
4795 section
.sh_offset
= entry
->d_un
.d_val
- loadaddr
;
4797 if (fseek (file
, 0, SEEK_END
))
4798 error (_("Unable to seek to end of file!"));
4800 section
.sh_size
= ftell (file
) - section
.sh_offset
;
4802 section
.sh_entsize
= sizeof (Elf32_External_Sym
);
4804 section
.sh_entsize
= sizeof (Elf64_External_Sym
);
4806 num_dynamic_syms
= section
.sh_size
/ section
.sh_entsize
;
4807 if (num_dynamic_syms
< 1)
4809 error (_("Unable to determine the number of symbols to load\n"));
4813 dynamic_symbols
= GET_ELF_SYMBOLS (file
, §ion
);
4817 /* Similarly find a string table. */
4818 if (dynamic_strings
== NULL
)
4820 for (i
= 0, entry
= dynamic_segment
;
4824 unsigned long offset
;
4827 if (entry
->d_tag
!= DT_STRTAB
)
4830 dynamic_info
[DT_STRTAB
] = entry
->d_un
.d_val
;
4832 /* Since we do not know how big the string table is,
4833 we default to reading in the entire file (!) and
4834 processing that. This is overkill, I know, but it
4837 offset
= entry
->d_un
.d_val
- loadaddr
;
4838 if (fseek (file
, 0, SEEK_END
))
4839 error (_("Unable to seek to end of file\n"));
4840 str_tab_len
= ftell (file
) - offset
;
4842 if (str_tab_len
< 1)
4845 (_("Unable to determine the length of the dynamic string table\n"));
4849 dynamic_strings
= (char *) get_data (NULL
, file
, offset
, str_tab_len
,
4850 _("dynamic string table"));
4855 /* And find the syminfo section if available. */
4856 if (dynamic_syminfo
== NULL
)
4858 unsigned long syminsz
= 0;
4860 for (i
= 0, entry
= dynamic_segment
;
4864 if (entry
->d_tag
== DT_SYMINENT
)
4866 /* Note: these braces are necessary to avoid a syntax
4867 error from the SunOS4 C compiler. */
4868 assert (sizeof (Elf_External_Syminfo
) == entry
->d_un
.d_val
);
4870 else if (entry
->d_tag
== DT_SYMINSZ
)
4871 syminsz
= entry
->d_un
.d_val
;
4872 else if (entry
->d_tag
== DT_SYMINFO
)
4873 dynamic_syminfo_offset
= entry
->d_un
.d_val
- loadaddr
;
4876 if (dynamic_syminfo_offset
!= 0 && syminsz
!= 0)
4878 Elf_External_Syminfo
*extsyminfo
;
4879 Elf_Internal_Syminfo
*syminfo
;
4881 /* There is a syminfo section. Read the data. */
4882 extsyminfo
= ((Elf_External_Syminfo
*)
4883 get_data (NULL
, file
, dynamic_syminfo_offset
,
4884 syminsz
, _("symbol information")));
4888 dynamic_syminfo
= (Elf_Internal_Syminfo
*) malloc (syminsz
);
4889 if (dynamic_syminfo
== NULL
)
4891 error (_("Out of memory\n"));
4895 dynamic_syminfo_nent
= syminsz
/ sizeof (Elf_External_Syminfo
);
4896 for (i
= 0, syminfo
= dynamic_syminfo
; i
< dynamic_syminfo_nent
;
4899 syminfo
->si_boundto
= BYTE_GET (extsyminfo
[i
].si_boundto
);
4900 syminfo
->si_flags
= BYTE_GET (extsyminfo
[i
].si_flags
);
4907 if (do_dynamic
&& dynamic_addr
)
4908 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4909 dynamic_addr
, (long) dynamic_size
);
4911 printf (_(" Tag Type Name/Value\n"));
4913 for (i
= 0, entry
= dynamic_segment
;
4922 print_vma (entry
->d_tag
, FULL_HEX
);
4923 dtype
= get_dynamic_type (entry
->d_tag
);
4924 printf (" (%s)%*s", dtype
,
4925 ((is_32bit_elf
? 27 : 19)
4926 - (int) strlen (dtype
)),
4930 switch (entry
->d_tag
)
4934 puts (get_dynamic_flags (entry
->d_un
.d_val
));
4944 switch (entry
->d_tag
)
4947 printf (_("Auxiliary library"));
4951 printf (_("Filter library"));
4955 printf (_("Configuration file"));
4959 printf (_("Dependency audit library"));
4963 printf (_("Audit library"));
4967 if (dynamic_strings
)
4968 printf (": [%s]\n", dynamic_strings
+ entry
->d_un
.d_val
);
4972 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
4981 printf (_("Flags:"));
4983 if (entry
->d_un
.d_val
== 0)
4984 printf (_(" None\n"));
4987 unsigned long int val
= entry
->d_un
.d_val
;
4989 if (val
& DTF_1_PARINIT
)
4991 printf (" PARINIT");
4992 val
^= DTF_1_PARINIT
;
4994 if (val
& DTF_1_CONFEXP
)
4996 printf (" CONFEXP");
4997 val
^= DTF_1_CONFEXP
;
5000 printf (" %lx", val
);
5009 printf (_("Flags:"));
5011 if (entry
->d_un
.d_val
== 0)
5012 printf (_(" None\n"));
5015 unsigned long int val
= entry
->d_un
.d_val
;
5017 if (val
& DF_P1_LAZYLOAD
)
5019 printf (" LAZYLOAD");
5020 val
^= DF_P1_LAZYLOAD
;
5022 if (val
& DF_P1_GROUPPERM
)
5024 printf (" GROUPPERM");
5025 val
^= DF_P1_GROUPPERM
;
5028 printf (" %lx", val
);
5037 printf (_("Flags:"));
5038 if (entry
->d_un
.d_val
== 0)
5039 printf (_(" None\n"));
5042 unsigned long int val
= entry
->d_un
.d_val
;
5049 if (val
& DF_1_GLOBAL
)
5054 if (val
& DF_1_GROUP
)
5059 if (val
& DF_1_NODELETE
)
5061 printf (" NODELETE");
5062 val
^= DF_1_NODELETE
;
5064 if (val
& DF_1_LOADFLTR
)
5066 printf (" LOADFLTR");
5067 val
^= DF_1_LOADFLTR
;
5069 if (val
& DF_1_INITFIRST
)
5071 printf (" INITFIRST");
5072 val
^= DF_1_INITFIRST
;
5074 if (val
& DF_1_NOOPEN
)
5079 if (val
& DF_1_ORIGIN
)
5084 if (val
& DF_1_DIRECT
)
5089 if (val
& DF_1_TRANS
)
5094 if (val
& DF_1_INTERPOSE
)
5096 printf (" INTERPOSE");
5097 val
^= DF_1_INTERPOSE
;
5099 if (val
& DF_1_NODEFLIB
)
5101 printf (" NODEFLIB");
5102 val
^= DF_1_NODEFLIB
;
5104 if (val
& DF_1_NODUMP
)
5109 if (val
& DF_1_CONLFAT
)
5111 printf (" CONLFAT");
5112 val
^= DF_1_CONLFAT
;
5115 printf (" %lx", val
);
5122 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5124 puts (get_dynamic_type (entry
->d_un
.d_val
));
5144 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5150 if (dynamic_strings
== NULL
)
5153 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5157 switch (entry
->d_tag
)
5160 printf (_("Shared library: [%s]"), name
);
5162 if (strcmp (name
, program_interpreter
) == 0)
5163 printf (_(" program interpreter"));
5167 printf (_("Library soname: [%s]"), name
);
5171 printf (_("Library rpath: [%s]"), name
);
5175 printf (_("Library runpath: [%s]"), name
);
5179 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5184 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5197 dynamic_info
[entry
->d_tag
] = entry
->d_un
.d_val
;
5201 case DT_INIT_ARRAYSZ
:
5202 case DT_FINI_ARRAYSZ
:
5203 case DT_GNU_CONFLICTSZ
:
5204 case DT_GNU_LIBLISTSZ
:
5207 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5208 printf (" (bytes)\n");
5218 print_vma (entry
->d_un
.d_val
, UNSIGNED
);
5231 if (dynamic_strings
!= NULL
&& entry
->d_tag
== DT_USED
)
5235 name
= dynamic_strings
+ entry
->d_un
.d_val
;
5239 printf (_("Not needed object: [%s]\n"), name
);
5244 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5250 /* The value of this entry is ignored. */
5255 case DT_GNU_PRELINKED
:
5259 time_t time
= entry
->d_un
.d_val
;
5261 tmp
= gmtime (&time
);
5262 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5263 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
5264 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
5270 if ((entry
->d_tag
>= DT_VERSYM
) && (entry
->d_tag
<= DT_VERNEEDNUM
))
5271 version_info
[DT_VERSIONTAGIDX (entry
->d_tag
)] =
5276 switch (elf_header
.e_machine
)
5279 case EM_MIPS_RS3_LE
:
5280 dynamic_segment_mips_val (entry
);
5283 dynamic_segment_parisc_val (entry
);
5286 dynamic_segment_ia64_val (entry
);
5289 print_vma (entry
->d_un
.d_val
, PREFIX_HEX
);
5301 get_ver_flags (flags
)
5304 static char buff
[32];
5311 if (flags
& VER_FLG_BASE
)
5312 strcat (buff
, "BASE ");
5314 if (flags
& VER_FLG_WEAK
)
5316 if (flags
& VER_FLG_BASE
)
5317 strcat (buff
, "| ");
5319 strcat (buff
, "WEAK ");
5322 if (flags
& ~(VER_FLG_BASE
| VER_FLG_WEAK
))
5323 strcat (buff
, "| <unknown>");
5328 /* Display the contents of the version sections. */
5330 process_version_sections (file
)
5333 Elf_Internal_Shdr
*section
;
5340 for (i
= 0, section
= section_headers
;
5341 i
< elf_header
.e_shnum
;
5344 switch (section
->sh_type
)
5346 case SHT_GNU_verdef
:
5348 Elf_External_Verdef
*edefs
;
5355 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5356 SECTION_NAME (section
), section
->sh_info
);
5358 printf (_(" Addr: 0x"));
5359 printf_vma (section
->sh_addr
);
5360 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5361 (unsigned long) section
->sh_offset
, section
->sh_link
,
5362 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5364 edefs
= ((Elf_External_Verdef
*)
5365 get_data (NULL
, file
, section
->sh_offset
,
5367 _("version definition section")));
5371 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5374 Elf_External_Verdef
*edef
;
5375 Elf_Internal_Verdef ent
;
5376 Elf_External_Verdaux
*eaux
;
5377 Elf_Internal_Verdaux aux
;
5381 vstart
= ((char *) edefs
) + idx
;
5383 edef
= (Elf_External_Verdef
*) vstart
;
5385 ent
.vd_version
= BYTE_GET (edef
->vd_version
);
5386 ent
.vd_flags
= BYTE_GET (edef
->vd_flags
);
5387 ent
.vd_ndx
= BYTE_GET (edef
->vd_ndx
);
5388 ent
.vd_cnt
= BYTE_GET (edef
->vd_cnt
);
5389 ent
.vd_hash
= BYTE_GET (edef
->vd_hash
);
5390 ent
.vd_aux
= BYTE_GET (edef
->vd_aux
);
5391 ent
.vd_next
= BYTE_GET (edef
->vd_next
);
5393 printf (_(" %#06x: Rev: %d Flags: %s"),
5394 idx
, ent
.vd_version
, get_ver_flags (ent
.vd_flags
));
5396 printf (_(" Index: %d Cnt: %d "),
5397 ent
.vd_ndx
, ent
.vd_cnt
);
5399 vstart
+= ent
.vd_aux
;
5401 eaux
= (Elf_External_Verdaux
*) vstart
;
5403 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5404 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5406 if (dynamic_strings
)
5407 printf (_("Name: %s\n"), dynamic_strings
+ aux
.vda_name
);
5409 printf (_("Name index: %ld\n"), aux
.vda_name
);
5411 isum
= idx
+ ent
.vd_aux
;
5413 for (j
= 1; j
< ent
.vd_cnt
; j
++)
5415 isum
+= aux
.vda_next
;
5416 vstart
+= aux
.vda_next
;
5418 eaux
= (Elf_External_Verdaux
*) vstart
;
5420 aux
.vda_name
= BYTE_GET (eaux
->vda_name
);
5421 aux
.vda_next
= BYTE_GET (eaux
->vda_next
);
5423 if (dynamic_strings
)
5424 printf (_(" %#06x: Parent %d: %s\n"),
5425 isum
, j
, dynamic_strings
+ aux
.vda_name
);
5427 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5428 isum
, j
, aux
.vda_name
);
5438 case SHT_GNU_verneed
:
5440 Elf_External_Verneed
*eneed
;
5446 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5447 SECTION_NAME (section
), section
->sh_info
);
5449 printf (_(" Addr: 0x"));
5450 printf_vma (section
->sh_addr
);
5451 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5452 (unsigned long) section
->sh_offset
, section
->sh_link
,
5453 SECTION_NAME (SECTION_HEADER (section
->sh_link
)));
5455 eneed
= ((Elf_External_Verneed
*)
5456 get_data (NULL
, file
, section
->sh_offset
,
5457 section
->sh_size
, _("version need section")));
5461 for (idx
= cnt
= 0; cnt
< section
->sh_info
; ++cnt
)
5463 Elf_External_Verneed
*entry
;
5464 Elf_Internal_Verneed ent
;
5469 vstart
= ((char *) eneed
) + idx
;
5471 entry
= (Elf_External_Verneed
*) vstart
;
5473 ent
.vn_version
= BYTE_GET (entry
->vn_version
);
5474 ent
.vn_cnt
= BYTE_GET (entry
->vn_cnt
);
5475 ent
.vn_file
= BYTE_GET (entry
->vn_file
);
5476 ent
.vn_aux
= BYTE_GET (entry
->vn_aux
);
5477 ent
.vn_next
= BYTE_GET (entry
->vn_next
);
5479 printf (_(" %#06x: Version: %d"), idx
, ent
.vn_version
);
5481 if (dynamic_strings
)
5482 printf (_(" File: %s"), dynamic_strings
+ ent
.vn_file
);
5484 printf (_(" File: %lx"), ent
.vn_file
);
5486 printf (_(" Cnt: %d\n"), ent
.vn_cnt
);
5488 vstart
+= ent
.vn_aux
;
5490 for (j
= 0, isum
= idx
+ ent
.vn_aux
; j
< ent
.vn_cnt
; ++j
)
5492 Elf_External_Vernaux
*eaux
;
5493 Elf_Internal_Vernaux aux
;
5495 eaux
= (Elf_External_Vernaux
*) vstart
;
5497 aux
.vna_hash
= BYTE_GET (eaux
->vna_hash
);
5498 aux
.vna_flags
= BYTE_GET (eaux
->vna_flags
);
5499 aux
.vna_other
= BYTE_GET (eaux
->vna_other
);
5500 aux
.vna_name
= BYTE_GET (eaux
->vna_name
);
5501 aux
.vna_next
= BYTE_GET (eaux
->vna_next
);
5503 if (dynamic_strings
)
5504 printf (_(" %#06x: Name: %s"),
5505 isum
, dynamic_strings
+ aux
.vna_name
);
5507 printf (_(" %#06x: Name index: %lx"),
5508 isum
, aux
.vna_name
);
5510 printf (_(" Flags: %s Version: %d\n"),
5511 get_ver_flags (aux
.vna_flags
), aux
.vna_other
);
5513 isum
+= aux
.vna_next
;
5514 vstart
+= aux
.vna_next
;
5524 case SHT_GNU_versym
:
5526 Elf_Internal_Shdr
*link_section
;
5529 unsigned char *edata
;
5530 unsigned short *data
;
5532 Elf_Internal_Sym
*symbols
;
5533 Elf_Internal_Shdr
*string_sec
;
5535 link_section
= SECTION_HEADER (section
->sh_link
);
5536 total
= section
->sh_size
/ section
->sh_entsize
;
5540 symbols
= GET_ELF_SYMBOLS (file
, link_section
);
5542 string_sec
= SECTION_HEADER (link_section
->sh_link
);
5544 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
5545 string_sec
->sh_size
,
5546 _("version string table"));
5550 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5551 SECTION_NAME (section
), total
);
5553 printf (_(" Addr: "));
5554 printf_vma (section
->sh_addr
);
5555 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5556 (unsigned long) section
->sh_offset
, section
->sh_link
,
5557 SECTION_NAME (link_section
));
5561 get_data (NULL
, file
,
5562 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] - loadaddr
,
5563 total
* sizeof (short), _("version symbol data")));
5570 data
= (unsigned short *) malloc (total
* sizeof (short));
5572 for (cnt
= total
; cnt
--;)
5573 data
[cnt
] = byte_get (edata
+ cnt
* sizeof (short),
5578 for (cnt
= 0; cnt
< total
; cnt
+= 4)
5581 int check_def
, check_need
;
5584 printf (" %03x:", cnt
);
5586 for (j
= 0; (j
< 4) && (cnt
+ j
) < total
; ++j
)
5587 switch (data
[cnt
+ j
])
5590 fputs (_(" 0 (*local*) "), stdout
);
5594 fputs (_(" 1 (*global*) "), stdout
);
5598 nn
= printf ("%4x%c", data
[cnt
+ j
] & 0x7fff,
5599 data
[cnt
+ j
] & 0x8000 ? 'h' : ' ');
5603 if (SECTION_HEADER (symbols
[cnt
+ j
].st_shndx
)->sh_type
5606 if (symbols
[cnt
+ j
].st_shndx
== SHN_UNDEF
)
5613 && version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)])
5615 Elf_Internal_Verneed ivn
;
5616 unsigned long offset
;
5618 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
5623 Elf_Internal_Vernaux ivna
;
5624 Elf_External_Verneed evn
;
5625 Elf_External_Vernaux evna
;
5626 unsigned long a_off
;
5628 get_data (&evn
, file
, offset
, sizeof (evn
),
5631 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
5632 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
5634 a_off
= offset
+ ivn
.vn_aux
;
5638 get_data (&evna
, file
, a_off
, sizeof (evna
),
5639 _("version need aux (2)"));
5641 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
5642 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
5644 a_off
+= ivna
.vna_next
;
5646 while (ivna
.vna_other
!= data
[cnt
+ j
]
5647 && ivna
.vna_next
!= 0);
5649 if (ivna
.vna_other
== data
[cnt
+ j
])
5651 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
5653 name
= strtab
+ ivna
.vna_name
;
5654 nn
+= printf ("(%s%-*s",
5656 12 - (int) strlen (name
),
5662 offset
+= ivn
.vn_next
;
5664 while (ivn
.vn_next
);
5667 if (check_def
&& data
[cnt
+ j
] != 0x8001
5668 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
5670 Elf_Internal_Verdef ivd
;
5671 Elf_External_Verdef evd
;
5672 unsigned long offset
;
5674 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
5679 get_data (&evd
, file
, offset
, sizeof (evd
),
5682 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
5683 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
5685 offset
+= ivd
.vd_next
;
5687 while (ivd
.vd_ndx
!= (data
[cnt
+ j
] & 0x7fff)
5688 && ivd
.vd_next
!= 0);
5690 if (ivd
.vd_ndx
== (data
[cnt
+ j
] & 0x7fff))
5692 Elf_External_Verdaux evda
;
5693 Elf_Internal_Verdaux ivda
;
5695 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
5697 get_data (&evda
, file
,
5698 offset
- ivd
.vd_next
+ ivd
.vd_aux
,
5699 sizeof (evda
), _("version def aux"));
5701 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
5703 name
= strtab
+ ivda
.vda_name
;
5704 nn
+= printf ("(%s%-*s",
5706 12 - (int) strlen (name
),
5712 printf ("%*c", 18 - nn
, ' ');
5730 printf (_("\nNo version information found in this file.\n"));
5736 get_symbol_binding (binding
)
5737 unsigned int binding
;
5739 static char buff
[32];
5743 case STB_LOCAL
: return "LOCAL";
5744 case STB_GLOBAL
: return "GLOBAL";
5745 case STB_WEAK
: return "WEAK";
5747 if (binding
>= STB_LOPROC
&& binding
<= STB_HIPROC
)
5748 sprintf (buff
, _("<processor specific>: %d"), binding
);
5749 else if (binding
>= STB_LOOS
&& binding
<= STB_HIOS
)
5750 sprintf (buff
, _("<OS specific>: %d"), binding
);
5752 sprintf (buff
, _("<unknown>: %d"), binding
);
5758 get_symbol_type (type
)
5761 static char buff
[32];
5765 case STT_NOTYPE
: return "NOTYPE";
5766 case STT_OBJECT
: return "OBJECT";
5767 case STT_FUNC
: return "FUNC";
5768 case STT_SECTION
: return "SECTION";
5769 case STT_FILE
: return "FILE";
5770 case STT_COMMON
: return "COMMON";
5771 case STT_TLS
: return "TLS";
5773 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
5775 if (elf_header
.e_machine
== EM_ARM
&& type
== STT_ARM_TFUNC
)
5776 return "THUMB_FUNC";
5778 if (elf_header
.e_machine
== EM_SPARCV9
&& type
== STT_REGISTER
)
5781 if (elf_header
.e_machine
== EM_PARISC
&& type
== STT_PARISC_MILLI
)
5782 return "PARISC_MILLI";
5784 sprintf (buff
, _("<processor specific>: %d"), type
);
5786 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
5788 if (elf_header
.e_machine
== EM_PARISC
)
5790 if (type
== STT_HP_OPAQUE
)
5792 if (type
== STT_HP_STUB
)
5796 sprintf (buff
, _("<OS specific>: %d"), type
);
5799 sprintf (buff
, _("<unknown>: %d"), type
);
5805 get_symbol_visibility (visibility
)
5806 unsigned int visibility
;
5810 case STV_DEFAULT
: return "DEFAULT";
5811 case STV_INTERNAL
: return "INTERNAL";
5812 case STV_HIDDEN
: return "HIDDEN";
5813 case STV_PROTECTED
: return "PROTECTED";
5819 get_symbol_index_type (type
)
5822 static char buff
[32];
5826 case SHN_UNDEF
: return "UND";
5827 case SHN_ABS
: return "ABS";
5828 case SHN_COMMON
: return "COM";
5830 if (type
>= SHN_LOPROC
&& type
<= SHN_HIPROC
)
5831 sprintf (buff
, "PRC[0x%04x]", type
);
5832 else if (type
>= SHN_LOOS
&& type
<= SHN_HIOS
)
5833 sprintf (buff
, "OS [0x%04x]", type
);
5834 else if (type
>= SHN_LORESERVE
&& type
<= SHN_HIRESERVE
)
5835 sprintf (buff
, "RSV[0x%04x]", type
);
5837 sprintf (buff
, "%3d", type
);
5845 get_dynamic_data (file
, number
)
5847 unsigned int number
;
5849 unsigned char *e_data
;
5852 e_data
= (unsigned char *) malloc (number
* 4);
5856 error (_("Out of memory\n"));
5860 if (fread (e_data
, 4, number
, file
) != number
)
5862 error (_("Unable to read in dynamic data\n"));
5866 i_data
= (int *) malloc (number
* sizeof (*i_data
));
5870 error (_("Out of memory\n"));
5876 i_data
[number
] = byte_get (e_data
+ number
* 4, 4);
5883 /* Dump the symbol table. */
5885 process_symbol_table (file
)
5888 Elf_Internal_Shdr
*section
;
5889 unsigned char nb
[4];
5890 unsigned char nc
[4];
5893 int *buckets
= NULL
;
5896 if (! do_syms
&& !do_histogram
)
5899 if (dynamic_info
[DT_HASH
] && ((do_using_dynamic
&& dynamic_strings
!= NULL
)
5902 if (fseek (file
, dynamic_info
[DT_HASH
] - loadaddr
, SEEK_SET
))
5904 error (_("Unable to seek to start of dynamic information"));
5908 if (fread (nb
, sizeof (nb
), 1, file
) != 1)
5910 error (_("Failed to read in number of buckets\n"));
5914 if (fread (nc
, sizeof (nc
), 1, file
) != 1)
5916 error (_("Failed to read in number of chains\n"));
5920 nbuckets
= byte_get (nb
, 4);
5921 nchains
= byte_get (nc
, 4);
5923 buckets
= get_dynamic_data (file
, nbuckets
);
5924 chains
= get_dynamic_data (file
, nchains
);
5926 if (buckets
== NULL
|| chains
== NULL
)
5931 && dynamic_info
[DT_HASH
] && do_using_dynamic
&& dynamic_strings
!= NULL
)
5936 printf (_("\nSymbol table for image:\n"));
5938 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5940 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5942 for (hn
= 0; hn
< nbuckets
; hn
++)
5947 for (si
= buckets
[hn
]; si
< nchains
&& si
> 0; si
= chains
[si
])
5949 Elf_Internal_Sym
*psym
;
5951 psym
= dynamic_symbols
+ si
;
5953 printf (" %3d %3d: ", si
, hn
);
5954 print_vma (psym
->st_value
, LONG_HEX
);
5956 print_vma (psym
->st_size
, DEC_5
);
5958 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
5959 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
5960 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
5961 printf (" %3.3s ", get_symbol_index_type (psym
->st_shndx
));
5962 print_symbol (25, dynamic_strings
+ psym
->st_name
);
5967 else if (do_syms
&& !do_using_dynamic
)
5971 for (i
= 0, section
= section_headers
;
5972 i
< elf_header
.e_shnum
;
5977 Elf_Internal_Sym
*symtab
;
5978 Elf_Internal_Sym
*psym
;
5981 if ( section
->sh_type
!= SHT_SYMTAB
5982 && section
->sh_type
!= SHT_DYNSYM
)
5985 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5986 SECTION_NAME (section
),
5987 (unsigned long) (section
->sh_size
/ section
->sh_entsize
));
5989 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5991 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5993 symtab
= GET_ELF_SYMBOLS (file
, section
);
5997 if (section
->sh_link
== elf_header
.e_shstrndx
)
5998 strtab
= string_table
;
6001 Elf_Internal_Shdr
*string_sec
;
6003 string_sec
= SECTION_HEADER (section
->sh_link
);
6005 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
6006 string_sec
->sh_size
,
6010 for (si
= 0, psym
= symtab
;
6011 si
< section
->sh_size
/ section
->sh_entsize
;
6014 printf ("%6d: ", si
);
6015 print_vma (psym
->st_value
, LONG_HEX
);
6017 print_vma (psym
->st_size
, DEC_5
);
6018 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym
->st_info
)));
6019 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym
->st_info
)));
6020 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym
->st_other
)));
6021 printf (" %4s ", get_symbol_index_type (psym
->st_shndx
));
6022 print_symbol (25, strtab
+ psym
->st_name
);
6024 if (section
->sh_type
== SHT_DYNSYM
&&
6025 version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)] != 0)
6027 unsigned char data
[2];
6028 unsigned short vers_data
;
6029 unsigned long offset
;
6033 offset
= version_info
[DT_VERSIONTAGIDX (DT_VERSYM
)]
6036 get_data (&data
, file
, offset
+ si
* sizeof (vers_data
),
6037 sizeof (data
), _("version data"));
6039 vers_data
= byte_get (data
, 2);
6041 is_nobits
= (SECTION_HEADER (psym
->st_shndx
)->sh_type
6044 check_def
= (psym
->st_shndx
!= SHN_UNDEF
);
6046 if ((vers_data
& 0x8000) || vers_data
> 1)
6048 if (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6049 && (is_nobits
|| ! check_def
))
6051 Elf_External_Verneed evn
;
6052 Elf_Internal_Verneed ivn
;
6053 Elf_Internal_Vernaux ivna
;
6055 /* We must test both. */
6056 offset
= (version_info
[DT_VERSIONTAGIDX (DT_VERNEED
)]
6061 unsigned long vna_off
;
6063 get_data (&evn
, file
, offset
, sizeof (evn
),
6066 ivn
.vn_aux
= BYTE_GET (evn
.vn_aux
);
6067 ivn
.vn_next
= BYTE_GET (evn
.vn_next
);
6069 vna_off
= offset
+ ivn
.vn_aux
;
6073 Elf_External_Vernaux evna
;
6075 get_data (&evna
, file
, vna_off
,
6077 _("version need aux (3)"));
6079 ivna
.vna_other
= BYTE_GET (evna
.vna_other
);
6080 ivna
.vna_next
= BYTE_GET (evna
.vna_next
);
6081 ivna
.vna_name
= BYTE_GET (evna
.vna_name
);
6083 vna_off
+= ivna
.vna_next
;
6085 while (ivna
.vna_other
!= vers_data
6086 && ivna
.vna_next
!= 0);
6088 if (ivna
.vna_other
== vers_data
)
6091 offset
+= ivn
.vn_next
;
6093 while (ivn
.vn_next
!= 0);
6095 if (ivna
.vna_other
== vers_data
)
6098 strtab
+ ivna
.vna_name
, ivna
.vna_other
);
6101 else if (! is_nobits
)
6102 error (_("bad dynamic symbol"));
6109 if (vers_data
!= 0x8001
6110 && version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)])
6112 Elf_Internal_Verdef ivd
;
6113 Elf_Internal_Verdaux ivda
;
6114 Elf_External_Verdaux evda
;
6115 unsigned long offset
;
6118 = (version_info
[DT_VERSIONTAGIDX (DT_VERDEF
)]
6123 Elf_External_Verdef evd
;
6125 get_data (&evd
, file
, offset
, sizeof (evd
),
6128 ivd
.vd_ndx
= BYTE_GET (evd
.vd_ndx
);
6129 ivd
.vd_aux
= BYTE_GET (evd
.vd_aux
);
6130 ivd
.vd_next
= BYTE_GET (evd
.vd_next
);
6132 offset
+= ivd
.vd_next
;
6134 while (ivd
.vd_ndx
!= (vers_data
& 0x7fff)
6135 && ivd
.vd_next
!= 0);
6137 offset
-= ivd
.vd_next
;
6138 offset
+= ivd
.vd_aux
;
6140 get_data (&evda
, file
, offset
, sizeof (evda
),
6141 _("version def aux"));
6143 ivda
.vda_name
= BYTE_GET (evda
.vda_name
);
6145 if (psym
->st_name
!= ivda
.vda_name
)
6146 printf ((vers_data
& 0x8000)
6148 strtab
+ ivda
.vda_name
);
6158 if (strtab
!= string_table
)
6164 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
6166 if (do_histogram
&& buckets
!= NULL
)
6173 int nzero_counts
= 0;
6176 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
6178 printf (_(" Length Number %% of total Coverage\n"));
6180 lengths
= (int *) calloc (nbuckets
, sizeof (int));
6181 if (lengths
== NULL
)
6183 error (_("Out of memory"));
6186 for (hn
= 0; hn
< nbuckets
; ++hn
)
6191 for (si
= buckets
[hn
]; si
> 0 && si
< nchains
; si
= chains
[si
])
6194 if (maxlength
< ++lengths
[hn
])
6199 counts
= (int *) calloc (maxlength
+ 1, sizeof (int));
6202 error (_("Out of memory"));
6206 for (hn
= 0; hn
< nbuckets
; ++hn
)
6207 ++counts
[lengths
[hn
]];
6211 printf (" 0 %-10d (%5.1f%%)\n",
6212 counts
[0], (counts
[0] * 100.0) / nbuckets
);
6213 for (si
= 1; si
<= maxlength
; ++si
)
6215 nzero_counts
+= counts
[si
] * si
;
6216 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6217 si
, counts
[si
], (counts
[si
] * 100.0) / nbuckets
,
6218 (nzero_counts
* 100.0) / nsyms
);
6226 if (buckets
!= NULL
)
6236 process_syminfo (file
)
6237 FILE *file ATTRIBUTE_UNUSED
;
6241 if (dynamic_syminfo
== NULL
6243 /* No syminfo, this is ok. */
6246 /* There better should be a dynamic symbol section. */
6247 if (dynamic_symbols
== NULL
|| dynamic_strings
== NULL
)
6251 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6252 dynamic_syminfo_offset
, dynamic_syminfo_nent
);
6254 printf (_(" Num: Name BoundTo Flags\n"));
6255 for (i
= 0; i
< dynamic_syminfo_nent
; ++i
)
6257 unsigned short int flags
= dynamic_syminfo
[i
].si_flags
;
6259 printf ("%4d: ", i
);
6260 print_symbol (30, dynamic_strings
+ dynamic_symbols
[i
].st_name
);
6263 switch (dynamic_syminfo
[i
].si_boundto
)
6265 case SYMINFO_BT_SELF
:
6266 fputs ("SELF ", stdout
);
6268 case SYMINFO_BT_PARENT
:
6269 fputs ("PARENT ", stdout
);
6272 if (dynamic_syminfo
[i
].si_boundto
> 0
6273 && dynamic_syminfo
[i
].si_boundto
< dynamic_size
)
6278 [dynamic_syminfo
[i
].si_boundto
].d_un
.d_val
));
6282 printf ("%-10d ", dynamic_syminfo
[i
].si_boundto
);
6286 if (flags
& SYMINFO_FLG_DIRECT
)
6288 if (flags
& SYMINFO_FLG_PASSTHRU
)
6289 printf (" PASSTHRU");
6290 if (flags
& SYMINFO_FLG_COPY
)
6292 if (flags
& SYMINFO_FLG_LAZYLOAD
)
6293 printf (" LAZYLOAD");
6301 #ifdef SUPPORT_DISASSEMBLY
6303 disassemble_section (section
, file
)
6304 Elf_Internal_Shdr
*section
;
6307 printf (_("\nAssembly dump of section %s\n"),
6308 SECTION_NAME (section
));
6310 /* XXX -- to be done --- XXX */
6317 dump_section (section
, file
)
6318 Elf_Internal_Shdr
*section
;
6321 bfd_size_type bytes
;
6323 unsigned char *data
;
6324 unsigned char *start
;
6326 bytes
= section
->sh_size
;
6330 printf (_("\nSection '%s' has no data to dump.\n"),
6331 SECTION_NAME (section
));
6335 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section
));
6337 addr
= section
->sh_addr
;
6339 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, bytes
,
6352 lbytes
= (bytes
> 16 ? 16 : bytes
);
6354 printf (" 0x%8.8lx ", (unsigned long) addr
);
6356 switch (elf_header
.e_ident
[EI_DATA
])
6360 for (j
= 15; j
>= 0; j
--)
6363 printf ("%2.2x", data
[j
]);
6373 for (j
= 0; j
< 16; j
++)
6376 printf ("%2.2x", data
[j
]);
6386 for (j
= 0; j
< lbytes
; j
++)
6389 if (k
>= ' ' && k
< 0x80)
6408 static unsigned long int
6409 read_leb128 (data
, length_return
, sign
)
6410 unsigned char *data
;
6414 unsigned long int result
= 0;
6415 unsigned int num_read
= 0;
6424 result
|= (byte
& 0x7f) << shift
;
6429 while (byte
& 0x80);
6431 if (length_return
!= NULL
)
6432 *length_return
= num_read
;
6434 if (sign
&& (shift
< 32) && (byte
& 0x40))
6435 result
|= -1 << shift
;
6440 typedef struct State_Machine_Registers
6442 unsigned long address
;
6445 unsigned int column
;
6449 /* This variable hold the number of the last entry seen
6450 in the File Table. */
6451 unsigned int last_file_entry
;
6454 static SMR state_machine_regs
;
6457 reset_state_machine (is_stmt
)
6460 state_machine_regs
.address
= 0;
6461 state_machine_regs
.file
= 1;
6462 state_machine_regs
.line
= 1;
6463 state_machine_regs
.column
= 0;
6464 state_machine_regs
.is_stmt
= is_stmt
;
6465 state_machine_regs
.basic_block
= 0;
6466 state_machine_regs
.end_sequence
= 0;
6467 state_machine_regs
.last_file_entry
= 0;
6470 /* Handled an extend line op. Returns true if this is the end
6473 process_extended_line_op (data
, is_stmt
, pointer_size
)
6474 unsigned char *data
;
6478 unsigned char op_code
;
6481 unsigned char *name
;
6484 len
= read_leb128 (data
, & bytes_read
, 0);
6489 warn (_("badly formed extended line op encountered!\n"));
6496 printf (_(" Extended opcode %d: "), op_code
);
6500 case DW_LNE_end_sequence
:
6501 printf (_("End of Sequence\n\n"));
6502 reset_state_machine (is_stmt
);
6505 case DW_LNE_set_address
:
6506 adr
= byte_get (data
, pointer_size
);
6507 printf (_("set Address to 0x%lx\n"), adr
);
6508 state_machine_regs
.address
= adr
;
6511 case DW_LNE_define_file
:
6512 printf (_(" define new File Table entry\n"));
6513 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6515 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6517 data
+= strlen ((char *) data
) + 1;
6518 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6520 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6522 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6523 printf (_("%s\n\n"), name
);
6527 printf (_("UNKNOWN: length %d\n"), len
- bytes_read
);
6534 /* Size of pointers in the .debug_line section. This information is not
6535 really present in that section. It's obtained before dumping the debug
6536 sections by doing some pre-scan of the .debug_info section. */
6537 static int debug_line_pointer_size
= 4;
6540 display_debug_lines (section
, start
, file
)
6541 Elf_Internal_Shdr
*section
;
6542 unsigned char * start
;
6543 FILE *file ATTRIBUTE_UNUSED
;
6545 unsigned char *hdrptr
;
6546 DWARF2_Internal_LineInfo info
;
6547 unsigned char *standard_opcodes
;
6548 unsigned char *data
= start
;
6549 unsigned char *end
= start
+ section
->sh_size
;
6550 unsigned char *end_of_sequence
;
6553 int initial_length_size
;
6555 printf (_("\nDump of debug contents of section %s:\n\n"),
6556 SECTION_NAME (section
));
6562 /* Check the length of the block. */
6563 info
.li_length
= byte_get (hdrptr
, 4);
6566 if (info
.li_length
== 0xffffffff)
6568 /* This section is 64-bit DWARF 3. */
6569 info
.li_length
= byte_get (hdrptr
, 8);
6572 initial_length_size
= 12;
6577 initial_length_size
= 4;
6580 if (info
.li_length
+ initial_length_size
> section
->sh_size
)
6583 (_("The line info appears to be corrupt - the section is too small\n"));
6587 /* Check its version number. */
6588 info
.li_version
= byte_get (hdrptr
, 2);
6590 if (info
.li_version
!= 2 && info
.li_version
!= 3)
6592 warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
6596 info
.li_prologue_length
= byte_get (hdrptr
, offset_size
);
6597 hdrptr
+= offset_size
;
6598 info
.li_min_insn_length
= byte_get (hdrptr
, 1);
6600 info
.li_default_is_stmt
= byte_get (hdrptr
, 1);
6602 info
.li_line_base
= byte_get (hdrptr
, 1);
6604 info
.li_line_range
= byte_get (hdrptr
, 1);
6606 info
.li_opcode_base
= byte_get (hdrptr
, 1);
6609 /* Sign extend the line base field. */
6610 info
.li_line_base
<<= 24;
6611 info
.li_line_base
>>= 24;
6613 printf (_(" Length: %ld\n"), info
.li_length
);
6614 printf (_(" DWARF Version: %d\n"), info
.li_version
);
6615 printf (_(" Prologue Length: %d\n"), info
.li_prologue_length
);
6616 printf (_(" Minimum Instruction Length: %d\n"), info
.li_min_insn_length
);
6617 printf (_(" Initial value of 'is_stmt': %d\n"), info
.li_default_is_stmt
);
6618 printf (_(" Line Base: %d\n"), info
.li_line_base
);
6619 printf (_(" Line Range: %d\n"), info
.li_line_range
);
6620 printf (_(" Opcode Base: %d\n"), info
.li_opcode_base
);
6622 end_of_sequence
= data
+ info
.li_length
+ initial_length_size
;
6624 reset_state_machine (info
.li_default_is_stmt
);
6626 /* Display the contents of the Opcodes table. */
6627 standard_opcodes
= hdrptr
;
6629 printf (_("\n Opcodes:\n"));
6631 for (i
= 1; i
< info
.li_opcode_base
; i
++)
6632 printf (_(" Opcode %d has %d args\n"), i
, standard_opcodes
[i
- 1]);
6634 /* Display the contents of the Directory table. */
6635 data
= standard_opcodes
+ info
.li_opcode_base
- 1;
6638 printf (_("\n The Directory Table is empty.\n"));
6641 printf (_("\n The Directory Table:\n"));
6645 printf (_(" %s\n"), data
);
6647 data
+= strlen ((char *) data
) + 1;
6651 /* Skip the NUL at the end of the table. */
6654 /* Display the contents of the File Name table. */
6656 printf (_("\n The File Name Table is empty.\n"));
6659 printf (_("\n The File Name Table:\n"));
6660 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6664 unsigned char *name
;
6667 printf (_(" %d\t"), ++state_machine_regs
.last_file_entry
);
6670 data
+= strlen ((char *) data
) + 1;
6672 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6674 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6676 printf (_("%lu\t"), read_leb128 (data
, & bytes_read
, 0));
6678 printf (_("%s\n"), name
);
6682 /* Skip the NUL at the end of the table. */
6685 /* Now display the statements. */
6686 printf (_("\n Line Number Statements:\n"));
6689 while (data
< end_of_sequence
)
6691 unsigned char op_code
;
6697 if (op_code
>= info
.li_opcode_base
)
6699 op_code
-= info
.li_opcode_base
;
6700 adv
= (op_code
/ info
.li_line_range
) * info
.li_min_insn_length
;
6701 state_machine_regs
.address
+= adv
;
6702 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6703 op_code
, adv
, state_machine_regs
.address
);
6704 adv
= (op_code
% info
.li_line_range
) + info
.li_line_base
;
6705 state_machine_regs
.line
+= adv
;
6706 printf (_(" and Line by %d to %d\n"),
6707 adv
, state_machine_regs
.line
);
6709 else switch (op_code
)
6711 case DW_LNS_extended_op
:
6712 data
+= process_extended_line_op (data
, info
.li_default_is_stmt
,
6713 debug_line_pointer_size
);
6717 printf (_(" Copy\n"));
6720 case DW_LNS_advance_pc
:
6721 adv
= info
.li_min_insn_length
* read_leb128 (data
, & bytes_read
, 0);
6723 state_machine_regs
.address
+= adv
;
6724 printf (_(" Advance PC by %d to %lx\n"), adv
,
6725 state_machine_regs
.address
);
6728 case DW_LNS_advance_line
:
6729 adv
= read_leb128 (data
, & bytes_read
, 1);
6731 state_machine_regs
.line
+= adv
;
6732 printf (_(" Advance Line by %d to %d\n"), adv
,
6733 state_machine_regs
.line
);
6736 case DW_LNS_set_file
:
6737 adv
= read_leb128 (data
, & bytes_read
, 0);
6739 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6741 state_machine_regs
.file
= adv
;
6744 case DW_LNS_set_column
:
6745 adv
= read_leb128 (data
, & bytes_read
, 0);
6747 printf (_(" Set column to %d\n"), adv
);
6748 state_machine_regs
.column
= adv
;
6751 case DW_LNS_negate_stmt
:
6752 adv
= state_machine_regs
.is_stmt
;
6754 printf (_(" Set is_stmt to %d\n"), adv
);
6755 state_machine_regs
.is_stmt
= adv
;
6758 case DW_LNS_set_basic_block
:
6759 printf (_(" Set basic block\n"));
6760 state_machine_regs
.basic_block
= 1;
6763 case DW_LNS_const_add_pc
:
6764 adv
= (((255 - info
.li_opcode_base
) / info
.li_line_range
)
6765 * info
.li_min_insn_length
);
6766 state_machine_regs
.address
+= adv
;
6767 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv
,
6768 state_machine_regs
.address
);
6771 case DW_LNS_fixed_advance_pc
:
6772 adv
= byte_get (data
, 2);
6774 state_machine_regs
.address
+= adv
;
6775 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6776 adv
, state_machine_regs
.address
);
6779 case DW_LNS_set_prologue_end
:
6780 printf (_(" Set prologue_end to true\n"));
6783 case DW_LNS_set_epilogue_begin
:
6784 printf (_(" Set epilogue_begin to true\n"));
6787 case DW_LNS_set_isa
:
6788 adv
= read_leb128 (data
, & bytes_read
, 0);
6790 printf (_(" Set ISA to %d\n"), adv
);
6794 printf (_(" Unknown opcode %d with operands: "), op_code
);
6797 for (i
= standard_opcodes
[op_code
- 1]; i
> 0 ; --i
)
6799 printf ("0x%lx%s", read_leb128 (data
, &bytes_read
, 0),
6800 i
== 1 ? "" : ", ");
6815 display_debug_pubnames (section
, start
, file
)
6816 Elf_Internal_Shdr
*section
;
6817 unsigned char *start
;
6818 FILE *file ATTRIBUTE_UNUSED
;
6820 DWARF2_Internal_PubNames pubnames
;
6823 end
= start
+ section
->sh_size
;
6825 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
6829 unsigned char *data
;
6830 unsigned long offset
;
6831 int offset_size
, initial_length_size
;
6835 pubnames
.pn_length
= byte_get (data
, 4);
6837 if (pubnames
.pn_length
== 0xffffffff)
6839 pubnames
.pn_length
= byte_get (data
, 8);
6842 initial_length_size
= 12;
6847 initial_length_size
= 4;
6850 pubnames
.pn_version
= byte_get (data
, 2);
6852 pubnames
.pn_offset
= byte_get (data
, offset_size
);
6853 data
+= offset_size
;
6854 pubnames
.pn_size
= byte_get (data
, offset_size
);
6855 data
+= offset_size
;
6857 start
+= pubnames
.pn_length
+ initial_length_size
;
6859 if (pubnames
.pn_version
!= 2 && pubnames
.pn_version
!= 3)
6861 static int warned
= 0;
6865 warn (_("Only DWARF 2 and 3 pubnames are currently supported\n"));
6872 printf (_(" Length: %ld\n"),
6873 pubnames
.pn_length
);
6874 printf (_(" Version: %d\n"),
6875 pubnames
.pn_version
);
6876 printf (_(" Offset into .debug_info section: %ld\n"),
6877 pubnames
.pn_offset
);
6878 printf (_(" Size of area in .debug_info section: %ld\n"),
6881 printf (_("\n Offset\tName\n"));
6885 offset
= byte_get (data
, offset_size
);
6889 data
+= offset_size
;
6890 printf (" %ld\t\t%s\n", offset
, data
);
6891 data
+= strlen ((char *) data
) + 1;
6894 while (offset
!= 0);
6907 case DW_TAG_padding
: return "DW_TAG_padding";
6908 case DW_TAG_array_type
: return "DW_TAG_array_type";
6909 case DW_TAG_class_type
: return "DW_TAG_class_type";
6910 case DW_TAG_entry_point
: return "DW_TAG_entry_point";
6911 case DW_TAG_enumeration_type
: return "DW_TAG_enumeration_type";
6912 case DW_TAG_formal_parameter
: return "DW_TAG_formal_parameter";
6913 case DW_TAG_imported_declaration
: return "DW_TAG_imported_declaration";
6914 case DW_TAG_label
: return "DW_TAG_label";
6915 case DW_TAG_lexical_block
: return "DW_TAG_lexical_block";
6916 case DW_TAG_member
: return "DW_TAG_member";
6917 case DW_TAG_pointer_type
: return "DW_TAG_pointer_type";
6918 case DW_TAG_reference_type
: return "DW_TAG_reference_type";
6919 case DW_TAG_compile_unit
: return "DW_TAG_compile_unit";
6920 case DW_TAG_string_type
: return "DW_TAG_string_type";
6921 case DW_TAG_structure_type
: return "DW_TAG_structure_type";
6922 case DW_TAG_subroutine_type
: return "DW_TAG_subroutine_type";
6923 case DW_TAG_typedef
: return "DW_TAG_typedef";
6924 case DW_TAG_union_type
: return "DW_TAG_union_type";
6925 case DW_TAG_unspecified_parameters
: return "DW_TAG_unspecified_parameters";
6926 case DW_TAG_variant
: return "DW_TAG_variant";
6927 case DW_TAG_common_block
: return "DW_TAG_common_block";
6928 case DW_TAG_common_inclusion
: return "DW_TAG_common_inclusion";
6929 case DW_TAG_inheritance
: return "DW_TAG_inheritance";
6930 case DW_TAG_inlined_subroutine
: return "DW_TAG_inlined_subroutine";
6931 case DW_TAG_module
: return "DW_TAG_module";
6932 case DW_TAG_ptr_to_member_type
: return "DW_TAG_ptr_to_member_type";
6933 case DW_TAG_set_type
: return "DW_TAG_set_type";
6934 case DW_TAG_subrange_type
: return "DW_TAG_subrange_type";
6935 case DW_TAG_with_stmt
: return "DW_TAG_with_stmt";
6936 case DW_TAG_access_declaration
: return "DW_TAG_access_declaration";
6937 case DW_TAG_base_type
: return "DW_TAG_base_type";
6938 case DW_TAG_catch_block
: return "DW_TAG_catch_block";
6939 case DW_TAG_const_type
: return "DW_TAG_const_type";
6940 case DW_TAG_constant
: return "DW_TAG_constant";
6941 case DW_TAG_enumerator
: return "DW_TAG_enumerator";
6942 case DW_TAG_file_type
: return "DW_TAG_file_type";
6943 case DW_TAG_friend
: return "DW_TAG_friend";
6944 case DW_TAG_namelist
: return "DW_TAG_namelist";
6945 case DW_TAG_namelist_item
: return "DW_TAG_namelist_item";
6946 case DW_TAG_packed_type
: return "DW_TAG_packed_type";
6947 case DW_TAG_subprogram
: return "DW_TAG_subprogram";
6948 case DW_TAG_template_type_param
: return "DW_TAG_template_type_param";
6949 case DW_TAG_template_value_param
: return "DW_TAG_template_value_param";
6950 case DW_TAG_thrown_type
: return "DW_TAG_thrown_type";
6951 case DW_TAG_try_block
: return "DW_TAG_try_block";
6952 case DW_TAG_variant_part
: return "DW_TAG_variant_part";
6953 case DW_TAG_variable
: return "DW_TAG_variable";
6954 case DW_TAG_volatile_type
: return "DW_TAG_volatile_type";
6955 case DW_TAG_MIPS_loop
: return "DW_TAG_MIPS_loop";
6956 case DW_TAG_format_label
: return "DW_TAG_format_label";
6957 case DW_TAG_function_template
: return "DW_TAG_function_template";
6958 case DW_TAG_class_template
: return "DW_TAG_class_template";
6959 /* DWARF 2.1 values. */
6960 case DW_TAG_dwarf_procedure
: return "DW_TAG_dwarf_procedure";
6961 case DW_TAG_restrict_type
: return "DW_TAG_restrict_type";
6962 case DW_TAG_interface_type
: return "DW_TAG_interface_type";
6963 case DW_TAG_namespace
: return "DW_TAG_namespace";
6964 case DW_TAG_imported_module
: return "DW_TAG_imported_module";
6965 case DW_TAG_unspecified_type
: return "DW_TAG_unspecified_type";
6966 case DW_TAG_partial_unit
: return "DW_TAG_partial_unit";
6967 case DW_TAG_imported_unit
: return "DW_TAG_imported_unit";
6969 case DW_TAG_upc_shared_type
: return "DW_TAG_upc_shared_type";
6970 case DW_TAG_upc_strict_type
: return "DW_TAG_upc_strict_type";
6971 case DW_TAG_upc_relaxed_type
: return "DW_TAG_upc_relaxed_type";
6974 static char buffer
[100];
6976 sprintf (buffer
, _("Unknown TAG value: %lx"), tag
);
6983 get_AT_name (attribute
)
6984 unsigned long attribute
;
6988 case DW_AT_sibling
: return "DW_AT_sibling";
6989 case DW_AT_location
: return "DW_AT_location";
6990 case DW_AT_name
: return "DW_AT_name";
6991 case DW_AT_ordering
: return "DW_AT_ordering";
6992 case DW_AT_subscr_data
: return "DW_AT_subscr_data";
6993 case DW_AT_byte_size
: return "DW_AT_byte_size";
6994 case DW_AT_bit_offset
: return "DW_AT_bit_offset";
6995 case DW_AT_bit_size
: return "DW_AT_bit_size";
6996 case DW_AT_element_list
: return "DW_AT_element_list";
6997 case DW_AT_stmt_list
: return "DW_AT_stmt_list";
6998 case DW_AT_low_pc
: return "DW_AT_low_pc";
6999 case DW_AT_high_pc
: return "DW_AT_high_pc";
7000 case DW_AT_language
: return "DW_AT_language";
7001 case DW_AT_member
: return "DW_AT_member";
7002 case DW_AT_discr
: return "DW_AT_discr";
7003 case DW_AT_discr_value
: return "DW_AT_discr_value";
7004 case DW_AT_visibility
: return "DW_AT_visibility";
7005 case DW_AT_import
: return "DW_AT_import";
7006 case DW_AT_string_length
: return "DW_AT_string_length";
7007 case DW_AT_common_reference
: return "DW_AT_common_reference";
7008 case DW_AT_comp_dir
: return "DW_AT_comp_dir";
7009 case DW_AT_const_value
: return "DW_AT_const_value";
7010 case DW_AT_containing_type
: return "DW_AT_containing_type";
7011 case DW_AT_default_value
: return "DW_AT_default_value";
7012 case DW_AT_inline
: return "DW_AT_inline";
7013 case DW_AT_is_optional
: return "DW_AT_is_optional";
7014 case DW_AT_lower_bound
: return "DW_AT_lower_bound";
7015 case DW_AT_producer
: return "DW_AT_producer";
7016 case DW_AT_prototyped
: return "DW_AT_prototyped";
7017 case DW_AT_return_addr
: return "DW_AT_return_addr";
7018 case DW_AT_start_scope
: return "DW_AT_start_scope";
7019 case DW_AT_stride_size
: return "DW_AT_stride_size";
7020 case DW_AT_upper_bound
: return "DW_AT_upper_bound";
7021 case DW_AT_abstract_origin
: return "DW_AT_abstract_origin";
7022 case DW_AT_accessibility
: return "DW_AT_accessibility";
7023 case DW_AT_address_class
: return "DW_AT_address_class";
7024 case DW_AT_artificial
: return "DW_AT_artificial";
7025 case DW_AT_base_types
: return "DW_AT_base_types";
7026 case DW_AT_calling_convention
: return "DW_AT_calling_convention";
7027 case DW_AT_count
: return "DW_AT_count";
7028 case DW_AT_data_member_location
: return "DW_AT_data_member_location";
7029 case DW_AT_decl_column
: return "DW_AT_decl_column";
7030 case DW_AT_decl_file
: return "DW_AT_decl_file";
7031 case DW_AT_decl_line
: return "DW_AT_decl_line";
7032 case DW_AT_declaration
: return "DW_AT_declaration";
7033 case DW_AT_discr_list
: return "DW_AT_discr_list";
7034 case DW_AT_encoding
: return "DW_AT_encoding";
7035 case DW_AT_external
: return "DW_AT_external";
7036 case DW_AT_frame_base
: return "DW_AT_frame_base";
7037 case DW_AT_friend
: return "DW_AT_friend";
7038 case DW_AT_identifier_case
: return "DW_AT_identifier_case";
7039 case DW_AT_macro_info
: return "DW_AT_macro_info";
7040 case DW_AT_namelist_items
: return "DW_AT_namelist_items";
7041 case DW_AT_priority
: return "DW_AT_priority";
7042 case DW_AT_segment
: return "DW_AT_segment";
7043 case DW_AT_specification
: return "DW_AT_specification";
7044 case DW_AT_static_link
: return "DW_AT_static_link";
7045 case DW_AT_type
: return "DW_AT_type";
7046 case DW_AT_use_location
: return "DW_AT_use_location";
7047 case DW_AT_variable_parameter
: return "DW_AT_variable_parameter";
7048 case DW_AT_virtuality
: return "DW_AT_virtuality";
7049 case DW_AT_vtable_elem_location
: return "DW_AT_vtable_elem_location";
7050 /* DWARF 2.1 values. */
7051 case DW_AT_allocated
: return "DW_AT_allocated";
7052 case DW_AT_associated
: return "DW_AT_associated";
7053 case DW_AT_data_location
: return "DW_AT_data_location";
7054 case DW_AT_stride
: return "DW_AT_stride";
7055 case DW_AT_entry_pc
: return "DW_AT_entry_pc";
7056 case DW_AT_use_UTF8
: return "DW_AT_use_UTF8";
7057 case DW_AT_extension
: return "DW_AT_extension";
7058 case DW_AT_ranges
: return "DW_AT_ranges";
7059 case DW_AT_trampoline
: return "DW_AT_trampoline";
7060 case DW_AT_call_column
: return "DW_AT_call_column";
7061 case DW_AT_call_file
: return "DW_AT_call_file";
7062 case DW_AT_call_line
: return "DW_AT_call_line";
7063 /* SGI/MIPS extensions. */
7064 case DW_AT_MIPS_fde
: return "DW_AT_MIPS_fde";
7065 case DW_AT_MIPS_loop_begin
: return "DW_AT_MIPS_loop_begin";
7066 case DW_AT_MIPS_tail_loop_begin
: return "DW_AT_MIPS_tail_loop_begin";
7067 case DW_AT_MIPS_epilog_begin
: return "DW_AT_MIPS_epilog_begin";
7068 case DW_AT_MIPS_loop_unroll_factor
: return "DW_AT_MIPS_loop_unroll_factor";
7069 case DW_AT_MIPS_software_pipeline_depth
:
7070 return "DW_AT_MIPS_software_pipeline_depth";
7071 case DW_AT_MIPS_linkage_name
: return "DW_AT_MIPS_linkage_name";
7072 case DW_AT_MIPS_stride
: return "DW_AT_MIPS_stride";
7073 case DW_AT_MIPS_abstract_name
: return "DW_AT_MIPS_abstract_name";
7074 case DW_AT_MIPS_clone_origin
: return "DW_AT_MIPS_clone_origin";
7075 case DW_AT_MIPS_has_inlines
: return "DW_AT_MIPS_has_inlines";
7076 /* GNU extensions. */
7077 case DW_AT_sf_names
: return "DW_AT_sf_names";
7078 case DW_AT_src_info
: return "DW_AT_src_info";
7079 case DW_AT_mac_info
: return "DW_AT_mac_info";
7080 case DW_AT_src_coords
: return "DW_AT_src_coords";
7081 case DW_AT_body_begin
: return "DW_AT_body_begin";
7082 case DW_AT_body_end
: return "DW_AT_body_end";
7083 case DW_AT_GNU_vector
: return "DW_AT_GNU_vector";
7084 /* UPC extension. */
7085 case DW_AT_upc_threads_scaled
: return "DW_AT_upc_threads_scaled";
7088 static char buffer
[100];
7090 sprintf (buffer
, _("Unknown AT value: %lx"), attribute
);
7097 get_FORM_name (form
)
7102 case DW_FORM_addr
: return "DW_FORM_addr";
7103 case DW_FORM_block2
: return "DW_FORM_block2";
7104 case DW_FORM_block4
: return "DW_FORM_block4";
7105 case DW_FORM_data2
: return "DW_FORM_data2";
7106 case DW_FORM_data4
: return "DW_FORM_data4";
7107 case DW_FORM_data8
: return "DW_FORM_data8";
7108 case DW_FORM_string
: return "DW_FORM_string";
7109 case DW_FORM_block
: return "DW_FORM_block";
7110 case DW_FORM_block1
: return "DW_FORM_block1";
7111 case DW_FORM_data1
: return "DW_FORM_data1";
7112 case DW_FORM_flag
: return "DW_FORM_flag";
7113 case DW_FORM_sdata
: return "DW_FORM_sdata";
7114 case DW_FORM_strp
: return "DW_FORM_strp";
7115 case DW_FORM_udata
: return "DW_FORM_udata";
7116 case DW_FORM_ref_addr
: return "DW_FORM_ref_addr";
7117 case DW_FORM_ref1
: return "DW_FORM_ref1";
7118 case DW_FORM_ref2
: return "DW_FORM_ref2";
7119 case DW_FORM_ref4
: return "DW_FORM_ref4";
7120 case DW_FORM_ref8
: return "DW_FORM_ref8";
7121 case DW_FORM_ref_udata
: return "DW_FORM_ref_udata";
7122 case DW_FORM_indirect
: return "DW_FORM_indirect";
7125 static char buffer
[100];
7127 sprintf (buffer
, _("Unknown FORM value: %lx"), form
);
7133 /* FIXME: There are better and more effiecint ways to handle
7134 these structures. For now though, I just want something that
7135 is simple to implement. */
7136 typedef struct abbrev_attr
7138 unsigned long attribute
;
7140 struct abbrev_attr
*next
;
7144 typedef struct abbrev_entry
7146 unsigned long entry
;
7149 struct abbrev_attr
*first_attr
;
7150 struct abbrev_attr
*last_attr
;
7151 struct abbrev_entry
*next
;
7155 static abbrev_entry
*first_abbrev
= NULL
;
7156 static abbrev_entry
*last_abbrev
= NULL
;
7161 abbrev_entry
*abbrev
;
7163 for (abbrev
= first_abbrev
; abbrev
;)
7165 abbrev_entry
*next
= abbrev
->next
;
7168 for (attr
= abbrev
->first_attr
; attr
;)
7170 abbrev_attr
*next
= attr
->next
;
7180 last_abbrev
= first_abbrev
= NULL
;
7184 add_abbrev (number
, tag
, children
)
7185 unsigned long number
;
7189 abbrev_entry
*entry
;
7191 entry
= (abbrev_entry
*) malloc (sizeof (*entry
));
7197 entry
->entry
= number
;
7199 entry
->children
= children
;
7200 entry
->first_attr
= NULL
;
7201 entry
->last_attr
= NULL
;
7204 if (first_abbrev
== NULL
)
7205 first_abbrev
= entry
;
7207 last_abbrev
->next
= entry
;
7209 last_abbrev
= entry
;
7213 add_abbrev_attr (attribute
, form
)
7214 unsigned long attribute
;
7219 attr
= (abbrev_attr
*) malloc (sizeof (*attr
));
7225 attr
->attribute
= attribute
;
7229 if (last_abbrev
->first_attr
== NULL
)
7230 last_abbrev
->first_attr
= attr
;
7232 last_abbrev
->last_attr
->next
= attr
;
7234 last_abbrev
->last_attr
= attr
;
7237 /* Processes the (partial) contents of a .debug_abbrev section.
7238 Returns NULL if the end of the section was encountered.
7239 Returns the address after the last byte read if the end of
7240 an abbreviation set was found. */
7242 static unsigned char *
7243 process_abbrev_section (start
, end
)
7244 unsigned char *start
;
7247 if (first_abbrev
!= NULL
)
7253 unsigned long entry
;
7255 unsigned long attribute
;
7258 entry
= read_leb128 (start
, & bytes_read
, 0);
7259 start
+= bytes_read
;
7261 /* A single zero is supposed to end the section according
7262 to the standard. If there's more, then signal that to
7265 return start
== end
? NULL
: start
;
7267 tag
= read_leb128 (start
, & bytes_read
, 0);
7268 start
+= bytes_read
;
7270 children
= *start
++;
7272 add_abbrev (entry
, tag
, children
);
7278 attribute
= read_leb128 (start
, & bytes_read
, 0);
7279 start
+= bytes_read
;
7281 form
= read_leb128 (start
, & bytes_read
, 0);
7282 start
+= bytes_read
;
7285 add_abbrev_attr (attribute
, form
);
7287 while (attribute
!= 0);
7295 display_debug_macinfo (section
, start
, file
)
7296 Elf_Internal_Shdr
*section
;
7297 unsigned char *start
;
7298 FILE *file ATTRIBUTE_UNUSED
;
7300 unsigned char *end
= start
+ section
->sh_size
;
7301 unsigned char *curr
= start
;
7302 unsigned int bytes_read
;
7303 enum dwarf_macinfo_record_type op
;
7305 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7309 unsigned int lineno
;
7317 case DW_MACINFO_start_file
:
7319 unsigned int filenum
;
7321 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7323 filenum
= read_leb128 (curr
, & bytes_read
, 0);
7326 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno
, filenum
);
7330 case DW_MACINFO_end_file
:
7331 printf (_(" DW_MACINFO_end_file\n"));
7334 case DW_MACINFO_define
:
7335 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7338 curr
+= strlen (string
) + 1;
7339 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno
, string
);
7342 case DW_MACINFO_undef
:
7343 lineno
= read_leb128 (curr
, & bytes_read
, 0);
7346 curr
+= strlen (string
) + 1;
7347 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno
, string
);
7350 case DW_MACINFO_vendor_ext
:
7352 unsigned int constant
;
7354 constant
= read_leb128 (curr
, & bytes_read
, 0);
7357 curr
+= strlen (string
) + 1;
7358 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant
, string
);
7369 display_debug_abbrev (section
, start
, file
)
7370 Elf_Internal_Shdr
*section
;
7371 unsigned char *start
;
7372 FILE *file ATTRIBUTE_UNUSED
;
7374 abbrev_entry
*entry
;
7375 unsigned char *end
= start
+ section
->sh_size
;
7377 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section
));
7381 start
= process_abbrev_section (start
, end
);
7383 if (first_abbrev
== NULL
)
7386 printf (_(" Number TAG\n"));
7388 for (entry
= first_abbrev
; entry
; entry
= entry
->next
)
7392 printf (_(" %ld %s [%s]\n"),
7394 get_TAG_name (entry
->tag
),
7395 entry
->children
? _("has children") : _("no children"));
7397 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
7399 printf (_(" %-18s %s\n"),
7400 get_AT_name (attr
->attribute
),
7401 get_FORM_name (attr
->form
));
7415 static unsigned char *
7416 display_block (data
, length
)
7417 unsigned char *data
;
7418 unsigned long length
;
7420 printf (_(" %lu byte block: "), length
);
7423 printf ("%lx ", (unsigned long) byte_get (data
++, 1));
7429 decode_location_expression (data
, pointer_size
, length
)
7430 unsigned char * data
;
7431 unsigned int pointer_size
;
7432 unsigned long length
;
7436 unsigned long uvalue
;
7437 unsigned char *end
= data
+ length
;
7446 printf ("DW_OP_addr: %lx",
7447 (unsigned long) byte_get (data
, pointer_size
));
7448 data
+= pointer_size
;
7451 printf ("DW_OP_deref");
7454 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data
++, 1));
7457 printf ("DW_OP_const1s: %ld", (long) byte_get (data
++, 1));
7460 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data
, 2));
7464 printf ("DW_OP_const2s: %ld", (long) byte_get (data
, 2));
7468 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data
, 4));
7472 printf ("DW_OP_const4s: %ld", (long) byte_get (data
, 4));
7476 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data
, 4),
7477 (unsigned long) byte_get (data
+ 4, 4));
7481 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data
, 4),
7482 (long) byte_get (data
+ 4, 4));
7486 printf ("DW_OP_constu: %lu", read_leb128 (data
, &bytes_read
, 0));
7490 printf ("DW_OP_consts: %ld", read_leb128 (data
, &bytes_read
, 1));
7494 printf ("DW_OP_dup");
7497 printf ("DW_OP_drop");
7500 printf ("DW_OP_over");
7503 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data
++, 1));
7506 printf ("DW_OP_swap");
7509 printf ("DW_OP_rot");
7512 printf ("DW_OP_xderef");
7515 printf ("DW_OP_abs");
7518 printf ("DW_OP_and");
7521 printf ("DW_OP_div");
7524 printf ("DW_OP_minus");
7527 printf ("DW_OP_mod");
7530 printf ("DW_OP_mul");
7533 printf ("DW_OP_neg");
7536 printf ("DW_OP_not");
7539 printf ("DW_OP_or");
7542 printf ("DW_OP_plus");
7544 case DW_OP_plus_uconst
:
7545 printf ("DW_OP_plus_uconst: %lu",
7546 read_leb128 (data
, &bytes_read
, 0));
7550 printf ("DW_OP_shl");
7553 printf ("DW_OP_shr");
7556 printf ("DW_OP_shra");
7559 printf ("DW_OP_xor");
7562 printf ("DW_OP_bra: %ld", (long) byte_get (data
, 2));
7566 printf ("DW_OP_eq");
7569 printf ("DW_OP_ge");
7572 printf ("DW_OP_gt");
7575 printf ("DW_OP_le");
7578 printf ("DW_OP_lt");
7581 printf ("DW_OP_ne");
7584 printf ("DW_OP_skip: %ld", (long) byte_get (data
, 2));
7620 printf ("DW_OP_lit%d", op
- DW_OP_lit0
);
7655 printf ("DW_OP_reg%d", op
- DW_OP_reg0
);
7690 printf ("DW_OP_breg%d: %ld", op
- DW_OP_breg0
,
7691 read_leb128 (data
, &bytes_read
, 1));
7696 printf ("DW_OP_regx: %lu", read_leb128 (data
, &bytes_read
, 0));
7700 printf ("DW_OP_fbreg: %ld", read_leb128 (data
, &bytes_read
, 1));
7704 uvalue
= read_leb128 (data
, &bytes_read
, 0);
7706 printf ("DW_OP_bregx: %lu %ld", uvalue
,
7707 read_leb128 (data
, &bytes_read
, 1));
7711 printf ("DW_OP_piece: %lu", read_leb128 (data
, &bytes_read
, 0));
7714 case DW_OP_deref_size
:
7715 printf ("DW_OP_deref_size: %ld", (long) byte_get (data
++, 1));
7717 case DW_OP_xderef_size
:
7718 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data
++, 1));
7721 printf ("DW_OP_nop");
7724 /* DWARF 3 extensions. */
7725 case DW_OP_push_object_address
:
7726 printf ("DW_OP_push_object_address");
7729 printf ("DW_OP_call2: <%lx>", (long) byte_get (data
, 2));
7733 printf ("DW_OP_call4: <%lx>", (long) byte_get (data
, 4));
7736 case DW_OP_call_ref
:
7737 printf ("DW_OP_call_ref");
7740 /* GNU extensions. */
7741 case DW_OP_GNU_push_tls_address
:
7742 printf ("DW_OP_GNU_push_tls_address");
7746 if (op
>= DW_OP_lo_user
7747 && op
<= DW_OP_hi_user
)
7748 printf (_("(User defined location op)"));
7750 printf (_("(Unknown location op)"));
7751 /* No way to tell where the next op is, so just bail. */
7755 /* Separate the ops. */
7761 static const char *debug_loc_contents
;
7762 static bfd_vma debug_loc_size
;
7765 load_debug_loc (file
)
7768 Elf_Internal_Shdr
*sec
;
7771 /* If it is already loaded, do nothing. */
7772 if (debug_loc_contents
!= NULL
)
7775 /* Locate the .debug_loc section. */
7776 for (i
= 0, sec
= section_headers
;
7777 i
< elf_header
.e_shnum
;
7779 if (strcmp (SECTION_NAME (sec
), ".debug_loc") == 0)
7782 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7785 debug_loc_size
= sec
->sh_size
;
7787 debug_loc_contents
= ((char *)
7788 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7789 _("debug_loc section data")));
7795 if (debug_loc_contents
== NULL
)
7798 free ((char *) debug_loc_contents
);
7799 debug_loc_contents
= NULL
;
7805 display_debug_loc (section
, start
, file
)
7806 Elf_Internal_Shdr
*section
;
7807 unsigned char *start
;
7808 FILE *file ATTRIBUTE_UNUSED
;
7810 unsigned char *section_end
;
7811 unsigned long bytes
;
7812 unsigned char *section_begin
= start
;
7815 addr
= section
->sh_addr
;
7816 bytes
= section
->sh_size
;
7817 section_end
= start
+ bytes
;
7821 printf (_("\nThe .debug_loc section is empty.\n"));
7825 printf (_("Contents of the .debug_loc section:\n\n"));
7826 printf (_("\n Offset Begin End Expression\n"));
7828 while (start
< section_end
)
7830 unsigned long begin
;
7832 unsigned short length
;
7833 unsigned long offset
;
7835 offset
= start
- section_begin
;
7839 /* Normally, the lists in the debug_loc section are related to a
7840 given compilation unit, and thus, we would use the pointer size
7841 of that compilation unit. However, since we are displaying it
7842 seperately here, we either have to store pointer sizes of all
7843 compilation units, or assume they don't change. We assume,
7844 like the debug_line display, that it doesn't change. */
7845 begin
= byte_get (start
, debug_line_pointer_size
);
7846 start
+= debug_line_pointer_size
;
7847 end
= byte_get (start
, debug_line_pointer_size
);
7848 start
+= debug_line_pointer_size
;
7850 if (begin
== 0 && end
== 0)
7853 /* For now, skip any base address specifiers. */
7854 if (begin
== 0xffffffff)
7860 length
= byte_get (start
, 2);
7863 printf (" %8.8lx %8.8lx %8.8lx (", offset
, begin
, end
);
7864 decode_location_expression (start
, debug_line_pointer_size
, length
);
7874 static const char *debug_str_contents
;
7875 static bfd_vma debug_str_size
;
7878 load_debug_str (file
)
7881 Elf_Internal_Shdr
*sec
;
7884 /* If it is already loaded, do nothing. */
7885 if (debug_str_contents
!= NULL
)
7888 /* Locate the .debug_str section. */
7889 for (i
= 0, sec
= section_headers
;
7890 i
< elf_header
.e_shnum
;
7892 if (strcmp (SECTION_NAME (sec
), ".debug_str") == 0)
7895 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
7898 debug_str_size
= sec
->sh_size
;
7900 debug_str_contents
= ((char *)
7901 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
7902 _("debug_str section data")));
7908 if (debug_str_contents
== NULL
)
7911 free ((char *) debug_str_contents
);
7912 debug_str_contents
= NULL
;
7917 fetch_indirect_string (offset
)
7918 unsigned long offset
;
7920 if (debug_str_contents
== NULL
)
7921 return _("<no .debug_str section>");
7923 if (offset
> debug_str_size
)
7924 return _("<offset is too big>");
7926 return debug_str_contents
+ offset
;
7930 display_debug_str (section
, start
, file
)
7931 Elf_Internal_Shdr
*section
;
7932 unsigned char *start
;
7933 FILE *file ATTRIBUTE_UNUSED
;
7935 unsigned long bytes
;
7938 addr
= section
->sh_addr
;
7939 bytes
= section
->sh_size
;
7943 printf (_("\nThe .debug_str section is empty.\n"));
7947 printf (_("Contents of the .debug_str section:\n\n"));
7955 lbytes
= (bytes
> 16 ? 16 : bytes
);
7957 printf (" 0x%8.8lx ", (unsigned long) addr
);
7959 for (j
= 0; j
< 16; j
++)
7962 printf ("%2.2x", start
[j
]);
7970 for (j
= 0; j
< lbytes
; j
++)
7973 if (k
>= ' ' && k
< 0x80)
7989 static unsigned char *
7990 read_and_display_attr_value (attribute
, form
, data
, cu_offset
, pointer_size
,
7991 offset_size
, dwarf_version
)
7992 unsigned long attribute
;
7994 unsigned char *data
;
7995 unsigned long cu_offset
;
7996 unsigned long pointer_size
;
7997 unsigned long offset_size
;
8000 unsigned long uvalue
= 0;
8001 unsigned char *block_start
= NULL
;
8009 case DW_FORM_ref_addr
:
8010 if (dwarf_version
== 2)
8012 uvalue
= byte_get (data
, pointer_size
);
8013 data
+= pointer_size
;
8015 else if (dwarf_version
== 3)
8017 uvalue
= byte_get (data
, offset_size
);
8018 data
+= offset_size
;
8022 error (_("Internal error: DWARF version is not 2 or 3.\n"));
8027 uvalue
= byte_get (data
, pointer_size
);
8028 data
+= pointer_size
;
8032 uvalue
= byte_get (data
, offset_size
);
8033 data
+= offset_size
;
8039 uvalue
= byte_get (data
++, 1);
8044 uvalue
= byte_get (data
, 2);
8050 uvalue
= byte_get (data
, 4);
8055 uvalue
= read_leb128 (data
, & bytes_read
, 1);
8059 case DW_FORM_ref_udata
:
8061 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8065 case DW_FORM_indirect
:
8066 form
= read_leb128 (data
, & bytes_read
, 0);
8068 printf (" %s", get_FORM_name (form
));
8069 return read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8070 pointer_size
, offset_size
,
8076 case DW_FORM_ref_addr
:
8077 printf (" <#%lx>", uvalue
);
8083 case DW_FORM_ref_udata
:
8084 printf (" <%lx>", uvalue
+ cu_offset
);
8088 printf (" %#lx", uvalue
);
8096 printf (" %ld", uvalue
);
8101 uvalue
= byte_get (data
, 4);
8102 printf (" %lx", uvalue
);
8103 printf (" %lx", (unsigned long) byte_get (data
+ 4, 4));
8107 case DW_FORM_string
:
8108 printf (" %s", data
);
8109 data
+= strlen ((char *) data
) + 1;
8113 uvalue
= read_leb128 (data
, & bytes_read
, 0);
8114 block_start
= data
+ bytes_read
;
8115 data
= display_block (block_start
, uvalue
);
8118 case DW_FORM_block1
:
8119 uvalue
= byte_get (data
, 1);
8120 block_start
= data
+ 1;
8121 data
= display_block (block_start
, uvalue
);
8124 case DW_FORM_block2
:
8125 uvalue
= byte_get (data
, 2);
8126 block_start
= data
+ 2;
8127 data
= display_block (block_start
, uvalue
);
8130 case DW_FORM_block4
:
8131 uvalue
= byte_get (data
, 4);
8132 block_start
= data
+ 4;
8133 data
= display_block (block_start
, uvalue
);
8137 printf (_(" (indirect string, offset: 0x%lx): %s"),
8138 uvalue
, fetch_indirect_string (uvalue
));
8141 case DW_FORM_indirect
:
8142 /* Handled above. */
8146 warn (_("Unrecognized form: %d\n"), form
);
8150 /* For some attributes we can display futher information. */
8159 case DW_INL_not_inlined
:
8160 printf (_("(not inlined)"));
8162 case DW_INL_inlined
:
8163 printf (_("(inlined)"));
8165 case DW_INL_declared_not_inlined
:
8166 printf (_("(declared as inline but ignored)"));
8168 case DW_INL_declared_inlined
:
8169 printf (_("(declared as inline and inlined)"));
8172 printf (_(" (Unknown inline attribute value: %lx)"), uvalue
);
8177 case DW_AT_language
:
8180 case DW_LANG_C
: printf ("(non-ANSI C)"); break;
8181 case DW_LANG_C89
: printf ("(ANSI C)"); break;
8182 case DW_LANG_C_plus_plus
: printf ("(C++)"); break;
8183 case DW_LANG_Fortran77
: printf ("(FORTRAN 77)"); break;
8184 case DW_LANG_Fortran90
: printf ("(Fortran 90)"); break;
8185 case DW_LANG_Modula2
: printf ("(Modula 2)"); break;
8186 case DW_LANG_Pascal83
: printf ("(ANSI Pascal)"); break;
8187 case DW_LANG_Ada83
: printf ("(Ada)"); break;
8188 case DW_LANG_Cobol74
: printf ("(Cobol 74)"); break;
8189 case DW_LANG_Cobol85
: printf ("(Cobol 85)"); break;
8190 /* DWARF 2.1 values. */
8191 case DW_LANG_C99
: printf ("(ANSI C99)"); break;
8192 case DW_LANG_Ada95
: printf ("(ADA 95)"); break;
8193 case DW_LANG_Fortran95
: printf ("(Fortran 95)"); break;
8194 /* MIPS extension. */
8195 case DW_LANG_Mips_Assembler
: printf ("(MIPS assembler)"); break;
8196 /* UPC extension. */
8197 case DW_LANG_Upc
: printf ("(Unified Parallel C)"); break;
8199 printf ("(Unknown: %lx)", uvalue
);
8204 case DW_AT_encoding
:
8207 case DW_ATE_void
: printf ("(void)"); break;
8208 case DW_ATE_address
: printf ("(machine address)"); break;
8209 case DW_ATE_boolean
: printf ("(boolean)"); break;
8210 case DW_ATE_complex_float
: printf ("(complex float)"); break;
8211 case DW_ATE_float
: printf ("(float)"); break;
8212 case DW_ATE_signed
: printf ("(signed)"); break;
8213 case DW_ATE_signed_char
: printf ("(signed char)"); break;
8214 case DW_ATE_unsigned
: printf ("(unsigned)"); break;
8215 case DW_ATE_unsigned_char
: printf ("(unsigned char)"); break;
8216 /* DWARF 2.1 value. */
8217 case DW_ATE_imaginary_float
: printf ("(imaginary float)"); break;
8219 if (uvalue
>= DW_ATE_lo_user
8220 && uvalue
<= DW_ATE_hi_user
)
8221 printf ("(user defined type)");
8223 printf ("(unknown type)");
8228 case DW_AT_accessibility
:
8231 case DW_ACCESS_public
: printf ("(public)"); break;
8232 case DW_ACCESS_protected
: printf ("(protected)"); break;
8233 case DW_ACCESS_private
: printf ("(private)"); break;
8235 printf ("(unknown accessibility)");
8240 case DW_AT_visibility
:
8243 case DW_VIS_local
: printf ("(local)"); break;
8244 case DW_VIS_exported
: printf ("(exported)"); break;
8245 case DW_VIS_qualified
: printf ("(qualified)"); break;
8246 default: printf ("(unknown visibility)"); break;
8250 case DW_AT_virtuality
:
8253 case DW_VIRTUALITY_none
: printf ("(none)"); break;
8254 case DW_VIRTUALITY_virtual
: printf ("(virtual)"); break;
8255 case DW_VIRTUALITY_pure_virtual
:printf ("(pure_virtual)"); break;
8256 default: printf ("(unknown virtuality)"); break;
8260 case DW_AT_identifier_case
:
8263 case DW_ID_case_sensitive
: printf ("(case_sensitive)"); break;
8264 case DW_ID_up_case
: printf ("(up_case)"); break;
8265 case DW_ID_down_case
: printf ("(down_case)"); break;
8266 case DW_ID_case_insensitive
: printf ("(case_insensitive)"); break;
8267 default: printf ("(unknown case)"); break;
8271 case DW_AT_calling_convention
:
8274 case DW_CC_normal
: printf ("(normal)"); break;
8275 case DW_CC_program
: printf ("(program)"); break;
8276 case DW_CC_nocall
: printf ("(nocall)"); break;
8278 if (uvalue
>= DW_CC_lo_user
8279 && uvalue
<= DW_CC_hi_user
)
8280 printf ("(user defined)");
8282 printf ("(unknown convention)");
8286 case DW_AT_ordering
:
8289 case -1: printf ("(undefined)"); break;
8290 case 0: printf ("(row major)"); break;
8291 case 1: printf ("(column major)"); break;
8295 case DW_AT_frame_base
:
8296 case DW_AT_location
:
8297 case DW_AT_data_member_location
:
8298 case DW_AT_vtable_elem_location
:
8299 case DW_AT_allocated
:
8300 case DW_AT_associated
:
8301 case DW_AT_data_location
:
8303 case DW_AT_upper_bound
:
8304 case DW_AT_lower_bound
:
8308 decode_location_expression (block_start
, pointer_size
, uvalue
);
8311 else if (form
== DW_FORM_data4
|| form
== DW_FORM_data8
)
8314 printf ("location list");
8326 static unsigned char *
8327 read_and_display_attr (attribute
, form
, data
, cu_offset
, pointer_size
,
8328 offset_size
, dwarf_version
)
8329 unsigned long attribute
;
8331 unsigned char *data
;
8332 unsigned long cu_offset
;
8333 unsigned long pointer_size
;
8334 unsigned long offset_size
;
8337 printf (" %-18s:", get_AT_name (attribute
));
8338 data
= read_and_display_attr_value (attribute
, form
, data
, cu_offset
,
8339 pointer_size
, offset_size
, dwarf_version
);
8345 display_debug_info (section
, start
, file
)
8346 Elf_Internal_Shdr
*section
;
8347 unsigned char *start
;
8350 unsigned char *end
= start
+ section
->sh_size
;
8351 unsigned char *section_begin
= start
;
8353 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8355 load_debug_str (file
);
8356 load_debug_loc (file
);
8360 DWARF2_Internal_CompUnit compunit
;
8361 Elf_Internal_Shdr
*relsec
;
8362 unsigned char *hdrptr
;
8363 unsigned char *cu_abbrev_offset_ptr
;
8364 unsigned char *tags
;
8367 unsigned long cu_offset
;
8369 int initial_length_size
;
8373 compunit
.cu_length
= byte_get (hdrptr
, 4);
8376 if (compunit
.cu_length
== 0xffffffff)
8378 compunit
.cu_length
= byte_get (hdrptr
, 8);
8381 initial_length_size
= 12;
8386 initial_length_size
= 4;
8389 compunit
.cu_version
= byte_get (hdrptr
, 2);
8392 /* Apply addends of RELA relocations. */
8393 for (relsec
= section_headers
;
8394 relsec
< section_headers
+ elf_header
.e_shnum
;
8397 unsigned long nrelas
;
8398 Elf_Internal_Rela
*rela
, *rp
;
8399 Elf_Internal_Shdr
*symsec
;
8400 Elf_Internal_Sym
*symtab
;
8401 Elf_Internal_Sym
*sym
;
8403 if (relsec
->sh_type
!= SHT_RELA
8404 || SECTION_HEADER (relsec
->sh_info
) != section
8405 || relsec
->sh_size
== 0)
8408 if (!slurp_rela_relocs (file
, relsec
->sh_offset
, relsec
->sh_size
,
8412 symsec
= SECTION_HEADER (relsec
->sh_link
);
8413 symtab
= GET_ELF_SYMBOLS (file
, symsec
);
8415 for (rp
= rela
; rp
< rela
+ nrelas
; ++rp
)
8419 if (rp
->r_offset
>= (bfd_vma
) (hdrptr
- section_begin
)
8420 && section
->sh_size
> (bfd_vma
) offset_size
8421 && rp
->r_offset
<= section
->sh_size
- offset_size
)
8422 loc
= section_begin
+ rp
->r_offset
;
8428 sym
= symtab
+ ELF32_R_SYM (rp
->r_info
);
8430 if (ELF32_R_SYM (rp
->r_info
) != 0
8431 && ELF32_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8433 warn (_("Skipping unexpected symbol type %u\n"),
8434 ELF32_ST_TYPE (sym
->st_info
));
8440 sym
= symtab
+ ELF64_R_SYM (rp
->r_info
);
8442 if (ELF64_R_SYM (rp
->r_info
) != 0
8443 && ELF64_ST_TYPE (sym
->st_info
) != STT_SECTION
)
8445 warn (_("Skipping unexpected symbol type %u\n"),
8446 ELF64_ST_TYPE (sym
->st_info
));
8451 byte_put (loc
, rp
->r_addend
, offset_size
);
8458 cu_abbrev_offset_ptr
= hdrptr
;
8459 compunit
.cu_abbrev_offset
= byte_get (hdrptr
, offset_size
);
8460 hdrptr
+= offset_size
;
8462 compunit
.cu_pointer_size
= byte_get (hdrptr
, 1);
8466 cu_offset
= start
- section_begin
;
8467 start
+= compunit
.cu_length
+ initial_length_size
;
8469 printf (_(" Compilation Unit @ %lx:\n"), cu_offset
);
8470 printf (_(" Length: %ld\n"), compunit
.cu_length
);
8471 printf (_(" Version: %d\n"), compunit
.cu_version
);
8472 printf (_(" Abbrev Offset: %ld\n"), compunit
.cu_abbrev_offset
);
8473 printf (_(" Pointer Size: %d\n"), compunit
.cu_pointer_size
);
8475 if (compunit
.cu_version
!= 2 && compunit
.cu_version
!= 3)
8477 warn (_("Only version 2 and 3 DWARF debug information is currently supported.\n"));
8483 /* Read in the abbrevs used by this compilation unit. */
8485 Elf_Internal_Shdr
*sec
;
8486 unsigned char *begin
;
8488 /* Locate the .debug_abbrev section and process it. */
8489 for (i
= 0, sec
= section_headers
;
8490 i
< elf_header
.e_shnum
;
8492 if (strcmp (SECTION_NAME (sec
), ".debug_abbrev") == 0)
8495 if (i
== elf_header
.e_shnum
|| sec
->sh_size
== 0)
8497 warn (_("Unable to locate .debug_abbrev section!\n"));
8501 begin
= ((unsigned char *)
8502 get_data (NULL
, file
, sec
->sh_offset
, sec
->sh_size
,
8503 _("debug_abbrev section data")));
8507 process_abbrev_section (begin
+ compunit
.cu_abbrev_offset
,
8508 begin
+ sec
->sh_size
);
8514 while (tags
< start
)
8517 unsigned long abbrev_number
;
8518 abbrev_entry
*entry
;
8521 abbrev_number
= read_leb128 (tags
, & bytes_read
, 0);
8524 /* A null DIE marks the end of a list of children. */
8525 if (abbrev_number
== 0)
8531 /* Scan through the abbreviation list until we reach the
8533 for (entry
= first_abbrev
;
8534 entry
&& entry
->entry
!= abbrev_number
;
8535 entry
= entry
->next
)
8540 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8545 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8547 (unsigned long) (tags
- section_begin
- bytes_read
),
8549 get_TAG_name (entry
->tag
));
8551 for (attr
= entry
->first_attr
; attr
; attr
= attr
->next
)
8552 tags
= read_and_display_attr (attr
->attribute
,
8555 compunit
.cu_pointer_size
,
8557 compunit
.cu_version
);
8559 if (entry
->children
)
8573 display_debug_aranges (section
, start
, file
)
8574 Elf_Internal_Shdr
*section
;
8575 unsigned char *start
;
8576 FILE *file ATTRIBUTE_UNUSED
;
8578 unsigned char *end
= start
+ section
->sh_size
;
8580 printf (_("The section %s contains:\n\n"), SECTION_NAME (section
));
8584 unsigned char *hdrptr
;
8585 DWARF2_Internal_ARange arange
;
8586 unsigned char *ranges
;
8587 unsigned long length
;
8588 unsigned long address
;
8591 int initial_length_size
;
8595 arange
.ar_length
= byte_get (hdrptr
, 4);
8598 if (arange
.ar_length
== 0xffffffff)
8600 arange
.ar_length
= byte_get (hdrptr
, 8);
8603 initial_length_size
= 12;
8608 initial_length_size
= 4;
8611 arange
.ar_version
= byte_get (hdrptr
, 2);
8614 arange
.ar_info_offset
= byte_get (hdrptr
, offset_size
);
8615 hdrptr
+= offset_size
;
8617 arange
.ar_pointer_size
= byte_get (hdrptr
, 1);
8620 arange
.ar_segment_size
= byte_get (hdrptr
, 1);
8623 if (arange
.ar_version
!= 2 && arange
.ar_version
!= 3)
8625 warn (_("Only DWARF 2 and 3 aranges are currently supported.\n"));
8629 printf (_(" Length: %ld\n"), arange
.ar_length
);
8630 printf (_(" Version: %d\n"), arange
.ar_version
);
8631 printf (_(" Offset into .debug_info: %lx\n"), arange
.ar_info_offset
);
8632 printf (_(" Pointer Size: %d\n"), arange
.ar_pointer_size
);
8633 printf (_(" Segment Size: %d\n"), arange
.ar_segment_size
);
8635 printf (_("\n Address Length\n"));
8639 /* Must pad to an alignment boundary that is twice the pointer size. */
8640 excess
= (hdrptr
- start
) % (2 * arange
.ar_pointer_size
);
8642 ranges
+= (2 * arange
.ar_pointer_size
) - excess
;
8646 address
= byte_get (ranges
, arange
.ar_pointer_size
);
8648 ranges
+= arange
.ar_pointer_size
;
8650 length
= byte_get (ranges
, arange
.ar_pointer_size
);
8652 ranges
+= arange
.ar_pointer_size
;
8654 /* A pair of zeros marks the end of the list. */
8655 if (address
== 0 && length
== 0)
8658 printf (" %8.8lx %lu\n", address
, length
);
8661 start
+= arange
.ar_length
+ initial_length_size
;
8669 typedef struct Frame_Chunk
8671 struct Frame_Chunk
*next
;
8672 unsigned char *chunk_start
;
8674 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8675 short int *col_type
;
8678 unsigned int code_factor
;
8680 unsigned long pc_begin
;
8681 unsigned long pc_range
;
8685 unsigned char fde_encoding
;
8686 unsigned char cfa_exp
;
8690 /* A marker for a col_type that means this column was never referenced
8691 in the frame info. */
8692 #define DW_CFA_unreferenced (-1)
8694 static void frame_need_space
PARAMS ((Frame_Chunk
*, int));
8695 static void frame_display_row
PARAMS ((Frame_Chunk
*, int *, int *));
8696 static int size_of_encoded_value
PARAMS ((int));
8697 static bfd_vma get_encoded_value
PARAMS ((unsigned char *, int));
8700 frame_need_space (fc
, reg
)
8704 int prev
= fc
->ncols
;
8706 if (reg
< fc
->ncols
)
8709 fc
->ncols
= reg
+ 1;
8710 fc
->col_type
= (short int *) xrealloc (fc
->col_type
,
8711 fc
->ncols
* sizeof (short int));
8712 fc
->col_offset
= (int *) xrealloc (fc
->col_offset
,
8713 fc
->ncols
* sizeof (int));
8715 while (prev
< fc
->ncols
)
8717 fc
->col_type
[prev
] = DW_CFA_unreferenced
;
8718 fc
->col_offset
[prev
] = 0;
8724 frame_display_row (fc
, need_col_headers
, max_regs
)
8726 int *need_col_headers
;
8732 if (*max_regs
< fc
->ncols
)
8733 *max_regs
= fc
->ncols
;
8735 if (*need_col_headers
)
8737 *need_col_headers
= 0;
8739 printf (" LOC CFA ");
8741 for (r
= 0; r
< *max_regs
; r
++)
8742 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8747 printf ("r%-4d", r
);
8753 printf ("%08lx ", fc
->pc_begin
);
8755 strcpy (tmp
, "exp");
8757 sprintf (tmp
, "r%d%+d", fc
->cfa_reg
, fc
->cfa_offset
);
8758 printf ("%-8s ", tmp
);
8760 for (r
= 0; r
< fc
->ncols
; r
++)
8762 if (fc
->col_type
[r
] != DW_CFA_unreferenced
)
8764 switch (fc
->col_type
[r
])
8766 case DW_CFA_undefined
:
8769 case DW_CFA_same_value
:
8773 sprintf (tmp
, "c%+d", fc
->col_offset
[r
]);
8775 case DW_CFA_register
:
8776 sprintf (tmp
, "r%d", fc
->col_offset
[r
]);
8778 case DW_CFA_expression
:
8779 strcpy (tmp
, "exp");
8782 strcpy (tmp
, "n/a");
8785 printf ("%-5s", tmp
);
8792 size_of_encoded_value (encoding
)
8795 switch (encoding
& 0x7)
8798 case 0: return is_32bit_elf
? 4 : 8;
8806 get_encoded_value (data
, encoding
)
8807 unsigned char *data
;
8810 int size
= size_of_encoded_value (encoding
);
8811 if (encoding
& DW_EH_PE_signed
)
8812 return byte_get_signed (data
, size
);
8814 return byte_get (data
, size
);
8817 #define GET(N) byte_get (start, N); start += N
8818 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8819 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8822 display_debug_frames (section
, start
, file
)
8823 Elf_Internal_Shdr
*section
;
8824 unsigned char *start
;
8825 FILE *file ATTRIBUTE_UNUSED
;
8827 unsigned char *end
= start
+ section
->sh_size
;
8828 unsigned char *section_start
= start
;
8829 Frame_Chunk
*chunks
= 0;
8830 Frame_Chunk
*remembered_state
= 0;
8832 int is_eh
= (strcmp (SECTION_NAME (section
), ".eh_frame") == 0);
8835 int addr_size
= is_32bit_elf
? 4 : 8;
8837 printf (_("The section %s contains:\n"), SECTION_NAME (section
));
8841 unsigned char *saved_start
;
8842 unsigned char *block_end
;
8843 unsigned long length
;
8844 unsigned long cie_id
;
8847 int need_col_headers
= 1;
8848 unsigned char *augmentation_data
= NULL
;
8849 unsigned long augmentation_data_len
= 0;
8850 int encoded_ptr_size
= addr_size
;
8852 int initial_length_size
;
8854 saved_start
= start
;
8855 length
= byte_get (start
, 4); start
+= 4;
8859 printf ("\n%08lx ZERO terminator\n\n",
8860 (unsigned long)(saved_start
- section_start
));
8864 if (length
== 0xffffffff)
8866 length
= byte_get (start
, 8);
8869 initial_length_size
= 12;
8874 initial_length_size
= 4;
8877 block_end
= saved_start
+ length
+ initial_length_size
;
8878 cie_id
= byte_get (start
, offset_size
); start
+= offset_size
;
8880 if (is_eh
? (cie_id
== 0) : (cie_id
== DW_CIE_ID
))
8884 fc
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
8885 memset (fc
, 0, sizeof (Frame_Chunk
));
8889 fc
->chunk_start
= saved_start
;
8891 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8892 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8893 frame_need_space (fc
, max_regs
-1);
8897 fc
->augmentation
= start
;
8898 start
= strchr (start
, '\0') + 1;
8900 if (fc
->augmentation
[0] == 'z')
8902 fc
->code_factor
= LEB ();
8903 fc
->data_factor
= SLEB ();
8904 fc
->ra
= byte_get (start
, 1); start
+= 1;
8905 augmentation_data_len
= LEB ();
8906 augmentation_data
= start
;
8907 start
+= augmentation_data_len
;
8909 else if (strcmp (fc
->augmentation
, "eh") == 0)
8912 fc
->code_factor
= LEB ();
8913 fc
->data_factor
= SLEB ();
8914 fc
->ra
= byte_get (start
, 1); start
+= 1;
8918 fc
->code_factor
= LEB ();
8919 fc
->data_factor
= SLEB ();
8920 fc
->ra
= byte_get (start
, 1); start
+= 1;
8924 if (do_debug_frames_interp
)
8925 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8926 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
8927 fc
->augmentation
, fc
->code_factor
, fc
->data_factor
,
8931 printf ("\n%08lx %08lx %08lx CIE\n",
8932 (unsigned long)(saved_start
- section_start
), length
, cie_id
);
8933 printf (" Version: %d\n", version
);
8934 printf (" Augmentation: \"%s\"\n", fc
->augmentation
);
8935 printf (" Code alignment factor: %u\n", fc
->code_factor
);
8936 printf (" Data alignment factor: %d\n", fc
->data_factor
);
8937 printf (" Return address column: %d\n", fc
->ra
);
8939 if (augmentation_data_len
)
8942 printf (" Augmentation data: ");
8943 for (i
= 0; i
< augmentation_data_len
; ++i
)
8944 printf (" %02x", augmentation_data
[i
]);
8950 if (augmentation_data_len
)
8952 unsigned char *p
, *q
;
8953 p
= fc
->augmentation
+ 1;
8954 q
= augmentation_data
;
8961 q
+= 1 + size_of_encoded_value (*q
);
8963 fc
->fde_encoding
= *q
++;
8969 if (fc
->fde_encoding
)
8970 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
8973 frame_need_space (fc
, fc
->ra
);
8977 unsigned char *look_for
;
8978 static Frame_Chunk fde_fc
;
8981 memset (fc
, 0, sizeof (Frame_Chunk
));
8983 look_for
= is_eh
? start
- 4 - cie_id
: section_start
+ cie_id
;
8985 for (cie
= chunks
; cie
; cie
= cie
->next
)
8986 if (cie
->chunk_start
== look_for
)
8991 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8992 cie_id
, saved_start
);
8995 fc
->col_type
= (short int *) xmalloc (sizeof (short int));
8996 fc
->col_offset
= (int *) xmalloc (sizeof (int));
8997 frame_need_space (fc
, max_regs
- 1);
8999 fc
->augmentation
= "";
9000 fc
->fde_encoding
= 0;
9004 fc
->ncols
= cie
->ncols
;
9005 fc
->col_type
= (short int *) xmalloc (fc
->ncols
* sizeof (short int));
9006 fc
->col_offset
= (int *) xmalloc (fc
->ncols
* sizeof (int));
9007 memcpy (fc
->col_type
, cie
->col_type
, fc
->ncols
* sizeof (short int));
9008 memcpy (fc
->col_offset
, cie
->col_offset
, fc
->ncols
* sizeof (int));
9009 fc
->augmentation
= cie
->augmentation
;
9010 fc
->code_factor
= cie
->code_factor
;
9011 fc
->data_factor
= cie
->data_factor
;
9012 fc
->cfa_reg
= cie
->cfa_reg
;
9013 fc
->cfa_offset
= cie
->cfa_offset
;
9015 frame_need_space (fc
, max_regs
-1);
9016 fc
->fde_encoding
= cie
->fde_encoding
;
9019 if (fc
->fde_encoding
)
9020 encoded_ptr_size
= size_of_encoded_value (fc
->fde_encoding
);
9022 fc
->pc_begin
= get_encoded_value (start
, fc
->fde_encoding
);
9023 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9024 fc
->pc_begin
+= section
->sh_addr
+ (start
- section_start
);
9025 start
+= encoded_ptr_size
;
9026 fc
->pc_range
= byte_get (start
, encoded_ptr_size
);
9027 start
+= encoded_ptr_size
;
9029 if (cie
->augmentation
[0] == 'z')
9031 augmentation_data_len
= LEB ();
9032 augmentation_data
= start
;
9033 start
+= augmentation_data_len
;
9036 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
9037 (unsigned long)(saved_start
- section_start
), length
, cie_id
,
9038 (unsigned long)(cie
->chunk_start
- section_start
),
9039 fc
->pc_begin
, fc
->pc_begin
+ fc
->pc_range
);
9040 if (! do_debug_frames_interp
&& augmentation_data_len
)
9043 printf (" Augmentation data: ");
9044 for (i
= 0; i
< augmentation_data_len
; ++i
)
9045 printf (" %02x", augmentation_data
[i
]);
9051 /* At this point, fc is the current chunk, cie (if any) is set, and we're
9052 about to interpret instructions for the chunk. */
9053 /* ??? At present we need to do this always, since this sizes the
9054 fc->col_type and fc->col_offset arrays, which we write into always.
9055 We should probably split the interpreted and non-interpreted bits
9056 into two different routines, since there's so much that doesn't
9057 really overlap between them. */
9058 if (1 || do_debug_frames_interp
)
9060 /* Start by making a pass over the chunk, allocating storage
9061 and taking note of what registers are used. */
9062 unsigned char *tmp
= start
;
9064 while (start
< block_end
)
9067 unsigned long reg
, tmp
;
9074 /* Warning: if you add any more cases to this switch, be
9075 sure to add them to the corresponding switch below. */
9078 case DW_CFA_advance_loc
:
9082 frame_need_space (fc
, opa
);
9083 fc
->col_type
[opa
] = DW_CFA_undefined
;
9085 case DW_CFA_restore
:
9086 frame_need_space (fc
, opa
);
9087 fc
->col_type
[opa
] = DW_CFA_undefined
;
9089 case DW_CFA_set_loc
:
9090 start
+= encoded_ptr_size
;
9092 case DW_CFA_advance_loc1
:
9095 case DW_CFA_advance_loc2
:
9098 case DW_CFA_advance_loc4
:
9101 case DW_CFA_offset_extended
:
9102 reg
= LEB (); LEB ();
9103 frame_need_space (fc
, reg
);
9104 fc
->col_type
[reg
] = DW_CFA_undefined
;
9106 case DW_CFA_restore_extended
:
9108 frame_need_space (fc
, reg
);
9109 fc
->col_type
[reg
] = DW_CFA_undefined
;
9111 case DW_CFA_undefined
:
9113 frame_need_space (fc
, reg
);
9114 fc
->col_type
[reg
] = DW_CFA_undefined
;
9116 case DW_CFA_same_value
:
9118 frame_need_space (fc
, reg
);
9119 fc
->col_type
[reg
] = DW_CFA_undefined
;
9121 case DW_CFA_register
:
9122 reg
= LEB (); LEB ();
9123 frame_need_space (fc
, reg
);
9124 fc
->col_type
[reg
] = DW_CFA_undefined
;
9126 case DW_CFA_def_cfa
:
9129 case DW_CFA_def_cfa_register
:
9132 case DW_CFA_def_cfa_offset
:
9135 case DW_CFA_def_cfa_expression
:
9139 case DW_CFA_expression
:
9143 frame_need_space (fc
, reg
);
9144 fc
->col_type
[reg
] = DW_CFA_undefined
;
9146 case DW_CFA_offset_extended_sf
:
9147 reg
= LEB (); SLEB ();
9148 frame_need_space (fc
, reg
);
9149 fc
->col_type
[reg
] = DW_CFA_undefined
;
9151 case DW_CFA_def_cfa_sf
:
9154 case DW_CFA_def_cfa_offset_sf
:
9157 case DW_CFA_MIPS_advance_loc8
:
9160 case DW_CFA_GNU_args_size
:
9163 case DW_CFA_GNU_negative_offset_extended
:
9164 reg
= LEB (); LEB ();
9165 frame_need_space (fc
, reg
);
9166 fc
->col_type
[reg
] = DW_CFA_undefined
;
9175 /* Now we know what registers are used, make a second pass over
9176 the chunk, this time actually printing out the info. */
9178 while (start
< block_end
)
9181 unsigned long ul
, reg
, roffs
;
9190 /* Warning: if you add any more cases to this switch, be
9191 sure to add them to the corresponding switch above. */
9194 case DW_CFA_advance_loc
:
9195 if (do_debug_frames_interp
)
9196 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9198 printf (" DW_CFA_advance_loc: %d to %08lx\n",
9199 opa
* fc
->code_factor
,
9200 fc
->pc_begin
+ opa
* fc
->code_factor
);
9201 fc
->pc_begin
+= opa
* fc
->code_factor
;
9206 if (! do_debug_frames_interp
)
9207 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
9208 opa
, roffs
* fc
->data_factor
);
9209 fc
->col_type
[opa
] = DW_CFA_offset
;
9210 fc
->col_offset
[opa
] = roffs
* fc
->data_factor
;
9213 case DW_CFA_restore
:
9214 if (! do_debug_frames_interp
)
9215 printf (" DW_CFA_restore: r%d\n", opa
);
9216 fc
->col_type
[opa
] = cie
->col_type
[opa
];
9217 fc
->col_offset
[opa
] = cie
->col_offset
[opa
];
9220 case DW_CFA_set_loc
:
9221 vma
= get_encoded_value (start
, fc
->fde_encoding
);
9222 if ((fc
->fde_encoding
& 0x70) == DW_EH_PE_pcrel
)
9223 vma
+= section
->sh_addr
+ (start
- section_start
);
9224 start
+= encoded_ptr_size
;
9225 if (do_debug_frames_interp
)
9226 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9228 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma
);
9232 case DW_CFA_advance_loc1
:
9233 ofs
= byte_get (start
, 1); start
+= 1;
9234 if (do_debug_frames_interp
)
9235 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9237 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
9238 ofs
* fc
->code_factor
,
9239 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9240 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9243 case DW_CFA_advance_loc2
:
9244 ofs
= byte_get (start
, 2); start
+= 2;
9245 if (do_debug_frames_interp
)
9246 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9248 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
9249 ofs
* fc
->code_factor
,
9250 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9251 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9254 case DW_CFA_advance_loc4
:
9255 ofs
= byte_get (start
, 4); start
+= 4;
9256 if (do_debug_frames_interp
)
9257 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9259 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
9260 ofs
* fc
->code_factor
,
9261 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9262 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9265 case DW_CFA_offset_extended
:
9268 if (! do_debug_frames_interp
)
9269 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
9270 reg
, roffs
* fc
->data_factor
);
9271 fc
->col_type
[reg
] = DW_CFA_offset
;
9272 fc
->col_offset
[reg
] = roffs
* fc
->data_factor
;
9275 case DW_CFA_restore_extended
:
9277 if (! do_debug_frames_interp
)
9278 printf (" DW_CFA_restore_extended: r%ld\n", reg
);
9279 fc
->col_type
[reg
] = cie
->col_type
[reg
];
9280 fc
->col_offset
[reg
] = cie
->col_offset
[reg
];
9283 case DW_CFA_undefined
:
9285 if (! do_debug_frames_interp
)
9286 printf (" DW_CFA_undefined: r%ld\n", reg
);
9287 fc
->col_type
[reg
] = DW_CFA_undefined
;
9288 fc
->col_offset
[reg
] = 0;
9291 case DW_CFA_same_value
:
9293 if (! do_debug_frames_interp
)
9294 printf (" DW_CFA_same_value: r%ld\n", reg
);
9295 fc
->col_type
[reg
] = DW_CFA_same_value
;
9296 fc
->col_offset
[reg
] = 0;
9299 case DW_CFA_register
:
9302 if (! do_debug_frames_interp
)
9303 printf (" DW_CFA_register: r%ld in r%ld\n", reg
, roffs
);
9304 fc
->col_type
[reg
] = DW_CFA_register
;
9305 fc
->col_offset
[reg
] = roffs
;
9308 case DW_CFA_remember_state
:
9309 if (! do_debug_frames_interp
)
9310 printf (" DW_CFA_remember_state\n");
9311 rs
= (Frame_Chunk
*) xmalloc (sizeof (Frame_Chunk
));
9312 rs
->ncols
= fc
->ncols
;
9313 rs
->col_type
= (short int *) xmalloc (rs
->ncols
* sizeof (short int));
9314 rs
->col_offset
= (int *) xmalloc (rs
->ncols
* sizeof (int));
9315 memcpy (rs
->col_type
, fc
->col_type
, rs
->ncols
);
9316 memcpy (rs
->col_offset
, fc
->col_offset
, rs
->ncols
* sizeof (int));
9317 rs
->next
= remembered_state
;
9318 remembered_state
= rs
;
9321 case DW_CFA_restore_state
:
9322 if (! do_debug_frames_interp
)
9323 printf (" DW_CFA_restore_state\n");
9324 rs
= remembered_state
;
9325 remembered_state
= rs
->next
;
9326 frame_need_space (fc
, rs
->ncols
-1);
9327 memcpy (fc
->col_type
, rs
->col_type
, rs
->ncols
);
9328 memcpy (fc
->col_offset
, rs
->col_offset
, rs
->ncols
* sizeof (int));
9329 free (rs
->col_type
);
9330 free (rs
->col_offset
);
9334 case DW_CFA_def_cfa
:
9335 fc
->cfa_reg
= LEB ();
9336 fc
->cfa_offset
= LEB ();
9338 if (! do_debug_frames_interp
)
9339 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9340 fc
->cfa_reg
, fc
->cfa_offset
);
9343 case DW_CFA_def_cfa_register
:
9344 fc
->cfa_reg
= LEB ();
9346 if (! do_debug_frames_interp
)
9347 printf (" DW_CFA_def_cfa_reg: r%d\n", fc
->cfa_reg
);
9350 case DW_CFA_def_cfa_offset
:
9351 fc
->cfa_offset
= LEB ();
9352 if (! do_debug_frames_interp
)
9353 printf (" DW_CFA_def_cfa_offset: %d\n", fc
->cfa_offset
);
9357 if (! do_debug_frames_interp
)
9358 printf (" DW_CFA_nop\n");
9361 case DW_CFA_def_cfa_expression
:
9363 if (! do_debug_frames_interp
)
9365 printf (" DW_CFA_def_cfa_expression (");
9366 decode_location_expression (start
, addr_size
, ul
);
9373 case DW_CFA_expression
:
9376 if (! do_debug_frames_interp
)
9378 printf (" DW_CFA_expression: r%ld (", reg
);
9379 decode_location_expression (start
, addr_size
, ul
);
9382 fc
->col_type
[reg
] = DW_CFA_expression
;
9386 case DW_CFA_offset_extended_sf
:
9389 frame_need_space (fc
, reg
);
9390 if (! do_debug_frames_interp
)
9391 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9392 reg
, l
* fc
->data_factor
);
9393 fc
->col_type
[reg
] = DW_CFA_offset
;
9394 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9397 case DW_CFA_def_cfa_sf
:
9398 fc
->cfa_reg
= LEB ();
9399 fc
->cfa_offset
= SLEB ();
9401 if (! do_debug_frames_interp
)
9402 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9403 fc
->cfa_reg
, fc
->cfa_offset
);
9406 case DW_CFA_def_cfa_offset_sf
:
9407 fc
->cfa_offset
= SLEB ();
9408 if (! do_debug_frames_interp
)
9409 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc
->cfa_offset
);
9412 case DW_CFA_MIPS_advance_loc8
:
9413 ofs
= byte_get (start
, 8); start
+= 8;
9414 if (do_debug_frames_interp
)
9415 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9417 printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
9418 ofs
* fc
->code_factor
,
9419 fc
->pc_begin
+ ofs
* fc
->code_factor
);
9420 fc
->pc_begin
+= ofs
* fc
->code_factor
;
9423 case DW_CFA_GNU_window_save
:
9424 if (! do_debug_frames_interp
)
9425 printf (" DW_CFA_GNU_window_save\n");
9428 case DW_CFA_GNU_args_size
:
9430 if (! do_debug_frames_interp
)
9431 printf (" DW_CFA_GNU_args_size: %ld\n", ul
);
9434 case DW_CFA_GNU_negative_offset_extended
:
9437 frame_need_space (fc
, reg
);
9438 if (! do_debug_frames_interp
)
9439 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9440 reg
, l
* fc
->data_factor
);
9441 fc
->col_type
[reg
] = DW_CFA_offset
;
9442 fc
->col_offset
[reg
] = l
* fc
->data_factor
;
9446 fprintf (stderr
, "unsupported or unknown DW_CFA_%d\n", op
);
9451 if (do_debug_frames_interp
)
9452 frame_display_row (fc
, &need_col_headers
, &max_regs
);
9467 display_debug_not_supported (section
, start
, file
)
9468 Elf_Internal_Shdr
*section
;
9469 unsigned char *start ATTRIBUTE_UNUSED
;
9470 FILE *file ATTRIBUTE_UNUSED
;
9472 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9473 SECTION_NAME (section
));
9478 /* Pre-scan the .debug_info section to record the size of address.
9479 When dumping the .debug_line, we use that size information, assuming
9480 that all compilation units have the same address size. */
9482 prescan_debug_info (section
, start
, file
)
9483 Elf_Internal_Shdr
*section ATTRIBUTE_UNUSED
;
9484 unsigned char *start
;
9485 FILE *file ATTRIBUTE_UNUSED
;
9487 unsigned long length
;
9489 /* Read the first 4 bytes. For a 32-bit DWARF section, this will
9490 be the length. For a 64-bit DWARF section, it'll be the escape
9491 code 0xffffffff followed by an 8 byte length. For the purposes
9492 of this prescan, we don't care about the actual length, but the
9493 presence of the escape bytes does affect the location of the byte
9494 which describes the address size. */
9495 length
= byte_get (start
, 4);
9497 if (length
== 0xffffffff)
9499 /* For 64-bit DWARF, the 1-byte address_size field is 22 bytes
9500 from the start of the section. This is computed as follows:
9502 unit_length: 12 bytes
9504 debug_abbrev_offset: 8 bytes
9505 -----------------------------
9508 debug_line_pointer_size
= byte_get (start
+ 22, 1);
9512 /* For 32-bit DWARF, the 1-byte address_size field is 10 bytes from
9513 the start of the section:
9514 unit_length: 4 bytes
9516 debug_abbrev_offset: 4 bytes
9517 -----------------------------
9520 debug_line_pointer_size
= byte_get (start
+ 10, 1);
9525 /* A structure containing the name of a debug section and a pointer
9526 to a function that can decode it. The third field is a prescan
9527 function to be run over the section before displaying any of the
9531 const char *const name
;
9532 int (*display
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9533 int (*prescan
) PARAMS ((Elf_Internal_Shdr
*, unsigned char *, FILE *));
9537 { ".debug_abbrev", display_debug_abbrev
, NULL
},
9538 { ".debug_aranges", display_debug_aranges
, NULL
},
9539 { ".debug_frame", display_debug_frames
, NULL
},
9540 { ".debug_info", display_debug_info
, prescan_debug_info
},
9541 { ".debug_line", display_debug_lines
, NULL
},
9542 { ".debug_pubnames", display_debug_pubnames
, NULL
},
9543 { ".eh_frame", display_debug_frames
, NULL
},
9544 { ".debug_macinfo", display_debug_macinfo
, NULL
},
9545 { ".debug_str", display_debug_str
, NULL
},
9546 { ".debug_loc", display_debug_loc
, NULL
},
9547 { ".debug_pubtypes", display_debug_not_supported
, NULL
},
9548 { ".debug_ranges", display_debug_not_supported
, NULL
},
9549 { ".debug_static_func", display_debug_not_supported
, NULL
},
9550 { ".debug_static_vars", display_debug_not_supported
, NULL
},
9551 { ".debug_types", display_debug_not_supported
, NULL
},
9552 { ".debug_weaknames", display_debug_not_supported
, NULL
}
9556 display_debug_section (section
, file
)
9557 Elf_Internal_Shdr
*section
;
9560 char *name
= SECTION_NAME (section
);
9561 bfd_size_type length
;
9562 unsigned char *start
;
9565 length
= section
->sh_size
;
9568 printf (_("\nSection '%s' has no debugging data.\n"), name
);
9572 start
= (unsigned char *) get_data (NULL
, file
, section
->sh_offset
, length
,
9573 _("debug section data"));
9577 /* See if we know how to display the contents of this section. */
9578 if (strncmp (name
, ".gnu.linkonce.wi.", 17) == 0)
9579 name
= ".debug_info";
9581 for (i
= NUM_ELEM (debug_displays
); i
--;)
9582 if (strcmp (debug_displays
[i
].name
, name
) == 0)
9584 debug_displays
[i
].display (section
, start
, file
);
9589 printf (_("Unrecognized debug section: %s\n"), name
);
9593 /* If we loaded in the abbrev section at some point,
9594 we must release it here. */
9601 process_section_contents (file
)
9604 Elf_Internal_Shdr
*section
;
9610 /* Pre-scan the debug sections to find some debug information not
9611 present in some of them. For the .debug_line, we must find out the
9612 size of address (specified in .debug_info and .debug_aranges). */
9613 for (i
= 0, section
= section_headers
;
9614 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9617 char *name
= SECTION_NAME (section
);
9620 if (section
->sh_size
== 0)
9623 /* See if there is some pre-scan operation for this section. */
9624 for (j
= NUM_ELEM (debug_displays
); j
--;)
9625 if (strcmp (debug_displays
[j
].name
, name
) == 0)
9627 if (debug_displays
[j
].prescan
!= NULL
)
9629 bfd_size_type length
;
9630 unsigned char *start
;
9632 length
= section
->sh_size
;
9633 start
= ((unsigned char *)
9634 get_data (NULL
, file
, section
->sh_offset
, length
,
9635 _("debug section data")));
9639 debug_displays
[j
].prescan (section
, start
, file
);
9647 for (i
= 0, section
= section_headers
;
9648 i
< elf_header
.e_shnum
&& i
< num_dump_sects
;
9651 #ifdef SUPPORT_DISASSEMBLY
9652 if (dump_sects
[i
] & DISASS_DUMP
)
9653 disassemble_section (section
, file
);
9655 if (dump_sects
[i
] & HEX_DUMP
)
9656 dump_section (section
, file
);
9658 if (dump_sects
[i
] & DEBUG_DUMP
)
9659 display_debug_section (section
, file
);
9662 if (i
< num_dump_sects
)
9663 warn (_("Some sections were not dumped because they do not exist!\n"));
9669 process_mips_fpe_exception (mask
)
9675 if (mask
& OEX_FPU_INEX
)
9676 fputs ("INEX", stdout
), first
= 0;
9677 if (mask
& OEX_FPU_UFLO
)
9678 printf ("%sUFLO", first
? "" : "|"), first
= 0;
9679 if (mask
& OEX_FPU_OFLO
)
9680 printf ("%sOFLO", first
? "" : "|"), first
= 0;
9681 if (mask
& OEX_FPU_DIV0
)
9682 printf ("%sDIV0", first
? "" : "|"), first
= 0;
9683 if (mask
& OEX_FPU_INVAL
)
9684 printf ("%sINVAL", first
? "" : "|");
9687 fputs ("0", stdout
);
9691 process_mips_specific (file
)
9694 Elf_Internal_Dyn
*entry
;
9695 size_t liblist_offset
= 0;
9696 size_t liblistno
= 0;
9697 size_t conflictsno
= 0;
9698 size_t options_offset
= 0;
9699 size_t conflicts_offset
= 0;
9701 /* We have a lot of special sections. Thanks SGI! */
9702 if (dynamic_segment
== NULL
)
9703 /* No information available. */
9706 for (entry
= dynamic_segment
; entry
->d_tag
!= DT_NULL
; ++entry
)
9707 switch (entry
->d_tag
)
9709 case DT_MIPS_LIBLIST
:
9710 liblist_offset
= entry
->d_un
.d_val
- loadaddr
;
9712 case DT_MIPS_LIBLISTNO
:
9713 liblistno
= entry
->d_un
.d_val
;
9715 case DT_MIPS_OPTIONS
:
9716 options_offset
= entry
->d_un
.d_val
- loadaddr
;
9718 case DT_MIPS_CONFLICT
:
9719 conflicts_offset
= entry
->d_un
.d_val
- loadaddr
;
9721 case DT_MIPS_CONFLICTNO
:
9722 conflictsno
= entry
->d_un
.d_val
;
9728 if (liblist_offset
!= 0 && liblistno
!= 0 && do_dynamic
)
9730 Elf32_External_Lib
*elib
;
9733 elib
= ((Elf32_External_Lib
*)
9734 get_data (NULL
, file
, liblist_offset
,
9735 liblistno
* sizeof (Elf32_External_Lib
),
9739 printf ("\nSection '.liblist' contains %lu entries:\n",
9740 (unsigned long) liblistno
);
9741 fputs (" Library Time Stamp Checksum Version Flags\n",
9744 for (cnt
= 0; cnt
< liblistno
; ++cnt
)
9751 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
9752 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
9753 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
9754 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
9755 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
9757 tmp
= gmtime (&time
);
9758 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
9759 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
9760 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
9762 printf ("%3lu: ", (unsigned long) cnt
);
9763 print_symbol (20, dynamic_strings
+ liblist
.l_name
);
9764 printf (" %s %#10lx %-7ld", timebuf
, liblist
.l_checksum
,
9767 if (liblist
.l_flags
== 0)
9778 { " EXACT_MATCH", LL_EXACT_MATCH
},
9779 { " IGNORE_INT_VER", LL_IGNORE_INT_VER
},
9780 { " REQUIRE_MINOR", LL_REQUIRE_MINOR
},
9781 { " EXPORTS", LL_EXPORTS
},
9782 { " DELAY_LOAD", LL_DELAY_LOAD
},
9783 { " DELTA", LL_DELTA
}
9785 int flags
= liblist
.l_flags
;
9789 fcnt
< sizeof (l_flags_vals
) / sizeof (l_flags_vals
[0]);
9791 if ((flags
& l_flags_vals
[fcnt
].bit
) != 0)
9793 fputs (l_flags_vals
[fcnt
].name
, stdout
);
9794 flags
^= l_flags_vals
[fcnt
].bit
;
9797 printf (" %#x", (unsigned int) flags
);
9807 if (options_offset
!= 0)
9809 Elf_External_Options
*eopt
;
9810 Elf_Internal_Shdr
*sect
= section_headers
;
9811 Elf_Internal_Options
*iopt
;
9812 Elf_Internal_Options
*option
;
9816 /* Find the section header so that we get the size. */
9817 while (sect
->sh_type
!= SHT_MIPS_OPTIONS
)
9820 eopt
= (Elf_External_Options
*) get_data (NULL
, file
, options_offset
,
9821 sect
->sh_size
, _("options"));
9824 iopt
= ((Elf_Internal_Options
*)
9825 malloc ((sect
->sh_size
/ sizeof (eopt
)) * sizeof (*iopt
)));
9828 error (_("Out of memory"));
9835 while (offset
< sect
->sh_size
)
9837 Elf_External_Options
*eoption
;
9839 eoption
= (Elf_External_Options
*) ((char *) eopt
+ offset
);
9841 option
->kind
= BYTE_GET (eoption
->kind
);
9842 option
->size
= BYTE_GET (eoption
->size
);
9843 option
->section
= BYTE_GET (eoption
->section
);
9844 option
->info
= BYTE_GET (eoption
->info
);
9846 offset
+= option
->size
;
9852 printf (_("\nSection '%s' contains %d entries:\n"),
9853 SECTION_NAME (sect
), cnt
);
9861 switch (option
->kind
)
9864 /* This shouldn't happen. */
9865 printf (" NULL %d %lx", option
->section
, option
->info
);
9868 printf (" REGINFO ");
9869 if (elf_header
.e_machine
== EM_MIPS
)
9872 Elf32_External_RegInfo
*ereg
;
9873 Elf32_RegInfo reginfo
;
9875 ereg
= (Elf32_External_RegInfo
*) (option
+ 1);
9876 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9877 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9878 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9879 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9880 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9881 reginfo
.ri_gp_value
= BYTE_GET (ereg
->ri_gp_value
);
9883 printf ("GPR %08lx GP 0x%lx\n",
9885 (unsigned long) reginfo
.ri_gp_value
);
9886 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9887 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9888 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9893 Elf64_External_RegInfo
*ereg
;
9894 Elf64_Internal_RegInfo reginfo
;
9896 ereg
= (Elf64_External_RegInfo
*) (option
+ 1);
9897 reginfo
.ri_gprmask
= BYTE_GET (ereg
->ri_gprmask
);
9898 reginfo
.ri_cprmask
[0] = BYTE_GET (ereg
->ri_cprmask
[0]);
9899 reginfo
.ri_cprmask
[1] = BYTE_GET (ereg
->ri_cprmask
[1]);
9900 reginfo
.ri_cprmask
[2] = BYTE_GET (ereg
->ri_cprmask
[2]);
9901 reginfo
.ri_cprmask
[3] = BYTE_GET (ereg
->ri_cprmask
[3]);
9902 reginfo
.ri_gp_value
= BYTE_GET8 (ereg
->ri_gp_value
);
9904 printf ("GPR %08lx GP 0x",
9905 reginfo
.ri_gprmask
);
9906 printf_vma (reginfo
.ri_gp_value
);
9909 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9910 reginfo
.ri_cprmask
[0], reginfo
.ri_cprmask
[1],
9911 reginfo
.ri_cprmask
[2], reginfo
.ri_cprmask
[3]);
9915 case ODK_EXCEPTIONS
:
9916 fputs (" EXCEPTIONS fpe_min(", stdout
);
9917 process_mips_fpe_exception (option
->info
& OEX_FPU_MIN
);
9918 fputs (") fpe_max(", stdout
);
9919 process_mips_fpe_exception ((option
->info
& OEX_FPU_MAX
) >> 8);
9920 fputs (")", stdout
);
9922 if (option
->info
& OEX_PAGE0
)
9923 fputs (" PAGE0", stdout
);
9924 if (option
->info
& OEX_SMM
)
9925 fputs (" SMM", stdout
);
9926 if (option
->info
& OEX_FPDBUG
)
9927 fputs (" FPDBUG", stdout
);
9928 if (option
->info
& OEX_DISMISS
)
9929 fputs (" DISMISS", stdout
);
9932 fputs (" PAD ", stdout
);
9933 if (option
->info
& OPAD_PREFIX
)
9934 fputs (" PREFIX", stdout
);
9935 if (option
->info
& OPAD_POSTFIX
)
9936 fputs (" POSTFIX", stdout
);
9937 if (option
->info
& OPAD_SYMBOL
)
9938 fputs (" SYMBOL", stdout
);
9941 fputs (" HWPATCH ", stdout
);
9942 if (option
->info
& OHW_R4KEOP
)
9943 fputs (" R4KEOP", stdout
);
9944 if (option
->info
& OHW_R8KPFETCH
)
9945 fputs (" R8KPFETCH", stdout
);
9946 if (option
->info
& OHW_R5KEOP
)
9947 fputs (" R5KEOP", stdout
);
9948 if (option
->info
& OHW_R5KCVTL
)
9949 fputs (" R5KCVTL", stdout
);
9952 fputs (" FILL ", stdout
);
9953 /* XXX Print content of info word? */
9956 fputs (" TAGS ", stdout
);
9957 /* XXX Print content of info word? */
9960 fputs (" HWAND ", stdout
);
9961 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9962 fputs (" R4KEOP_CHECKED", stdout
);
9963 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9964 fputs (" R4KEOP_CLEAN", stdout
);
9967 fputs (" HWOR ", stdout
);
9968 if (option
->info
& OHWA0_R4KEOP_CHECKED
)
9969 fputs (" R4KEOP_CHECKED", stdout
);
9970 if (option
->info
& OHWA0_R4KEOP_CLEAN
)
9971 fputs (" R4KEOP_CLEAN", stdout
);
9974 printf (" GP_GROUP %#06lx self-contained %#06lx",
9975 option
->info
& OGP_GROUP
,
9976 (option
->info
& OGP_SELF
) >> 16);
9979 printf (" IDENT %#06lx self-contained %#06lx",
9980 option
->info
& OGP_GROUP
,
9981 (option
->info
& OGP_SELF
) >> 16);
9984 /* This shouldn't happen. */
9985 printf (" %3d ??? %d %lx",
9986 option
->kind
, option
->section
, option
->info
);
9990 len
= sizeof (*eopt
);
9991 while (len
< option
->size
)
9992 if (((char *) option
)[len
] >= ' '
9993 && ((char *) option
)[len
] < 0x7f)
9994 printf ("%c", ((char *) option
)[len
++]);
9996 printf ("\\%03o", ((char *) option
)[len
++]);
9998 fputs ("\n", stdout
);
10006 if (conflicts_offset
!= 0 && conflictsno
!= 0)
10008 Elf32_Conflict
*iconf
;
10011 if (dynamic_symbols
== NULL
)
10013 error (_("conflict list found without a dynamic symbol table"));
10017 iconf
= (Elf32_Conflict
*) malloc (conflictsno
* sizeof (*iconf
));
10020 error (_("Out of memory"));
10026 Elf32_External_Conflict
*econf32
;
10028 econf32
= ((Elf32_External_Conflict
*)
10029 get_data (NULL
, file
, conflicts_offset
,
10030 conflictsno
* sizeof (*econf32
),
10035 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10036 iconf
[cnt
] = BYTE_GET (econf32
[cnt
]);
10042 Elf64_External_Conflict
*econf64
;
10044 econf64
= ((Elf64_External_Conflict
*)
10045 get_data (NULL
, file
, conflicts_offset
,
10046 conflictsno
* sizeof (*econf64
),
10051 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10052 iconf
[cnt
] = BYTE_GET (econf64
[cnt
]);
10057 printf (_("\nSection '.conflict' contains %ld entries:\n"),
10058 (long) conflictsno
);
10059 puts (_(" Num: Index Value Name"));
10061 for (cnt
= 0; cnt
< conflictsno
; ++cnt
)
10063 Elf_Internal_Sym
*psym
= & dynamic_symbols
[iconf
[cnt
]];
10065 printf ("%5lu: %8lu ", (unsigned long) cnt
, iconf
[cnt
]);
10066 print_vma (psym
->st_value
, FULL_HEX
);
10068 print_symbol (25, dynamic_strings
+ psym
->st_name
);
10079 process_gnu_liblist (file
)
10082 Elf_Internal_Shdr
*section
, *string_sec
;
10083 Elf32_External_Lib
*elib
;
10091 for (i
= 0, section
= section_headers
;
10092 i
< elf_header
.e_shnum
;
10095 switch (section
->sh_type
)
10097 case SHT_GNU_LIBLIST
:
10098 elib
= ((Elf32_External_Lib
*)
10099 get_data (NULL
, file
, section
->sh_offset
, section
->sh_size
,
10104 string_sec
= SECTION_HEADER (section
->sh_link
);
10106 strtab
= (char *) get_data (NULL
, file
, string_sec
->sh_offset
,
10107 string_sec
->sh_size
,
10108 _("liblist string table"));
10111 || section
->sh_entsize
!= sizeof (Elf32_External_Lib
))
10117 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
10118 SECTION_NAME (section
),
10119 (long) (section
->sh_size
/ sizeof (Elf32_External_Lib
)));
10121 puts (" Library Time Stamp Checksum Version Flags");
10123 for (cnt
= 0; cnt
< section
->sh_size
/ sizeof (Elf32_External_Lib
);
10131 liblist
.l_name
= BYTE_GET (elib
[cnt
].l_name
);
10132 time
= BYTE_GET (elib
[cnt
].l_time_stamp
);
10133 liblist
.l_checksum
= BYTE_GET (elib
[cnt
].l_checksum
);
10134 liblist
.l_version
= BYTE_GET (elib
[cnt
].l_version
);
10135 liblist
.l_flags
= BYTE_GET (elib
[cnt
].l_flags
);
10137 tmp
= gmtime (&time
);
10138 sprintf (timebuf
, "%04u-%02u-%02uT%02u:%02u:%02u",
10139 tmp
->tm_year
+ 1900, tmp
->tm_mon
+ 1, tmp
->tm_mday
,
10140 tmp
->tm_hour
, tmp
->tm_min
, tmp
->tm_sec
);
10142 printf ("%3lu: ", (unsigned long) cnt
);
10144 printf ("%-20s", strtab
+ liblist
.l_name
);
10146 printf ("%-20.20s", strtab
+ liblist
.l_name
);
10147 printf (" %s %#010lx %-7ld %-7ld\n", timebuf
, liblist
.l_checksum
,
10148 liblist
.l_version
, liblist
.l_flags
);
10158 static const char *
10159 get_note_type (e_type
)
10162 static char buff
[64];
10166 case NT_PRSTATUS
: return _("NT_PRSTATUS (prstatus structure)");
10167 case NT_FPREGSET
: return _("NT_FPREGSET (floating point registers)");
10168 case NT_PRPSINFO
: return _("NT_PRPSINFO (prpsinfo structure)");
10169 case NT_TASKSTRUCT
: return _("NT_TASKSTRUCT (task structure)");
10170 case NT_PRXFPREG
: return _("NT_PRXFPREG (user_xfpregs structure)");
10171 case NT_PSTATUS
: return _("NT_PSTATUS (pstatus structure)");
10172 case NT_FPREGS
: return _("NT_FPREGS (floating point registers)");
10173 case NT_PSINFO
: return _("NT_PSINFO (psinfo structure)");
10174 case NT_LWPSTATUS
: return _("NT_LWPSTATUS (lwpstatus_t structure)");
10175 case NT_LWPSINFO
: return _("NT_LWPSINFO (lwpsinfo_t structure)");
10176 case NT_WIN32PSTATUS
: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
10178 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10183 static const char *
10184 get_netbsd_elfcore_note_type (e_type
)
10187 static char buff
[64];
10189 if (e_type
== NT_NETBSDCORE_PROCINFO
)
10191 /* NetBSD core "procinfo" structure. */
10192 return _("NetBSD procinfo structure");
10195 /* As of Jan 2002 there are no other machine-independent notes
10196 defined for NetBSD core files. If the note type is less
10197 than the start of the machine-dependent note types, we don't
10200 if (e_type
< NT_NETBSDCORE_FIRSTMACH
)
10202 sprintf (buff
, _("Unknown note type: (0x%08x)"), e_type
);
10206 switch (elf_header
.e_machine
)
10208 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
10209 and PT_GETFPREGS == mach+2. */
10214 case EM_SPARC32PLUS
:
10218 case NT_NETBSDCORE_FIRSTMACH
+0:
10219 return _("PT_GETREGS (reg structure)");
10220 case NT_NETBSDCORE_FIRSTMACH
+2:
10221 return _("PT_GETFPREGS (fpreg structure)");
10227 /* On all other arch's, PT_GETREGS == mach+1 and
10228 PT_GETFPREGS == mach+3. */
10232 case NT_NETBSDCORE_FIRSTMACH
+1:
10233 return _("PT_GETREGS (reg structure)");
10234 case NT_NETBSDCORE_FIRSTMACH
+3:
10235 return _("PT_GETFPREGS (fpreg structure)");
10241 sprintf (buff
, _("PT_FIRSTMACH+%d"), e_type
- NT_NETBSDCORE_FIRSTMACH
);
10245 /* Note that by the ELF standard, the name field is already null byte
10246 terminated, and namesz includes the terminating null byte.
10247 I.E. the value of namesz for the name "FSF" is 4.
10249 If the value of namesz is zero, there is no name present. */
10251 process_note (pnote
)
10252 Elf_Internal_Note
*pnote
;
10256 if (pnote
->namesz
== 0)
10258 /* If there is no note name, then use the default set of
10259 note type strings. */
10260 nt
= get_note_type (pnote
->type
);
10262 else if (strncmp (pnote
->namedata
, "NetBSD-CORE", 11) == 0)
10264 /* NetBSD-specific core file notes. */
10265 nt
= get_netbsd_elfcore_note_type (pnote
->type
);
10269 /* Don't recognize this note name; just use the default set of
10270 note type strings. */
10271 nt
= get_note_type (pnote
->type
);
10274 printf (" %s\t\t0x%08lx\t%s\n",
10275 pnote
->namesz
? pnote
->namedata
: "(NONE)",
10276 pnote
->descsz
, nt
);
10282 process_corefile_note_segment (file
, offset
, length
)
10287 Elf_External_Note
*pnotes
;
10288 Elf_External_Note
*external
;
10294 pnotes
= (Elf_External_Note
*) get_data (NULL
, file
, offset
, length
,
10301 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
10302 (unsigned long) offset
, (unsigned long) length
);
10303 printf (_(" Owner\t\tData size\tDescription\n"));
10305 while (external
< (Elf_External_Note
*)((char *) pnotes
+ length
))
10307 Elf_External_Note
*next
;
10308 Elf_Internal_Note inote
;
10311 inote
.type
= BYTE_GET (external
->type
);
10312 inote
.namesz
= BYTE_GET (external
->namesz
);
10313 inote
.namedata
= external
->name
;
10314 inote
.descsz
= BYTE_GET (external
->descsz
);
10315 inote
.descdata
= inote
.namedata
+ align_power (inote
.namesz
, 2);
10316 inote
.descpos
= offset
+ (inote
.descdata
- (char *) pnotes
);
10318 next
= (Elf_External_Note
*)(inote
.descdata
+ align_power (inote
.descsz
, 2));
10320 if (((char *) next
) > (((char *) pnotes
) + length
))
10322 warn (_("corrupt note found at offset %x into core notes\n"),
10323 ((char *) external
) - ((char *) pnotes
));
10324 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
10325 inote
.type
, inote
.namesz
, inote
.descsz
);
10331 /* Verify that name is null terminated. It appears that at least
10332 one version of Linux (RedHat 6.0) generates corefiles that don't
10333 comply with the ELF spec by failing to include the null byte in
10335 if (inote
.namedata
[inote
.namesz
] != '\0')
10337 temp
= malloc (inote
.namesz
+ 1);
10341 error (_("Out of memory\n"));
10346 strncpy (temp
, inote
.namedata
, inote
.namesz
);
10347 temp
[inote
.namesz
] = 0;
10349 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
10350 inote
.namedata
= temp
;
10353 res
&= process_note (& inote
);
10368 process_corefile_note_segments (file
)
10371 Elf_Internal_Phdr
*program_headers
;
10372 Elf_Internal_Phdr
*segment
;
10376 program_headers
= (Elf_Internal_Phdr
*) malloc
10377 (elf_header
.e_phnum
* sizeof (Elf_Internal_Phdr
));
10379 if (program_headers
== NULL
)
10381 error (_("Out of memory\n"));
10386 i
= get_32bit_program_headers (file
, program_headers
);
10388 i
= get_64bit_program_headers (file
, program_headers
);
10392 free (program_headers
);
10396 for (i
= 0, segment
= program_headers
;
10397 i
< elf_header
.e_phnum
;
10400 if (segment
->p_type
== PT_NOTE
)
10401 res
&= process_corefile_note_segment (file
,
10402 (bfd_vma
) segment
->p_offset
,
10403 (bfd_vma
) segment
->p_filesz
);
10406 free (program_headers
);
10412 process_corefile_contents (file
)
10415 /* If we have not been asked to display the notes then do nothing. */
10419 /* If file is not a core file then exit. */
10420 if (elf_header
.e_type
!= ET_CORE
)
10423 /* No program headers means no NOTE segment. */
10424 if (elf_header
.e_phnum
== 0)
10426 printf (_("No note segments present in the core file.\n"));
10430 return process_corefile_note_segments (file
);
10434 process_arch_specific (file
)
10440 switch (elf_header
.e_machine
)
10443 case EM_MIPS_RS3_LE
:
10444 return process_mips_specific (file
);
10453 get_file_header (file
)
10456 /* Read in the identity array. */
10457 if (fread (elf_header
.e_ident
, EI_NIDENT
, 1, file
) != 1)
10460 /* Determine how to read the rest of the header. */
10461 switch (elf_header
.e_ident
[EI_DATA
])
10463 default: /* fall through */
10464 case ELFDATANONE
: /* fall through */
10466 byte_get
= byte_get_little_endian
;
10467 byte_put
= byte_put_little_endian
;
10470 byte_get
= byte_get_big_endian
;
10471 byte_put
= byte_put_big_endian
;
10475 /* For now we only support 32 bit and 64 bit ELF files. */
10476 is_32bit_elf
= (elf_header
.e_ident
[EI_CLASS
] != ELFCLASS64
);
10478 /* Read in the rest of the header. */
10481 Elf32_External_Ehdr ehdr32
;
10483 if (fread (ehdr32
.e_type
, sizeof (ehdr32
) - EI_NIDENT
, 1, file
) != 1)
10486 elf_header
.e_type
= BYTE_GET (ehdr32
.e_type
);
10487 elf_header
.e_machine
= BYTE_GET (ehdr32
.e_machine
);
10488 elf_header
.e_version
= BYTE_GET (ehdr32
.e_version
);
10489 elf_header
.e_entry
= BYTE_GET (ehdr32
.e_entry
);
10490 elf_header
.e_phoff
= BYTE_GET (ehdr32
.e_phoff
);
10491 elf_header
.e_shoff
= BYTE_GET (ehdr32
.e_shoff
);
10492 elf_header
.e_flags
= BYTE_GET (ehdr32
.e_flags
);
10493 elf_header
.e_ehsize
= BYTE_GET (ehdr32
.e_ehsize
);
10494 elf_header
.e_phentsize
= BYTE_GET (ehdr32
.e_phentsize
);
10495 elf_header
.e_phnum
= BYTE_GET (ehdr32
.e_phnum
);
10496 elf_header
.e_shentsize
= BYTE_GET (ehdr32
.e_shentsize
);
10497 elf_header
.e_shnum
= BYTE_GET (ehdr32
.e_shnum
);
10498 elf_header
.e_shstrndx
= BYTE_GET (ehdr32
.e_shstrndx
);
10502 Elf64_External_Ehdr ehdr64
;
10504 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10505 we will not be able to cope with the 64bit data found in
10506 64 ELF files. Detect this now and abort before we start
10507 overwritting things. */
10508 if (sizeof (bfd_vma
) < 8)
10510 error (_("This instance of readelf has been built without support for a\n\
10511 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10515 if (fread (ehdr64
.e_type
, sizeof (ehdr64
) - EI_NIDENT
, 1, file
) != 1)
10518 elf_header
.e_type
= BYTE_GET (ehdr64
.e_type
);
10519 elf_header
.e_machine
= BYTE_GET (ehdr64
.e_machine
);
10520 elf_header
.e_version
= BYTE_GET (ehdr64
.e_version
);
10521 elf_header
.e_entry
= BYTE_GET8 (ehdr64
.e_entry
);
10522 elf_header
.e_phoff
= BYTE_GET8 (ehdr64
.e_phoff
);
10523 elf_header
.e_shoff
= BYTE_GET8 (ehdr64
.e_shoff
);
10524 elf_header
.e_flags
= BYTE_GET (ehdr64
.e_flags
);
10525 elf_header
.e_ehsize
= BYTE_GET (ehdr64
.e_ehsize
);
10526 elf_header
.e_phentsize
= BYTE_GET (ehdr64
.e_phentsize
);
10527 elf_header
.e_phnum
= BYTE_GET (ehdr64
.e_phnum
);
10528 elf_header
.e_shentsize
= BYTE_GET (ehdr64
.e_shentsize
);
10529 elf_header
.e_shnum
= BYTE_GET (ehdr64
.e_shnum
);
10530 elf_header
.e_shstrndx
= BYTE_GET (ehdr64
.e_shstrndx
);
10533 if (elf_header
.e_shoff
)
10535 /* There may be some extensions in the first section header. Don't
10536 bomb if we can't read it. */
10538 get_32bit_section_headers (file
, 1);
10540 get_64bit_section_headers (file
, 1);
10547 process_file (file_name
)
10551 struct stat statbuf
;
10554 if (stat (file_name
, & statbuf
) < 0)
10556 error (_("Cannot stat input file %s.\n"), file_name
);
10560 file
= fopen (file_name
, "rb");
10563 error (_("Input file %s not found.\n"), file_name
);
10567 if (! get_file_header (file
))
10569 error (_("%s: Failed to read file header\n"), file_name
);
10574 /* Initialise per file variables. */
10575 for (i
= NUM_ELEM (version_info
); i
--;)
10576 version_info
[i
] = 0;
10578 for (i
= NUM_ELEM (dynamic_info
); i
--;)
10579 dynamic_info
[i
] = 0;
10581 /* Process the file. */
10583 printf (_("\nFile: %s\n"), file_name
);
10585 if (! process_file_header ())
10591 if (! process_section_headers (file
))
10593 /* Without loaded section headers we
10594 cannot process lots of things. */
10595 do_unwind
= do_version
= do_dump
= do_arch
= 0;
10597 if (! do_using_dynamic
)
10598 do_syms
= do_reloc
= 0;
10601 if (process_program_headers (file
))
10602 process_dynamic_segment (file
);
10604 process_relocs (file
);
10606 process_unwind (file
);
10608 process_symbol_table (file
);
10610 process_syminfo (file
);
10612 process_version_sections (file
);
10614 process_section_contents (file
);
10616 process_corefile_contents (file
);
10618 process_gnu_liblist (file
);
10620 process_arch_specific (file
);
10624 if (section_headers
)
10626 free (section_headers
);
10627 section_headers
= NULL
;
10632 free (string_table
);
10633 string_table
= NULL
;
10634 string_table_length
= 0;
10637 if (dynamic_strings
)
10639 free (dynamic_strings
);
10640 dynamic_strings
= NULL
;
10643 if (dynamic_symbols
)
10645 free (dynamic_symbols
);
10646 dynamic_symbols
= NULL
;
10647 num_dynamic_syms
= 0;
10650 if (dynamic_syminfo
)
10652 free (dynamic_syminfo
);
10653 dynamic_syminfo
= NULL
;
10659 #ifdef SUPPORT_DISASSEMBLY
10660 /* Needed by the i386 disassembler. For extra credit, someone could
10661 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10665 print_address (unsigned int addr
, FILE *outfile
)
10667 fprintf (outfile
,"0x%8.8x", addr
);
10670 /* Needed by the i386 disassembler. */
10672 db_task_printsym (unsigned int addr
)
10674 print_address (addr
, stderr
);
10678 int main
PARAMS ((int, char **));
10686 char *cmdline_dump_sects
= NULL
;
10687 unsigned num_cmdline_dump_sects
= 0;
10689 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10690 setlocale (LC_MESSAGES
, "");
10692 #if defined (HAVE_SETLOCALE)
10693 setlocale (LC_CTYPE
, "");
10695 bindtextdomain (PACKAGE
, LOCALEDIR
);
10696 textdomain (PACKAGE
);
10698 parse_args (argc
, argv
);
10700 if (optind
< (argc
- 1))
10703 /* When processing more than one file remember the dump requests
10704 issued on command line to reset them after each file. */
10705 if (optind
+ 1 < argc
&& dump_sects
!= NULL
)
10707 cmdline_dump_sects
= malloc (num_dump_sects
);
10708 if (cmdline_dump_sects
== NULL
)
10709 error (_("Out of memory allocating dump request table."));
10712 memcpy (cmdline_dump_sects
, dump_sects
, num_dump_sects
);
10713 num_cmdline_dump_sects
= num_dump_sects
;
10718 while (optind
< argc
)
10720 err
|= process_file (argv
[optind
++]);
10722 /* Reset dump requests. */
10723 if (optind
< argc
&& dump_sects
!= NULL
)
10725 num_dump_sects
= num_cmdline_dump_sects
;
10726 if (num_cmdline_dump_sects
> 0)
10727 memcpy (dump_sects
, cmdline_dump_sects
, num_cmdline_dump_sects
);
10731 if (dump_sects
!= NULL
)
10733 if (cmdline_dump_sects
!= NULL
)
10734 free (cmdline_dump_sects
);