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"
84 #include "elf/sparc.h"
87 #include "elf/x86-64.h"
88 #include "elf/xstormy16.h"
93 char *program_name = "readelf";
94 unsigned long dynamic_addr;
95 bfd_size_type dynamic_size;
96 char *dynamic_strings;
98 unsigned long string_table_length;
99 unsigned long num_dynamic_syms;
100 Elf_Internal_Sym *dynamic_symbols;
101 Elf_Internal_Syminfo *dynamic_syminfo;
102 unsigned long dynamic_syminfo_offset;
103 unsigned int dynamic_syminfo_nent;
104 char program_interpreter[64];
105 long dynamic_info[DT_JMPREL + 1];
106 long version_info[16];
108 Elf_Internal_Ehdr elf_header;
109 Elf_Internal_Shdr *section_headers;
110 Elf_Internal_Dyn *dynamic_segment;
111 Elf_Internal_Shdr *symtab_shndx_hdr;
119 int do_using_dynamic;
127 int do_debug_abbrevs;
129 int do_debug_pubnames;
130 int do_debug_aranges;
132 int do_debug_frames_interp;
133 int do_debug_macinfo;
140 /* A dynamic array of flags indicating which sections require dumping. */
141 char *dump_sects = NULL;
142 unsigned int num_dump_sects = 0;
144 #define HEX_DUMP (1 << 0)
145 #define DISASS_DUMP (1 << 1)
146 #define DEBUG_DUMP (1 << 2)
148 /* How to rpint a vma value. */
149 typedef enum print_mode
161 /* Forward declarations for dumb compilers. */
162 static void print_vma
163 PARAMS ((bfd_vma, print_mode));
164 static void print_symbol
165 PARAMS ((int, const char *));
166 static bfd_vma (*byte_get)
167 PARAMS ((unsigned char *, int));
168 static bfd_vma byte_get_little_endian
169 PARAMS ((unsigned char *, int));
170 static bfd_vma byte_get_big_endian
171 PARAMS ((unsigned char *, int));
172 static const char *get_mips_dynamic_type
173 PARAMS ((unsigned long));
174 static const char *get_sparc64_dynamic_type
175 PARAMS ((unsigned long));
176 static const char *get_ppc64_dynamic_type
177 PARAMS ((unsigned long));
178 static const char *get_parisc_dynamic_type
179 PARAMS ((unsigned long));
180 static const char *get_dynamic_type
181 PARAMS ((unsigned long));
182 static int slurp_rela_relocs
183 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
185 static int slurp_rel_relocs
186 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **,
188 static int dump_relocations
189 PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *,
190 unsigned long, char *, int));
191 static char *get_file_type
193 static char *get_machine_name
195 static void decode_ARM_machine_flags
196 PARAMS ((unsigned, char[]));
197 static char *get_machine_flags
198 PARAMS ((unsigned, unsigned));
199 static const char *get_mips_segment_type
200 PARAMS ((unsigned long));
201 static const char *get_parisc_segment_type
202 PARAMS ((unsigned long));
203 static const char *get_ia64_segment_type
204 PARAMS ((unsigned long));
205 static const char *get_segment_type
206 PARAMS ((unsigned long));
207 static const char *get_mips_section_type_name
208 PARAMS ((unsigned int));
209 static const char *get_parisc_section_type_name
210 PARAMS ((unsigned int));
211 static const char *get_ia64_section_type_name
212 PARAMS ((unsigned int));
213 static const char *get_section_type_name
214 PARAMS ((unsigned int));
215 static const char *get_symbol_binding
216 PARAMS ((unsigned int));
217 static const char *get_symbol_type
218 PARAMS ((unsigned int));
219 static const char *get_symbol_visibility
220 PARAMS ((unsigned int));
221 static const char *get_symbol_index_type
222 PARAMS ((unsigned int));
223 static const char *get_dynamic_flags
227 static void parse_args
228 PARAMS ((int, char **));
229 static int process_file_header
231 static int process_program_headers
233 static int process_section_headers
235 static int process_unwind
237 static void dynamic_segment_mips_val
238 PARAMS ((Elf_Internal_Dyn *));
239 static void dynamic_segment_parisc_val
240 PARAMS ((Elf_Internal_Dyn *));
241 static int process_dynamic_segment
243 static int process_symbol_table
245 static int process_syminfo
247 static int process_section_contents
249 static void process_mips_fpe_exception
251 static int process_mips_specific
253 static int process_file
255 static int process_relocs
257 static int process_version_sections
259 static char *get_ver_flags
260 PARAMS ((unsigned int));
261 static int get_32bit_section_headers
262 PARAMS ((FILE *, unsigned int));
263 static int get_64bit_section_headers
264 PARAMS ((FILE *, unsigned int));
265 static int get_32bit_program_headers
266 PARAMS ((FILE *, Elf_Internal_Phdr *));
267 static int get_64bit_program_headers
268 PARAMS ((FILE *, Elf_Internal_Phdr *));
269 static int get_file_header
271 static Elf_Internal_Sym *get_32bit_elf_symbols
272 PARAMS ((FILE *, Elf_Internal_Shdr *));
273 static Elf_Internal_Sym *get_64bit_elf_symbols
274 PARAMS ((FILE *, Elf_Internal_Shdr *));
275 static const char *get_elf_section_flags
277 static int *get_dynamic_data
278 PARAMS ((FILE *, unsigned int));
279 static int get_32bit_dynamic_segment
281 static int get_64bit_dynamic_segment
283 #ifdef SUPPORT_DISASSEMBLY
284 static int disassemble_section
285 PARAMS ((Elf_Internal_Shdr *, FILE *));
287 static int dump_section
288 PARAMS ((Elf_Internal_Shdr *, FILE *));
289 static int display_debug_section
290 PARAMS ((Elf_Internal_Shdr *, FILE *));
291 static int display_debug_info
292 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
293 static int display_debug_not_supported
294 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
295 static int prescan_debug_info
296 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
297 static int display_debug_lines
298 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
299 static int display_debug_pubnames
300 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
301 static int display_debug_abbrev
302 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
303 static int display_debug_aranges
304 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
305 static int display_debug_frames
306 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
307 static int display_debug_macinfo
308 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
309 static int display_debug_str
310 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
311 static int display_debug_loc
312 PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
313 static unsigned char *process_abbrev_section
314 PARAMS ((unsigned char *, unsigned char *));
315 static void load_debug_str
317 static void free_debug_str
319 static const char *fetch_indirect_string
320 PARAMS ((unsigned long));
321 static void load_debug_loc
323 static void free_debug_loc
325 static unsigned long read_leb128
326 PARAMS ((unsigned char *, int *, int));
327 static int process_extended_line_op
328 PARAMS ((unsigned char *, int, int));
329 static void reset_state_machine
331 static char *get_TAG_name
332 PARAMS ((unsigned long));
333 static char *get_AT_name
334 PARAMS ((unsigned long));
335 static char *get_FORM_name
336 PARAMS ((unsigned long));
337 static void free_abbrevs
339 static void add_abbrev
340 PARAMS ((unsigned long, unsigned long, int));
341 static void add_abbrev_attr
342 PARAMS ((unsigned long, unsigned long));
343 static unsigned char *read_and_display_attr
344 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
346 static unsigned char *read_and_display_attr_value
347 PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long,
349 static unsigned char *display_block
350 PARAMS ((unsigned char *, unsigned long));
351 static void decode_location_expression
352 PARAMS ((unsigned char *, unsigned int, unsigned long));
353 static void request_dump
354 PARAMS ((unsigned int, int));
355 static const char *get_elf_class
356 PARAMS ((unsigned int));
357 static const char *get_data_encoding
358 PARAMS ((unsigned int));
359 static const char *get_osabi_name
360 PARAMS ((unsigned int));
361 static int guess_is_rela
362 PARAMS ((unsigned long));
363 static const char *get_note_type
364 PARAMS ((unsigned int));
365 static const char *get_netbsd_elfcore_note_type
366 PARAMS ((unsigned int));
367 static int process_note
368 PARAMS ((Elf_Internal_Note *));
369 static int process_corefile_note_segment
370 PARAMS ((FILE *, bfd_vma, bfd_vma));
371 static int process_corefile_note_segments
373 static int process_corefile_contents
375 static int process_arch_specific
377 static int process_gnu_liblist
380 typedef int Elf32_Word;
384 #define SECTION_NAME(X) ((X) == NULL ? "<none>" : \
385 ((X)->sh_name >= string_table_length \
386 ? "<corrupt>" : string_table + (X)->sh_name))
388 /* Given st_shndx I, map to section_headers index. */
389 #define SECTION_HEADER_INDEX(I) \
390 ((I) < SHN_LORESERVE \
392 : ((I) <= SHN_HIRESERVE \
394 : (I) - (SHN_HIRESERVE + 1 - SHN_LORESERVE)))
396 /* Reverse of the above. */
397 #define SECTION_HEADER_NUM(N) \
398 ((N) < SHN_LORESERVE \
400 : (N) + (SHN_HIRESERVE + 1 - SHN_LORESERVE))
402 #define SECTION_HEADER(I) (section_headers + SECTION_HEADER_INDEX (I))
404 #define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */
406 #define BYTE_GET(field) byte_get (field, sizeof (field))
408 /* If we can support a 64 bit data type then BFD64 should be defined
409 and sizeof (bfd_vma) == 8. In this case when translating from an
410 external 8 byte field to an internal field, we can assume that the
411 internal field is also 8 bytes wide and so we can extract all the data.
412 If, however, BFD64 is not defined, then we must assume that the
413 internal data structure only has 4 byte wide fields that are the
414 equivalent of the 8 byte wide external counterparts, and so we must
415 truncate the data. */
417 #define BYTE_GET8(field) byte_get (field, -8)
419 #define BYTE_GET8(field) byte_get (field, 8)
422 #define NUM_ELEM(array) (sizeof (array) / sizeof ((array)[0]))
424 #define GET_ELF_SYMBOLS(file, section) \
425 (is_32bit_elf ? get_32bit_elf_symbols (file, section) \
426 : get_64bit_elf_symbols (file, section))
430 error VPARAMS ((const char *message, ...))
432 VA_OPEN (args, message);
433 VA_FIXEDARG (args, const char *, message);
435 fprintf (stderr, _("%s: Error: "), program_name);
436 vfprintf (stderr, message, args);
441 warn VPARAMS ((const char *message, ...))
443 VA_OPEN (args, message);
444 VA_FIXEDARG (args, const char *, message);
446 fprintf (stderr, _("%s: Warning: "), program_name);
447 vfprintf (stderr, message, args);
451 static PTR get_data PARAMS ((PTR, FILE *, long, size_t, const char *));
454 get_data (var, file, offset, size, reason)
466 if (fseek (file, offset, SEEK_SET))
468 error (_("Unable to seek to %x for %s\n"), offset, reason);
475 mvar = (PTR) malloc (size);
479 error (_("Out of memory allocating %d bytes for %s\n"),
485 if (fread (mvar, size, 1, file) != 1)
487 error (_("Unable to read in %d bytes of %s\n"), size, reason);
497 byte_get_little_endian (field, size)
498 unsigned char *field;
507 return ((unsigned int) (field[0]))
508 | (((unsigned int) (field[1])) << 8);
512 /* We want to extract data from an 8 byte wide field and
513 place it into a 4 byte wide field. Since this is a little
514 endian source we can just use the 4 byte extraction code. */
518 return ((unsigned long) (field[0]))
519 | (((unsigned long) (field[1])) << 8)
520 | (((unsigned long) (field[2])) << 16)
521 | (((unsigned long) (field[3])) << 24);
526 /* This is a special case, generated by the BYTE_GET8 macro.
527 It means that we are loading an 8 byte value from a field
528 in an external structure into an 8 byte value in a field
529 in an internal strcuture. */
530 return ((bfd_vma) (field[0]))
531 | (((bfd_vma) (field[1])) << 8)
532 | (((bfd_vma) (field[2])) << 16)
533 | (((bfd_vma) (field[3])) << 24)
534 | (((bfd_vma) (field[4])) << 32)
535 | (((bfd_vma) (field[5])) << 40)
536 | (((bfd_vma) (field[6])) << 48)
537 | (((bfd_vma) (field[7])) << 56);
540 error (_("Unhandled data length: %d\n"), size);
545 /* Print a VMA value. */
547 print_vma (vma, mode)
557 case FULL_HEX: printf ("0x"); /* drop through */
558 case LONG_HEX: printf ("%8.8lx", (unsigned long) vma); break;
559 case PREFIX_HEX: printf ("0x"); /* drop through */
560 case HEX: printf ("%lx", (unsigned long) vma); break;
561 case DEC: printf ("%ld", (unsigned long) vma); break;
562 case DEC_5: printf ("%5ld", (long) vma); break;
563 case UNSIGNED: printf ("%lu", (unsigned long) vma); break;
584 #if BFD_HOST_64BIT_LONG
587 if (_bfd_int64_high (vma))
588 printf ("%lx%8.8lx", _bfd_int64_high (vma), _bfd_int64_low (vma));
590 printf ("%lx", _bfd_int64_low (vma));
595 #if BFD_HOST_64BIT_LONG
598 if (_bfd_int64_high (vma))
600 printf ("++%ld", _bfd_int64_low (vma));
602 printf ("%ld", _bfd_int64_low (vma));
607 #if BFD_HOST_64BIT_LONG
608 printf ("%5ld", vma);
610 if (_bfd_int64_high (vma))
612 printf ("++%ld", _bfd_int64_low (vma));
614 printf ("%5ld", _bfd_int64_low (vma));
619 #if BFD_HOST_64BIT_LONG
622 if (_bfd_int64_high (vma))
624 printf ("++%lu", _bfd_int64_low (vma));
626 printf ("%lu", _bfd_int64_low (vma));
634 /* Display a symbol on stdout. If do_wide is not true then
635 format the symbol to be at most WIDTH characters,
636 truncating as necessary. If WIDTH is negative then
637 format the string to be exactly - WIDTH characters,
638 truncating or padding as necessary. */
641 print_symbol (width, symbol)
646 printf ("%s", symbol);
648 printf ("%-*.*s", width, width, symbol);
650 printf ("%-.*s", width, symbol);
654 byte_get_big_endian (field, size)
655 unsigned char *field;
664 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
667 return ((unsigned long) (field[3]))
668 | (((unsigned long) (field[2])) << 8)
669 | (((unsigned long) (field[1])) << 16)
670 | (((unsigned long) (field[0])) << 24);
674 /* Although we are extracing data from an 8 byte wide field, we
675 are returning only 4 bytes of data. */
676 return ((unsigned long) (field[7]))
677 | (((unsigned long) (field[6])) << 8)
678 | (((unsigned long) (field[5])) << 16)
679 | (((unsigned long) (field[4])) << 24);
683 /* This is a special case, generated by the BYTE_GET8 macro.
684 It means that we are loading an 8 byte value from a field
685 in an external structure into an 8 byte value in a field
686 in an internal strcuture. */
687 return ((bfd_vma) (field[7]))
688 | (((bfd_vma) (field[6])) << 8)
689 | (((bfd_vma) (field[5])) << 16)
690 | (((bfd_vma) (field[4])) << 24)
691 | (((bfd_vma) (field[3])) << 32)
692 | (((bfd_vma) (field[2])) << 40)
693 | (((bfd_vma) (field[1])) << 48)
694 | (((bfd_vma) (field[0])) << 56);
698 error (_("Unhandled data length: %d\n"), size);
703 /* Guess the relocation size commonly used by the specific machines. */
706 guess_is_rela (e_machine)
707 unsigned long e_machine;
711 /* Targets that use REL relocations. */
727 /* Targets that use RELA relocations. */
742 case EM_CYGNUS_MN10200:
744 case EM_CYGNUS_MN10300:
786 warn (_("Don't know about relocations on this machine architecture\n"));
792 slurp_rela_relocs (file, rel_offset, rel_size, relasp, nrelasp)
794 unsigned long rel_offset;
795 unsigned long rel_size;
796 Elf_Internal_Rela **relasp;
797 unsigned long *nrelasp;
799 Elf_Internal_Rela *relas;
800 unsigned long nrelas;
805 Elf32_External_Rela *erelas;
807 erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset,
808 rel_size, _("relocs"));
812 nrelas = rel_size / sizeof (Elf32_External_Rela);
814 relas = (Elf_Internal_Rela *)
815 malloc (nrelas * sizeof (Elf_Internal_Rela));
819 error(_("out of memory parsing relocs"));
823 for (i = 0; i < nrelas; i++)
825 relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
826 relas[i].r_info = BYTE_GET (erelas[i].r_info);
827 relas[i].r_addend = BYTE_GET (erelas[i].r_addend);
834 Elf64_External_Rela *erelas;
836 erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset,
837 rel_size, _("relocs"));
841 nrelas = rel_size / sizeof (Elf64_External_Rela);
843 relas = (Elf_Internal_Rela *)
844 malloc (nrelas * sizeof (Elf_Internal_Rela));
848 error(_("out of memory parsing relocs"));
852 for (i = 0; i < nrelas; i++)
854 relas[i].r_offset = BYTE_GET8 (erelas[i].r_offset);
855 relas[i].r_info = BYTE_GET8 (erelas[i].r_info);
856 relas[i].r_addend = BYTE_GET8 (erelas[i].r_addend);
867 slurp_rel_relocs (file, rel_offset, rel_size, relsp, nrelsp)
869 unsigned long rel_offset;
870 unsigned long rel_size;
871 Elf_Internal_Rela **relsp;
872 unsigned long *nrelsp;
874 Elf_Internal_Rela *rels;
880 Elf32_External_Rel *erels;
882 erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset,
883 rel_size, _("relocs"));
887 nrels = rel_size / sizeof (Elf32_External_Rel);
889 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
893 error(_("out of memory parsing relocs"));
897 for (i = 0; i < nrels; i++)
899 rels[i].r_offset = BYTE_GET (erels[i].r_offset);
900 rels[i].r_info = BYTE_GET (erels[i].r_info);
901 rels[i].r_addend = 0;
908 Elf64_External_Rel *erels;
910 erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset,
911 rel_size, _("relocs"));
915 nrels = rel_size / sizeof (Elf64_External_Rel);
917 rels = (Elf_Internal_Rela *) malloc (nrels * sizeof (Elf_Internal_Rela));
921 error(_("out of memory parsing relocs"));
925 for (i = 0; i < nrels; i++)
927 rels[i].r_offset = BYTE_GET8 (erels[i].r_offset);
928 rels[i].r_info = BYTE_GET8 (erels[i].r_info);
929 rels[i].r_addend = 0;
939 /* Display the contents of the relocation data found at the specified offset. */
941 dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela)
943 unsigned long rel_offset;
944 unsigned long rel_size;
945 Elf_Internal_Sym *symtab;
951 Elf_Internal_Rela *rels;
954 if (is_rela == UNKNOWN)
955 is_rela = guess_is_rela (elf_header.e_machine);
959 if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
964 if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
973 printf (_(" Offset Info Type Sym. Value Symbol's Name + Addend\n"));
975 printf (_(" Offset Info Type Sym.Value Sym. Name + Addend\n"));
980 printf (_(" Offset Info Type Sym. Value Symbol's Name\n"));
982 printf (_(" Offset Info Type Sym.Value Sym. Name\n"));
990 printf (_(" Offset Info Type Symbol's Value Symbol's Name + Addend\n"));
992 printf (_(" Offset Info Type Sym. Value Sym. Name + Addend\n"));
997 printf (_(" Offset Info Type Symbol's Value Symbol's Name\n"));
999 printf (_(" Offset Info Type Sym. Value Sym. Name\n"));
1003 for (i = 0; i < rel_size; i++)
1006 const char *rtype2 = NULL;
1007 const char *rtype3 = NULL;
1010 bfd_vma symtab_index;
1012 bfd_vma type2 = (bfd_vma) NULL;
1013 bfd_vma type3 = (bfd_vma) NULL;
1015 offset = rels[i].r_offset;
1016 info = rels[i].r_info;
1020 type = ELF32_R_TYPE (info);
1021 symtab_index = ELF32_R_SYM (info);
1025 if (elf_header.e_machine == EM_MIPS)
1027 type = ELF64_MIPS_R_TYPE (info);
1028 type2 = ELF64_MIPS_R_TYPE2 (info);
1029 type3 = ELF64_MIPS_R_TYPE3 (info);
1031 else if (elf_header.e_machine == EM_SPARCV9)
1032 type = ELF64_R_TYPE_ID (info);
1034 type = ELF64_R_TYPE (info);
1035 /* The #ifdef BFD64 below is to prevent a compile time warning.
1036 We know that if we do not have a 64 bit data type that we
1037 will never execute this code anyway. */
1039 symtab_index = ELF64_R_SYM (info);
1045 #ifdef _bfd_int64_low
1046 printf ("%8.8lx %8.8lx ", _bfd_int64_low (offset), _bfd_int64_low (info));
1048 printf ("%8.8lx %8.8lx ", offset, info);
1053 #ifdef _bfd_int64_low
1055 ? "%8.8lx%8.8lx %8.8lx%8.8lx "
1056 : "%4.4lx%8.8lx %4.4lx%8.8lx ",
1057 _bfd_int64_high (offset),
1058 _bfd_int64_low (offset),
1059 _bfd_int64_high (info),
1060 _bfd_int64_low (info));
1063 ? "%16.16lx %16.16lx "
1064 : "%12.12lx %12.12lx ",
1069 switch (elf_header.e_machine)
1076 case EM_CYGNUS_M32R:
1077 rtype = elf_m32r_reloc_type (type);
1082 rtype = elf_i386_reloc_type (type);
1087 rtype = elf_m68hc11_reloc_type (type);
1091 rtype = elf_m68k_reloc_type (type);
1095 rtype = elf_i960_reloc_type (type);
1100 rtype = elf_avr_reloc_type (type);
1103 case EM_OLD_SPARCV9:
1104 case EM_SPARC32PLUS:
1107 rtype = elf_sparc_reloc_type (type);
1111 case EM_CYGNUS_V850:
1112 rtype = v850_reloc_type (type);
1116 case EM_CYGNUS_D10V:
1117 rtype = elf_d10v_reloc_type (type);
1121 case EM_CYGNUS_D30V:
1122 rtype = elf_d30v_reloc_type (type);
1126 rtype = elf_dlx_reloc_type (type);
1130 rtype = elf_sh_reloc_type (type);
1134 case EM_CYGNUS_MN10300:
1135 rtype = elf_mn10300_reloc_type (type);
1139 case EM_CYGNUS_MN10200:
1140 rtype = elf_mn10200_reloc_type (type);
1144 case EM_CYGNUS_FR30:
1145 rtype = elf_fr30_reloc_type (type);
1149 rtype = elf_frv_reloc_type (type);
1153 rtype = elf_mcore_reloc_type (type);
1157 rtype = elf_mmix_reloc_type (type);
1162 rtype = elf_msp430_reloc_type (type);
1167 rtype = elf_ppc_reloc_type (type);
1171 case EM_MIPS_RS3_LE:
1172 rtype = elf_mips_reloc_type (type);
1175 rtype2 = elf_mips_reloc_type (type2);
1176 rtype3 = elf_mips_reloc_type (type3);
1181 rtype = elf_alpha_reloc_type (type);
1185 rtype = elf_arm_reloc_type (type);
1189 rtype = elf_arc_reloc_type (type);
1193 rtype = elf_hppa_reloc_type (type);
1199 rtype = elf_h8_reloc_type (type);
1204 rtype = elf_or32_reloc_type (type);
1209 rtype = elf_pj_reloc_type (type);
1212 rtype = elf_ia64_reloc_type (type);
1216 rtype = elf_cris_reloc_type (type);
1220 rtype = elf_i860_reloc_type (type);
1224 rtype = elf_x86_64_reloc_type (type);
1228 rtype = i370_reloc_type (type);
1233 rtype = elf_s390_reloc_type (type);
1237 rtype = elf_xstormy16_reloc_type (type);
1241 rtype = elf_vax_reloc_type (type);
1246 rtype = elf_ip2k_reloc_type (type);
1251 #ifdef _bfd_int64_low
1252 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type));
1254 printf (_("unrecognized: %-7lx"), type);
1257 printf (do_wide ? "%-21.21s" : "%-17.17s", rtype);
1261 if (symtab == NULL || symtab_index >= nsyms)
1262 printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
1265 Elf_Internal_Sym *psym;
1267 psym = symtab + symtab_index;
1270 print_vma (psym->st_value, LONG_HEX);
1271 printf (is_32bit_elf ? " " : " ");
1273 if (psym->st_name == 0)
1275 const char *sec_name = "<null>";
1278 if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1280 bfd_vma sec_index = (bfd_vma) -1;
1282 if (psym->st_shndx < SHN_LORESERVE)
1283 sec_index = psym->st_shndx;
1284 else if (psym->st_shndx > SHN_LORESERVE)
1285 sec_index = psym->st_shndx - (SHN_HIRESERVE + 1
1288 if (sec_index != (bfd_vma) -1)
1289 sec_name = SECTION_NAME (section_headers + sec_index);
1290 else if (psym->st_shndx == SHN_ABS)
1292 else if (psym->st_shndx == SHN_COMMON)
1293 sec_name = "COMMON";
1296 sprintf (name_buf, "<section 0x%x>",
1297 (unsigned int) psym->st_shndx);
1298 sec_name = name_buf;
1301 print_symbol (22, sec_name);
1303 else if (strtab == NULL)
1304 printf (_("<string table index %3ld>"), psym->st_name);
1306 print_symbol (22, strtab + psym->st_name);
1309 printf (" + %lx", (unsigned long) rels[i].r_addend);
1314 printf ("%*c", is_32bit_elf ? (do_wide ? 34 : 28) : (do_wide ? 26 : 20), ' ');
1315 print_vma (rels[i].r_addend, LONG_HEX);
1318 if (elf_header.e_machine == EM_SPARCV9
1319 && !strcmp (rtype, "R_SPARC_OLO10"))
1320 printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (info));
1324 if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1326 printf (" Type2: ");
1329 #ifdef _bfd_int64_low
1330 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type2));
1332 printf (_("unrecognized: %-7lx"), type2);
1335 printf ("%-17.17s", rtype2);
1337 printf("\n Type3: ");
1340 #ifdef _bfd_int64_low
1341 printf (_("unrecognized: %-7lx"), _bfd_int64_low (type3));
1343 printf (_("unrecognized: %-7lx"), type3);
1346 printf ("%-17.17s", rtype3);
1358 get_mips_dynamic_type (type)
1363 case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1364 case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1365 case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1366 case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1367 case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1368 case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1369 case DT_MIPS_MSYM: return "MIPS_MSYM";
1370 case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1371 case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1372 case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1373 case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1374 case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1375 case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1376 case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1377 case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1378 case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1379 case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1380 case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1381 case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1382 case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1383 case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1384 case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1385 case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1386 case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1387 case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1388 case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1389 case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1390 case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1391 case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1392 case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1393 case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1394 case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1395 case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1396 case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1397 case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1398 case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1399 case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1400 case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1401 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1402 case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1403 case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1404 case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1405 case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1412 get_sparc64_dynamic_type (type)
1417 case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1424 get_ppc64_dynamic_type (type)
1429 case DT_PPC64_GLINK: return "PPC64_GLINK";
1430 case DT_PPC64_OPD: return "PPC64_OPD";
1431 case DT_PPC64_OPDSZ: return "PPC64_OPDSZ";
1438 get_parisc_dynamic_type (type)
1443 case DT_HP_LOAD_MAP: return "HP_LOAD_MAP";
1444 case DT_HP_DLD_FLAGS: return "HP_DLD_FLAGS";
1445 case DT_HP_DLD_HOOK: return "HP_DLD_HOOK";
1446 case DT_HP_UX10_INIT: return "HP_UX10_INIT";
1447 case DT_HP_UX10_INITSZ: return "HP_UX10_INITSZ";
1448 case DT_HP_PREINIT: return "HP_PREINIT";
1449 case DT_HP_PREINITSZ: return "HP_PREINITSZ";
1450 case DT_HP_NEEDED: return "HP_NEEDED";
1451 case DT_HP_TIME_STAMP: return "HP_TIME_STAMP";
1452 case DT_HP_CHECKSUM: return "HP_CHECKSUM";
1453 case DT_HP_GST_SIZE: return "HP_GST_SIZE";
1454 case DT_HP_GST_VERSION: return "HP_GST_VERSION";
1455 case DT_HP_GST_HASHVAL: return "HP_GST_HASHVAL";
1462 get_dynamic_type (type)
1465 static char buff[32];
1469 case DT_NULL: return "NULL";
1470 case DT_NEEDED: return "NEEDED";
1471 case DT_PLTRELSZ: return "PLTRELSZ";
1472 case DT_PLTGOT: return "PLTGOT";
1473 case DT_HASH: return "HASH";
1474 case DT_STRTAB: return "STRTAB";
1475 case DT_SYMTAB: return "SYMTAB";
1476 case DT_RELA: return "RELA";
1477 case DT_RELASZ: return "RELASZ";
1478 case DT_RELAENT: return "RELAENT";
1479 case DT_STRSZ: return "STRSZ";
1480 case DT_SYMENT: return "SYMENT";
1481 case DT_INIT: return "INIT";
1482 case DT_FINI: return "FINI";
1483 case DT_SONAME: return "SONAME";
1484 case DT_RPATH: return "RPATH";
1485 case DT_SYMBOLIC: return "SYMBOLIC";
1486 case DT_REL: return "REL";
1487 case DT_RELSZ: return "RELSZ";
1488 case DT_RELENT: return "RELENT";
1489 case DT_PLTREL: return "PLTREL";
1490 case DT_DEBUG: return "DEBUG";
1491 case DT_TEXTREL: return "TEXTREL";
1492 case DT_JMPREL: return "JMPREL";
1493 case DT_BIND_NOW: return "BIND_NOW";
1494 case DT_INIT_ARRAY: return "INIT_ARRAY";
1495 case DT_FINI_ARRAY: return "FINI_ARRAY";
1496 case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
1497 case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
1498 case DT_RUNPATH: return "RUNPATH";
1499 case DT_FLAGS: return "FLAGS";
1501 case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
1502 case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
1504 case DT_CHECKSUM: return "CHECKSUM";
1505 case DT_PLTPADSZ: return "PLTPADSZ";
1506 case DT_MOVEENT: return "MOVEENT";
1507 case DT_MOVESZ: return "MOVESZ";
1508 case DT_FEATURE: return "FEATURE";
1509 case DT_POSFLAG_1: return "POSFLAG_1";
1510 case DT_SYMINSZ: return "SYMINSZ";
1511 case DT_SYMINENT: return "SYMINENT"; /* aka VALRNGHI */
1513 case DT_ADDRRNGLO: return "ADDRRNGLO";
1514 case DT_CONFIG: return "CONFIG";
1515 case DT_DEPAUDIT: return "DEPAUDIT";
1516 case DT_AUDIT: return "AUDIT";
1517 case DT_PLTPAD: return "PLTPAD";
1518 case DT_MOVETAB: return "MOVETAB";
1519 case DT_SYMINFO: return "SYMINFO"; /* aka ADDRRNGHI */
1521 case DT_VERSYM: return "VERSYM";
1523 case DT_RELACOUNT: return "RELACOUNT";
1524 case DT_RELCOUNT: return "RELCOUNT";
1525 case DT_FLAGS_1: return "FLAGS_1";
1526 case DT_VERDEF: return "VERDEF";
1527 case DT_VERDEFNUM: return "VERDEFNUM";
1528 case DT_VERNEED: return "VERNEED";
1529 case DT_VERNEEDNUM: return "VERNEEDNUM";
1531 case DT_AUXILIARY: return "AUXILIARY";
1532 case DT_USED: return "USED";
1533 case DT_FILTER: return "FILTER";
1535 case DT_GNU_PRELINKED: return "GNU_PRELINKED";
1536 case DT_GNU_CONFLICT: return "GNU_CONFLICT";
1537 case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
1538 case DT_GNU_LIBLIST: return "GNU_LIBLIST";
1539 case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
1542 if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
1546 switch (elf_header.e_machine)
1549 case EM_MIPS_RS3_LE:
1550 result = get_mips_dynamic_type (type);
1553 result = get_sparc64_dynamic_type (type);
1556 result = get_ppc64_dynamic_type (type);
1566 sprintf (buff, _("Processor Specific: %lx"), type);
1568 else if ((type >= DT_LOOS) && (type <= DT_HIOS))
1572 switch (elf_header.e_machine)
1575 result = get_parisc_dynamic_type (type);
1585 sprintf (buff, _("Operating System specific: %lx"), type);
1588 sprintf (buff, _("<unknown>: %lx"), type);
1595 get_file_type (e_type)
1598 static char buff[32];
1602 case ET_NONE: return _("NONE (None)");
1603 case ET_REL: return _("REL (Relocatable file)");
1604 case ET_EXEC: return _("EXEC (Executable file)");
1605 case ET_DYN: return _("DYN (Shared object file)");
1606 case ET_CORE: return _("CORE (Core file)");
1609 if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
1610 sprintf (buff, _("Processor Specific: (%x)"), e_type);
1611 else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
1612 sprintf (buff, _("OS Specific: (%x)"), e_type);
1614 sprintf (buff, _("<unknown>: %x"), e_type);
1620 get_machine_name (e_machine)
1623 static char buff[64]; /* XXX */
1627 case EM_NONE: return _("None");
1628 case EM_M32: return "WE32100";
1629 case EM_SPARC: return "Sparc";
1630 case EM_386: return "Intel 80386";
1631 case EM_68K: return "MC68000";
1632 case EM_88K: return "MC88000";
1633 case EM_486: return "Intel 80486";
1634 case EM_860: return "Intel 80860";
1635 case EM_MIPS: return "MIPS R3000";
1636 case EM_S370: return "IBM System/370";
1637 case EM_MIPS_RS3_LE: return "MIPS R4000 big-endian";
1638 case EM_OLD_SPARCV9: return "Sparc v9 (old)";
1639 case EM_PARISC: return "HPPA";
1640 case EM_PPC_OLD: return "Power PC (old)";
1641 case EM_SPARC32PLUS: return "Sparc v8+" ;
1642 case EM_960: return "Intel 90860";
1643 case EM_PPC: return "PowerPC";
1644 case EM_PPC64: return "PowerPC64";
1645 case EM_V800: return "NEC V800";
1646 case EM_FR20: return "Fujitsu FR20";
1647 case EM_RH32: return "TRW RH32";
1648 case EM_MCORE: return "MCORE";
1649 case EM_ARM: return "ARM";
1650 case EM_OLD_ALPHA: return "Digital Alpha (old)";
1651 case EM_SH: return "Hitachi SH";
1652 case EM_SPARCV9: return "Sparc v9";
1653 case EM_TRICORE: return "Siemens Tricore";
1654 case EM_ARC: return "ARC";
1655 case EM_H8_300: return "Hitachi H8/300";
1656 case EM_H8_300H: return "Hitachi H8/300H";
1657 case EM_H8S: return "Hitachi H8S";
1658 case EM_H8_500: return "Hitachi H8/500";
1659 case EM_IA_64: return "Intel IA-64";
1660 case EM_MIPS_X: return "Stanford MIPS-X";
1661 case EM_COLDFIRE: return "Motorola Coldfire";
1662 case EM_68HC12: return "Motorola M68HC12";
1663 case EM_ALPHA: return "Alpha";
1664 case EM_CYGNUS_D10V:
1665 case EM_D10V: return "d10v";
1666 case EM_CYGNUS_D30V:
1667 case EM_D30V: return "d30v";
1668 case EM_CYGNUS_M32R:
1669 case EM_M32R: return "Mitsubishi M32r";
1670 case EM_CYGNUS_V850:
1671 case EM_V850: return "NEC v850";
1672 case EM_CYGNUS_MN10300:
1673 case EM_MN10300: return "mn10300";
1674 case EM_CYGNUS_MN10200:
1675 case EM_MN10200: return "mn10200";
1676 case EM_CYGNUS_FR30:
1677 case EM_FR30: return "Fujitsu FR30";
1678 case EM_CYGNUS_FRV: return "Fujitsu FR-V";
1680 case EM_PJ: return "picoJava";
1681 case EM_MMA: return "Fujitsu Multimedia Accelerator";
1682 case EM_PCP: return "Siemens PCP";
1683 case EM_NCPU: return "Sony nCPU embedded RISC processor";
1684 case EM_NDR1: return "Denso NDR1 microprocesspr";
1685 case EM_STARCORE: return "Motorola Star*Core processor";
1686 case EM_ME16: return "Toyota ME16 processor";
1687 case EM_ST100: return "STMicroelectronics ST100 processor";
1688 case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
1689 case EM_FX66: return "Siemens FX66 microcontroller";
1690 case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
1691 case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
1692 case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
1693 case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
1694 case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
1695 case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
1696 case EM_SVX: return "Silicon Graphics SVx";
1697 case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
1698 case EM_VAX: return "Digital VAX";
1700 case EM_AVR: return "Atmel AVR 8-bit microcontroller";
1701 case EM_CRIS: return "Axis Communications 32-bit embedded processor";
1702 case EM_JAVELIN: return "Infineon Technologies 32-bit embedded cpu";
1703 case EM_FIREPATH: return "Element 14 64-bit DSP processor";
1704 case EM_ZSP: return "LSI Logic's 16-bit DSP processor";
1705 case EM_MMIX: return "Donald Knuth's educational 64-bit processor";
1706 case EM_HUANY: return "Harvard Universitys's machine-independent object format";
1707 case EM_PRISM: return "SiTera Prism";
1708 case EM_X86_64: return "Advanced Micro Devices X86-64";
1710 case EM_S390: return "IBM S/390";
1711 case EM_XSTORMY16: return "Sanyo Xstormy16 CPU core";
1713 case EM_OR32: return "OpenRISC";
1714 case EM_DLX: return "OpenDLX";
1716 case EM_IP2K: return "Ubicom IP2xxx 8-bit microcontrollers";
1718 sprintf (buff, _("<unknown>: %x"), e_machine);
1724 decode_ARM_machine_flags (e_flags, buf)
1731 eabi = EF_ARM_EABI_VERSION (e_flags);
1732 e_flags &= ~ EF_ARM_EABIMASK;
1734 /* Handle "generic" ARM flags. */
1735 if (e_flags & EF_ARM_RELEXEC)
1737 strcat (buf, ", relocatable executable");
1738 e_flags &= ~ EF_ARM_RELEXEC;
1741 if (e_flags & EF_ARM_HASENTRY)
1743 strcat (buf, ", has entry point");
1744 e_flags &= ~ EF_ARM_HASENTRY;
1747 /* Now handle EABI specific flags. */
1751 strcat (buf, ", <unrecognized EABI>");
1756 case EF_ARM_EABI_VER1:
1757 strcat (buf, ", Version1 EABI");
1762 /* Process flags one bit at a time. */
1763 flag = e_flags & - e_flags;
1768 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1769 strcat (buf, ", sorted symbol tables");
1779 case EF_ARM_EABI_VER2:
1780 strcat (buf, ", Version2 EABI");
1785 /* Process flags one bit at a time. */
1786 flag = e_flags & - e_flags;
1791 case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK. */
1792 strcat (buf, ", sorted symbol tables");
1795 case EF_ARM_DYNSYMSUSESEGIDX:
1796 strcat (buf, ", dynamic symbols use segment index");
1799 case EF_ARM_MAPSYMSFIRST:
1800 strcat (buf, ", mapping symbols precede others");
1810 case EF_ARM_EABI_UNKNOWN:
1811 strcat (buf, ", GNU EABI");
1816 /* Process flags one bit at a time. */
1817 flag = e_flags & - e_flags;
1822 case EF_ARM_INTERWORK:
1823 strcat (buf, ", interworking enabled");
1826 case EF_ARM_APCS_26:
1827 strcat (buf, ", uses APCS/26");
1830 case EF_ARM_APCS_FLOAT:
1831 strcat (buf, ", uses APCS/float");
1835 strcat (buf, ", position independent");
1839 strcat (buf, ", 8 bit structure alignment");
1842 case EF_ARM_NEW_ABI:
1843 strcat (buf, ", uses new ABI");
1846 case EF_ARM_OLD_ABI:
1847 strcat (buf, ", uses old ABI");
1850 case EF_ARM_SOFT_FLOAT:
1851 strcat (buf, ", software FP");
1862 strcat (buf,", <unknown>");
1866 get_machine_flags (e_flags, e_machine)
1870 static char buf[1024];
1882 decode_ARM_machine_flags (e_flags, buf);
1886 if (e_flags & EF_CPU32)
1887 strcat (buf, ", cpu32");
1888 if (e_flags & EF_M68000)
1889 strcat (buf, ", m68000");
1893 if (e_flags & EF_PPC_EMB)
1894 strcat (buf, ", emb");
1896 if (e_flags & EF_PPC_RELOCATABLE)
1897 strcat (buf, ", relocatable");
1899 if (e_flags & EF_PPC_RELOCATABLE_LIB)
1900 strcat (buf, ", relocatable-lib");
1904 case EM_CYGNUS_V850:
1905 switch (e_flags & EF_V850_ARCH)
1908 strcat (buf, ", v850e");
1911 strcat (buf, ", v850");
1914 strcat (buf, ", unknown v850 architecture variant");
1920 case EM_CYGNUS_M32R:
1921 if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
1922 strcat (buf, ", m32r");
1927 case EM_MIPS_RS3_LE:
1928 if (e_flags & EF_MIPS_NOREORDER)
1929 strcat (buf, ", noreorder");
1931 if (e_flags & EF_MIPS_PIC)
1932 strcat (buf, ", pic");
1934 if (e_flags & EF_MIPS_CPIC)
1935 strcat (buf, ", cpic");
1937 if (e_flags & EF_MIPS_UCODE)
1938 strcat (buf, ", ugen_reserved");
1940 if (e_flags & EF_MIPS_ABI2)
1941 strcat (buf, ", abi2");
1943 if (e_flags & EF_MIPS_OPTIONS_FIRST)
1944 strcat (buf, ", odk first");
1946 if (e_flags & EF_MIPS_32BITMODE)
1947 strcat (buf, ", 32bitmode");
1949 switch ((e_flags & EF_MIPS_MACH))
1951 case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
1952 case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
1953 case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
1954 case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
1955 case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
1956 case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
1957 case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
1958 case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
1959 case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break;
1961 /* We simply ignore the field in this case to avoid confusion:
1962 MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
1965 default: strcat (buf, ", unknown CPU"); break;
1968 switch ((e_flags & EF_MIPS_ABI))
1970 case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
1971 case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
1972 case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
1973 case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
1975 /* We simply ignore the field in this case to avoid confusion:
1976 MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
1977 This means it is likely to be an o32 file, but not for
1980 default: strcat (buf, ", unknown ABI"); break;
1983 if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
1984 strcat (buf, ", mdmx");
1986 if (e_flags & EF_MIPS_ARCH_ASE_M16)
1987 strcat (buf, ", mips16");
1989 switch ((e_flags & EF_MIPS_ARCH))
1991 case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
1992 case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
1993 case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
1994 case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
1995 case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
1996 case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
1997 case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
1998 case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
1999 default: strcat (buf, ", unknown ISA"); break;
2005 if (e_flags & EF_SPARC_32PLUS)
2006 strcat (buf, ", v8+");
2008 if (e_flags & EF_SPARC_SUN_US1)
2009 strcat (buf, ", ultrasparcI");
2011 if (e_flags & EF_SPARC_SUN_US3)
2012 strcat (buf, ", ultrasparcIII");
2014 if (e_flags & EF_SPARC_HAL_R1)
2015 strcat (buf, ", halr1");
2017 if (e_flags & EF_SPARC_LEDATA)
2018 strcat (buf, ", ledata");
2020 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
2021 strcat (buf, ", tso");
2023 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
2024 strcat (buf, ", pso");
2026 if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
2027 strcat (buf, ", rmo");
2031 switch (e_flags & EF_PARISC_ARCH)
2033 case EFA_PARISC_1_0:
2034 strcpy (buf, ", PA-RISC 1.0");
2036 case EFA_PARISC_1_1:
2037 strcpy (buf, ", PA-RISC 1.1");
2039 case EFA_PARISC_2_0:
2040 strcpy (buf, ", PA-RISC 2.0");
2045 if (e_flags & EF_PARISC_TRAPNIL)
2046 strcat (buf, ", trapnil");
2047 if (e_flags & EF_PARISC_EXT)
2048 strcat (buf, ", ext");
2049 if (e_flags & EF_PARISC_LSB)
2050 strcat (buf, ", lsb");
2051 if (e_flags & EF_PARISC_WIDE)
2052 strcat (buf, ", wide");
2053 if (e_flags & EF_PARISC_NO_KABP)
2054 strcat (buf, ", no kabp");
2055 if (e_flags & EF_PARISC_LAZYSWAP)
2056 strcat (buf, ", lazyswap");
2061 if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
2062 strcat (buf, ", new calling convention");
2064 if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
2065 strcat (buf, ", gnu calling convention");
2069 if ((e_flags & EF_IA_64_ABI64))
2070 strcat (buf, ", 64-bit");
2072 strcat (buf, ", 32-bit");
2073 if ((e_flags & EF_IA_64_REDUCEDFP))
2074 strcat (buf, ", reduced fp model");
2075 if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
2076 strcat (buf, ", no function descriptors, constant gp");
2077 else if ((e_flags & EF_IA_64_CONS_GP))
2078 strcat (buf, ", constant gp");
2079 if ((e_flags & EF_IA_64_ABSOLUTE))
2080 strcat (buf, ", absolute");
2084 if ((e_flags & EF_VAX_NONPIC))
2085 strcat (buf, ", non-PIC");
2086 if ((e_flags & EF_VAX_DFLOAT))
2087 strcat (buf, ", D-Float");
2088 if ((e_flags & EF_VAX_GFLOAT))
2089 strcat (buf, ", G-Float");
2098 get_mips_segment_type (type)
2103 case PT_MIPS_REGINFO:
2105 case PT_MIPS_RTPROC:
2107 case PT_MIPS_OPTIONS:
2117 get_parisc_segment_type (type)
2122 case PT_HP_TLS: return "HP_TLS";
2123 case PT_HP_CORE_NONE: return "HP_CORE_NONE";
2124 case PT_HP_CORE_VERSION: return "HP_CORE_VERSION";
2125 case PT_HP_CORE_KERNEL: return "HP_CORE_KERNEL";
2126 case PT_HP_CORE_COMM: return "HP_CORE_COMM";
2127 case PT_HP_CORE_PROC: return "HP_CORE_PROC";
2128 case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
2129 case PT_HP_CORE_STACK: return "HP_CORE_STACK";
2130 case PT_HP_CORE_SHM: return "HP_CORE_SHM";
2131 case PT_HP_CORE_MMF: return "HP_CORE_MMF";
2132 case PT_HP_PARALLEL: return "HP_PARALLEL";
2133 case PT_HP_FASTBIND: return "HP_FASTBIND";
2134 case PT_PARISC_ARCHEXT: return "PARISC_ARCHEXT";
2135 case PT_PARISC_UNWIND: return "PARISC_UNWIND";
2144 get_ia64_segment_type (type)
2149 case PT_IA_64_ARCHEXT: return "IA_64_ARCHEXT";
2150 case PT_IA_64_UNWIND: return "IA_64_UNWIND";
2151 case PT_HP_TLS: return "HP_TLS";
2152 case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
2153 case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
2154 case PT_IA_64_HP_STACK: return "HP_STACK";
2163 get_segment_type (p_type)
2164 unsigned long p_type;
2166 static char buff[32];
2170 case PT_NULL: return "NULL";
2171 case PT_LOAD: return "LOAD";
2172 case PT_DYNAMIC: return "DYNAMIC";
2173 case PT_INTERP: return "INTERP";
2174 case PT_NOTE: return "NOTE";
2175 case PT_SHLIB: return "SHLIB";
2176 case PT_PHDR: return "PHDR";
2177 case PT_TLS: return "TLS";
2179 case PT_GNU_EH_FRAME:
2180 return "GNU_EH_FRAME";
2183 if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
2187 switch (elf_header.e_machine)
2190 case EM_MIPS_RS3_LE:
2191 result = get_mips_segment_type (p_type);
2194 result = get_parisc_segment_type (p_type);
2197 result = get_ia64_segment_type (p_type);
2207 sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
2209 else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
2213 switch (elf_header.e_machine)
2216 result = get_parisc_segment_type (p_type);
2219 result = get_ia64_segment_type (p_type);
2229 sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
2232 sprintf (buff, _("<unknown>: %lx"), p_type);
2239 get_mips_section_type_name (sh_type)
2240 unsigned int sh_type;
2244 case SHT_MIPS_LIBLIST: return "MIPS_LIBLIST";
2245 case SHT_MIPS_MSYM: return "MIPS_MSYM";
2246 case SHT_MIPS_CONFLICT: return "MIPS_CONFLICT";
2247 case SHT_MIPS_GPTAB: return "MIPS_GPTAB";
2248 case SHT_MIPS_UCODE: return "MIPS_UCODE";
2249 case SHT_MIPS_DEBUG: return "MIPS_DEBUG";
2250 case SHT_MIPS_REGINFO: return "MIPS_REGINFO";
2251 case SHT_MIPS_PACKAGE: return "MIPS_PACKAGE";
2252 case SHT_MIPS_PACKSYM: return "MIPS_PACKSYM";
2253 case SHT_MIPS_RELD: return "MIPS_RELD";
2254 case SHT_MIPS_IFACE: return "MIPS_IFACE";
2255 case SHT_MIPS_CONTENT: return "MIPS_CONTENT";
2256 case SHT_MIPS_OPTIONS: return "MIPS_OPTIONS";
2257 case SHT_MIPS_SHDR: return "MIPS_SHDR";
2258 case SHT_MIPS_FDESC: return "MIPS_FDESC";
2259 case SHT_MIPS_EXTSYM: return "MIPS_EXTSYM";
2260 case SHT_MIPS_DENSE: return "MIPS_DENSE";
2261 case SHT_MIPS_PDESC: return "MIPS_PDESC";
2262 case SHT_MIPS_LOCSYM: return "MIPS_LOCSYM";
2263 case SHT_MIPS_AUXSYM: return "MIPS_AUXSYM";
2264 case SHT_MIPS_OPTSYM: return "MIPS_OPTSYM";
2265 case SHT_MIPS_LOCSTR: return "MIPS_LOCSTR";
2266 case SHT_MIPS_LINE: return "MIPS_LINE";
2267 case SHT_MIPS_RFDESC: return "MIPS_RFDESC";
2268 case SHT_MIPS_DELTASYM: return "MIPS_DELTASYM";
2269 case SHT_MIPS_DELTAINST: return "MIPS_DELTAINST";
2270 case SHT_MIPS_DELTACLASS: return "MIPS_DELTACLASS";
2271 case SHT_MIPS_DWARF: return "MIPS_DWARF";
2272 case SHT_MIPS_DELTADECL: return "MIPS_DELTADECL";
2273 case SHT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
2274 case SHT_MIPS_EVENTS: return "MIPS_EVENTS";
2275 case SHT_MIPS_TRANSLATE: return "MIPS_TRANSLATE";
2276 case SHT_MIPS_PIXIE: return "MIPS_PIXIE";
2277 case SHT_MIPS_XLATE: return "MIPS_XLATE";
2278 case SHT_MIPS_XLATE_DEBUG: return "MIPS_XLATE_DEBUG";
2279 case SHT_MIPS_WHIRL: return "MIPS_WHIRL";
2280 case SHT_MIPS_EH_REGION: return "MIPS_EH_REGION";
2281 case SHT_MIPS_XLATE_OLD: return "MIPS_XLATE_OLD";
2282 case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
2290 get_parisc_section_type_name (sh_type)
2291 unsigned int sh_type;
2295 case SHT_PARISC_EXT: return "PARISC_EXT";
2296 case SHT_PARISC_UNWIND: return "PARISC_UNWIND";
2297 case SHT_PARISC_DOC: return "PARISC_DOC";
2305 get_ia64_section_type_name (sh_type)
2306 unsigned int sh_type;
2310 case SHT_IA_64_EXT: return "IA_64_EXT";
2311 case SHT_IA_64_UNWIND: return "IA_64_UNWIND";
2319 get_section_type_name (sh_type)
2320 unsigned int sh_type;
2322 static char buff[32];
2326 case SHT_NULL: return "NULL";
2327 case SHT_PROGBITS: return "PROGBITS";
2328 case SHT_SYMTAB: return "SYMTAB";
2329 case SHT_STRTAB: return "STRTAB";
2330 case SHT_RELA: return "RELA";
2331 case SHT_HASH: return "HASH";
2332 case SHT_DYNAMIC: return "DYNAMIC";
2333 case SHT_NOTE: return "NOTE";
2334 case SHT_NOBITS: return "NOBITS";
2335 case SHT_REL: return "REL";
2336 case SHT_SHLIB: return "SHLIB";
2337 case SHT_DYNSYM: return "DYNSYM";
2338 case SHT_INIT_ARRAY: return "INIT_ARRAY";
2339 case SHT_FINI_ARRAY: return "FINI_ARRAY";
2340 case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2341 case SHT_GROUP: return "GROUP";
2342 case SHT_SYMTAB_SHNDX: return "SYMTAB SECTION INDICIES";
2343 case SHT_GNU_verdef: return "VERDEF";
2344 case SHT_GNU_verneed: return "VERNEED";
2345 case SHT_GNU_versym: return "VERSYM";
2346 case 0x6ffffff0: return "VERSYM";
2347 case 0x6ffffffc: return "VERDEF";
2348 case 0x7ffffffd: return "AUXILIARY";
2349 case 0x7fffffff: return "FILTER";
2350 case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
2353 if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
2357 switch (elf_header.e_machine)
2360 case EM_MIPS_RS3_LE:
2361 result = get_mips_section_type_name (sh_type);
2364 result = get_parisc_section_type_name (sh_type);
2367 result = get_ia64_section_type_name (sh_type);
2377 sprintf (buff, "LOPROC+%x", sh_type - SHT_LOPROC);
2379 else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
2380 sprintf (buff, "LOOS+%x", sh_type - SHT_LOOS);
2381 else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
2382 sprintf (buff, "LOUSER+%x", sh_type - SHT_LOUSER);
2384 sprintf (buff, _("<unknown>: %x"), sh_type);
2390 #define OPTION_DEBUG_DUMP 512
2392 struct option options[] =
2394 {"all", no_argument, 0, 'a'},
2395 {"file-header", no_argument, 0, 'h'},
2396 {"program-headers", no_argument, 0, 'l'},
2397 {"headers", no_argument, 0, 'e'},
2398 {"histogram", no_argument, 0, 'I'},
2399 {"segments", no_argument, 0, 'l'},
2400 {"sections", no_argument, 0, 'S'},
2401 {"section-headers", no_argument, 0, 'S'},
2402 {"symbols", no_argument, 0, 's'},
2403 {"syms", no_argument, 0, 's'},
2404 {"relocs", no_argument, 0, 'r'},
2405 {"notes", no_argument, 0, 'n'},
2406 {"dynamic", no_argument, 0, 'd'},
2407 {"arch-specific", no_argument, 0, 'A'},
2408 {"version-info", no_argument, 0, 'V'},
2409 {"use-dynamic", no_argument, 0, 'D'},
2410 {"hex-dump", required_argument, 0, 'x'},
2411 {"debug-dump", optional_argument, 0, OPTION_DEBUG_DUMP},
2412 {"unwind", no_argument, 0, 'u'},
2413 #ifdef SUPPORT_DISASSEMBLY
2414 {"instruction-dump", required_argument, 0, 'i'},
2417 {"version", no_argument, 0, 'v'},
2418 {"wide", no_argument, 0, 'W'},
2419 {"help", no_argument, 0, 'H'},
2420 {0, no_argument, 0, 0}
2426 fprintf (stdout, _("Usage: readelf <option(s)> elf-file(s)\n"));
2427 fprintf (stdout, _(" Display information about the contents of ELF format files\n"));
2428 fprintf (stdout, _(" Options are:\n\
2429 -a --all Equivalent to: -h -l -S -s -r -d -V -A -I\n\
2430 -h --file-header Display the ELF file header\n\
2431 -l --program-headers Display the program headers\n\
2432 --segments An alias for --program-headers\n\
2433 -S --section-headers Display the sections' header\n\
2434 --sections An alias for --section-headers\n\
2435 -e --headers Equivalent to: -h -l -S\n\
2436 -s --syms Display the symbol table\n\
2437 --symbols An alias for --syms\n\
2438 -n --notes Display the core notes (if present)\n\
2439 -r --relocs Display the relocations (if present)\n\
2440 -u --unwind Display the unwind info (if present)\n\
2441 -d --dynamic Display the dynamic segment (if present)\n\
2442 -V --version-info Display the version sections (if present)\n\
2443 -A --arch-specific Display architecture specific information (if any).\n\
2444 -D --use-dynamic Use the dynamic section info when displaying symbols\n\
2445 -x --hex-dump=<number> Dump the contents of section <number>\n\
2446 -w[liaprmfFso] or\n\
2447 --debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]\n\
2448 Display the contents of DWARF2 debug sections\n"));
2449 #ifdef SUPPORT_DISASSEMBLY
2450 fprintf (stdout, _("\
2451 -i --instruction-dump=<number>\n\
2452 Disassemble the contents of section <number>\n"));
2454 fprintf (stdout, _("\
2455 -I --histogram Display histogram of bucket list lengths\n\
2456 -W --wide Allow output width to exceed 80 characters\n\
2457 -H --help Display this information\n\
2458 -v --version Display the version number of readelf\n"));
2459 fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
2465 request_dump (section, type)
2466 unsigned int section;
2469 if (section >= num_dump_sects)
2471 char *new_dump_sects;
2473 new_dump_sects = (char *) calloc (section + 1, 1);
2475 if (new_dump_sects == NULL)
2476 error (_("Out of memory allocating dump request table."));
2479 /* Copy current flag settings. */
2480 memcpy (new_dump_sects, dump_sects, num_dump_sects);
2484 dump_sects = new_dump_sects;
2485 num_dump_sects = section + 1;
2490 dump_sects[section] |= type;
2496 parse_args (argc, argv)
2505 while ((c = getopt_long
2506 (argc, argv, "ersuahnldSDAIw::x:i:vVW", options, NULL)) != EOF)
2573 section = strtoul (optarg, & cp, 0);
2574 if (! *cp && section >= 0)
2576 request_dump (section, HEX_DUMP);
2586 unsigned int index = 0;
2590 while (optarg[index])
2591 switch (optarg[index++])
2600 do_debug_abbrevs = 1;
2610 do_debug_pubnames = 1;
2615 do_debug_aranges = 1;
2619 do_debug_frames_interp = 1;
2621 do_debug_frames = 1;
2626 do_debug_macinfo = 1;
2640 warn (_("Unrecognized debug option '%s'\n"), optarg);
2645 case OPTION_DEBUG_DUMP:
2651 static const char *debug_dump_opt[]
2652 = { "line", "info", "abbrev", "pubnames", "ranges",
2653 "macro", "frames", "frames-interp", "str", "loc", NULL };
2662 for (index = 0; debug_dump_opt[index]; index++)
2664 size_t len = strlen (debug_dump_opt[index]);
2666 if (strncmp (p, debug_dump_opt[index], len) == 0
2667 && (p[len] == ',' || p[len] == '\0'))
2676 do_debug_abbrevs = 1;
2687 do_debug_pubnames = 1;
2691 do_debug_aranges = 1;
2696 do_debug_frames_interp = 1;
2697 do_debug_frames = 1;
2701 do_debug_macinfo = 1;
2714 if (debug_dump_opt[index] == NULL)
2716 warn (_("Unrecognized debug option '%s'\n"), p);
2717 p = strchr (p, ',');
2727 #ifdef SUPPORT_DISASSEMBLY
2730 section = strtoul (optarg, & cp, 0);
2731 if (! *cp && section >= 0)
2733 request_dump (section, DISASS_DUMP);
2739 print_version (program_name);
2749 /* xgettext:c-format */
2750 error (_("Invalid option '-%c'\n"), c);
2757 if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
2758 && !do_segments && !do_header && !do_dump && !do_version
2759 && !do_histogram && !do_debugging && !do_arch && !do_notes)
2763 warn (_("Nothing to do.\n"));
2769 get_elf_class (elf_class)
2770 unsigned int elf_class;
2772 static char buff[32];
2776 case ELFCLASSNONE: return _("none");
2777 case ELFCLASS32: return "ELF32";
2778 case ELFCLASS64: return "ELF64";
2780 sprintf (buff, _("<unknown: %x>"), elf_class);
2786 get_data_encoding (encoding)
2787 unsigned int encoding;
2789 static char buff[32];
2793 case ELFDATANONE: return _("none");
2794 case ELFDATA2LSB: return _("2's complement, little endian");
2795 case ELFDATA2MSB: return _("2's complement, big endian");
2797 sprintf (buff, _("<unknown: %x>"), encoding);
2803 get_osabi_name (osabi)
2806 static char buff[32];
2810 case ELFOSABI_NONE: return "UNIX - System V";
2811 case ELFOSABI_HPUX: return "UNIX - HP-UX";
2812 case ELFOSABI_NETBSD: return "UNIX - NetBSD";
2813 case ELFOSABI_LINUX: return "UNIX - Linux";
2814 case ELFOSABI_HURD: return "GNU/Hurd";
2815 case ELFOSABI_SOLARIS: return "UNIX - Solaris";
2816 case ELFOSABI_AIX: return "UNIX - AIX";
2817 case ELFOSABI_IRIX: return "UNIX - IRIX";
2818 case ELFOSABI_FREEBSD: return "UNIX - FreeBSD";
2819 case ELFOSABI_TRU64: return "UNIX - TRU64";
2820 case ELFOSABI_MODESTO: return "Novell - Modesto";
2821 case ELFOSABI_OPENBSD: return "UNIX - OpenBSD";
2822 case ELFOSABI_STANDALONE: return _("Standalone App");
2823 case ELFOSABI_ARM: return "ARM";
2825 sprintf (buff, _("<unknown: %x>"), osabi);
2830 /* Decode the data held in 'elf_header'. */
2832 process_file_header ()
2834 if ( elf_header.e_ident[EI_MAG0] != ELFMAG0
2835 || elf_header.e_ident[EI_MAG1] != ELFMAG1
2836 || elf_header.e_ident[EI_MAG2] != ELFMAG2
2837 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
2840 (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
2848 printf (_("ELF Header:\n"));
2849 printf (_(" Magic: "));
2850 for (i = 0; i < EI_NIDENT; i++)
2851 printf ("%2.2x ", elf_header.e_ident[i]);
2853 printf (_(" Class: %s\n"),
2854 get_elf_class (elf_header.e_ident[EI_CLASS]));
2855 printf (_(" Data: %s\n"),
2856 get_data_encoding (elf_header.e_ident[EI_DATA]));
2857 printf (_(" Version: %d %s\n"),
2858 elf_header.e_ident[EI_VERSION],
2859 (elf_header.e_ident[EI_VERSION] == EV_CURRENT
2861 : (elf_header.e_ident[EI_VERSION] != EV_NONE
2864 printf (_(" OS/ABI: %s\n"),
2865 get_osabi_name (elf_header.e_ident[EI_OSABI]));
2866 printf (_(" ABI Version: %d\n"),
2867 elf_header.e_ident[EI_ABIVERSION]);
2868 printf (_(" Type: %s\n"),
2869 get_file_type (elf_header.e_type));
2870 printf (_(" Machine: %s\n"),
2871 get_machine_name (elf_header.e_machine));
2872 printf (_(" Version: 0x%lx\n"),
2873 (unsigned long) elf_header.e_version);
2875 printf (_(" Entry point address: "));
2876 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
2877 printf (_("\n Start of program headers: "));
2878 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
2879 printf (_(" (bytes into file)\n Start of section headers: "));
2880 print_vma ((bfd_vma) elf_header.e_shoff, DEC);
2881 printf (_(" (bytes into file)\n"));
2883 printf (_(" Flags: 0x%lx%s\n"),
2884 (unsigned long) elf_header.e_flags,
2885 get_machine_flags (elf_header.e_flags, elf_header.e_machine));
2886 printf (_(" Size of this header: %ld (bytes)\n"),
2887 (long) elf_header.e_ehsize);
2888 printf (_(" Size of program headers: %ld (bytes)\n"),
2889 (long) elf_header.e_phentsize);
2890 printf (_(" Number of program headers: %ld\n"),
2891 (long) elf_header.e_phnum);
2892 printf (_(" Size of section headers: %ld (bytes)\n"),
2893 (long) elf_header.e_shentsize);
2894 printf (_(" Number of section headers: %ld"),
2895 (long) elf_header.e_shnum);
2896 if (section_headers != NULL && elf_header.e_shnum == 0)
2897 printf (" (%ld)", (long) section_headers[0].sh_size);
2898 putc ('\n', stdout);
2899 printf (_(" Section header string table index: %ld"),
2900 (long) elf_header.e_shstrndx);
2901 if (section_headers != NULL && elf_header.e_shstrndx == SHN_XINDEX)
2902 printf (" (%ld)", (long) section_headers[0].sh_link);
2903 putc ('\n', stdout);
2906 if (section_headers != NULL)
2908 if (elf_header.e_shnum == 0)
2909 elf_header.e_shnum = section_headers[0].sh_size;
2910 if (elf_header.e_shstrndx == SHN_XINDEX)
2911 elf_header.e_shstrndx = section_headers[0].sh_link;
2912 free (section_headers);
2913 section_headers = NULL;
2921 get_32bit_program_headers (file, program_headers)
2923 Elf_Internal_Phdr *program_headers;
2925 Elf32_External_Phdr *phdrs;
2926 Elf32_External_Phdr *external;
2927 Elf_Internal_Phdr *internal;
2930 phdrs = ((Elf32_External_Phdr *)
2931 get_data (NULL, file, elf_header.e_phoff,
2932 elf_header.e_phentsize * elf_header.e_phnum,
2933 _("program headers")));
2937 for (i = 0, internal = program_headers, external = phdrs;
2938 i < elf_header.e_phnum;
2939 i++, internal++, external++)
2941 internal->p_type = BYTE_GET (external->p_type);
2942 internal->p_offset = BYTE_GET (external->p_offset);
2943 internal->p_vaddr = BYTE_GET (external->p_vaddr);
2944 internal->p_paddr = BYTE_GET (external->p_paddr);
2945 internal->p_filesz = BYTE_GET (external->p_filesz);
2946 internal->p_memsz = BYTE_GET (external->p_memsz);
2947 internal->p_flags = BYTE_GET (external->p_flags);
2948 internal->p_align = BYTE_GET (external->p_align);
2957 get_64bit_program_headers (file, program_headers)
2959 Elf_Internal_Phdr *program_headers;
2961 Elf64_External_Phdr *phdrs;
2962 Elf64_External_Phdr *external;
2963 Elf_Internal_Phdr *internal;
2966 phdrs = ((Elf64_External_Phdr *)
2967 get_data (NULL, file, elf_header.e_phoff,
2968 elf_header.e_phentsize * elf_header.e_phnum,
2969 _("program headers")));
2973 for (i = 0, internal = program_headers, external = phdrs;
2974 i < elf_header.e_phnum;
2975 i++, internal++, external++)
2977 internal->p_type = BYTE_GET (external->p_type);
2978 internal->p_flags = BYTE_GET (external->p_flags);
2979 internal->p_offset = BYTE_GET8 (external->p_offset);
2980 internal->p_vaddr = BYTE_GET8 (external->p_vaddr);
2981 internal->p_paddr = BYTE_GET8 (external->p_paddr);
2982 internal->p_filesz = BYTE_GET8 (external->p_filesz);
2983 internal->p_memsz = BYTE_GET8 (external->p_memsz);
2984 internal->p_align = BYTE_GET8 (external->p_align);
2992 /* Returns 1 if the program headers were loaded. */
2995 process_program_headers (file)
2998 Elf_Internal_Phdr *program_headers;
2999 Elf_Internal_Phdr *segment;
3002 if (elf_header.e_phnum == 0)
3005 printf (_("\nThere are no program headers in this file.\n"));
3009 if (do_segments && !do_header)
3011 printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
3012 printf (_("Entry point "));
3013 print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
3014 printf (_("\nThere are %d program headers, starting at offset "),
3015 elf_header.e_phnum);
3016 print_vma ((bfd_vma) elf_header.e_phoff, DEC);
3020 program_headers = (Elf_Internal_Phdr *) malloc
3021 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
3023 if (program_headers == NULL)
3025 error (_("Out of memory\n"));
3030 i = get_32bit_program_headers (file, program_headers);
3032 i = get_64bit_program_headers (file, program_headers);
3036 free (program_headers);
3042 if (elf_header.e_phnum > 1)
3043 printf (_("\nProgram Headers:\n"));
3045 printf (_("\nProgram Headers:\n"));
3049 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3052 (_(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align\n"));
3056 (_(" Type Offset VirtAddr PhysAddr\n"));
3058 (_(" FileSiz MemSiz Flags Align\n"));
3066 for (i = 0, segment = program_headers;
3067 i < elf_header.e_phnum;
3072 printf (" %-14.14s ", get_segment_type (segment->p_type));
3076 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3077 printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
3078 printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
3079 printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
3080 printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
3082 (segment->p_flags & PF_R ? 'R' : ' '),
3083 (segment->p_flags & PF_W ? 'W' : ' '),
3084 (segment->p_flags & PF_X ? 'E' : ' '));
3085 printf ("%#lx", (unsigned long) segment->p_align);
3089 if ((unsigned long) segment->p_offset == segment->p_offset)
3090 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
3093 print_vma (segment->p_offset, FULL_HEX);
3097 print_vma (segment->p_vaddr, FULL_HEX);
3099 print_vma (segment->p_paddr, FULL_HEX);
3102 if ((unsigned long) segment->p_filesz == segment->p_filesz)
3103 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
3106 print_vma (segment->p_filesz, FULL_HEX);
3110 if ((unsigned long) segment->p_memsz == segment->p_memsz)
3111 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
3114 print_vma (segment->p_offset, FULL_HEX);
3118 (segment->p_flags & PF_R ? 'R' : ' '),
3119 (segment->p_flags & PF_W ? 'W' : ' '),
3120 (segment->p_flags & PF_X ? 'E' : ' '));
3122 if ((unsigned long) segment->p_align == segment->p_align)
3123 printf ("%#lx", (unsigned long) segment->p_align);
3126 print_vma (segment->p_align, PREFIX_HEX);
3131 print_vma (segment->p_offset, FULL_HEX);
3133 print_vma (segment->p_vaddr, FULL_HEX);
3135 print_vma (segment->p_paddr, FULL_HEX);
3137 print_vma (segment->p_filesz, FULL_HEX);
3139 print_vma (segment->p_memsz, FULL_HEX);
3141 (segment->p_flags & PF_R ? 'R' : ' '),
3142 (segment->p_flags & PF_W ? 'W' : ' '),
3143 (segment->p_flags & PF_X ? 'E' : ' '));
3144 print_vma (segment->p_align, HEX);
3148 switch (segment->p_type)
3153 unsigned long align_mask = -segment->p_align;
3155 if (align_mask == 0)
3157 loadaddr = ((segment->p_vaddr & align_mask)
3158 - (segment->p_offset & align_mask));
3164 error (_("more than one dynamic segment\n"));
3166 dynamic_addr = segment->p_offset;
3167 dynamic_size = segment->p_filesz;
3171 if (fseek (file, (long) segment->p_offset, SEEK_SET))
3172 error (_("Unable to find program interpreter name\n"));
3175 program_interpreter[0] = 0;
3176 fscanf (file, "%63s", program_interpreter);
3179 printf (_("\n [Requesting program interpreter: %s]"),
3180 program_interpreter);
3186 putc ('\n', stdout);
3195 if (do_segments && section_headers != NULL)
3197 printf (_("\n Section to Segment mapping:\n"));
3198 printf (_(" Segment Sections...\n"));
3200 assert (string_table != NULL);
3202 for (i = 0; i < elf_header.e_phnum; i++)
3205 Elf_Internal_Shdr *section;
3207 segment = program_headers + i;
3208 section = section_headers;
3210 printf (" %2.2d ", i);
3212 for (j = 1; j < elf_header.e_shnum; j++, section++)
3214 if (section->sh_size > 0
3215 /* Compare allocated sections by VMA, unallocated
3216 sections by file offset. */
3217 && (section->sh_flags & SHF_ALLOC
3218 ? (section->sh_addr >= segment->p_vaddr
3219 && section->sh_addr + section->sh_size
3220 <= segment->p_vaddr + segment->p_memsz)
3221 : ((bfd_vma) section->sh_offset >= segment->p_offset
3222 && (section->sh_offset + section->sh_size
3223 <= segment->p_offset + segment->p_filesz))))
3224 printf ("%s ", SECTION_NAME (section));
3231 free (program_headers);
3238 get_32bit_section_headers (file, num)
3242 Elf32_External_Shdr *shdrs;
3243 Elf_Internal_Shdr *internal;
3246 shdrs = ((Elf32_External_Shdr *)
3247 get_data (NULL, file, elf_header.e_shoff,
3248 elf_header.e_shentsize * num,
3249 _("section headers")));
3253 section_headers = ((Elf_Internal_Shdr *)
3254 malloc (num * sizeof (Elf_Internal_Shdr)));
3256 if (section_headers == NULL)
3258 error (_("Out of memory\n"));
3262 for (i = 0, internal = section_headers;
3266 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3267 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3268 internal->sh_flags = BYTE_GET (shdrs[i].sh_flags);
3269 internal->sh_addr = BYTE_GET (shdrs[i].sh_addr);
3270 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3271 internal->sh_size = BYTE_GET (shdrs[i].sh_size);
3272 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3273 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3274 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3275 internal->sh_entsize = BYTE_GET (shdrs[i].sh_entsize);
3284 get_64bit_section_headers (file, num)
3288 Elf64_External_Shdr *shdrs;
3289 Elf_Internal_Shdr *internal;
3292 shdrs = ((Elf64_External_Shdr *)
3293 get_data (NULL, file, elf_header.e_shoff,
3294 elf_header.e_shentsize * num,
3295 _("section headers")));
3299 section_headers = ((Elf_Internal_Shdr *)
3300 malloc (num * sizeof (Elf_Internal_Shdr)));
3302 if (section_headers == NULL)
3304 error (_("Out of memory\n"));
3308 for (i = 0, internal = section_headers;
3312 internal->sh_name = BYTE_GET (shdrs[i].sh_name);
3313 internal->sh_type = BYTE_GET (shdrs[i].sh_type);
3314 internal->sh_flags = BYTE_GET8 (shdrs[i].sh_flags);
3315 internal->sh_addr = BYTE_GET8 (shdrs[i].sh_addr);
3316 internal->sh_size = BYTE_GET8 (shdrs[i].sh_size);
3317 internal->sh_entsize = BYTE_GET8 (shdrs[i].sh_entsize);
3318 internal->sh_link = BYTE_GET (shdrs[i].sh_link);
3319 internal->sh_info = BYTE_GET (shdrs[i].sh_info);
3320 internal->sh_offset = BYTE_GET (shdrs[i].sh_offset);
3321 internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
3329 static Elf_Internal_Sym *
3330 get_32bit_elf_symbols (file, section)
3332 Elf_Internal_Shdr *section;
3334 unsigned long number;
3335 Elf32_External_Sym *esyms;
3336 Elf_External_Sym_Shndx *shndx;
3337 Elf_Internal_Sym *isyms;
3338 Elf_Internal_Sym *psym;
3341 esyms = ((Elf32_External_Sym *)
3342 get_data (NULL, file, section->sh_offset,
3343 section->sh_size, _("symbols")));
3348 if (symtab_shndx_hdr != NULL
3349 && (symtab_shndx_hdr->sh_link
3350 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3352 shndx = ((Elf_External_Sym_Shndx *)
3353 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3354 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3362 number = section->sh_size / section->sh_entsize;
3363 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3367 error (_("Out of memory\n"));
3374 for (j = 0, psym = isyms;
3378 psym->st_name = BYTE_GET (esyms[j].st_name);
3379 psym->st_value = BYTE_GET (esyms[j].st_value);
3380 psym->st_size = BYTE_GET (esyms[j].st_size);
3381 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3382 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3384 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3385 psym->st_info = BYTE_GET (esyms[j].st_info);
3386 psym->st_other = BYTE_GET (esyms[j].st_other);
3396 static Elf_Internal_Sym *
3397 get_64bit_elf_symbols (file, section)
3399 Elf_Internal_Shdr *section;
3401 unsigned long number;
3402 Elf64_External_Sym *esyms;
3403 Elf_External_Sym_Shndx *shndx;
3404 Elf_Internal_Sym *isyms;
3405 Elf_Internal_Sym *psym;
3408 esyms = ((Elf64_External_Sym *)
3409 get_data (NULL, file, section->sh_offset,
3410 section->sh_size, _("symbols")));
3415 if (symtab_shndx_hdr != NULL
3416 && (symtab_shndx_hdr->sh_link
3417 == (unsigned long) SECTION_HEADER_NUM (section - section_headers)))
3419 shndx = ((Elf_External_Sym_Shndx *)
3420 get_data (NULL, file, symtab_shndx_hdr->sh_offset,
3421 symtab_shndx_hdr->sh_size, _("symtab shndx")));
3429 number = section->sh_size / section->sh_entsize;
3430 isyms = (Elf_Internal_Sym *) malloc (number * sizeof (Elf_Internal_Sym));
3434 error (_("Out of memory\n"));
3441 for (j = 0, psym = isyms;
3445 psym->st_name = BYTE_GET (esyms[j].st_name);
3446 psym->st_info = BYTE_GET (esyms[j].st_info);
3447 psym->st_other = BYTE_GET (esyms[j].st_other);
3448 psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
3449 if (psym->st_shndx == SHN_XINDEX && shndx != NULL)
3451 = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
3452 psym->st_value = BYTE_GET8 (esyms[j].st_value);
3453 psym->st_size = BYTE_GET8 (esyms[j].st_size);
3464 get_elf_section_flags (sh_flags)
3467 static char buff[32];
3475 flag = sh_flags & - sh_flags;
3480 case SHF_WRITE: strcat (buff, "W"); break;
3481 case SHF_ALLOC: strcat (buff, "A"); break;
3482 case SHF_EXECINSTR: strcat (buff, "X"); break;
3483 case SHF_MERGE: strcat (buff, "M"); break;
3484 case SHF_STRINGS: strcat (buff, "S"); break;
3485 case SHF_INFO_LINK: strcat (buff, "I"); break;
3486 case SHF_LINK_ORDER: strcat (buff, "L"); break;
3487 case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
3488 case SHF_GROUP: strcat (buff, "G"); break;
3489 case SHF_TLS: strcat (buff, "T"); break;
3492 if (flag & SHF_MASKOS)
3495 sh_flags &= ~ SHF_MASKOS;
3497 else if (flag & SHF_MASKPROC)
3500 sh_flags &= ~ SHF_MASKPROC;
3512 process_section_headers (file)
3515 Elf_Internal_Shdr *section;
3518 section_headers = NULL;
3520 if (elf_header.e_shnum == 0)
3523 printf (_("\nThere are no sections in this file.\n"));
3528 if (do_sections && !do_header)
3529 printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
3530 elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
3534 if (! get_32bit_section_headers (file, elf_header.e_shnum))
3537 else if (! get_64bit_section_headers (file, elf_header.e_shnum))
3540 /* Read in the string table, so that we have names to display. */
3541 section = SECTION_HEADER (elf_header.e_shstrndx);
3543 if (section->sh_size != 0)
3545 string_table = (char *) get_data (NULL, file, section->sh_offset,
3546 section->sh_size, _("string table"));
3548 string_table_length = section->sh_size;
3551 /* Scan the sections for the dynamic symbol table
3552 and dynamic string table and debug sections. */
3553 dynamic_symbols = NULL;
3554 dynamic_strings = NULL;
3555 dynamic_syminfo = NULL;
3556 symtab_shndx_hdr = NULL;
3558 for (i = 0, section = section_headers;
3559 i < elf_header.e_shnum;
3562 char *name = SECTION_NAME (section);
3564 if (section->sh_type == SHT_DYNSYM)
3566 if (dynamic_symbols != NULL)
3568 error (_("File contains multiple dynamic symbol tables\n"));
3572 num_dynamic_syms = section->sh_size / section->sh_entsize;
3573 dynamic_symbols = GET_ELF_SYMBOLS (file, section);
3575 else if (section->sh_type == SHT_STRTAB
3576 && strcmp (name, ".dynstr") == 0)
3578 if (dynamic_strings != NULL)
3580 error (_("File contains multiple dynamic string tables\n"));
3584 dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
3586 _("dynamic strings"));
3588 else if (section->sh_type == SHT_SYMTAB_SHNDX)
3590 if (symtab_shndx_hdr != NULL)
3592 error (_("File contains multiple symtab shndx tables\n"));
3595 symtab_shndx_hdr = section;
3597 else if ((do_debugging || do_debug_info || do_debug_abbrevs
3598 || do_debug_lines || do_debug_pubnames || do_debug_aranges
3599 || do_debug_frames || do_debug_macinfo || do_debug_str
3601 && strncmp (name, ".debug_", 7) == 0)
3606 || (do_debug_info && (strcmp (name, "info") == 0))
3607 || (do_debug_abbrevs && (strcmp (name, "abbrev") == 0))
3608 || (do_debug_lines && (strcmp (name, "line") == 0))
3609 || (do_debug_pubnames && (strcmp (name, "pubnames") == 0))
3610 || (do_debug_aranges && (strcmp (name, "aranges") == 0))
3611 || (do_debug_frames && (strcmp (name, "frame") == 0))
3612 || (do_debug_macinfo && (strcmp (name, "macinfo") == 0))
3613 || (do_debug_str && (strcmp (name, "str") == 0))
3614 || (do_debug_loc && (strcmp (name, "loc") == 0))
3616 request_dump (i, DEBUG_DUMP);
3618 /* linkonce section to be combined with .debug_info at link time. */
3619 else if ((do_debugging || do_debug_info)
3620 && strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
3621 request_dump (i, DEBUG_DUMP);
3622 else if (do_debug_frames && strcmp (name, ".eh_frame") == 0)
3623 request_dump (i, DEBUG_DUMP);
3629 if (elf_header.e_shnum > 1)
3630 printf (_("\nSection Headers:\n"));
3632 printf (_("\nSection Header:\n"));
3636 (_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
3639 (_(" [Nr] Name Type Address Off Size ES Flg Lk Inf Al\n"));
3642 printf (_(" [Nr] Name Type Address Offset\n"));
3643 printf (_(" Size EntSize Flags Link Info Align\n"));
3646 for (i = 0, section = section_headers;
3647 i < elf_header.e_shnum;
3650 printf (" [%2u] %-17.17s %-15.15s ",
3651 SECTION_HEADER_NUM (i),
3652 SECTION_NAME (section),
3653 get_section_type_name (section->sh_type));
3657 print_vma (section->sh_addr, LONG_HEX);
3659 printf ( " %6.6lx %6.6lx %2.2lx",
3660 (unsigned long) section->sh_offset,
3661 (unsigned long) section->sh_size,
3662 (unsigned long) section->sh_entsize);
3664 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3666 printf ("%2ld %3lx %2ld\n",
3667 (unsigned long) section->sh_link,
3668 (unsigned long) section->sh_info,
3669 (unsigned long) section->sh_addralign);
3673 print_vma (section->sh_addr, LONG_HEX);
3675 if ((long) section->sh_offset == section->sh_offset)
3676 printf (" %6.6lx", (unsigned long) section->sh_offset);
3680 print_vma (section->sh_offset, LONG_HEX);
3683 if ((unsigned long) section->sh_size == section->sh_size)
3684 printf (" %6.6lx", (unsigned long) section->sh_size);
3688 print_vma (section->sh_size, LONG_HEX);
3691 if ((unsigned long) section->sh_entsize == section->sh_entsize)
3692 printf (" %2.2lx", (unsigned long) section->sh_entsize);
3696 print_vma (section->sh_entsize, LONG_HEX);
3699 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3701 printf ("%2ld %3lx ",
3702 (unsigned long) section->sh_link,
3703 (unsigned long) section->sh_info);
3705 if ((unsigned long) section->sh_addralign == section->sh_addralign)
3706 printf ("%2ld\n", (unsigned long) section->sh_addralign);
3709 print_vma (section->sh_addralign, DEC);
3716 print_vma (section->sh_addr, LONG_HEX);
3717 if ((long) section->sh_offset == section->sh_offset)
3718 printf (" %8.8lx", (unsigned long) section->sh_offset);
3722 print_vma (section->sh_offset, LONG_HEX);
3725 print_vma (section->sh_size, LONG_HEX);
3727 print_vma (section->sh_entsize, LONG_HEX);
3729 printf (" %3s ", get_elf_section_flags (section->sh_flags));
3731 printf (" %2ld %3lx %ld\n",
3732 (unsigned long) section->sh_link,
3733 (unsigned long) section->sh_info,
3734 (unsigned long) section->sh_addralign);
3738 printf (_("Key to Flags:\n\
3739 W (write), A (alloc), X (execute), M (merge), S (strings)\n\
3740 I (info), L (link order), G (group), x (unknown)\n\
3741 O (extra OS processing required) o (OS specific), p (processor specific)\n"));
3746 /* Process the reloc section. */
3748 process_relocs (file)
3751 unsigned long rel_size;
3752 unsigned long rel_offset;
3758 if (do_using_dynamic)
3760 int is_rela = FALSE;
3765 if (dynamic_info[DT_REL])
3767 rel_offset = dynamic_info[DT_REL];
3768 rel_size = dynamic_info[DT_RELSZ];
3771 else if (dynamic_info[DT_RELA])
3773 rel_offset = dynamic_info[DT_RELA];
3774 rel_size = dynamic_info[DT_RELASZ];
3777 else if (dynamic_info[DT_JMPREL])
3779 rel_offset = dynamic_info[DT_JMPREL];
3780 rel_size = dynamic_info[DT_PLTRELSZ];
3782 switch (dynamic_info[DT_PLTREL])
3799 (_("\nRelocation section at offset 0x%lx contains %ld bytes:\n"),
3800 rel_offset, rel_size);
3802 dump_relocations (file, rel_offset - loadaddr, rel_size,
3803 dynamic_symbols, num_dynamic_syms, dynamic_strings,
3807 printf (_("\nThere are no dynamic relocations in this file.\n"));
3811 Elf_Internal_Shdr *section;
3815 for (i = 0, section = section_headers;
3816 i < elf_header.e_shnum;
3819 if ( section->sh_type != SHT_RELA
3820 && section->sh_type != SHT_REL)
3823 rel_offset = section->sh_offset;
3824 rel_size = section->sh_size;
3828 Elf_Internal_Shdr *strsec;
3829 Elf_Internal_Sym *symtab;
3832 unsigned long nsyms;
3834 printf (_("\nRelocation section "));
3836 if (string_table == NULL)
3837 printf ("%d", section->sh_name);
3839 printf (_("'%s'"), SECTION_NAME (section));
3841 printf (_(" at offset 0x%lx contains %lu entries:\n"),
3842 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
3847 if (section->sh_link)
3849 Elf_Internal_Shdr *symsec;
3851 symsec = SECTION_HEADER (section->sh_link);
3852 nsyms = symsec->sh_size / symsec->sh_entsize;
3853 symtab = GET_ELF_SYMBOLS (file, symsec);
3858 strsec = SECTION_HEADER (symsec->sh_link);
3860 strtab = (char *) get_data (NULL, file, strsec->sh_offset,
3864 is_rela = section->sh_type == SHT_RELA;
3866 dump_relocations (file, rel_offset, rel_size,
3867 symtab, nsyms, strtab, is_rela);
3879 printf (_("\nThere are no relocations in this file.\n"));
3885 #include "unwind-ia64.h"
3887 /* An absolute address consists of a section and an offset. If the
3888 section is NULL, the offset itself is the address, otherwise, the
3889 address equals to LOAD_ADDRESS(section) + offset. */
3893 unsigned short section;
3899 struct unw_table_entry
3901 struct absaddr start;
3903 struct absaddr info;
3905 *table; /* Unwind table. */
3906 unsigned long table_len; /* Length of unwind table. */
3907 unsigned char *info; /* Unwind info. */
3908 unsigned long info_size; /* Size of unwind info. */
3909 bfd_vma info_addr; /* starting address of unwind info. */
3910 bfd_vma seg_base; /* Starting address of segment. */
3911 Elf_Internal_Sym *symtab; /* The symbol table. */
3912 unsigned long nsyms; /* Number of symbols. */
3913 char *strtab; /* The string table. */
3914 unsigned long strtab_size; /* Size of string table. */
3917 static void find_symbol_for_address
3918 PARAMS ((struct unw_aux_info *, struct absaddr, const char **, bfd_vma *));
3919 static void dump_ia64_unwind
3920 PARAMS ((struct unw_aux_info *));
3921 static int slurp_ia64_unwind_table
3922 PARAMS ((FILE *, struct unw_aux_info *, Elf_Internal_Shdr *));
3925 find_symbol_for_address (aux, addr, symname, offset)
3926 struct unw_aux_info *aux;
3927 struct absaddr addr;
3928 const char **symname;
3931 bfd_vma dist = (bfd_vma) 0x100000;
3932 Elf_Internal_Sym *sym, *best = NULL;
3935 for (i = 0, sym = aux->symtab; i < aux->nsyms; ++i, ++sym)
3937 if (ELF_ST_TYPE (sym->st_info) == STT_FUNC
3938 && sym->st_name != 0
3939 && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
3940 && addr.offset >= sym->st_value
3941 && addr.offset - sym->st_value < dist)
3944 dist = addr.offset - sym->st_value;
3951 *symname = (best->st_name >= aux->strtab_size
3952 ? "<corrupt>" : aux->strtab + best->st_name);
3957 *offset = addr.offset;
3961 dump_ia64_unwind (aux)
3962 struct unw_aux_info *aux;
3965 struct unw_table_entry *tp;
3968 addr_size = is_32bit_elf ? 4 : 8;
3970 for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
3974 const unsigned char *dp;
3975 const unsigned char *head;
3976 const char *procname;
3978 find_symbol_for_address (aux, tp->start, &procname, &offset);
3980 fputs ("\n<", stdout);
3984 fputs (procname, stdout);
3987 printf ("+%lx", (unsigned long) offset);
3990 fputs (">: [", stdout);
3991 print_vma (tp->start.offset, PREFIX_HEX);
3992 fputc ('-', stdout);
3993 print_vma (tp->end.offset, PREFIX_HEX);
3994 printf ("], info at +0x%lx\n",
3995 (unsigned long) (tp->info.offset - aux->seg_base));
3997 head = aux->info + (tp->info.offset - aux->info_addr);
3998 stamp = BYTE_GET8 ((unsigned char *) head);
4000 printf (" v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
4001 (unsigned) UNW_VER (stamp),
4002 (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
4003 UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
4004 UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
4005 (unsigned long) (addr_size * UNW_LENGTH (stamp)));
4007 if (UNW_VER (stamp) != 1)
4009 printf ("\tUnknown version.\n");
4014 for (dp = head + 8; dp < head + 8 + addr_size * UNW_LENGTH (stamp);)
4015 dp = unw_decode (dp, in_body, & in_body);
4020 slurp_ia64_unwind_table (file, aux, sec)
4022 struct unw_aux_info *aux;
4023 Elf_Internal_Shdr *sec;
4025 unsigned long size, addr_size, nrelas, i;
4026 Elf_Internal_Phdr *prog_hdrs, *seg;
4027 struct unw_table_entry *tep;
4028 Elf_Internal_Shdr *relsec;
4029 Elf_Internal_Rela *rela, *rp;
4030 unsigned char *table, *tp;
4031 Elf_Internal_Sym *sym;
4032 const char *relname;
4035 addr_size = is_32bit_elf ? 4 : 8;
4037 /* First, find the starting address of the segment that includes
4040 if (elf_header.e_phnum)
4042 prog_hdrs = (Elf_Internal_Phdr *)
4043 xmalloc (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
4046 result = get_32bit_program_headers (file, prog_hdrs);
4048 result = get_64bit_program_headers (file, prog_hdrs);
4056 for (seg = prog_hdrs; seg < prog_hdrs + elf_header.e_phnum; ++seg)
4058 if (seg->p_type != PT_LOAD)
4061 if (sec->sh_addr >= seg->p_vaddr
4062 && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
4064 aux->seg_base = seg->p_vaddr;
4072 /* Second, build the unwind table from the contents of the unwind section: */
4073 size = sec->sh_size;
4074 table = (char *) get_data (NULL, file, sec->sh_offset,
4075 size, _("unwind table"));
4079 tep = aux->table = xmalloc (size / (3 * addr_size) * sizeof (aux->table[0]));
4080 for (tp = table; tp < table + size; tp += 3 * addr_size, ++tep)
4082 tep->start.section = SHN_UNDEF;
4083 tep->end.section = SHN_UNDEF;
4084 tep->info.section = SHN_UNDEF;
4087 tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
4088 tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
4089 tep->info.offset = byte_get ((unsigned char *) tp + 8, 4);
4093 tep->start.offset = BYTE_GET8 ((unsigned char *) tp + 0);
4094 tep->end.offset = BYTE_GET8 ((unsigned char *) tp + 8);
4095 tep->info.offset = BYTE_GET8 ((unsigned char *) tp + 16);
4097 tep->start.offset += aux->seg_base;
4098 tep->end.offset += aux->seg_base;
4099 tep->info.offset += aux->seg_base;
4103 /* Third, apply any relocations to the unwind table: */
4105 for (relsec = section_headers;
4106 relsec < section_headers + elf_header.e_shnum;
4109 if (relsec->sh_type != SHT_RELA
4110 || SECTION_HEADER (relsec->sh_info) != sec)
4113 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
4117 for (rp = rela; rp < rela + nrelas; ++rp)
4121 relname = elf_ia64_reloc_type (ELF32_R_TYPE (rp->r_info));
4122 sym = aux->symtab + ELF32_R_SYM (rp->r_info);
4124 if (ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
4126 warn (_("Skipping unexpected symbol type %u\n"),
4127 ELF32_ST_TYPE (sym->st_info));
4133 relname = elf_ia64_reloc_type (ELF64_R_TYPE (rp->r_info));
4134 sym = aux->symtab + ELF64_R_SYM (rp->r_info);
4136 if (ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
4138 warn (_("Skipping unexpected symbol type %u\n"),
4139 ELF64_ST_TYPE (sym->st_info));
4144 if (strncmp (relname, "R_IA64_SEGREL", 13) != 0)
4146 warn (_("Skipping unexpected relocation type %s\n"), relname);
4150 i = rp->r_offset / (3 * addr_size);
4152 switch (rp->r_offset/addr_size % 3)
4155 aux->table[i].start.section = sym->st_shndx;
4156 aux->table[i].start.offset += rp->r_addend;
4159 aux->table[i].end.section = sym->st_shndx;
4160 aux->table[i].end.offset += rp->r_addend;
4163 aux->table[i].info.section = sym->st_shndx;
4164 aux->table[i].info.offset += rp->r_addend;
4174 aux->table_len = size / (3 * addr_size);
4179 process_unwind (file)
4182 Elf_Internal_Shdr *sec, *unwsec = NULL, *strsec;
4183 unsigned long i, addr_size, unwcount = 0, unwstart = 0;
4184 struct unw_aux_info aux;
4189 if (elf_header.e_machine != EM_IA_64)
4191 printf (_("\nThere are no unwind sections in this file.\n"));
4195 memset (& aux, 0, sizeof (aux));
4197 addr_size = is_32bit_elf ? 4 : 8;
4199 for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
4201 if (sec->sh_type == SHT_SYMTAB)
4203 aux.nsyms = sec->sh_size / sec->sh_entsize;
4204 aux.symtab = GET_ELF_SYMBOLS (file, sec);
4206 strsec = SECTION_HEADER (sec->sh_link);
4207 aux.strtab_size = strsec->sh_size;
4208 aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
4209 aux.strtab_size, _("string table"));
4211 else if (sec->sh_type == SHT_IA_64_UNWIND)
4216 printf (_("\nThere are no unwind sections in this file.\n"));
4218 while (unwcount-- > 0)
4223 for (i = unwstart, sec = section_headers + unwstart;
4224 i < elf_header.e_shnum; ++i, ++sec)
4225 if (sec->sh_type == SHT_IA_64_UNWIND)
4232 len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
4234 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once,
4237 /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO */
4238 len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
4239 suffix = SECTION_NAME (unwsec) + len;
4240 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4242 if (strncmp (SECTION_NAME (sec),
4243 ELF_STRING_ia64_unwind_info_once, len2) == 0
4244 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4249 /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
4250 .IA_64.unwind or BAR -> .IA_64.unwind_info */
4251 len = sizeof (ELF_STRING_ia64_unwind) - 1;
4252 len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
4254 if (strncmp (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind,
4256 suffix = SECTION_NAME (unwsec) + len;
4257 for (i = 0, sec = section_headers; i < elf_header.e_shnum;
4259 if (strncmp (SECTION_NAME (sec),
4260 ELF_STRING_ia64_unwind_info, len2) == 0
4261 && strcmp (SECTION_NAME (sec) + len2, suffix) == 0)
4265 if (i == elf_header.e_shnum)
4267 printf (_("\nCould not find unwind info section for "));
4269 if (string_table == NULL)
4270 printf ("%d", unwsec->sh_name);
4272 printf (_("'%s'"), SECTION_NAME (unwsec));
4276 aux.info_size = sec->sh_size;
4277 aux.info_addr = sec->sh_addr;
4278 aux.info = (char *) get_data (NULL, file, sec->sh_offset,
4279 aux.info_size, _("unwind info"));
4281 printf (_("\nUnwind section "));
4283 if (string_table == NULL)
4284 printf ("%d", unwsec->sh_name);
4286 printf (_("'%s'"), SECTION_NAME (unwsec));
4288 printf (_(" at offset 0x%lx contains %lu entries:\n"),
4289 (unsigned long) unwsec->sh_offset,
4290 (unsigned long) (unwsec->sh_size / (3 * addr_size)));
4292 (void) slurp_ia64_unwind_table (file, & aux, unwsec);
4294 if (aux.table_len > 0)
4295 dump_ia64_unwind (& aux);
4298 free ((char *) aux.table);
4300 free ((char *) aux.info);
4309 free ((char *) aux.strtab);
4315 dynamic_segment_mips_val (entry)
4316 Elf_Internal_Dyn *entry;
4318 switch (entry->d_tag)
4321 if (entry->d_un.d_val == 0)
4325 static const char * opts[] =
4327 "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
4328 "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
4329 "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
4330 "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
4335 for (cnt = 0; cnt < NUM_ELEM (opts); ++cnt)
4336 if (entry->d_un.d_val & (1 << cnt))
4338 printf ("%s%s", first ? "" : " ", opts[cnt]);
4345 case DT_MIPS_IVERSION:
4346 if (dynamic_strings != NULL)
4347 printf ("Interface Version: %s\n",
4348 dynamic_strings + entry->d_un.d_val);
4350 printf ("%ld\n", (long) entry->d_un.d_ptr);
4353 case DT_MIPS_TIME_STAMP:
4358 time_t time = entry->d_un.d_val;
4359 tmp = gmtime (&time);
4360 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
4361 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
4362 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
4363 printf ("Time Stamp: %s\n", timebuf);
4367 case DT_MIPS_RLD_VERSION:
4368 case DT_MIPS_LOCAL_GOTNO:
4369 case DT_MIPS_CONFLICTNO:
4370 case DT_MIPS_LIBLISTNO:
4371 case DT_MIPS_SYMTABNO:
4372 case DT_MIPS_UNREFEXTNO:
4373 case DT_MIPS_HIPAGENO:
4374 case DT_MIPS_DELTA_CLASS_NO:
4375 case DT_MIPS_DELTA_INSTANCE_NO:
4376 case DT_MIPS_DELTA_RELOC_NO:
4377 case DT_MIPS_DELTA_SYM_NO:
4378 case DT_MIPS_DELTA_CLASSSYM_NO:
4379 case DT_MIPS_COMPACT_SIZE:
4380 printf ("%ld\n", (long) entry->d_un.d_ptr);
4384 printf ("%#lx\n", (long) entry->d_un.d_ptr);
4390 dynamic_segment_parisc_val (entry)
4391 Elf_Internal_Dyn *entry;
4393 switch (entry->d_tag)
4395 case DT_HP_DLD_FLAGS:
4404 { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
4405 { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
4406 { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
4407 { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
4408 { DT_HP_BIND_NOW, "HP_BIND_NOW" },
4409 { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
4410 { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
4411 { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
4412 { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
4413 { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
4414 { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" }
4418 bfd_vma val = entry->d_un.d_val;
4420 for (cnt = 0; cnt < sizeof (flags) / sizeof (flags[0]); ++cnt)
4421 if (val & flags[cnt].bit)
4425 fputs (flags[cnt].str, stdout);
4427 val ^= flags[cnt].bit;
4430 if (val != 0 || first)
4434 print_vma (val, HEX);
4440 print_vma (entry->d_un.d_ptr, PREFIX_HEX);
4447 get_32bit_dynamic_segment (file)
4450 Elf32_External_Dyn *edyn;
4451 Elf_Internal_Dyn *entry;
4454 edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr,
4455 dynamic_size, _("dynamic segment"));
4459 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4460 how large this .dynamic is now. We can do this even before the byte
4461 swapping since the DT_NULL tag is recognizable. */
4463 while (*(Elf32_Word *) edyn[dynamic_size++].d_tag != DT_NULL)
4466 dynamic_segment = (Elf_Internal_Dyn *)
4467 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4469 if (dynamic_segment == NULL)
4471 error (_("Out of memory\n"));
4476 for (i = 0, entry = dynamic_segment;
4480 entry->d_tag = BYTE_GET (edyn[i].d_tag);
4481 entry->d_un.d_val = BYTE_GET (edyn[i].d_un.d_val);
4490 get_64bit_dynamic_segment (file)
4493 Elf64_External_Dyn *edyn;
4494 Elf_Internal_Dyn *entry;
4497 edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr,
4498 dynamic_size, _("dynamic segment"));
4502 /* SGI's ELF has more than one section in the DYNAMIC segment. Determine
4503 how large this .dynamic is now. We can do this even before the byte
4504 swapping since the DT_NULL tag is recognizable. */
4506 while (*(bfd_vma *) edyn[dynamic_size++].d_tag != DT_NULL)
4509 dynamic_segment = (Elf_Internal_Dyn *)
4510 malloc (dynamic_size * sizeof (Elf_Internal_Dyn));
4512 if (dynamic_segment == NULL)
4514 error (_("Out of memory\n"));
4519 for (i = 0, entry = dynamic_segment;
4523 entry->d_tag = BYTE_GET8 (edyn[i].d_tag);
4524 entry->d_un.d_val = BYTE_GET8 (edyn[i].d_un.d_val);
4533 get_dynamic_flags (flags)
4536 static char buff[128];
4544 flag = flags & - flags;
4552 case DF_ORIGIN: strcpy (p, "ORIGIN"); break;
4553 case DF_SYMBOLIC: strcpy (p, "SYMBOLIC"); break;
4554 case DF_TEXTREL: strcpy (p, "TEXTREL"); break;
4555 case DF_BIND_NOW: strcpy (p, "BIND_NOW"); break;
4556 case DF_STATIC_TLS: strcpy (p, "STATIC_TLS"); break;
4557 default: strcpy (p, "unknown"); break;
4560 p = strchr (p, '\0');
4565 /* Parse and display the contents of the dynamic segment. */
4567 process_dynamic_segment (file)
4570 Elf_Internal_Dyn *entry;
4573 if (dynamic_size == 0)
4576 printf (_("\nThere is no dynamic segment in this file.\n"));
4583 if (! get_32bit_dynamic_segment (file))
4586 else if (! get_64bit_dynamic_segment (file))
4589 /* Find the appropriate symbol table. */
4590 if (dynamic_symbols == NULL)
4592 for (i = 0, entry = dynamic_segment;
4596 Elf_Internal_Shdr section;
4598 if (entry->d_tag != DT_SYMTAB)
4601 dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
4603 /* Since we do not know how big the symbol table is,
4604 we default to reading in the entire file (!) and
4605 processing that. This is overkill, I know, but it
4607 section.sh_offset = entry->d_un.d_val - loadaddr;
4609 if (fseek (file, 0, SEEK_END))
4610 error (_("Unable to seek to end of file!"));
4612 section.sh_size = ftell (file) - section.sh_offset;
4614 section.sh_entsize = sizeof (Elf32_External_Sym);
4616 section.sh_entsize = sizeof (Elf64_External_Sym);
4618 num_dynamic_syms = section.sh_size / section.sh_entsize;
4619 if (num_dynamic_syms < 1)
4621 error (_("Unable to determine the number of symbols to load\n"));
4625 dynamic_symbols = GET_ELF_SYMBOLS (file, §ion);
4629 /* Similarly find a string table. */
4630 if (dynamic_strings == NULL)
4632 for (i = 0, entry = dynamic_segment;
4636 unsigned long offset;
4639 if (entry->d_tag != DT_STRTAB)
4642 dynamic_info[DT_STRTAB] = entry->d_un.d_val;
4644 /* Since we do not know how big the string table is,
4645 we default to reading in the entire file (!) and
4646 processing that. This is overkill, I know, but it
4649 offset = entry->d_un.d_val - loadaddr;
4650 if (fseek (file, 0, SEEK_END))
4651 error (_("Unable to seek to end of file\n"));
4652 str_tab_len = ftell (file) - offset;
4654 if (str_tab_len < 1)
4657 (_("Unable to determine the length of the dynamic string table\n"));
4661 dynamic_strings = (char *) get_data (NULL, file, offset, str_tab_len,
4662 _("dynamic string table"));
4667 /* And find the syminfo section if available. */
4668 if (dynamic_syminfo == NULL)
4670 unsigned long syminsz = 0;
4672 for (i = 0, entry = dynamic_segment;
4676 if (entry->d_tag == DT_SYMINENT)
4678 /* Note: these braces are necessary to avoid a syntax
4679 error from the SunOS4 C compiler. */
4680 assert (sizeof (Elf_External_Syminfo) == entry->d_un.d_val);
4682 else if (entry->d_tag == DT_SYMINSZ)
4683 syminsz = entry->d_un.d_val;
4684 else if (entry->d_tag == DT_SYMINFO)
4685 dynamic_syminfo_offset = entry->d_un.d_val - loadaddr;
4688 if (dynamic_syminfo_offset != 0 && syminsz != 0)
4690 Elf_External_Syminfo *extsyminfo;
4691 Elf_Internal_Syminfo *syminfo;
4693 /* There is a syminfo section. Read the data. */
4694 extsyminfo = ((Elf_External_Syminfo *)
4695 get_data (NULL, file, dynamic_syminfo_offset,
4696 syminsz, _("symbol information")));
4700 dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
4701 if (dynamic_syminfo == NULL)
4703 error (_("Out of memory\n"));
4707 dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
4708 for (i = 0, syminfo = dynamic_syminfo; i < dynamic_syminfo_nent;
4711 syminfo->si_boundto = BYTE_GET (extsyminfo[i].si_boundto);
4712 syminfo->si_flags = BYTE_GET (extsyminfo[i].si_flags);
4719 if (do_dynamic && dynamic_addr)
4720 printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
4721 dynamic_addr, (long) dynamic_size);
4723 printf (_(" Tag Type Name/Value\n"));
4725 for (i = 0, entry = dynamic_segment;
4734 print_vma (entry->d_tag, FULL_HEX);
4735 dtype = get_dynamic_type (entry->d_tag);
4736 printf (" (%s)%*s", dtype,
4737 ((is_32bit_elf ? 27 : 19)
4738 - (int) strlen (dtype)),
4742 switch (entry->d_tag)
4746 puts (get_dynamic_flags (entry->d_un.d_val));
4756 switch (entry->d_tag)
4759 printf (_("Auxiliary library"));
4763 printf (_("Filter library"));
4767 printf (_("Configuration file"));
4771 printf (_("Dependency audit library"));
4775 printf (_("Audit library"));
4779 if (dynamic_strings)
4780 printf (": [%s]\n", dynamic_strings + entry->d_un.d_val);
4784 print_vma (entry->d_un.d_val, PREFIX_HEX);
4793 printf (_("Flags:"));
4795 if (entry->d_un.d_val == 0)
4796 printf (_(" None\n"));
4799 unsigned long int val = entry->d_un.d_val;
4801 if (val & DTF_1_PARINIT)
4803 printf (" PARINIT");
4804 val ^= DTF_1_PARINIT;
4806 if (val & DTF_1_CONFEXP)
4808 printf (" CONFEXP");
4809 val ^= DTF_1_CONFEXP;
4812 printf (" %lx", val);
4821 printf (_("Flags:"));
4823 if (entry->d_un.d_val == 0)
4824 printf (_(" None\n"));
4827 unsigned long int val = entry->d_un.d_val;
4829 if (val & DF_P1_LAZYLOAD)
4831 printf (" LAZYLOAD");
4832 val ^= DF_P1_LAZYLOAD;
4834 if (val & DF_P1_GROUPPERM)
4836 printf (" GROUPPERM");
4837 val ^= DF_P1_GROUPPERM;
4840 printf (" %lx", val);
4849 printf (_("Flags:"));
4850 if (entry->d_un.d_val == 0)
4851 printf (_(" None\n"));
4854 unsigned long int val = entry->d_un.d_val;
4861 if (val & DF_1_GLOBAL)
4866 if (val & DF_1_GROUP)
4871 if (val & DF_1_NODELETE)
4873 printf (" NODELETE");
4874 val ^= DF_1_NODELETE;
4876 if (val & DF_1_LOADFLTR)
4878 printf (" LOADFLTR");
4879 val ^= DF_1_LOADFLTR;
4881 if (val & DF_1_INITFIRST)
4883 printf (" INITFIRST");
4884 val ^= DF_1_INITFIRST;
4886 if (val & DF_1_NOOPEN)
4891 if (val & DF_1_ORIGIN)
4896 if (val & DF_1_DIRECT)
4901 if (val & DF_1_TRANS)
4906 if (val & DF_1_INTERPOSE)
4908 printf (" INTERPOSE");
4909 val ^= DF_1_INTERPOSE;
4911 if (val & DF_1_NODEFLIB)
4913 printf (" NODEFLIB");
4914 val ^= DF_1_NODEFLIB;
4916 if (val & DF_1_NODUMP)
4921 if (val & DF_1_CONLFAT)
4923 printf (" CONLFAT");
4924 val ^= DF_1_CONLFAT;
4927 printf (" %lx", val);
4935 puts (get_dynamic_type (entry->d_un.d_val));
4955 dynamic_info[entry->d_tag] = entry->d_un.d_val;
4961 if (dynamic_strings == NULL)
4964 name = dynamic_strings + entry->d_un.d_val;
4968 switch (entry->d_tag)
4971 printf (_("Shared library: [%s]"), name);
4973 if (strcmp (name, program_interpreter) == 0)
4974 printf (_(" program interpreter"));
4978 printf (_("Library soname: [%s]"), name);
4982 printf (_("Library rpath: [%s]"), name);
4986 printf (_("Library runpath: [%s]"), name);
4990 print_vma (entry->d_un.d_val, PREFIX_HEX);
4995 print_vma (entry->d_un.d_val, PREFIX_HEX);
5011 case DT_INIT_ARRAYSZ:
5012 case DT_FINI_ARRAYSZ:
5013 case DT_GNU_CONFLICTSZ:
5014 case DT_GNU_LIBLISTSZ:
5017 print_vma (entry->d_un.d_val, UNSIGNED);
5018 printf (" (bytes)\n");
5028 print_vma (entry->d_un.d_val, UNSIGNED);
5041 if (dynamic_strings != NULL && entry->d_tag == DT_USED)
5045 name = dynamic_strings + entry->d_un.d_val;
5049 printf (_("Not needed object: [%s]\n"), name);
5054 print_vma (entry->d_un.d_val, PREFIX_HEX);
5060 /* The value of this entry is ignored. */
5065 case DT_GNU_PRELINKED:
5069 time_t time = entry->d_un.d_val;
5071 tmp = gmtime (&time);
5072 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
5073 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
5074 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
5080 if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
5081 version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
5086 switch (elf_header.e_machine)
5089 case EM_MIPS_RS3_LE:
5090 dynamic_segment_mips_val (entry);
5093 dynamic_segment_parisc_val (entry);
5096 print_vma (entry->d_un.d_val, PREFIX_HEX);
5108 get_ver_flags (flags)
5111 static char buff[32];
5118 if (flags & VER_FLG_BASE)
5119 strcat (buff, "BASE ");
5121 if (flags & VER_FLG_WEAK)
5123 if (flags & VER_FLG_BASE)
5124 strcat (buff, "| ");
5126 strcat (buff, "WEAK ");
5129 if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
5130 strcat (buff, "| <unknown>");
5135 /* Display the contents of the version sections. */
5137 process_version_sections (file)
5140 Elf_Internal_Shdr *section;
5147 for (i = 0, section = section_headers;
5148 i < elf_header.e_shnum;
5151 switch (section->sh_type)
5153 case SHT_GNU_verdef:
5155 Elf_External_Verdef *edefs;
5162 (_("\nVersion definition section '%s' contains %ld entries:\n"),
5163 SECTION_NAME (section), section->sh_info);
5165 printf (_(" Addr: 0x"));
5166 printf_vma (section->sh_addr);
5167 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5168 (unsigned long) section->sh_offset, section->sh_link,
5169 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5171 edefs = ((Elf_External_Verdef *)
5172 get_data (NULL, file, section->sh_offset,
5174 _("version definition section")));
5178 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5181 Elf_External_Verdef *edef;
5182 Elf_Internal_Verdef ent;
5183 Elf_External_Verdaux *eaux;
5184 Elf_Internal_Verdaux aux;
5188 vstart = ((char *) edefs) + idx;
5190 edef = (Elf_External_Verdef *) vstart;
5192 ent.vd_version = BYTE_GET (edef->vd_version);
5193 ent.vd_flags = BYTE_GET (edef->vd_flags);
5194 ent.vd_ndx = BYTE_GET (edef->vd_ndx);
5195 ent.vd_cnt = BYTE_GET (edef->vd_cnt);
5196 ent.vd_hash = BYTE_GET (edef->vd_hash);
5197 ent.vd_aux = BYTE_GET (edef->vd_aux);
5198 ent.vd_next = BYTE_GET (edef->vd_next);
5200 printf (_(" %#06x: Rev: %d Flags: %s"),
5201 idx, ent.vd_version, get_ver_flags (ent.vd_flags));
5203 printf (_(" Index: %d Cnt: %d "),
5204 ent.vd_ndx, ent.vd_cnt);
5206 vstart += ent.vd_aux;
5208 eaux = (Elf_External_Verdaux *) vstart;
5210 aux.vda_name = BYTE_GET (eaux->vda_name);
5211 aux.vda_next = BYTE_GET (eaux->vda_next);
5213 if (dynamic_strings)
5214 printf (_("Name: %s\n"), dynamic_strings + aux.vda_name);
5216 printf (_("Name index: %ld\n"), aux.vda_name);
5218 isum = idx + ent.vd_aux;
5220 for (j = 1; j < ent.vd_cnt; j++)
5222 isum += aux.vda_next;
5223 vstart += aux.vda_next;
5225 eaux = (Elf_External_Verdaux *) vstart;
5227 aux.vda_name = BYTE_GET (eaux->vda_name);
5228 aux.vda_next = BYTE_GET (eaux->vda_next);
5230 if (dynamic_strings)
5231 printf (_(" %#06x: Parent %d: %s\n"),
5232 isum, j, dynamic_strings + aux.vda_name);
5234 printf (_(" %#06x: Parent %d, name index: %ld\n"),
5235 isum, j, aux.vda_name);
5245 case SHT_GNU_verneed:
5247 Elf_External_Verneed *eneed;
5253 printf (_("\nVersion needs section '%s' contains %ld entries:\n"),
5254 SECTION_NAME (section), section->sh_info);
5256 printf (_(" Addr: 0x"));
5257 printf_vma (section->sh_addr);
5258 printf (_(" Offset: %#08lx Link to section: %ld (%s)\n"),
5259 (unsigned long) section->sh_offset, section->sh_link,
5260 SECTION_NAME (SECTION_HEADER (section->sh_link)));
5262 eneed = ((Elf_External_Verneed *)
5263 get_data (NULL, file, section->sh_offset,
5264 section->sh_size, _("version need section")));
5268 for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
5270 Elf_External_Verneed *entry;
5271 Elf_Internal_Verneed ent;
5276 vstart = ((char *) eneed) + idx;
5278 entry = (Elf_External_Verneed *) vstart;
5280 ent.vn_version = BYTE_GET (entry->vn_version);
5281 ent.vn_cnt = BYTE_GET (entry->vn_cnt);
5282 ent.vn_file = BYTE_GET (entry->vn_file);
5283 ent.vn_aux = BYTE_GET (entry->vn_aux);
5284 ent.vn_next = BYTE_GET (entry->vn_next);
5286 printf (_(" %#06x: Version: %d"), idx, ent.vn_version);
5288 if (dynamic_strings)
5289 printf (_(" File: %s"), dynamic_strings + ent.vn_file);
5291 printf (_(" File: %lx"), ent.vn_file);
5293 printf (_(" Cnt: %d\n"), ent.vn_cnt);
5295 vstart += ent.vn_aux;
5297 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
5299 Elf_External_Vernaux *eaux;
5300 Elf_Internal_Vernaux aux;
5302 eaux = (Elf_External_Vernaux *) vstart;
5304 aux.vna_hash = BYTE_GET (eaux->vna_hash);
5305 aux.vna_flags = BYTE_GET (eaux->vna_flags);
5306 aux.vna_other = BYTE_GET (eaux->vna_other);
5307 aux.vna_name = BYTE_GET (eaux->vna_name);
5308 aux.vna_next = BYTE_GET (eaux->vna_next);
5310 if (dynamic_strings)
5311 printf (_(" %#06x: Name: %s"),
5312 isum, dynamic_strings + aux.vna_name);
5314 printf (_(" %#06x: Name index: %lx"),
5315 isum, aux.vna_name);
5317 printf (_(" Flags: %s Version: %d\n"),
5318 get_ver_flags (aux.vna_flags), aux.vna_other);
5320 isum += aux.vna_next;
5321 vstart += aux.vna_next;
5331 case SHT_GNU_versym:
5333 Elf_Internal_Shdr *link_section;
5336 unsigned char *edata;
5337 unsigned short *data;
5339 Elf_Internal_Sym *symbols;
5340 Elf_Internal_Shdr *string_sec;
5342 link_section = SECTION_HEADER (section->sh_link);
5343 total = section->sh_size / section->sh_entsize;
5347 symbols = GET_ELF_SYMBOLS (file, link_section);
5349 string_sec = SECTION_HEADER (link_section->sh_link);
5351 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5352 string_sec->sh_size,
5353 _("version string table"));
5357 printf (_("\nVersion symbols section '%s' contains %d entries:\n"),
5358 SECTION_NAME (section), total);
5360 printf (_(" Addr: "));
5361 printf_vma (section->sh_addr);
5362 printf (_(" Offset: %#08lx Link: %lx (%s)\n"),
5363 (unsigned long) section->sh_offset, section->sh_link,
5364 SECTION_NAME (link_section));
5368 get_data (NULL, file,
5369 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] - loadaddr,
5370 total * sizeof (short), _("version symbol data")));
5377 data = (unsigned short *) malloc (total * sizeof (short));
5379 for (cnt = total; cnt --;)
5380 data[cnt] = byte_get (edata + cnt * sizeof (short),
5385 for (cnt = 0; cnt < total; cnt += 4)
5388 int check_def, check_need;
5391 printf (" %03x:", cnt);
5393 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
5394 switch (data[cnt + j])
5397 fputs (_(" 0 (*local*) "), stdout);
5401 fputs (_(" 1 (*global*) "), stdout);
5405 nn = printf ("%4x%c", data[cnt + j] & 0x7fff,
5406 data[cnt + j] & 0x8000 ? 'h' : ' ');
5410 if (SECTION_HEADER (symbols[cnt + j].st_shndx)->sh_type
5413 if (symbols[cnt + j].st_shndx == SHN_UNDEF)
5420 && version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
5422 Elf_Internal_Verneed ivn;
5423 unsigned long offset;
5425 offset = version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5430 Elf_Internal_Vernaux ivna;
5431 Elf_External_Verneed evn;
5432 Elf_External_Vernaux evna;
5433 unsigned long a_off;
5435 get_data (&evn, file, offset, sizeof (evn),
5438 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5439 ivn.vn_next = BYTE_GET (evn.vn_next);
5441 a_off = offset + ivn.vn_aux;
5445 get_data (&evna, file, a_off, sizeof (evna),
5446 _("version need aux (2)"));
5448 ivna.vna_next = BYTE_GET (evna.vna_next);
5449 ivna.vna_other = BYTE_GET (evna.vna_other);
5451 a_off += ivna.vna_next;
5453 while (ivna.vna_other != data[cnt + j]
5454 && ivna.vna_next != 0);
5456 if (ivna.vna_other == data[cnt + j])
5458 ivna.vna_name = BYTE_GET (evna.vna_name);
5460 name = strtab + ivna.vna_name;
5461 nn += printf ("(%s%-*s",
5463 12 - (int) strlen (name),
5469 offset += ivn.vn_next;
5471 while (ivn.vn_next);
5474 if (check_def && data[cnt + j] != 0x8001
5475 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5477 Elf_Internal_Verdef ivd;
5478 Elf_External_Verdef evd;
5479 unsigned long offset;
5481 offset = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5486 get_data (&evd, file, offset, sizeof (evd),
5489 ivd.vd_next = BYTE_GET (evd.vd_next);
5490 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5492 offset += ivd.vd_next;
5494 while (ivd.vd_ndx != (data[cnt + j] & 0x7fff)
5495 && ivd.vd_next != 0);
5497 if (ivd.vd_ndx == (data[cnt + j] & 0x7fff))
5499 Elf_External_Verdaux evda;
5500 Elf_Internal_Verdaux ivda;
5502 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5504 get_data (&evda, file,
5505 offset - ivd.vd_next + ivd.vd_aux,
5506 sizeof (evda), _("version def aux"));
5508 ivda.vda_name = BYTE_GET (evda.vda_name);
5510 name = strtab + ivda.vda_name;
5511 nn += printf ("(%s%-*s",
5513 12 - (int) strlen (name),
5519 printf ("%*c", 18 - nn, ' ');
5537 printf (_("\nNo version information found in this file.\n"));
5543 get_symbol_binding (binding)
5544 unsigned int binding;
5546 static char buff[32];
5550 case STB_LOCAL: return "LOCAL";
5551 case STB_GLOBAL: return "GLOBAL";
5552 case STB_WEAK: return "WEAK";
5554 if (binding >= STB_LOPROC && binding <= STB_HIPROC)
5555 sprintf (buff, _("<processor specific>: %d"), binding);
5556 else if (binding >= STB_LOOS && binding <= STB_HIOS)
5557 sprintf (buff, _("<OS specific>: %d"), binding);
5559 sprintf (buff, _("<unknown>: %d"), binding);
5565 get_symbol_type (type)
5568 static char buff[32];
5572 case STT_NOTYPE: return "NOTYPE";
5573 case STT_OBJECT: return "OBJECT";
5574 case STT_FUNC: return "FUNC";
5575 case STT_SECTION: return "SECTION";
5576 case STT_FILE: return "FILE";
5577 case STT_COMMON: return "COMMON";
5578 case STT_TLS: return "TLS";
5580 if (type >= STT_LOPROC && type <= STT_HIPROC)
5582 if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
5583 return "THUMB_FUNC";
5585 if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
5588 if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
5589 return "PARISC_MILLI";
5591 sprintf (buff, _("<processor specific>: %d"), type);
5593 else if (type >= STT_LOOS && type <= STT_HIOS)
5595 if (elf_header.e_machine == EM_PARISC)
5597 if (type == STT_HP_OPAQUE)
5599 if (type == STT_HP_STUB)
5603 sprintf (buff, _("<OS specific>: %d"), type);
5606 sprintf (buff, _("<unknown>: %d"), type);
5612 get_symbol_visibility (visibility)
5613 unsigned int visibility;
5617 case STV_DEFAULT: return "DEFAULT";
5618 case STV_INTERNAL: return "INTERNAL";
5619 case STV_HIDDEN: return "HIDDEN";
5620 case STV_PROTECTED: return "PROTECTED";
5626 get_symbol_index_type (type)
5629 static char buff[32];
5633 case SHN_UNDEF: return "UND";
5634 case SHN_ABS: return "ABS";
5635 case SHN_COMMON: return "COM";
5637 if (type >= SHN_LOPROC && type <= SHN_HIPROC)
5638 sprintf (buff, "PRC[0x%04x]", type);
5639 else if (type >= SHN_LOOS && type <= SHN_HIOS)
5640 sprintf (buff, "OS [0x%04x]", type);
5641 else if (type >= SHN_LORESERVE && type <= SHN_HIRESERVE)
5642 sprintf (buff, "RSV[0x%04x]", type);
5644 sprintf (buff, "%3d", type);
5652 get_dynamic_data (file, number)
5654 unsigned int number;
5656 unsigned char *e_data;
5659 e_data = (unsigned char *) malloc (number * 4);
5663 error (_("Out of memory\n"));
5667 if (fread (e_data, 4, number, file) != number)
5669 error (_("Unable to read in dynamic data\n"));
5673 i_data = (int *) malloc (number * sizeof (*i_data));
5677 error (_("Out of memory\n"));
5683 i_data[number] = byte_get (e_data + number * 4, 4);
5690 /* Dump the symbol table. */
5692 process_symbol_table (file)
5695 Elf_Internal_Shdr *section;
5696 unsigned char nb[4];
5697 unsigned char nc[4];
5700 int *buckets = NULL;
5703 if (! do_syms && !do_histogram)
5706 if (dynamic_info[DT_HASH] && ((do_using_dynamic && dynamic_strings != NULL)
5709 if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
5711 error (_("Unable to seek to start of dynamic information"));
5715 if (fread (nb, sizeof (nb), 1, file) != 1)
5717 error (_("Failed to read in number of buckets\n"));
5721 if (fread (nc, sizeof (nc), 1, file) != 1)
5723 error (_("Failed to read in number of chains\n"));
5727 nbuckets = byte_get (nb, 4);
5728 nchains = byte_get (nc, 4);
5730 buckets = get_dynamic_data (file, nbuckets);
5731 chains = get_dynamic_data (file, nchains);
5733 if (buckets == NULL || chains == NULL)
5738 && dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
5743 printf (_("\nSymbol table for image:\n"));
5745 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5747 printf (_(" Num Buc: Value Size Type Bind Vis Ndx Name\n"));
5749 for (hn = 0; hn < nbuckets; hn++)
5754 for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
5756 Elf_Internal_Sym *psym;
5758 psym = dynamic_symbols + si;
5760 printf (" %3d %3d: ", si, hn);
5761 print_vma (psym->st_value, LONG_HEX);
5763 print_vma (psym->st_size, DEC_5);
5765 printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5766 printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5767 printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5768 printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
5769 print_symbol (25, dynamic_strings + psym->st_name);
5774 else if (do_syms && !do_using_dynamic)
5778 for (i = 0, section = section_headers;
5779 i < elf_header.e_shnum;
5784 Elf_Internal_Sym *symtab;
5785 Elf_Internal_Sym *psym;
5788 if ( section->sh_type != SHT_SYMTAB
5789 && section->sh_type != SHT_DYNSYM)
5792 printf (_("\nSymbol table '%s' contains %lu entries:\n"),
5793 SECTION_NAME (section),
5794 (unsigned long) (section->sh_size / section->sh_entsize));
5796 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5798 printf (_(" Num: Value Size Type Bind Vis Ndx Name\n"));
5800 symtab = GET_ELF_SYMBOLS (file, section);
5804 if (section->sh_link == elf_header.e_shstrndx)
5805 strtab = string_table;
5808 Elf_Internal_Shdr *string_sec;
5810 string_sec = SECTION_HEADER (section->sh_link);
5812 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
5813 string_sec->sh_size,
5817 for (si = 0, psym = symtab;
5818 si < section->sh_size / section->sh_entsize;
5821 printf ("%6d: ", si);
5822 print_vma (psym->st_value, LONG_HEX);
5824 print_vma (psym->st_size, DEC_5);
5825 printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
5826 printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
5827 printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
5828 printf (" %4s ", get_symbol_index_type (psym->st_shndx));
5829 print_symbol (25, strtab + psym->st_name);
5831 if (section->sh_type == SHT_DYNSYM &&
5832 version_info[DT_VERSIONTAGIDX (DT_VERSYM)] != 0)
5834 unsigned char data[2];
5835 unsigned short vers_data;
5836 unsigned long offset;
5840 offset = version_info[DT_VERSIONTAGIDX (DT_VERSYM)]
5843 get_data (&data, file, offset + si * sizeof (vers_data),
5844 sizeof (data), _("version data"));
5846 vers_data = byte_get (data, 2);
5848 is_nobits = (SECTION_HEADER (psym->st_shndx)->sh_type
5851 check_def = (psym->st_shndx != SHN_UNDEF);
5853 if ((vers_data & 0x8000) || vers_data > 1)
5855 if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5856 && (is_nobits || ! check_def))
5858 Elf_External_Verneed evn;
5859 Elf_Internal_Verneed ivn;
5860 Elf_Internal_Vernaux ivna;
5862 /* We must test both. */
5863 offset = (version_info[DT_VERSIONTAGIDX (DT_VERNEED)]
5868 unsigned long vna_off;
5870 get_data (&evn, file, offset, sizeof (evn),
5873 ivn.vn_aux = BYTE_GET (evn.vn_aux);
5874 ivn.vn_next = BYTE_GET (evn.vn_next);
5876 vna_off = offset + ivn.vn_aux;
5880 Elf_External_Vernaux evna;
5882 get_data (&evna, file, vna_off,
5884 _("version need aux (3)"));
5886 ivna.vna_other = BYTE_GET (evna.vna_other);
5887 ivna.vna_next = BYTE_GET (evna.vna_next);
5888 ivna.vna_name = BYTE_GET (evna.vna_name);
5890 vna_off += ivna.vna_next;
5892 while (ivna.vna_other != vers_data
5893 && ivna.vna_next != 0);
5895 if (ivna.vna_other == vers_data)
5898 offset += ivn.vn_next;
5900 while (ivn.vn_next != 0);
5902 if (ivna.vna_other == vers_data)
5905 strtab + ivna.vna_name, ivna.vna_other);
5908 else if (! is_nobits)
5909 error (_("bad dynamic symbol"));
5916 if (vers_data != 0x8001
5917 && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
5919 Elf_Internal_Verdef ivd;
5920 Elf_Internal_Verdaux ivda;
5921 Elf_External_Verdaux evda;
5922 unsigned long offset;
5925 = (version_info[DT_VERSIONTAGIDX (DT_VERDEF)]
5930 Elf_External_Verdef evd;
5932 get_data (&evd, file, offset, sizeof (evd),
5935 ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
5936 ivd.vd_aux = BYTE_GET (evd.vd_aux);
5937 ivd.vd_next = BYTE_GET (evd.vd_next);
5939 offset += ivd.vd_next;
5941 while (ivd.vd_ndx != (vers_data & 0x7fff)
5942 && ivd.vd_next != 0);
5944 offset -= ivd.vd_next;
5945 offset += ivd.vd_aux;
5947 get_data (&evda, file, offset, sizeof (evda),
5948 _("version def aux"));
5950 ivda.vda_name = BYTE_GET (evda.vda_name);
5952 if (psym->st_name != ivda.vda_name)
5953 printf ((vers_data & 0x8000)
5955 strtab + ivda.vda_name);
5965 if (strtab != string_table)
5971 (_("\nDynamic symbol information is not available for displaying symbols.\n"));
5973 if (do_histogram && buckets != NULL)
5980 int nzero_counts = 0;
5983 printf (_("\nHistogram for bucket list length (total of %d buckets):\n"),
5985 printf (_(" Length Number %% of total Coverage\n"));
5987 lengths = (int *) calloc (nbuckets, sizeof (int));
5988 if (lengths == NULL)
5990 error (_("Out of memory"));
5993 for (hn = 0; hn < nbuckets; ++hn)
5998 for (si = buckets[hn]; si > 0 && si < nchains; si = chains[si])
6001 if (maxlength < ++lengths[hn])
6006 counts = (int *) calloc (maxlength + 1, sizeof (int));
6009 error (_("Out of memory"));
6013 for (hn = 0; hn < nbuckets; ++hn)
6014 ++counts[lengths[hn]];
6018 printf (" 0 %-10d (%5.1f%%)\n",
6019 counts[0], (counts[0] * 100.0) / nbuckets);
6020 for (si = 1; si <= maxlength; ++si)
6022 nzero_counts += counts[si] * si;
6023 printf ("%7d %-10d (%5.1f%%) %5.1f%%\n",
6024 si, counts[si], (counts[si] * 100.0) / nbuckets,
6025 (nzero_counts * 100.0) / nsyms);
6033 if (buckets != NULL)
6043 process_syminfo (file)
6044 FILE *file ATTRIBUTE_UNUSED;
6048 if (dynamic_syminfo == NULL
6050 /* No syminfo, this is ok. */
6053 /* There better should be a dynamic symbol section. */
6054 if (dynamic_symbols == NULL || dynamic_strings == NULL)
6058 printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
6059 dynamic_syminfo_offset, dynamic_syminfo_nent);
6061 printf (_(" Num: Name BoundTo Flags\n"));
6062 for (i = 0; i < dynamic_syminfo_nent; ++i)
6064 unsigned short int flags = dynamic_syminfo[i].si_flags;
6066 printf ("%4d: ", i);
6067 print_symbol (30, dynamic_strings + dynamic_symbols[i].st_name);
6070 switch (dynamic_syminfo[i].si_boundto)
6072 case SYMINFO_BT_SELF:
6073 fputs ("SELF ", stdout);
6075 case SYMINFO_BT_PARENT:
6076 fputs ("PARENT ", stdout);
6079 if (dynamic_syminfo[i].si_boundto > 0
6080 && dynamic_syminfo[i].si_boundto < dynamic_size)
6085 [dynamic_syminfo[i].si_boundto].d_un.d_val));
6089 printf ("%-10d ", dynamic_syminfo[i].si_boundto);
6093 if (flags & SYMINFO_FLG_DIRECT)
6095 if (flags & SYMINFO_FLG_PASSTHRU)
6096 printf (" PASSTHRU");
6097 if (flags & SYMINFO_FLG_COPY)
6099 if (flags & SYMINFO_FLG_LAZYLOAD)
6100 printf (" LAZYLOAD");
6108 #ifdef SUPPORT_DISASSEMBLY
6110 disassemble_section (section, file)
6111 Elf_Internal_Shdr *section;
6114 printf (_("\nAssembly dump of section %s\n"),
6115 SECTION_NAME (section));
6117 /* XXX -- to be done --- XXX */
6124 dump_section (section, file)
6125 Elf_Internal_Shdr *section;
6128 bfd_size_type bytes;
6130 unsigned char *data;
6131 unsigned char *start;
6133 bytes = section->sh_size;
6137 printf (_("\nSection '%s' has no data to dump.\n"),
6138 SECTION_NAME (section));
6142 printf (_("\nHex dump of section '%s':\n"), SECTION_NAME (section));
6144 addr = section->sh_addr;
6146 start = (unsigned char *) get_data (NULL, file, section->sh_offset, bytes,
6159 lbytes = (bytes > 16 ? 16 : bytes);
6161 printf (" 0x%8.8lx ", (unsigned long) addr);
6163 switch (elf_header.e_ident[EI_DATA])
6167 for (j = 15; j >= 0; j --)
6170 printf ("%2.2x", data[j]);
6180 for (j = 0; j < 16; j++)
6183 printf ("%2.2x", data[j]);
6193 for (j = 0; j < lbytes; j++)
6196 if (k >= ' ' && k < 0x80)
6215 static unsigned long int
6216 read_leb128 (data, length_return, sign)
6217 unsigned char *data;
6221 unsigned long int result = 0;
6222 unsigned int num_read = 0;
6231 result |= (byte & 0x7f) << shift;
6236 while (byte & 0x80);
6238 if (length_return != NULL)
6239 *length_return = num_read;
6241 if (sign && (shift < 32) && (byte & 0x40))
6242 result |= -1 << shift;
6247 typedef struct State_Machine_Registers
6249 unsigned long address;
6252 unsigned int column;
6256 /* This variable hold the number of the last entry seen
6257 in the File Table. */
6258 unsigned int last_file_entry;
6261 static SMR state_machine_regs;
6264 reset_state_machine (is_stmt)
6267 state_machine_regs.address = 0;
6268 state_machine_regs.file = 1;
6269 state_machine_regs.line = 1;
6270 state_machine_regs.column = 0;
6271 state_machine_regs.is_stmt = is_stmt;
6272 state_machine_regs.basic_block = 0;
6273 state_machine_regs.end_sequence = 0;
6274 state_machine_regs.last_file_entry = 0;
6277 /* Handled an extend line op. Returns true if this is the end
6280 process_extended_line_op (data, is_stmt, pointer_size)
6281 unsigned char *data;
6285 unsigned char op_code;
6288 unsigned char *name;
6291 len = read_leb128 (data, & bytes_read, 0);
6296 warn (_("badly formed extended line op encountered!\n"));
6303 printf (_(" Extended opcode %d: "), op_code);
6307 case DW_LNE_end_sequence:
6308 printf (_("End of Sequence\n\n"));
6309 reset_state_machine (is_stmt);
6312 case DW_LNE_set_address:
6313 adr = byte_get (data, pointer_size);
6314 printf (_("set Address to 0x%lx\n"), adr);
6315 state_machine_regs.address = adr;
6318 case DW_LNE_define_file:
6319 printf (_(" define new File Table entry\n"));
6320 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6322 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6324 data += strlen ((char *) data) + 1;
6325 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6327 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6329 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6330 printf (_("%s\n\n"), name);
6334 printf (_("UNKNOWN: length %d\n"), len - bytes_read);
6341 /* Size of pointers in the .debug_line section. This information is not
6342 really present in that section. It's obtained before dumping the debug
6343 sections by doing some pre-scan of the .debug_info section. */
6344 static int debug_line_pointer_size = 4;
6347 display_debug_lines (section, start, file)
6348 Elf_Internal_Shdr *section;
6349 unsigned char * start;
6350 FILE *file ATTRIBUTE_UNUSED;
6352 DWARF2_External_LineInfo *external;
6353 DWARF2_Internal_LineInfo info;
6354 unsigned char *standard_opcodes;
6355 unsigned char *data = start;
6356 unsigned char *end = start + section->sh_size;
6357 unsigned char *end_of_sequence;
6360 printf (_("\nDump of debug contents of section %s:\n\n"),
6361 SECTION_NAME (section));
6365 external = (DWARF2_External_LineInfo *) data;
6367 /* Check the length of the block. */
6368 info.li_length = BYTE_GET (external->li_length);
6370 if (info.li_length == 0xffffffff)
6372 warn (_("64-bit DWARF line info is not supported yet.\n"));
6376 if (info.li_length + sizeof (external->li_length) > section->sh_size)
6379 (_("The line info appears to be corrupt - the section is too small\n"));
6383 /* Check its version number. */
6384 info.li_version = BYTE_GET (external->li_version);
6385 if (info.li_version != 2)
6387 warn (_("Only DWARF version 2 line info is currently supported.\n"));
6391 info.li_prologue_length = BYTE_GET (external->li_prologue_length);
6392 info.li_min_insn_length = BYTE_GET (external->li_min_insn_length);
6393 info.li_default_is_stmt = BYTE_GET (external->li_default_is_stmt);
6394 info.li_line_base = BYTE_GET (external->li_line_base);
6395 info.li_line_range = BYTE_GET (external->li_line_range);
6396 info.li_opcode_base = BYTE_GET (external->li_opcode_base);
6398 /* Sign extend the line base field. */
6399 info.li_line_base <<= 24;
6400 info.li_line_base >>= 24;
6402 printf (_(" Length: %ld\n"), info.li_length);
6403 printf (_(" DWARF Version: %d\n"), info.li_version);
6404 printf (_(" Prologue Length: %d\n"), info.li_prologue_length);
6405 printf (_(" Minimum Instruction Length: %d\n"), info.li_min_insn_length);
6406 printf (_(" Initial value of 'is_stmt': %d\n"), info.li_default_is_stmt);
6407 printf (_(" Line Base: %d\n"), info.li_line_base);
6408 printf (_(" Line Range: %d\n"), info.li_line_range);
6409 printf (_(" Opcode Base: %d\n"), info.li_opcode_base);
6411 end_of_sequence = data + info.li_length + sizeof (external->li_length);
6413 reset_state_machine (info.li_default_is_stmt);
6415 /* Display the contents of the Opcodes table. */
6416 standard_opcodes = data + sizeof (*external);
6418 printf (_("\n Opcodes:\n"));
6420 for (i = 1; i < info.li_opcode_base; i++)
6421 printf (_(" Opcode %d has %d args\n"), i, standard_opcodes[i - 1]);
6423 /* Display the contents of the Directory table. */
6424 data = standard_opcodes + info.li_opcode_base - 1;
6427 printf (_("\n The Directory Table is empty.\n"));
6430 printf (_("\n The Directory Table:\n"));
6434 printf (_(" %s\n"), data);
6436 data += strlen ((char *) data) + 1;
6440 /* Skip the NUL at the end of the table. */
6443 /* Display the contents of the File Name table. */
6445 printf (_("\n The File Name Table is empty.\n"));
6448 printf (_("\n The File Name Table:\n"));
6449 printf (_(" Entry\tDir\tTime\tSize\tName\n"));
6453 unsigned char *name;
6456 printf (_(" %d\t"), ++state_machine_regs.last_file_entry);
6459 data += strlen ((char *) data) + 1;
6461 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6463 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6465 printf (_("%lu\t"), read_leb128 (data, & bytes_read, 0));
6467 printf (_("%s\n"), name);
6471 /* Skip the NUL at the end of the table. */
6474 /* Now display the statements. */
6475 printf (_("\n Line Number Statements:\n"));
6478 while (data < end_of_sequence)
6480 unsigned char op_code;
6486 if (op_code >= info.li_opcode_base)
6488 op_code -= info.li_opcode_base;
6489 adv = (op_code / info.li_line_range) * info.li_min_insn_length;
6490 state_machine_regs.address += adv;
6491 printf (_(" Special opcode %d: advance Address by %d to 0x%lx"),
6492 op_code, adv, state_machine_regs.address);
6493 adv = (op_code % info.li_line_range) + info.li_line_base;
6494 state_machine_regs.line += adv;
6495 printf (_(" and Line by %d to %d\n"),
6496 adv, state_machine_regs.line);
6498 else switch (op_code)
6500 case DW_LNS_extended_op:
6501 data += process_extended_line_op (data, info.li_default_is_stmt,
6502 debug_line_pointer_size);
6506 printf (_(" Copy\n"));
6509 case DW_LNS_advance_pc:
6510 adv = info.li_min_insn_length * read_leb128 (data, & bytes_read, 0);
6512 state_machine_regs.address += adv;
6513 printf (_(" Advance PC by %d to %lx\n"), adv,
6514 state_machine_regs.address);
6517 case DW_LNS_advance_line:
6518 adv = read_leb128 (data, & bytes_read, 1);
6520 state_machine_regs.line += adv;
6521 printf (_(" Advance Line by %d to %d\n"), adv,
6522 state_machine_regs.line);
6525 case DW_LNS_set_file:
6526 adv = read_leb128 (data, & bytes_read, 0);
6528 printf (_(" Set File Name to entry %d in the File Name Table\n"),
6530 state_machine_regs.file = adv;
6533 case DW_LNS_set_column:
6534 adv = read_leb128 (data, & bytes_read, 0);
6536 printf (_(" Set column to %d\n"), adv);
6537 state_machine_regs.column = adv;
6540 case DW_LNS_negate_stmt:
6541 adv = state_machine_regs.is_stmt;
6543 printf (_(" Set is_stmt to %d\n"), adv);
6544 state_machine_regs.is_stmt = adv;
6547 case DW_LNS_set_basic_block:
6548 printf (_(" Set basic block\n"));
6549 state_machine_regs.basic_block = 1;
6552 case DW_LNS_const_add_pc:
6553 adv = (((255 - info.li_opcode_base) / info.li_line_range)
6554 * info.li_min_insn_length);
6555 state_machine_regs.address += adv;
6556 printf (_(" Advance PC by constant %d to 0x%lx\n"), adv,
6557 state_machine_regs.address);
6560 case DW_LNS_fixed_advance_pc:
6561 adv = byte_get (data, 2);
6563 state_machine_regs.address += adv;
6564 printf (_(" Advance PC by fixed size amount %d to 0x%lx\n"),
6565 adv, state_machine_regs.address);
6568 case DW_LNS_set_prologue_end:
6569 printf (_(" Set prologue_end to true\n"));
6572 case DW_LNS_set_epilogue_begin:
6573 printf (_(" Set epilogue_begin to true\n"));
6576 case DW_LNS_set_isa:
6577 adv = read_leb128 (data, & bytes_read, 0);
6579 printf (_(" Set ISA to %d\n"), adv);
6583 printf (_(" Unknown opcode %d with operands: "), op_code);
6586 for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
6588 printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
6589 i == 1 ? "" : ", ");
6604 display_debug_pubnames (section, start, file)
6605 Elf_Internal_Shdr *section;
6606 unsigned char *start;
6607 FILE *file ATTRIBUTE_UNUSED;
6609 DWARF2_External_PubNames *external;
6610 DWARF2_Internal_PubNames pubnames;
6613 end = start + section->sh_size;
6615 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
6619 unsigned char *data;
6620 unsigned long offset;
6622 external = (DWARF2_External_PubNames *) start;
6624 pubnames.pn_length = BYTE_GET (external->pn_length);
6625 pubnames.pn_version = BYTE_GET (external->pn_version);
6626 pubnames.pn_offset = BYTE_GET (external->pn_offset);
6627 pubnames.pn_size = BYTE_GET (external->pn_size);
6629 data = start + sizeof (*external);
6630 start += pubnames.pn_length + sizeof (external->pn_length);
6632 if (pubnames.pn_length == 0xffffffff)
6634 warn (_("64-bit DWARF pubnames are not supported yet.\n"));
6638 if (pubnames.pn_version != 2)
6640 static int warned = 0;
6644 warn (_("Only DWARF 2 pubnames are currently supported\n"));
6651 printf (_(" Length: %ld\n"),
6652 pubnames.pn_length);
6653 printf (_(" Version: %d\n"),
6654 pubnames.pn_version);
6655 printf (_(" Offset into .debug_info section: %ld\n"),
6656 pubnames.pn_offset);
6657 printf (_(" Size of area in .debug_info section: %ld\n"),
6660 printf (_("\n Offset\tName\n"));
6664 offset = byte_get (data, 4);
6669 printf (" %ld\t\t%s\n", offset, data);
6670 data += strlen ((char *) data) + 1;
6673 while (offset != 0);
6686 case DW_TAG_padding: return "DW_TAG_padding";
6687 case DW_TAG_array_type: return "DW_TAG_array_type";
6688 case DW_TAG_class_type: return "DW_TAG_class_type";
6689 case DW_TAG_entry_point: return "DW_TAG_entry_point";
6690 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
6691 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
6692 case DW_TAG_imported_declaration: return "DW_TAG_imported_declaration";
6693 case DW_TAG_label: return "DW_TAG_label";
6694 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
6695 case DW_TAG_member: return "DW_TAG_member";
6696 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
6697 case DW_TAG_reference_type: return "DW_TAG_reference_type";
6698 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
6699 case DW_TAG_string_type: return "DW_TAG_string_type";
6700 case DW_TAG_structure_type: return "DW_TAG_structure_type";
6701 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
6702 case DW_TAG_typedef: return "DW_TAG_typedef";
6703 case DW_TAG_union_type: return "DW_TAG_union_type";
6704 case DW_TAG_unspecified_parameters: return "DW_TAG_unspecified_parameters";
6705 case DW_TAG_variant: return "DW_TAG_variant";
6706 case DW_TAG_common_block: return "DW_TAG_common_block";
6707 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
6708 case DW_TAG_inheritance: return "DW_TAG_inheritance";
6709 case DW_TAG_inlined_subroutine: return "DW_TAG_inlined_subroutine";
6710 case DW_TAG_module: return "DW_TAG_module";
6711 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
6712 case DW_TAG_set_type: return "DW_TAG_set_type";
6713 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
6714 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
6715 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
6716 case DW_TAG_base_type: return "DW_TAG_base_type";
6717 case DW_TAG_catch_block: return "DW_TAG_catch_block";
6718 case DW_TAG_const_type: return "DW_TAG_const_type";
6719 case DW_TAG_constant: return "DW_TAG_constant";
6720 case DW_TAG_enumerator: return "DW_TAG_enumerator";
6721 case DW_TAG_file_type: return "DW_TAG_file_type";
6722 case DW_TAG_friend: return "DW_TAG_friend";
6723 case DW_TAG_namelist: return "DW_TAG_namelist";
6724 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
6725 case DW_TAG_packed_type: return "DW_TAG_packed_type";
6726 case DW_TAG_subprogram: return "DW_TAG_subprogram";
6727 case DW_TAG_template_type_param: return "DW_TAG_template_type_param";
6728 case DW_TAG_template_value_param: return "DW_TAG_template_value_param";
6729 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
6730 case DW_TAG_try_block: return "DW_TAG_try_block";
6731 case DW_TAG_variant_part: return "DW_TAG_variant_part";
6732 case DW_TAG_variable: return "DW_TAG_variable";
6733 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
6734 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
6735 case DW_TAG_format_label: return "DW_TAG_format_label";
6736 case DW_TAG_function_template: return "DW_TAG_function_template";
6737 case DW_TAG_class_template: return "DW_TAG_class_template";
6738 /* DWARF 2.1 values. */
6739 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
6740 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
6741 case DW_TAG_interface_type: return "DW_TAG_interface_type";
6742 case DW_TAG_namespace: return "DW_TAG_namespace";
6743 case DW_TAG_imported_module: return "DW_TAG_imported_module";
6744 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
6745 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
6746 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
6748 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
6749 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
6750 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
6753 static char buffer[100];
6755 sprintf (buffer, _("Unknown TAG value: %lx"), tag);
6762 get_AT_name (attribute)
6763 unsigned long attribute;
6767 case DW_AT_sibling: return "DW_AT_sibling";
6768 case DW_AT_location: return "DW_AT_location";
6769 case DW_AT_name: return "DW_AT_name";
6770 case DW_AT_ordering: return "DW_AT_ordering";
6771 case DW_AT_subscr_data: return "DW_AT_subscr_data";
6772 case DW_AT_byte_size: return "DW_AT_byte_size";
6773 case DW_AT_bit_offset: return "DW_AT_bit_offset";
6774 case DW_AT_bit_size: return "DW_AT_bit_size";
6775 case DW_AT_element_list: return "DW_AT_element_list";
6776 case DW_AT_stmt_list: return "DW_AT_stmt_list";
6777 case DW_AT_low_pc: return "DW_AT_low_pc";
6778 case DW_AT_high_pc: return "DW_AT_high_pc";
6779 case DW_AT_language: return "DW_AT_language";
6780 case DW_AT_member: return "DW_AT_member";
6781 case DW_AT_discr: return "DW_AT_discr";
6782 case DW_AT_discr_value: return "DW_AT_discr_value";
6783 case DW_AT_visibility: return "DW_AT_visibility";
6784 case DW_AT_import: return "DW_AT_import";
6785 case DW_AT_string_length: return "DW_AT_string_length";
6786 case DW_AT_common_reference: return "DW_AT_common_reference";
6787 case DW_AT_comp_dir: return "DW_AT_comp_dir";
6788 case DW_AT_const_value: return "DW_AT_const_value";
6789 case DW_AT_containing_type: return "DW_AT_containing_type";
6790 case DW_AT_default_value: return "DW_AT_default_value";
6791 case DW_AT_inline: return "DW_AT_inline";
6792 case DW_AT_is_optional: return "DW_AT_is_optional";
6793 case DW_AT_lower_bound: return "DW_AT_lower_bound";
6794 case DW_AT_producer: return "DW_AT_producer";
6795 case DW_AT_prototyped: return "DW_AT_prototyped";
6796 case DW_AT_return_addr: return "DW_AT_return_addr";
6797 case DW_AT_start_scope: return "DW_AT_start_scope";
6798 case DW_AT_stride_size: return "DW_AT_stride_size";
6799 case DW_AT_upper_bound: return "DW_AT_upper_bound";
6800 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
6801 case DW_AT_accessibility: return "DW_AT_accessibility";
6802 case DW_AT_address_class: return "DW_AT_address_class";
6803 case DW_AT_artificial: return "DW_AT_artificial";
6804 case DW_AT_base_types: return "DW_AT_base_types";
6805 case DW_AT_calling_convention: return "DW_AT_calling_convention";
6806 case DW_AT_count: return "DW_AT_count";
6807 case DW_AT_data_member_location: return "DW_AT_data_member_location";
6808 case DW_AT_decl_column: return "DW_AT_decl_column";
6809 case DW_AT_decl_file: return "DW_AT_decl_file";
6810 case DW_AT_decl_line: return "DW_AT_decl_line";
6811 case DW_AT_declaration: return "DW_AT_declaration";
6812 case DW_AT_discr_list: return "DW_AT_discr_list";
6813 case DW_AT_encoding: return "DW_AT_encoding";
6814 case DW_AT_external: return "DW_AT_external";
6815 case DW_AT_frame_base: return "DW_AT_frame_base";
6816 case DW_AT_friend: return "DW_AT_friend";
6817 case DW_AT_identifier_case: return "DW_AT_identifier_case";
6818 case DW_AT_macro_info: return "DW_AT_macro_info";
6819 case DW_AT_namelist_items: return "DW_AT_namelist_items";
6820 case DW_AT_priority: return "DW_AT_priority";
6821 case DW_AT_segment: return "DW_AT_segment";
6822 case DW_AT_specification: return "DW_AT_specification";
6823 case DW_AT_static_link: return "DW_AT_static_link";
6824 case DW_AT_type: return "DW_AT_type";
6825 case DW_AT_use_location: return "DW_AT_use_location";
6826 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
6827 case DW_AT_virtuality: return "DW_AT_virtuality";
6828 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
6829 /* DWARF 2.1 values. */
6830 case DW_AT_allocated: return "DW_AT_allocated";
6831 case DW_AT_associated: return "DW_AT_associated";
6832 case DW_AT_data_location: return "DW_AT_data_location";
6833 case DW_AT_stride: return "DW_AT_stride";
6834 case DW_AT_entry_pc: return "DW_AT_entry_pc";
6835 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
6836 case DW_AT_extension: return "DW_AT_extension";
6837 case DW_AT_ranges: return "DW_AT_ranges";
6838 case DW_AT_trampoline: return "DW_AT_trampoline";
6839 case DW_AT_call_column: return "DW_AT_call_column";
6840 case DW_AT_call_file: return "DW_AT_call_file";
6841 case DW_AT_call_line: return "DW_AT_call_line";
6842 /* SGI/MIPS extensions. */
6843 case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
6844 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
6845 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
6846 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
6847 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
6848 case DW_AT_MIPS_software_pipeline_depth:
6849 return "DW_AT_MIPS_software_pipeline_depth";
6850 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
6851 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
6852 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
6853 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
6854 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
6855 /* GNU extensions. */
6856 case DW_AT_sf_names: return "DW_AT_sf_names";
6857 case DW_AT_src_info: return "DW_AT_src_info";
6858 case DW_AT_mac_info: return "DW_AT_mac_info";
6859 case DW_AT_src_coords: return "DW_AT_src_coords";
6860 case DW_AT_body_begin: return "DW_AT_body_begin";
6861 case DW_AT_body_end: return "DW_AT_body_end";
6862 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
6863 /* UPC extension. */
6864 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
6867 static char buffer[100];
6869 sprintf (buffer, _("Unknown AT value: %lx"), attribute);
6876 get_FORM_name (form)
6881 case DW_FORM_addr: return "DW_FORM_addr";
6882 case DW_FORM_block2: return "DW_FORM_block2";
6883 case DW_FORM_block4: return "DW_FORM_block4";
6884 case DW_FORM_data2: return "DW_FORM_data2";
6885 case DW_FORM_data4: return "DW_FORM_data4";
6886 case DW_FORM_data8: return "DW_FORM_data8";
6887 case DW_FORM_string: return "DW_FORM_string";
6888 case DW_FORM_block: return "DW_FORM_block";
6889 case DW_FORM_block1: return "DW_FORM_block1";
6890 case DW_FORM_data1: return "DW_FORM_data1";
6891 case DW_FORM_flag: return "DW_FORM_flag";
6892 case DW_FORM_sdata: return "DW_FORM_sdata";
6893 case DW_FORM_strp: return "DW_FORM_strp";
6894 case DW_FORM_udata: return "DW_FORM_udata";
6895 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
6896 case DW_FORM_ref1: return "DW_FORM_ref1";
6897 case DW_FORM_ref2: return "DW_FORM_ref2";
6898 case DW_FORM_ref4: return "DW_FORM_ref4";
6899 case DW_FORM_ref8: return "DW_FORM_ref8";
6900 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
6901 case DW_FORM_indirect: return "DW_FORM_indirect";
6904 static char buffer[100];
6906 sprintf (buffer, _("Unknown FORM value: %lx"), form);
6912 /* FIXME: There are better and more effiecint ways to handle
6913 these structures. For now though, I just want something that
6914 is simple to implement. */
6915 typedef struct abbrev_attr
6917 unsigned long attribute;
6919 struct abbrev_attr *next;
6923 typedef struct abbrev_entry
6925 unsigned long entry;
6928 struct abbrev_attr *first_attr;
6929 struct abbrev_attr *last_attr;
6930 struct abbrev_entry *next;
6934 static abbrev_entry *first_abbrev = NULL;
6935 static abbrev_entry *last_abbrev = NULL;
6940 abbrev_entry *abbrev;
6942 for (abbrev = first_abbrev; abbrev;)
6944 abbrev_entry *next = abbrev->next;
6947 for (attr = abbrev->first_attr; attr;)
6949 abbrev_attr *next = attr->next;
6959 last_abbrev = first_abbrev = NULL;
6963 add_abbrev (number, tag, children)
6964 unsigned long number;
6968 abbrev_entry *entry;
6970 entry = (abbrev_entry *) malloc (sizeof (*entry));
6976 entry->entry = number;
6978 entry->children = children;
6979 entry->first_attr = NULL;
6980 entry->last_attr = NULL;
6983 if (first_abbrev == NULL)
6984 first_abbrev = entry;
6986 last_abbrev->next = entry;
6988 last_abbrev = entry;
6992 add_abbrev_attr (attribute, form)
6993 unsigned long attribute;
6998 attr = (abbrev_attr *) malloc (sizeof (*attr));
7004 attr->attribute = attribute;
7008 if (last_abbrev->first_attr == NULL)
7009 last_abbrev->first_attr = attr;
7011 last_abbrev->last_attr->next = attr;
7013 last_abbrev->last_attr = attr;
7016 /* Processes the (partial) contents of a .debug_abbrev section.
7017 Returns NULL if the end of the section was encountered.
7018 Returns the address after the last byte read if the end of
7019 an abbreviation set was found. */
7021 static unsigned char *
7022 process_abbrev_section (start, end)
7023 unsigned char *start;
7026 if (first_abbrev != NULL)
7032 unsigned long entry;
7034 unsigned long attribute;
7037 entry = read_leb128 (start, & bytes_read, 0);
7038 start += bytes_read;
7040 /* A single zero is supposed to end the section according
7041 to the standard. If there's more, then signal that to
7044 return start == end ? NULL : start;
7046 tag = read_leb128 (start, & bytes_read, 0);
7047 start += bytes_read;
7049 children = *start++;
7051 add_abbrev (entry, tag, children);
7057 attribute = read_leb128 (start, & bytes_read, 0);
7058 start += bytes_read;
7060 form = read_leb128 (start, & bytes_read, 0);
7061 start += bytes_read;
7064 add_abbrev_attr (attribute, form);
7066 while (attribute != 0);
7074 display_debug_macinfo (section, start, file)
7075 Elf_Internal_Shdr *section;
7076 unsigned char *start;
7077 FILE *file ATTRIBUTE_UNUSED;
7079 unsigned char *end = start + section->sh_size;
7080 unsigned char *curr = start;
7081 unsigned int bytes_read;
7082 enum dwarf_macinfo_record_type op;
7084 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7088 unsigned int lineno;
7096 case DW_MACINFO_start_file:
7098 unsigned int filenum;
7100 lineno = read_leb128 (curr, & bytes_read, 0);
7102 filenum = read_leb128 (curr, & bytes_read, 0);
7105 printf (_(" DW_MACINFO_start_file - lineno: %d filenum: %d\n"), lineno, filenum);
7109 case DW_MACINFO_end_file:
7110 printf (_(" DW_MACINFO_end_file\n"));
7113 case DW_MACINFO_define:
7114 lineno = read_leb128 (curr, & bytes_read, 0);
7117 curr += strlen (string) + 1;
7118 printf (_(" DW_MACINFO_define - lineno : %d macro : %s\n"), lineno, string);
7121 case DW_MACINFO_undef:
7122 lineno = read_leb128 (curr, & bytes_read, 0);
7125 curr += strlen (string) + 1;
7126 printf (_(" DW_MACINFO_undef - lineno : %d macro : %s\n"), lineno, string);
7129 case DW_MACINFO_vendor_ext:
7131 unsigned int constant;
7133 constant = read_leb128 (curr, & bytes_read, 0);
7136 curr += strlen (string) + 1;
7137 printf (_(" DW_MACINFO_vendor_ext - constant : %d string : %s\n"), constant, string);
7148 display_debug_abbrev (section, start, file)
7149 Elf_Internal_Shdr *section;
7150 unsigned char *start;
7151 FILE *file ATTRIBUTE_UNUSED;
7153 abbrev_entry *entry;
7154 unsigned char *end = start + section->sh_size;
7156 printf (_("Contents of the %s section:\n\n"), SECTION_NAME (section));
7160 start = process_abbrev_section (start, end);
7162 if (first_abbrev == NULL)
7165 printf (_(" Number TAG\n"));
7167 for (entry = first_abbrev; entry; entry = entry->next)
7171 printf (_(" %ld %s [%s]\n"),
7173 get_TAG_name (entry->tag),
7174 entry->children ? _("has children") : _("no children"));
7176 for (attr = entry->first_attr; attr; attr = attr->next)
7178 printf (_(" %-18s %s\n"),
7179 get_AT_name (attr->attribute),
7180 get_FORM_name (attr->form));
7194 static unsigned char *
7195 display_block (data, length)
7196 unsigned char *data;
7197 unsigned long length;
7199 printf (_(" %lu byte block: "), length);
7202 printf ("%lx ", (unsigned long) byte_get (data++, 1));
7208 decode_location_expression (data, pointer_size, length)
7209 unsigned char * data;
7210 unsigned int pointer_size;
7211 unsigned long length;
7215 unsigned long uvalue;
7216 unsigned char *end = data + length;
7225 printf ("DW_OP_addr: %lx",
7226 (unsigned long) byte_get (data, pointer_size));
7227 data += pointer_size;
7230 printf ("DW_OP_deref");
7233 printf ("DW_OP_const1u: %lu", (unsigned long) byte_get (data++, 1));
7236 printf ("DW_OP_const1s: %ld", (long) byte_get (data++, 1));
7239 printf ("DW_OP_const2u: %lu", (unsigned long) byte_get (data, 2));
7243 printf ("DW_OP_const2s: %ld", (long) byte_get (data, 2));
7247 printf ("DW_OP_const4u: %lu", (unsigned long) byte_get (data, 4));
7251 printf ("DW_OP_const4s: %ld", (long) byte_get (data, 4));
7255 printf ("DW_OP_const8u: %lu %lu", (unsigned long) byte_get (data, 4),
7256 (unsigned long) byte_get (data + 4, 4));
7260 printf ("DW_OP_const8s: %ld %ld", (long) byte_get (data, 4),
7261 (long) byte_get (data + 4, 4));
7265 printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
7269 printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
7273 printf ("DW_OP_dup");
7276 printf ("DW_OP_drop");
7279 printf ("DW_OP_over");
7282 printf ("DW_OP_pick: %ld", (unsigned long) byte_get (data++, 1));
7285 printf ("DW_OP_swap");
7288 printf ("DW_OP_rot");
7291 printf ("DW_OP_xderef");
7294 printf ("DW_OP_abs");
7297 printf ("DW_OP_and");
7300 printf ("DW_OP_div");
7303 printf ("DW_OP_minus");
7306 printf ("DW_OP_mod");
7309 printf ("DW_OP_mul");
7312 printf ("DW_OP_neg");
7315 printf ("DW_OP_not");
7318 printf ("DW_OP_or");
7321 printf ("DW_OP_plus");
7323 case DW_OP_plus_uconst:
7324 printf ("DW_OP_plus_uconst: %lu",
7325 read_leb128 (data, &bytes_read, 0));
7329 printf ("DW_OP_shl");
7332 printf ("DW_OP_shr");
7335 printf ("DW_OP_shra");
7338 printf ("DW_OP_xor");
7341 printf ("DW_OP_bra: %ld", (long) byte_get (data, 2));
7345 printf ("DW_OP_eq");
7348 printf ("DW_OP_ge");
7351 printf ("DW_OP_gt");
7354 printf ("DW_OP_le");
7357 printf ("DW_OP_lt");
7360 printf ("DW_OP_ne");
7363 printf ("DW_OP_skip: %ld", (long) byte_get (data, 2));
7399 printf ("DW_OP_lit%d", op - DW_OP_lit0);
7434 printf ("DW_OP_reg%d", op - DW_OP_reg0);
7469 printf ("DW_OP_breg%d: %ld", op - DW_OP_breg0,
7470 read_leb128 (data, &bytes_read, 1));
7475 printf ("DW_OP_regx: %lu", read_leb128 (data, &bytes_read, 0));
7479 printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
7483 uvalue = read_leb128 (data, &bytes_read, 0);
7485 printf ("DW_OP_bregx: %lu %ld", uvalue,
7486 read_leb128 (data, &bytes_read, 1));
7490 printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
7493 case DW_OP_deref_size:
7494 printf ("DW_OP_deref_size: %ld", (long) byte_get (data++, 1));
7496 case DW_OP_xderef_size:
7497 printf ("DW_OP_xderef_size: %ld", (long) byte_get (data++, 1));
7500 printf ("DW_OP_nop");
7503 /* DWARF 3 extensions. */
7504 case DW_OP_push_object_address:
7505 printf ("DW_OP_push_object_address");
7508 printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
7512 printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
7515 case DW_OP_call_ref:
7516 printf ("DW_OP_call_ref");
7519 /* GNU extensions. */
7520 case DW_OP_GNU_push_tls_address:
7521 printf ("DW_OP_GNU_push_tls_address");
7525 if (op >= DW_OP_lo_user
7526 && op <= DW_OP_hi_user)
7527 printf (_("(User defined location op)"));
7529 printf (_("(Unknown location op)"));
7530 /* No way to tell where the next op is, so just bail. */
7534 /* Separate the ops. */
7539 static const char *debug_loc_contents;
7540 static bfd_vma debug_loc_size;
7543 load_debug_loc (file)
7546 Elf_Internal_Shdr *sec;
7549 /* If it is already loaded, do nothing. */
7550 if (debug_loc_contents != NULL)
7553 /* Locate the .debug_loc section. */
7554 for (i = 0, sec = section_headers;
7555 i < elf_header.e_shnum;
7557 if (strcmp (SECTION_NAME (sec), ".debug_loc") == 0)
7560 if (i == elf_header.e_shnum || sec->sh_size == 0)
7563 debug_loc_size = sec->sh_size;
7565 debug_loc_contents = ((char *)
7566 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7567 _("debug_loc section data")));
7573 if (debug_loc_contents == NULL)
7576 free ((char *) debug_loc_contents);
7577 debug_loc_contents = NULL;
7583 display_debug_loc (section, start, file)
7584 Elf_Internal_Shdr *section;
7585 unsigned char *start;
7586 FILE *file ATTRIBUTE_UNUSED;
7588 unsigned char *section_end;
7589 unsigned long bytes;
7590 unsigned char *section_begin = start;
7593 addr = section->sh_addr;
7594 bytes = section->sh_size;
7595 section_end = start + bytes;
7599 printf (_("\nThe .debug_loc section is empty.\n"));
7603 printf (_("Contents of the .debug_loc section:\n\n"));
7604 printf (_("\n Offset Begin End Expression\n"));
7606 while (start < section_end)
7608 unsigned long begin;
7610 unsigned short length;
7611 unsigned long offset;
7613 offset = start - section_begin;
7617 /* Normally, the lists in the debug_loc section are related to a
7618 given compilation unit, and thus, we would use the
7619 pointer size of that compilation unit. However, since we are
7620 displaying it seperately here, we either have to store
7621 pointer sizes of all compilation units, or assume they don't
7622 change. We assume, like the debug_line display, that
7623 it doesn't change. */
7624 begin = byte_get (start, debug_line_pointer_size);
7625 start += debug_line_pointer_size;
7626 end = byte_get (start, debug_line_pointer_size);
7627 start += debug_line_pointer_size;
7629 if (begin == 0 && end == 0)
7635 length = byte_get (start, 2);
7638 printf (" %8.8lx %8.8lx %8.8lx (", offset, begin, end);
7639 decode_location_expression (start, debug_line_pointer_size, length);
7649 static const char *debug_str_contents;
7650 static bfd_vma debug_str_size;
7653 load_debug_str (file)
7656 Elf_Internal_Shdr *sec;
7659 /* If it is already loaded, do nothing. */
7660 if (debug_str_contents != NULL)
7663 /* Locate the .debug_str section. */
7664 for (i = 0, sec = section_headers;
7665 i < elf_header.e_shnum;
7667 if (strcmp (SECTION_NAME (sec), ".debug_str") == 0)
7670 if (i == elf_header.e_shnum || sec->sh_size == 0)
7673 debug_str_size = sec->sh_size;
7675 debug_str_contents = ((char *)
7676 get_data (NULL, file, sec->sh_offset, sec->sh_size,
7677 _("debug_str section data")));
7683 if (debug_str_contents == NULL)
7686 free ((char *) debug_str_contents);
7687 debug_str_contents = NULL;
7692 fetch_indirect_string (offset)
7693 unsigned long offset;
7695 if (debug_str_contents == NULL)
7696 return _("<no .debug_str section>");
7698 if (offset > debug_str_size)
7699 return _("<offset is too big>");
7701 return debug_str_contents + offset;
7705 display_debug_str (section, start, file)
7706 Elf_Internal_Shdr *section;
7707 unsigned char *start;
7708 FILE *file ATTRIBUTE_UNUSED;
7710 unsigned long bytes;
7713 addr = section->sh_addr;
7714 bytes = section->sh_size;
7718 printf (_("\nThe .debug_str section is empty.\n"));
7722 printf (_("Contents of the .debug_str section:\n\n"));
7730 lbytes = (bytes > 16 ? 16 : bytes);
7732 printf (" 0x%8.8lx ", (unsigned long) addr);
7734 for (j = 0; j < 16; j++)
7737 printf ("%2.2x", start[j]);
7745 for (j = 0; j < lbytes; j++)
7748 if (k >= ' ' && k < 0x80)
7764 static unsigned char *
7765 read_and_display_attr_value (attribute, form, data, cu_offset, pointer_size)
7766 unsigned long attribute;
7768 unsigned char *data;
7769 unsigned long cu_offset;
7770 unsigned long pointer_size;
7772 unsigned long uvalue = 0;
7773 unsigned char *block_start = NULL;
7781 case DW_FORM_ref_addr:
7783 uvalue = byte_get (data, pointer_size);
7784 data += pointer_size;
7788 uvalue = byte_get (data, /* offset_size */ 4);
7789 data += /* offset_size */ 4;
7795 uvalue = byte_get (data++, 1);
7800 uvalue = byte_get (data, 2);
7806 uvalue = byte_get (data, 4);
7811 uvalue = read_leb128 (data, & bytes_read, 1);
7815 case DW_FORM_ref_udata:
7817 uvalue = read_leb128 (data, & bytes_read, 0);
7821 case DW_FORM_indirect:
7822 form = read_leb128 (data, & bytes_read, 0);
7824 printf (" %s", get_FORM_name (form));
7825 return read_and_display_attr_value (attribute, form, data, cu_offset,
7831 case DW_FORM_ref_addr:
7832 printf (" <#%lx>", uvalue);
7838 case DW_FORM_ref_udata:
7839 printf (" <%lx>", uvalue + cu_offset);
7843 printf (" %#lx", uvalue);
7851 printf (" %ld", uvalue);
7856 uvalue = byte_get (data, 4);
7857 printf (" %lx", uvalue);
7858 printf (" %lx", (unsigned long) byte_get (data + 4, 4));
7862 case DW_FORM_string:
7863 printf (" %s", data);
7864 data += strlen ((char *) data) + 1;
7868 uvalue = read_leb128 (data, & bytes_read, 0);
7869 block_start = data + bytes_read;
7870 data = display_block (block_start, uvalue);
7873 case DW_FORM_block1:
7874 uvalue = byte_get (data, 1);
7875 block_start = data + 1;
7876 data = display_block (block_start, uvalue);
7879 case DW_FORM_block2:
7880 uvalue = byte_get (data, 2);
7881 block_start = data + 2;
7882 data = display_block (block_start, uvalue);
7885 case DW_FORM_block4:
7886 uvalue = byte_get (data, 4);
7887 block_start = data + 4;
7888 data = display_block (block_start, uvalue);
7892 printf (_(" (indirect string, offset: 0x%lx): %s"),
7893 uvalue, fetch_indirect_string (uvalue));
7896 case DW_FORM_indirect:
7897 /* Handled above. */
7901 warn (_("Unrecognized form: %d\n"), form);
7905 /* For some attributes we can display futher information. */
7914 case DW_INL_not_inlined:
7915 printf (_("(not inlined)"));
7917 case DW_INL_inlined:
7918 printf (_("(inlined)"));
7920 case DW_INL_declared_not_inlined:
7921 printf (_("(declared as inline but ignored)"));
7923 case DW_INL_declared_inlined:
7924 printf (_("(declared as inline and inlined)"));
7927 printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
7932 case DW_AT_language:
7935 case DW_LANG_C: printf ("(non-ANSI C)"); break;
7936 case DW_LANG_C89: printf ("(ANSI C)"); break;
7937 case DW_LANG_C_plus_plus: printf ("(C++)"); break;
7938 case DW_LANG_Fortran77: printf ("(FORTRAN 77)"); break;
7939 case DW_LANG_Fortran90: printf ("(Fortran 90)"); break;
7940 case DW_LANG_Modula2: printf ("(Modula 2)"); break;
7941 case DW_LANG_Pascal83: printf ("(ANSI Pascal)"); break;
7942 case DW_LANG_Ada83: printf ("(Ada)"); break;
7943 case DW_LANG_Cobol74: printf ("(Cobol 74)"); break;
7944 case DW_LANG_Cobol85: printf ("(Cobol 85)"); break;
7945 /* DWARF 2.1 values. */
7946 case DW_LANG_C99: printf ("(ANSI C99)"); break;
7947 case DW_LANG_Ada95: printf ("(ADA 95)"); break;
7948 case DW_LANG_Fortran95: printf ("(Fortran 95)"); break;
7949 /* MIPS extension. */
7950 case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
7951 /* UPC extension. */
7952 case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
7954 printf ("(Unknown: %lx)", uvalue);
7959 case DW_AT_encoding:
7962 case DW_ATE_void: printf ("(void)"); break;
7963 case DW_ATE_address: printf ("(machine address)"); break;
7964 case DW_ATE_boolean: printf ("(boolean)"); break;
7965 case DW_ATE_complex_float: printf ("(complex float)"); break;
7966 case DW_ATE_float: printf ("(float)"); break;
7967 case DW_ATE_signed: printf ("(signed)"); break;
7968 case DW_ATE_signed_char: printf ("(signed char)"); break;
7969 case DW_ATE_unsigned: printf ("(unsigned)"); break;
7970 case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
7971 /* DWARF 2.1 value. */
7972 case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
7974 if (uvalue >= DW_ATE_lo_user
7975 && uvalue <= DW_ATE_hi_user)
7976 printf ("(user defined type)");
7978 printf ("(unknown type)");
7983 case DW_AT_accessibility:
7986 case DW_ACCESS_public: printf ("(public)"); break;
7987 case DW_ACCESS_protected: printf ("(protected)"); break;
7988 case DW_ACCESS_private: printf ("(private)"); break;
7990 printf ("(unknown accessibility)");
7995 case DW_AT_visibility:
7998 case DW_VIS_local: printf ("(local)"); break;
7999 case DW_VIS_exported: printf ("(exported)"); break;
8000 case DW_VIS_qualified: printf ("(qualified)"); break;
8001 default: printf ("(unknown visibility)"); break;
8005 case DW_AT_virtuality:
8008 case DW_VIRTUALITY_none: printf ("(none)"); break;
8009 case DW_VIRTUALITY_virtual: printf ("(virtual)"); break;
8010 case DW_VIRTUALITY_pure_virtual:printf ("(pure_virtual)"); break;
8011 default: printf ("(unknown virtuality)"); break;
8015 case DW_AT_identifier_case:
8018 case DW_ID_case_sensitive: printf ("(case_sensitive)"); break;
8019 case DW_ID_up_case: printf ("(up_case)"); break;
8020 case DW_ID_down_case: printf ("(down_case)"); break;
8021 case DW_ID_case_insensitive: printf ("(case_insensitive)"); break;
8022 default: printf ("(unknown case)"); break;
8026 case DW_AT_calling_convention:
8029 case DW_CC_normal: printf ("(normal)"); break;
8030 case DW_CC_program: printf ("(program)"); break;
8031 case DW_CC_nocall: printf ("(nocall)"); break;
8033 if (uvalue >= DW_CC_lo_user
8034 && uvalue <= DW_CC_hi_user)
8035 printf ("(user defined)");
8037 printf ("(unknown convention)");
8041 case DW_AT_ordering:
8044 case -1: printf ("(undefined)"); break;
8045 case 0: printf ("(row major)"); break;
8046 case 1: printf ("(column major)"); break;
8050 case DW_AT_frame_base:
8051 case DW_AT_location:
8052 case DW_AT_data_member_location:
8053 case DW_AT_vtable_elem_location:
8054 case DW_AT_allocated:
8055 case DW_AT_associated:
8056 case DW_AT_data_location:
8058 case DW_AT_upper_bound:
8059 case DW_AT_lower_bound:
8063 decode_location_expression (block_start, pointer_size, uvalue);
8066 else if (form == DW_FORM_data4)
8069 printf ("location list");
8081 static unsigned char *
8082 read_and_display_attr (attribute, form, data, cu_offset, pointer_size)
8083 unsigned long attribute;
8085 unsigned char *data;
8086 unsigned long cu_offset;
8087 unsigned long pointer_size;
8089 printf (" %-18s:", get_AT_name (attribute));
8090 data = read_and_display_attr_value (attribute, form, data, cu_offset,
8097 display_debug_info (section, start, file)
8098 Elf_Internal_Shdr *section;
8099 unsigned char *start;
8102 unsigned char *end = start + section->sh_size;
8103 unsigned char *section_begin = start;
8105 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8107 load_debug_str (file);
8108 load_debug_loc (file);
8112 DWARF2_External_CompUnit *external;
8113 DWARF2_Internal_CompUnit compunit;
8114 Elf_Internal_Shdr *relsec;
8115 unsigned char *tags;
8118 unsigned long cu_offset;
8120 external = (DWARF2_External_CompUnit *) start;
8122 compunit.cu_length = BYTE_GET (external->cu_length);
8123 compunit.cu_version = BYTE_GET (external->cu_version);
8124 compunit.cu_abbrev_offset = BYTE_GET (external->cu_abbrev_offset);
8125 compunit.cu_pointer_size = BYTE_GET (external->cu_pointer_size);
8127 if (compunit.cu_length == 0xffffffff)
8129 warn (_("64-bit DWARF debug info is not supported yet.\n"));
8133 /* Check for RELA relocations in the
8134 abbrev_offset address, and apply them. */
8135 for (relsec = section_headers;
8136 relsec < section_headers + elf_header.e_shnum;
8139 unsigned long nrelas;
8140 Elf_Internal_Rela *rela, *rp;
8141 Elf_Internal_Shdr *symsec;
8142 Elf_Internal_Sym *symtab;
8143 Elf_Internal_Sym *sym;
8145 if (relsec->sh_type != SHT_RELA
8146 || SECTION_HEADER (relsec->sh_info) != section
8147 || relsec->sh_size == 0)
8150 if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
8154 symsec = SECTION_HEADER (relsec->sh_link);
8155 symtab = GET_ELF_SYMBOLS (file, symsec);
8157 for (rp = rela; rp < rela + nrelas; ++rp)
8160 != (bfd_vma) ((unsigned char *) &external->cu_abbrev_offset
8166 sym = symtab + ELF32_R_SYM (rp->r_info);
8168 if (ELF32_R_SYM (rp->r_info) != 0
8169 && ELF32_ST_TYPE (sym->st_info) != STT_SECTION)
8171 warn (_("Skipping unexpected symbol type %u\n"),
8172 ELF32_ST_TYPE (sym->st_info));
8178 sym = symtab + ELF64_R_SYM (rp->r_info);
8180 if (ELF64_R_SYM (rp->r_info) != 0
8181 && ELF64_ST_TYPE (sym->st_info) != STT_SECTION)
8183 warn (_("Skipping unexpected symbol type %u\n"),
8184 ELF64_ST_TYPE (sym->st_info));
8189 compunit.cu_abbrev_offset = rp->r_addend;
8197 tags = start + sizeof (*external);
8198 cu_offset = start - section_begin;
8199 start += compunit.cu_length + sizeof (external->cu_length);
8201 printf (_(" Compilation Unit @ %lx:\n"), cu_offset);
8202 printf (_(" Length: %ld\n"), compunit.cu_length);
8203 printf (_(" Version: %d\n"), compunit.cu_version);
8204 printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
8205 printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
8207 if (compunit.cu_version != 2)
8209 warn (_("Only version 2 DWARF debug information is currently supported.\n"));
8215 /* Read in the abbrevs used by this compilation unit. */
8217 Elf_Internal_Shdr *sec;
8218 unsigned char *begin;
8220 /* Locate the .debug_abbrev section and process it. */
8221 for (i = 0, sec = section_headers;
8222 i < elf_header.e_shnum;
8224 if (strcmp (SECTION_NAME (sec), ".debug_abbrev") == 0)
8227 if (i == elf_header.e_shnum || sec->sh_size == 0)
8229 warn (_("Unable to locate .debug_abbrev section!\n"));
8233 begin = ((unsigned char *)
8234 get_data (NULL, file, sec->sh_offset, sec->sh_size,
8235 _("debug_abbrev section data")));
8239 process_abbrev_section (begin + compunit.cu_abbrev_offset,
8240 begin + sec->sh_size);
8246 while (tags < start)
8249 unsigned long abbrev_number;
8250 abbrev_entry *entry;
8253 abbrev_number = read_leb128 (tags, & bytes_read, 0);
8256 /* A null DIE marks the end of a list of children. */
8257 if (abbrev_number == 0)
8263 /* Scan through the abbreviation list until we reach the
8265 for (entry = first_abbrev;
8266 entry && entry->entry != abbrev_number;
8267 entry = entry->next)
8272 warn (_("Unable to locate entry %lu in the abbreviation table\n"),
8277 printf (_(" <%d><%lx>: Abbrev Number: %lu (%s)\n"),
8279 (unsigned long) (tags - section_begin - bytes_read),
8281 get_TAG_name (entry->tag));
8283 for (attr = entry->first_attr; attr; attr = attr->next)
8284 tags = read_and_display_attr (attr->attribute,
8287 compunit.cu_pointer_size);
8289 if (entry->children)
8303 display_debug_aranges (section, start, file)
8304 Elf_Internal_Shdr *section;
8305 unsigned char *start;
8306 FILE *file ATTRIBUTE_UNUSED;
8308 unsigned char *end = start + section->sh_size;
8310 printf (_("The section %s contains:\n\n"), SECTION_NAME (section));
8314 DWARF2_External_ARange *external;
8315 DWARF2_Internal_ARange arange;
8316 unsigned char *ranges;
8317 unsigned long length;
8318 unsigned long address;
8321 external = (DWARF2_External_ARange *) start;
8323 arange.ar_length = BYTE_GET (external->ar_length);
8324 arange.ar_version = BYTE_GET (external->ar_version);
8325 arange.ar_info_offset = BYTE_GET (external->ar_info_offset);
8326 arange.ar_pointer_size = BYTE_GET (external->ar_pointer_size);
8327 arange.ar_segment_size = BYTE_GET (external->ar_segment_size);
8329 if (arange.ar_length == 0xffffffff)
8331 warn (_("64-bit DWARF aranges are not supported yet.\n"));
8335 if (arange.ar_version != 2)
8337 warn (_("Only DWARF 2 aranges are currently supported.\n"));
8341 printf (_(" Length: %ld\n"), arange.ar_length);
8342 printf (_(" Version: %d\n"), arange.ar_version);
8343 printf (_(" Offset into .debug_info: %lx\n"), arange.ar_info_offset);
8344 printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
8345 printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
8347 printf (_("\n Address Length\n"));
8349 ranges = start + sizeof (*external);
8351 /* Must pad to an alignment boundary that is twice the pointer size. */
8352 excess = sizeof (*external) % (2 * arange.ar_pointer_size);
8354 ranges += (2 * arange.ar_pointer_size) - excess;
8358 address = byte_get (ranges, arange.ar_pointer_size);
8360 ranges += arange.ar_pointer_size;
8362 length = byte_get (ranges, arange.ar_pointer_size);
8364 ranges += arange.ar_pointer_size;
8366 /* A pair of zeros marks the end of the list. */
8367 if (address == 0 && length == 0)
8370 printf (" %8.8lx %lu\n", address, length);
8373 start += arange.ar_length + sizeof (external->ar_length);
8381 typedef struct Frame_Chunk
8383 struct Frame_Chunk *next;
8384 unsigned char *chunk_start;
8386 /* DW_CFA_{undefined,same_value,offset,register,unreferenced} */
8387 short int *col_type;
8390 unsigned int code_factor;
8392 unsigned long pc_begin;
8393 unsigned long pc_range;
8397 unsigned char fde_encoding;
8401 /* A marker for a col_type that means this column was never referenced
8402 in the frame info. */
8403 #define DW_CFA_unreferenced (-1)
8405 static void frame_need_space PARAMS ((Frame_Chunk *, int));
8406 static void frame_display_row PARAMS ((Frame_Chunk *, int *, int *));
8407 static int size_of_encoded_value PARAMS ((int));
8410 frame_need_space (fc, reg)
8414 int prev = fc->ncols;
8416 if (reg < fc->ncols)
8419 fc->ncols = reg + 1;
8420 fc->col_type = (short int *) xrealloc (fc->col_type,
8421 fc->ncols * sizeof (short int));
8422 fc->col_offset = (int *) xrealloc (fc->col_offset,
8423 fc->ncols * sizeof (int));
8425 while (prev < fc->ncols)
8427 fc->col_type[prev] = DW_CFA_unreferenced;
8428 fc->col_offset[prev] = 0;
8434 frame_display_row (fc, need_col_headers, max_regs)
8436 int *need_col_headers;
8442 if (*max_regs < fc->ncols)
8443 *max_regs = fc->ncols;
8445 if (*need_col_headers)
8447 *need_col_headers = 0;
8449 printf (" LOC CFA ");
8451 for (r = 0; r < *max_regs; r++)
8452 if (fc->col_type[r] != DW_CFA_unreferenced)
8457 printf ("r%-4d", r);
8463 printf ("%08lx ", fc->pc_begin);
8464 sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
8465 printf ("%-8s ", tmp);
8467 for (r = 0; r < fc->ncols; r++)
8469 if (fc->col_type[r] != DW_CFA_unreferenced)
8471 switch (fc->col_type[r])
8473 case DW_CFA_undefined:
8476 case DW_CFA_same_value:
8480 sprintf (tmp, "c%+d", fc->col_offset[r]);
8482 case DW_CFA_register:
8483 sprintf (tmp, "r%d", fc->col_offset[r]);
8486 strcpy (tmp, "n/a");
8489 printf ("%-5s", tmp);
8496 size_of_encoded_value (encoding)
8499 switch (encoding & 0x7)
8502 case 0: return is_32bit_elf ? 4 : 8;
8509 #define GET(N) byte_get (start, N); start += N
8510 #define LEB() read_leb128 (start, & length_return, 0); start += length_return
8511 #define SLEB() read_leb128 (start, & length_return, 1); start += length_return
8514 display_debug_frames (section, start, file)
8515 Elf_Internal_Shdr *section;
8516 unsigned char *start;
8517 FILE *file ATTRIBUTE_UNUSED;
8519 unsigned char *end = start + section->sh_size;
8520 unsigned char *section_start = start;
8521 Frame_Chunk *chunks = 0;
8522 Frame_Chunk *remembered_state = 0;
8524 int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
8527 int addr_size = is_32bit_elf ? 4 : 8;
8529 printf (_("The section %s contains:\n"), SECTION_NAME (section));
8533 unsigned char *saved_start;
8534 unsigned char *block_end;
8535 unsigned long length;
8536 unsigned long cie_id;
8539 int need_col_headers = 1;
8540 unsigned char *augmentation_data = NULL;
8541 unsigned long augmentation_data_len = 0;
8542 int encoded_ptr_size = addr_size;
8544 saved_start = start;
8545 length = byte_get (start, 4); start += 4;
8549 printf ("\n%08lx ZERO terminator\n\n",
8550 (unsigned long)(saved_start - section_start));
8554 if (length == 0xffffffff)
8556 warn (_("64-bit DWARF format frames are not supported yet.\n"));
8560 block_end = saved_start + length + 4;
8561 cie_id = byte_get (start, 4); start += 4;
8563 if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
8567 fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8568 memset (fc, 0, sizeof (Frame_Chunk));
8572 fc->chunk_start = saved_start;
8574 fc->col_type = (short int *) xmalloc (sizeof (short int));
8575 fc->col_offset = (int *) xmalloc (sizeof (int));
8576 frame_need_space (fc, max_regs-1);
8580 fc->augmentation = start;
8581 start = strchr (start, '\0') + 1;
8583 if (fc->augmentation[0] == 'z')
8585 fc->code_factor = LEB ();
8586 fc->data_factor = SLEB ();
8587 fc->ra = byte_get (start, 1); start += 1;
8588 augmentation_data_len = LEB ();
8589 augmentation_data = start;
8590 start += augmentation_data_len;
8592 else if (strcmp (fc->augmentation, "eh") == 0)
8595 fc->code_factor = LEB ();
8596 fc->data_factor = SLEB ();
8597 fc->ra = byte_get (start, 1); start += 1;
8601 fc->code_factor = LEB ();
8602 fc->data_factor = SLEB ();
8603 fc->ra = byte_get (start, 1); start += 1;
8607 if (do_debug_frames_interp)
8608 printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
8609 (unsigned long)(saved_start - section_start), length, cie_id,
8610 fc->augmentation, fc->code_factor, fc->data_factor,
8614 printf ("\n%08lx %08lx %08lx CIE\n",
8615 (unsigned long)(saved_start - section_start), length, cie_id);
8616 printf (" Version: %d\n", version);
8617 printf (" Augmentation: \"%s\"\n", fc->augmentation);
8618 printf (" Code alignment factor: %u\n", fc->code_factor);
8619 printf (" Data alignment factor: %d\n", fc->data_factor);
8620 printf (" Return address column: %d\n", fc->ra);
8622 if (augmentation_data_len)
8625 printf (" Augmentation data: ");
8626 for (i = 0; i < augmentation_data_len; ++i)
8627 printf (" %02x", augmentation_data[i]);
8633 if (augmentation_data_len)
8635 unsigned char *p, *q;
8636 p = fc->augmentation + 1;
8637 q = augmentation_data;
8644 q += 1 + size_of_encoded_value (*q);
8646 fc->fde_encoding = *q++;
8652 if (fc->fde_encoding)
8653 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8656 frame_need_space (fc, fc->ra);
8660 unsigned char *look_for;
8661 static Frame_Chunk fde_fc;
8664 memset (fc, 0, sizeof (Frame_Chunk));
8666 look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
8668 for (cie = chunks; cie ; cie = cie->next)
8669 if (cie->chunk_start == look_for)
8674 warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
8675 cie_id, saved_start);
8678 fc->col_type = (short int *) xmalloc (sizeof (short int));
8679 fc->col_offset = (int *) xmalloc (sizeof (int));
8680 frame_need_space (fc, max_regs - 1);
8682 fc->augmentation = "";
8683 fc->fde_encoding = 0;
8687 fc->ncols = cie->ncols;
8688 fc->col_type = (short int *) xmalloc (fc->ncols * sizeof (short int));
8689 fc->col_offset = (int *) xmalloc (fc->ncols * sizeof (int));
8690 memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
8691 memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
8692 fc->augmentation = cie->augmentation;
8693 fc->code_factor = cie->code_factor;
8694 fc->data_factor = cie->data_factor;
8695 fc->cfa_reg = cie->cfa_reg;
8696 fc->cfa_offset = cie->cfa_offset;
8698 frame_need_space (fc, max_regs-1);
8699 fc->fde_encoding = cie->fde_encoding;
8702 if (fc->fde_encoding)
8703 encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
8705 fc->pc_begin = byte_get (start, encoded_ptr_size);
8706 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8707 fc->pc_begin += section->sh_addr + (start - section_start);
8708 start += encoded_ptr_size;
8709 fc->pc_range = byte_get (start, encoded_ptr_size);
8710 start += encoded_ptr_size;
8712 if (cie->augmentation[0] == 'z')
8714 augmentation_data_len = LEB ();
8715 augmentation_data = start;
8716 start += augmentation_data_len;
8719 printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
8720 (unsigned long)(saved_start - section_start), length, cie_id,
8721 (unsigned long)(cie->chunk_start - section_start),
8722 fc->pc_begin, fc->pc_begin + fc->pc_range);
8723 if (! do_debug_frames_interp && augmentation_data_len)
8726 printf (" Augmentation data: ");
8727 for (i = 0; i < augmentation_data_len; ++i)
8728 printf (" %02x", augmentation_data[i]);
8734 /* At this point, fc is the current chunk, cie (if any) is set, and we're
8735 about to interpret instructions for the chunk. */
8737 if (do_debug_frames_interp)
8739 /* Start by making a pass over the chunk, allocating storage
8740 and taking note of what registers are used. */
8741 unsigned char *tmp = start;
8743 while (start < block_end)
8753 /* Warning: if you add any more cases to this switch, be
8754 sure to add them to the corresponding switch below. */
8757 case DW_CFA_advance_loc:
8761 frame_need_space (fc, opa);
8762 fc->col_type[opa] = DW_CFA_undefined;
8764 case DW_CFA_restore:
8765 frame_need_space (fc, opa);
8766 fc->col_type[opa] = DW_CFA_undefined;
8768 case DW_CFA_set_loc:
8769 start += encoded_ptr_size;
8771 case DW_CFA_advance_loc1:
8774 case DW_CFA_advance_loc2:
8777 case DW_CFA_advance_loc4:
8780 case DW_CFA_offset_extended:
8781 reg = LEB (); LEB ();
8782 frame_need_space (fc, reg);
8783 fc->col_type[reg] = DW_CFA_undefined;
8785 case DW_CFA_restore_extended:
8787 frame_need_space (fc, reg);
8788 fc->col_type[reg] = DW_CFA_undefined;
8790 case DW_CFA_undefined:
8792 frame_need_space (fc, reg);
8793 fc->col_type[reg] = DW_CFA_undefined;
8795 case DW_CFA_same_value:
8797 frame_need_space (fc, reg);
8798 fc->col_type[reg] = DW_CFA_undefined;
8800 case DW_CFA_register:
8801 reg = LEB (); LEB ();
8802 frame_need_space (fc, reg);
8803 fc->col_type[reg] = DW_CFA_undefined;
8805 case DW_CFA_def_cfa:
8808 case DW_CFA_def_cfa_register:
8811 case DW_CFA_def_cfa_offset:
8814 case DW_CFA_offset_extended_sf:
8815 reg = LEB (); SLEB ();
8816 frame_need_space (fc, reg);
8817 fc->col_type[reg] = DW_CFA_undefined;
8819 case DW_CFA_def_cfa_sf:
8822 case DW_CFA_def_cfa_offset_sf:
8825 case DW_CFA_GNU_args_size:
8828 case DW_CFA_GNU_negative_offset_extended:
8829 reg = LEB (); LEB ();
8830 frame_need_space (fc, reg);
8831 fc->col_type[reg] = DW_CFA_undefined;
8840 /* Now we know what registers are used, make a second pass over
8841 the chunk, this time actually printing out the info. */
8843 while (start < block_end)
8846 unsigned long ul, reg, roffs;
8855 /* Warning: if you add any more cases to this switch, be
8856 sure to add them to the corresponding switch above. */
8859 case DW_CFA_advance_loc:
8860 if (do_debug_frames_interp)
8861 frame_display_row (fc, &need_col_headers, &max_regs);
8863 printf (" DW_CFA_advance_loc: %d to %08lx\n",
8864 opa * fc->code_factor,
8865 fc->pc_begin + opa * fc->code_factor);
8866 fc->pc_begin += opa * fc->code_factor;
8871 if (! do_debug_frames_interp)
8872 printf (" DW_CFA_offset: r%d at cfa%+ld\n",
8873 opa, roffs * fc->data_factor);
8874 fc->col_type[opa] = DW_CFA_offset;
8875 fc->col_offset[opa] = roffs * fc->data_factor;
8878 case DW_CFA_restore:
8879 if (! do_debug_frames_interp)
8880 printf (" DW_CFA_restore: r%d\n", opa);
8881 fc->col_type[opa] = cie->col_type[opa];
8882 fc->col_offset[opa] = cie->col_offset[opa];
8885 case DW_CFA_set_loc:
8886 vma = byte_get (start, encoded_ptr_size);
8887 if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
8888 vma += section->sh_addr + (start - section_start);
8889 start += encoded_ptr_size;
8890 if (do_debug_frames_interp)
8891 frame_display_row (fc, &need_col_headers, &max_regs);
8893 printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
8897 case DW_CFA_advance_loc1:
8898 ofs = byte_get (start, 1); start += 1;
8899 if (do_debug_frames_interp)
8900 frame_display_row (fc, &need_col_headers, &max_regs);
8902 printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
8903 ofs * fc->code_factor,
8904 fc->pc_begin + ofs * fc->code_factor);
8905 fc->pc_begin += ofs * fc->code_factor;
8908 case DW_CFA_advance_loc2:
8909 ofs = byte_get (start, 2); start += 2;
8910 if (do_debug_frames_interp)
8911 frame_display_row (fc, &need_col_headers, &max_regs);
8913 printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
8914 ofs * fc->code_factor,
8915 fc->pc_begin + ofs * fc->code_factor);
8916 fc->pc_begin += ofs * fc->code_factor;
8919 case DW_CFA_advance_loc4:
8920 ofs = byte_get (start, 4); start += 4;
8921 if (do_debug_frames_interp)
8922 frame_display_row (fc, &need_col_headers, &max_regs);
8924 printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
8925 ofs * fc->code_factor,
8926 fc->pc_begin + ofs * fc->code_factor);
8927 fc->pc_begin += ofs * fc->code_factor;
8930 case DW_CFA_offset_extended:
8933 if (! do_debug_frames_interp)
8934 printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
8935 reg, roffs * fc->data_factor);
8936 fc->col_type[reg] = DW_CFA_offset;
8937 fc->col_offset[reg] = roffs * fc->data_factor;
8940 case DW_CFA_restore_extended:
8942 if (! do_debug_frames_interp)
8943 printf (" DW_CFA_restore_extended: r%ld\n", reg);
8944 fc->col_type[reg] = cie->col_type[reg];
8945 fc->col_offset[reg] = cie->col_offset[reg];
8948 case DW_CFA_undefined:
8950 if (! do_debug_frames_interp)
8951 printf (" DW_CFA_undefined: r%ld\n", reg);
8952 fc->col_type[reg] = DW_CFA_undefined;
8953 fc->col_offset[reg] = 0;
8956 case DW_CFA_same_value:
8958 if (! do_debug_frames_interp)
8959 printf (" DW_CFA_same_value: r%ld\n", reg);
8960 fc->col_type[reg] = DW_CFA_same_value;
8961 fc->col_offset[reg] = 0;
8964 case DW_CFA_register:
8967 if (! do_debug_frames_interp)
8968 printf (" DW_CFA_register: r%ld\n", reg);
8969 fc->col_type[reg] = DW_CFA_register;
8970 fc->col_offset[reg] = roffs;
8973 case DW_CFA_remember_state:
8974 if (! do_debug_frames_interp)
8975 printf (" DW_CFA_remember_state\n");
8976 rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
8977 rs->ncols = fc->ncols;
8978 rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
8979 rs->col_offset = (int *) xmalloc (rs->ncols * sizeof (int));
8980 memcpy (rs->col_type, fc->col_type, rs->ncols);
8981 memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
8982 rs->next = remembered_state;
8983 remembered_state = rs;
8986 case DW_CFA_restore_state:
8987 if (! do_debug_frames_interp)
8988 printf (" DW_CFA_restore_state\n");
8989 rs = remembered_state;
8990 remembered_state = rs->next;
8991 frame_need_space (fc, rs->ncols-1);
8992 memcpy (fc->col_type, rs->col_type, rs->ncols);
8993 memcpy (fc->col_offset, rs->col_offset, rs->ncols * sizeof (int));
8994 free (rs->col_type);
8995 free (rs->col_offset);
8999 case DW_CFA_def_cfa:
9000 fc->cfa_reg = LEB ();
9001 fc->cfa_offset = LEB ();
9002 if (! do_debug_frames_interp)
9003 printf (" DW_CFA_def_cfa: r%d ofs %d\n",
9004 fc->cfa_reg, fc->cfa_offset);
9007 case DW_CFA_def_cfa_register:
9008 fc->cfa_reg = LEB ();
9009 if (! do_debug_frames_interp)
9010 printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
9013 case DW_CFA_def_cfa_offset:
9014 fc->cfa_offset = LEB ();
9015 if (! do_debug_frames_interp)
9016 printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
9020 if (! do_debug_frames_interp)
9021 printf (" DW_CFA_nop\n");
9024 case DW_CFA_offset_extended_sf:
9027 frame_need_space (fc, reg);
9028 if (! do_debug_frames_interp)
9029 printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
9030 reg, l * fc->data_factor);
9031 fc->col_type[reg] = DW_CFA_offset;
9032 fc->col_offset[reg] = l * fc->data_factor;
9035 case DW_CFA_def_cfa_sf:
9036 fc->cfa_reg = LEB ();
9037 fc->cfa_offset = SLEB ();
9038 if (! do_debug_frames_interp)
9039 printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
9040 fc->cfa_reg, fc->cfa_offset);
9043 case DW_CFA_def_cfa_offset_sf:
9044 fc->cfa_offset = SLEB ();
9045 if (! do_debug_frames_interp)
9046 printf (" DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
9049 case DW_CFA_GNU_window_save:
9050 if (! do_debug_frames_interp)
9051 printf (" DW_CFA_GNU_window_save\n");
9054 case DW_CFA_GNU_args_size:
9056 if (! do_debug_frames_interp)
9057 printf (" DW_CFA_GNU_args_size: %ld\n", ul);
9060 case DW_CFA_GNU_negative_offset_extended:
9063 frame_need_space (fc, reg);
9064 if (! do_debug_frames_interp)
9065 printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
9066 reg, l * fc->data_factor);
9067 fc->col_type[reg] = DW_CFA_offset;
9068 fc->col_offset[reg] = l * fc->data_factor;
9071 /* FIXME: How do we handle these? */
9072 case DW_CFA_def_cfa_expression:
9073 fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
9077 case DW_CFA_expression:
9078 fprintf (stderr, "unsupported DW_CFA_expression\n");
9083 fprintf (stderr, "unsupported or unknown DW_CFA_%d\n", op);
9088 if (do_debug_frames_interp)
9089 frame_display_row (fc, &need_col_headers, &max_regs);
9104 display_debug_not_supported (section, start, file)
9105 Elf_Internal_Shdr *section;
9106 unsigned char *start ATTRIBUTE_UNUSED;
9107 FILE *file ATTRIBUTE_UNUSED;
9109 printf (_("Displaying the debug contents of section %s is not yet supported.\n"),
9110 SECTION_NAME (section));
9115 /* Pre-scan the .debug_info section to record the size of address.
9116 When dumping the .debug_line, we use that size information, assuming
9117 that all compilation units have the same address size. */
9119 prescan_debug_info (section, start, file)
9120 Elf_Internal_Shdr *section ATTRIBUTE_UNUSED;
9121 unsigned char *start;
9122 FILE *file ATTRIBUTE_UNUSED;
9124 DWARF2_External_CompUnit *external;
9126 external = (DWARF2_External_CompUnit *) start;
9128 debug_line_pointer_size = BYTE_GET (external->cu_pointer_size);
9132 /* A structure containing the name of a debug section and a pointer
9133 to a function that can decode it. The third field is a prescan
9134 function to be run over the section before displaying any of the
9138 const char *const name;
9139 int (*display) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9140 int (*prescan) PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *));
9144 { ".debug_abbrev", display_debug_abbrev, NULL },
9145 { ".debug_aranges", display_debug_aranges, NULL },
9146 { ".debug_frame", display_debug_frames, NULL },
9147 { ".debug_info", display_debug_info, prescan_debug_info },
9148 { ".debug_line", display_debug_lines, NULL },
9149 { ".debug_pubnames", display_debug_pubnames, NULL },
9150 { ".eh_frame", display_debug_frames, NULL },
9151 { ".debug_macinfo", display_debug_macinfo, NULL },
9152 { ".debug_str", display_debug_str, NULL },
9153 { ".debug_loc", display_debug_loc, NULL },
9154 { ".debug_pubtypes", display_debug_not_supported, NULL },
9155 { ".debug_ranges", display_debug_not_supported, NULL },
9156 { ".debug_static_func", display_debug_not_supported, NULL },
9157 { ".debug_static_vars", display_debug_not_supported, NULL },
9158 { ".debug_types", display_debug_not_supported, NULL },
9159 { ".debug_weaknames", display_debug_not_supported, NULL }
9163 display_debug_section (section, file)
9164 Elf_Internal_Shdr *section;
9167 char *name = SECTION_NAME (section);
9168 bfd_size_type length;
9169 unsigned char *start;
9172 length = section->sh_size;
9175 printf (_("\nSection '%s' has no debugging data.\n"), name);
9179 start = (unsigned char *) get_data (NULL, file, section->sh_offset, length,
9180 _("debug section data"));
9184 /* See if we know how to display the contents of this section. */
9185 if (strncmp (name, ".gnu.linkonce.wi.", 17) == 0)
9186 name = ".debug_info";
9188 for (i = NUM_ELEM (debug_displays); i--;)
9189 if (strcmp (debug_displays[i].name, name) == 0)
9191 debug_displays[i].display (section, start, file);
9196 printf (_("Unrecognized debug section: %s\n"), name);
9200 /* If we loaded in the abbrev section at some point,
9201 we must release it here. */
9208 process_section_contents (file)
9211 Elf_Internal_Shdr *section;
9217 /* Pre-scan the debug sections to find some debug information not
9218 present in some of them. For the .debug_line, we must find out the
9219 size of address (specified in .debug_info and .debug_aranges). */
9220 for (i = 0, section = section_headers;
9221 i < elf_header.e_shnum && i < num_dump_sects;
9224 char *name = SECTION_NAME (section);
9227 if (section->sh_size == 0)
9230 /* See if there is some pre-scan operation for this section. */
9231 for (j = NUM_ELEM (debug_displays); j--;)
9232 if (strcmp (debug_displays[j].name, name) == 0)
9234 if (debug_displays[j].prescan != NULL)
9236 bfd_size_type length;
9237 unsigned char *start;
9239 length = section->sh_size;
9240 start = ((unsigned char *)
9241 get_data (NULL, file, section->sh_offset, length,
9242 _("debug section data")));
9246 debug_displays[j].prescan (section, start, file);
9254 for (i = 0, section = section_headers;
9255 i < elf_header.e_shnum && i < num_dump_sects;
9258 #ifdef SUPPORT_DISASSEMBLY
9259 if (dump_sects[i] & DISASS_DUMP)
9260 disassemble_section (section, file);
9262 if (dump_sects[i] & HEX_DUMP)
9263 dump_section (section, file);
9265 if (dump_sects[i] & DEBUG_DUMP)
9266 display_debug_section (section, file);
9269 if (i < num_dump_sects)
9270 warn (_("Some sections were not dumped because they do not exist!\n"));
9276 process_mips_fpe_exception (mask)
9282 if (mask & OEX_FPU_INEX)
9283 fputs ("INEX", stdout), first = 0;
9284 if (mask & OEX_FPU_UFLO)
9285 printf ("%sUFLO", first ? "" : "|"), first = 0;
9286 if (mask & OEX_FPU_OFLO)
9287 printf ("%sOFLO", first ? "" : "|"), first = 0;
9288 if (mask & OEX_FPU_DIV0)
9289 printf ("%sDIV0", first ? "" : "|"), first = 0;
9290 if (mask & OEX_FPU_INVAL)
9291 printf ("%sINVAL", first ? "" : "|");
9294 fputs ("0", stdout);
9298 process_mips_specific (file)
9301 Elf_Internal_Dyn *entry;
9302 size_t liblist_offset = 0;
9303 size_t liblistno = 0;
9304 size_t conflictsno = 0;
9305 size_t options_offset = 0;
9306 size_t conflicts_offset = 0;
9308 /* We have a lot of special sections. Thanks SGI! */
9309 if (dynamic_segment == NULL)
9310 /* No information available. */
9313 for (entry = dynamic_segment; entry->d_tag != DT_NULL; ++entry)
9314 switch (entry->d_tag)
9316 case DT_MIPS_LIBLIST:
9317 liblist_offset = entry->d_un.d_val - loadaddr;
9319 case DT_MIPS_LIBLISTNO:
9320 liblistno = entry->d_un.d_val;
9322 case DT_MIPS_OPTIONS:
9323 options_offset = entry->d_un.d_val - loadaddr;
9325 case DT_MIPS_CONFLICT:
9326 conflicts_offset = entry->d_un.d_val - loadaddr;
9328 case DT_MIPS_CONFLICTNO:
9329 conflictsno = entry->d_un.d_val;
9335 if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
9337 Elf32_External_Lib *elib;
9340 elib = ((Elf32_External_Lib *)
9341 get_data (NULL, file, liblist_offset,
9342 liblistno * sizeof (Elf32_External_Lib),
9346 printf ("\nSection '.liblist' contains %lu entries:\n",
9347 (unsigned long) liblistno);
9348 fputs (" Library Time Stamp Checksum Version Flags\n",
9351 for (cnt = 0; cnt < liblistno; ++cnt)
9358 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9359 time = BYTE_GET (elib[cnt].l_time_stamp);
9360 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9361 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9362 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9364 tmp = gmtime (&time);
9365 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9366 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9367 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9369 printf ("%3lu: ", (unsigned long) cnt);
9370 print_symbol (20, dynamic_strings + liblist.l_name);
9371 printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
9374 if (liblist.l_flags == 0)
9385 { " EXACT_MATCH", LL_EXACT_MATCH },
9386 { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
9387 { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
9388 { " EXPORTS", LL_EXPORTS },
9389 { " DELAY_LOAD", LL_DELAY_LOAD },
9390 { " DELTA", LL_DELTA }
9392 int flags = liblist.l_flags;
9396 fcnt < sizeof (l_flags_vals) / sizeof (l_flags_vals[0]);
9398 if ((flags & l_flags_vals[fcnt].bit) != 0)
9400 fputs (l_flags_vals[fcnt].name, stdout);
9401 flags ^= l_flags_vals[fcnt].bit;
9404 printf (" %#x", (unsigned int) flags);
9414 if (options_offset != 0)
9416 Elf_External_Options *eopt;
9417 Elf_Internal_Shdr *sect = section_headers;
9418 Elf_Internal_Options *iopt;
9419 Elf_Internal_Options *option;
9423 /* Find the section header so that we get the size. */
9424 while (sect->sh_type != SHT_MIPS_OPTIONS)
9427 eopt = (Elf_External_Options *) get_data (NULL, file, options_offset,
9428 sect->sh_size, _("options"));
9431 iopt = ((Elf_Internal_Options *)
9432 malloc ((sect->sh_size / sizeof (eopt)) * sizeof (*iopt)));
9435 error (_("Out of memory"));
9442 while (offset < sect->sh_size)
9444 Elf_External_Options *eoption;
9446 eoption = (Elf_External_Options *) ((char *) eopt + offset);
9448 option->kind = BYTE_GET (eoption->kind);
9449 option->size = BYTE_GET (eoption->size);
9450 option->section = BYTE_GET (eoption->section);
9451 option->info = BYTE_GET (eoption->info);
9453 offset += option->size;
9459 printf (_("\nSection '%s' contains %d entries:\n"),
9460 SECTION_NAME (sect), cnt);
9468 switch (option->kind)
9471 /* This shouldn't happen. */
9472 printf (" NULL %d %lx", option->section, option->info);
9475 printf (" REGINFO ");
9476 if (elf_header.e_machine == EM_MIPS)
9479 Elf32_External_RegInfo *ereg;
9480 Elf32_RegInfo reginfo;
9482 ereg = (Elf32_External_RegInfo *) (option + 1);
9483 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9484 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9485 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9486 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9487 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9488 reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
9490 printf ("GPR %08lx GP 0x%lx\n",
9492 (unsigned long) reginfo.ri_gp_value);
9493 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9494 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9495 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9500 Elf64_External_RegInfo *ereg;
9501 Elf64_Internal_RegInfo reginfo;
9503 ereg = (Elf64_External_RegInfo *) (option + 1);
9504 reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
9505 reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
9506 reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
9507 reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
9508 reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
9509 reginfo.ri_gp_value = BYTE_GET8 (ereg->ri_gp_value);
9511 printf ("GPR %08lx GP 0x",
9512 reginfo.ri_gprmask);
9513 printf_vma (reginfo.ri_gp_value);
9516 printf (" CPR0 %08lx CPR1 %08lx CPR2 %08lx CPR3 %08lx\n",
9517 reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
9518 reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
9522 case ODK_EXCEPTIONS:
9523 fputs (" EXCEPTIONS fpe_min(", stdout);
9524 process_mips_fpe_exception (option->info & OEX_FPU_MIN);
9525 fputs (") fpe_max(", stdout);
9526 process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
9527 fputs (")", stdout);
9529 if (option->info & OEX_PAGE0)
9530 fputs (" PAGE0", stdout);
9531 if (option->info & OEX_SMM)
9532 fputs (" SMM", stdout);
9533 if (option->info & OEX_FPDBUG)
9534 fputs (" FPDBUG", stdout);
9535 if (option->info & OEX_DISMISS)
9536 fputs (" DISMISS", stdout);
9539 fputs (" PAD ", stdout);
9540 if (option->info & OPAD_PREFIX)
9541 fputs (" PREFIX", stdout);
9542 if (option->info & OPAD_POSTFIX)
9543 fputs (" POSTFIX", stdout);
9544 if (option->info & OPAD_SYMBOL)
9545 fputs (" SYMBOL", stdout);
9548 fputs (" HWPATCH ", stdout);
9549 if (option->info & OHW_R4KEOP)
9550 fputs (" R4KEOP", stdout);
9551 if (option->info & OHW_R8KPFETCH)
9552 fputs (" R8KPFETCH", stdout);
9553 if (option->info & OHW_R5KEOP)
9554 fputs (" R5KEOP", stdout);
9555 if (option->info & OHW_R5KCVTL)
9556 fputs (" R5KCVTL", stdout);
9559 fputs (" FILL ", stdout);
9560 /* XXX Print content of info word? */
9563 fputs (" TAGS ", stdout);
9564 /* XXX Print content of info word? */
9567 fputs (" HWAND ", stdout);
9568 if (option->info & OHWA0_R4KEOP_CHECKED)
9569 fputs (" R4KEOP_CHECKED", stdout);
9570 if (option->info & OHWA0_R4KEOP_CLEAN)
9571 fputs (" R4KEOP_CLEAN", stdout);
9574 fputs (" HWOR ", stdout);
9575 if (option->info & OHWA0_R4KEOP_CHECKED)
9576 fputs (" R4KEOP_CHECKED", stdout);
9577 if (option->info & OHWA0_R4KEOP_CLEAN)
9578 fputs (" R4KEOP_CLEAN", stdout);
9581 printf (" GP_GROUP %#06lx self-contained %#06lx",
9582 option->info & OGP_GROUP,
9583 (option->info & OGP_SELF) >> 16);
9586 printf (" IDENT %#06lx self-contained %#06lx",
9587 option->info & OGP_GROUP,
9588 (option->info & OGP_SELF) >> 16);
9591 /* This shouldn't happen. */
9592 printf (" %3d ??? %d %lx",
9593 option->kind, option->section, option->info);
9597 len = sizeof (*eopt);
9598 while (len < option->size)
9599 if (((char *) option)[len] >= ' '
9600 && ((char *) option)[len] < 0x7f)
9601 printf ("%c", ((char *) option)[len++]);
9603 printf ("\\%03o", ((char *) option)[len++]);
9605 fputs ("\n", stdout);
9613 if (conflicts_offset != 0 && conflictsno != 0)
9615 Elf32_Conflict *iconf;
9618 if (dynamic_symbols == NULL)
9620 error (_("conflict list found without a dynamic symbol table"));
9624 iconf = (Elf32_Conflict *) malloc (conflictsno * sizeof (*iconf));
9627 error (_("Out of memory"));
9633 Elf32_External_Conflict *econf32;
9635 econf32 = ((Elf32_External_Conflict *)
9636 get_data (NULL, file, conflicts_offset,
9637 conflictsno * sizeof (*econf32),
9642 for (cnt = 0; cnt < conflictsno; ++cnt)
9643 iconf[cnt] = BYTE_GET (econf32[cnt]);
9649 Elf64_External_Conflict *econf64;
9651 econf64 = ((Elf64_External_Conflict *)
9652 get_data (NULL, file, conflicts_offset,
9653 conflictsno * sizeof (*econf64),
9658 for (cnt = 0; cnt < conflictsno; ++cnt)
9659 iconf[cnt] = BYTE_GET (econf64[cnt]);
9664 printf (_("\nSection '.conflict' contains %ld entries:\n"),
9665 (long) conflictsno);
9666 puts (_(" Num: Index Value Name"));
9668 for (cnt = 0; cnt < conflictsno; ++cnt)
9670 Elf_Internal_Sym *psym = & dynamic_symbols[iconf[cnt]];
9672 printf ("%5lu: %8lu ", (unsigned long) cnt, iconf[cnt]);
9673 print_vma (psym->st_value, FULL_HEX);
9675 print_symbol (25, dynamic_strings + psym->st_name);
9686 process_gnu_liblist (file)
9689 Elf_Internal_Shdr *section, *string_sec;
9690 Elf32_External_Lib *elib;
9698 for (i = 0, section = section_headers;
9699 i < elf_header.e_shnum;
9702 switch (section->sh_type)
9704 case SHT_GNU_LIBLIST:
9705 elib = ((Elf32_External_Lib *)
9706 get_data (NULL, file, section->sh_offset, section->sh_size,
9711 string_sec = SECTION_HEADER (section->sh_link);
9713 strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
9714 string_sec->sh_size,
9715 _("liblist string table"));
9718 || section->sh_entsize != sizeof (Elf32_External_Lib))
9724 printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
9725 SECTION_NAME (section),
9726 (long) (section->sh_size / sizeof (Elf32_External_Lib)));
9728 puts (" Library Time Stamp Checksum Version Flags");
9730 for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
9738 liblist.l_name = BYTE_GET (elib[cnt].l_name);
9739 time = BYTE_GET (elib[cnt].l_time_stamp);
9740 liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
9741 liblist.l_version = BYTE_GET (elib[cnt].l_version);
9742 liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
9744 tmp = gmtime (&time);
9745 sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
9746 tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9747 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9749 printf ("%3lu: ", (unsigned long) cnt);
9751 printf ("%-20s", strtab + liblist.l_name);
9753 printf ("%-20.20s", strtab + liblist.l_name);
9754 printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
9755 liblist.l_version, liblist.l_flags);
9766 get_note_type (e_type)
9769 static char buff[64];
9773 case NT_PRSTATUS: return _("NT_PRSTATUS (prstatus structure)");
9774 case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
9775 case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
9776 case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
9777 case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
9778 case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
9779 case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
9780 case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
9781 case NT_LWPSTATUS: return _("NT_LWPSTATUS (lwpstatus_t structure)");
9782 case NT_LWPSINFO: return _("NT_LWPSINFO (lwpsinfo_t structure)");
9783 case NT_WIN32PSTATUS: return _("NT_WIN32PSTATUS (win32_pstatus structure)");
9785 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9791 get_netbsd_elfcore_note_type (e_type)
9794 static char buff[64];
9796 if (e_type == NT_NETBSDCORE_PROCINFO)
9798 /* NetBSD core "procinfo" structure. */
9799 return _("NetBSD procinfo structure");
9802 /* As of Jan 2002 there are no other machine-independent notes
9803 defined for NetBSD core files. If the note type is less
9804 than the start of the machine-dependent note types, we don't
9807 if (e_type < NT_NETBSDCORE_FIRSTMACH)
9809 sprintf (buff, _("Unknown note type: (0x%08x)"), e_type);
9813 switch (elf_header.e_machine)
9815 /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
9816 and PT_GETFPREGS == mach+2. */
9821 case EM_SPARC32PLUS:
9825 case NT_NETBSDCORE_FIRSTMACH+0:
9826 return _("PT_GETREGS (reg structure)");
9827 case NT_NETBSDCORE_FIRSTMACH+2:
9828 return _("PT_GETFPREGS (fpreg structure)");
9834 /* On all other arch's, PT_GETREGS == mach+1 and
9835 PT_GETFPREGS == mach+3. */
9839 case NT_NETBSDCORE_FIRSTMACH+1:
9840 return _("PT_GETREGS (reg structure)");
9841 case NT_NETBSDCORE_FIRSTMACH+3:
9842 return _("PT_GETFPREGS (fpreg structure)");
9848 sprintf (buff, _("PT_FIRSTMACH+%d"), e_type - NT_NETBSDCORE_FIRSTMACH);
9852 /* Note that by the ELF standard, the name field is already null byte
9853 terminated, and namesz includes the terminating null byte.
9854 I.E. the value of namesz for the name "FSF" is 4.
9856 If the value of namesz is zero, there is no name present. */
9858 process_note (pnote)
9859 Elf_Internal_Note *pnote;
9863 if (pnote->namesz == 0)
9865 /* If there is no note name, then use the default set of
9866 note type strings. */
9867 nt = get_note_type (pnote->type);
9869 else if (strncmp (pnote->namedata, "NetBSD-CORE", 11) == 0)
9871 /* NetBSD-specific core file notes. */
9872 nt = get_netbsd_elfcore_note_type (pnote->type);
9876 /* Don't recognize this note name; just use the default set of
9877 note type strings. */
9878 nt = get_note_type (pnote->type);
9881 printf (" %s\t\t0x%08lx\t%s\n",
9882 pnote->namesz ? pnote->namedata : "(NONE)",
9889 process_corefile_note_segment (file, offset, length)
9894 Elf_External_Note *pnotes;
9895 Elf_External_Note *external;
9901 pnotes = (Elf_External_Note *) get_data (NULL, file, offset, length,
9908 printf (_("\nNotes at offset 0x%08lx with length 0x%08lx:\n"),
9909 (unsigned long) offset, (unsigned long) length);
9910 printf (_(" Owner\t\tData size\tDescription\n"));
9912 while (external < (Elf_External_Note *)((char *) pnotes + length))
9914 Elf_External_Note *next;
9915 Elf_Internal_Note inote;
9918 inote.type = BYTE_GET (external->type);
9919 inote.namesz = BYTE_GET (external->namesz);
9920 inote.namedata = external->name;
9921 inote.descsz = BYTE_GET (external->descsz);
9922 inote.descdata = inote.namedata + align_power (inote.namesz, 2);
9923 inote.descpos = offset + (inote.descdata - (char *) pnotes);
9925 next = (Elf_External_Note *)(inote.descdata + align_power (inote.descsz, 2));
9927 if (((char *) next) > (((char *) pnotes) + length))
9929 warn (_("corrupt note found at offset %x into core notes\n"),
9930 ((char *) external) - ((char *) pnotes));
9931 warn (_(" type: %x, namesize: %08lx, descsize: %08lx\n"),
9932 inote.type, inote.namesz, inote.descsz);
9938 /* Verify that name is null terminated. It appears that at least
9939 one version of Linux (RedHat 6.0) generates corefiles that don't
9940 comply with the ELF spec by failing to include the null byte in
9942 if (inote.namedata[inote.namesz] != '\0')
9944 temp = malloc (inote.namesz + 1);
9948 error (_("Out of memory\n"));
9953 strncpy (temp, inote.namedata, inote.namesz);
9954 temp[inote.namesz] = 0;
9956 /* warn (_("'%s' NOTE name not properly null terminated\n"), temp); */
9957 inote.namedata = temp;
9960 res &= process_note (& inote);
9975 process_corefile_note_segments (file)
9978 Elf_Internal_Phdr *program_headers;
9979 Elf_Internal_Phdr *segment;
9983 program_headers = (Elf_Internal_Phdr *) malloc
9984 (elf_header.e_phnum * sizeof (Elf_Internal_Phdr));
9986 if (program_headers == NULL)
9988 error (_("Out of memory\n"));
9993 i = get_32bit_program_headers (file, program_headers);
9995 i = get_64bit_program_headers (file, program_headers);
9999 free (program_headers);
10003 for (i = 0, segment = program_headers;
10004 i < elf_header.e_phnum;
10007 if (segment->p_type == PT_NOTE)
10008 res &= process_corefile_note_segment (file,
10009 (bfd_vma) segment->p_offset,
10010 (bfd_vma) segment->p_filesz);
10013 free (program_headers);
10019 process_corefile_contents (file)
10022 /* If we have not been asked to display the notes then do nothing. */
10026 /* If file is not a core file then exit. */
10027 if (elf_header.e_type != ET_CORE)
10030 /* No program headers means no NOTE segment. */
10031 if (elf_header.e_phnum == 0)
10033 printf (_("No note segments present in the core file.\n"));
10037 return process_corefile_note_segments (file);
10041 process_arch_specific (file)
10047 switch (elf_header.e_machine)
10050 case EM_MIPS_RS3_LE:
10051 return process_mips_specific (file);
10060 get_file_header (file)
10063 /* Read in the identity array. */
10064 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
10067 /* Determine how to read the rest of the header. */
10068 switch (elf_header.e_ident[EI_DATA])
10070 default: /* fall through */
10071 case ELFDATANONE: /* fall through */
10072 case ELFDATA2LSB: byte_get = byte_get_little_endian; break;
10073 case ELFDATA2MSB: byte_get = byte_get_big_endian; break;
10076 /* For now we only support 32 bit and 64 bit ELF files. */
10077 is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
10079 /* Read in the rest of the header. */
10082 Elf32_External_Ehdr ehdr32;
10084 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
10087 elf_header.e_type = BYTE_GET (ehdr32.e_type);
10088 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
10089 elf_header.e_version = BYTE_GET (ehdr32.e_version);
10090 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
10091 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
10092 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
10093 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
10094 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
10095 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
10096 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
10097 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
10098 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
10099 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
10103 Elf64_External_Ehdr ehdr64;
10105 /* If we have been compiled with sizeof (bfd_vma) == 4, then
10106 we will not be able to cope with the 64bit data found in
10107 64 ELF files. Detect this now and abort before we start
10108 overwritting things. */
10109 if (sizeof (bfd_vma) < 8)
10111 error (_("This instance of readelf has been built without support for a\n\
10112 64 bit data type and so it cannot read 64 bit ELF files.\n"));
10116 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
10119 elf_header.e_type = BYTE_GET (ehdr64.e_type);
10120 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
10121 elf_header.e_version = BYTE_GET (ehdr64.e_version);
10122 elf_header.e_entry = BYTE_GET8 (ehdr64.e_entry);
10123 elf_header.e_phoff = BYTE_GET8 (ehdr64.e_phoff);
10124 elf_header.e_shoff = BYTE_GET8 (ehdr64.e_shoff);
10125 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
10126 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
10127 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
10128 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
10129 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
10130 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
10131 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
10134 if (elf_header.e_shoff)
10136 /* There may be some extensions in the first section header. Don't
10137 bomb if we can't read it. */
10139 get_32bit_section_headers (file, 1);
10141 get_64bit_section_headers (file, 1);
10148 process_file (file_name)
10152 struct stat statbuf;
10155 if (stat (file_name, & statbuf) < 0)
10157 error (_("Cannot stat input file %s.\n"), file_name);
10161 file = fopen (file_name, "rb");
10164 error (_("Input file %s not found.\n"), file_name);
10168 if (! get_file_header (file))
10170 error (_("%s: Failed to read file header\n"), file_name);
10175 /* Initialise per file variables. */
10176 for (i = NUM_ELEM (version_info); i--;)
10177 version_info[i] = 0;
10179 for (i = NUM_ELEM (dynamic_info); i--;)
10180 dynamic_info[i] = 0;
10182 /* Process the file. */
10184 printf (_("\nFile: %s\n"), file_name);
10186 if (! process_file_header ())
10192 if (! process_section_headers (file))
10194 /* Without loaded section headers we
10195 cannot process lots of things. */
10196 do_unwind = do_version = do_dump = do_arch = 0;
10198 if (! do_using_dynamic)
10199 do_syms = do_reloc = 0;
10202 if (process_program_headers (file))
10203 process_dynamic_segment (file);
10205 process_relocs (file);
10207 process_unwind (file);
10209 process_symbol_table (file);
10211 process_syminfo (file);
10213 process_version_sections (file);
10215 process_section_contents (file);
10217 process_corefile_contents (file);
10219 process_gnu_liblist (file);
10221 process_arch_specific (file);
10225 if (section_headers)
10227 free (section_headers);
10228 section_headers = NULL;
10233 free (string_table);
10234 string_table = NULL;
10235 string_table_length = 0;
10238 if (dynamic_strings)
10240 free (dynamic_strings);
10241 dynamic_strings = NULL;
10244 if (dynamic_symbols)
10246 free (dynamic_symbols);
10247 dynamic_symbols = NULL;
10248 num_dynamic_syms = 0;
10251 if (dynamic_syminfo)
10253 free (dynamic_syminfo);
10254 dynamic_syminfo = NULL;
10260 #ifdef SUPPORT_DISASSEMBLY
10261 /* Needed by the i386 disassembler. For extra credit, someone could
10262 fix this so that we insert symbolic addresses here, esp for GOT/PLT
10266 print_address (unsigned int addr, FILE *outfile)
10268 fprintf (outfile,"0x%8.8x", addr);
10271 /* Needed by the i386 disassembler. */
10273 db_task_printsym (unsigned int addr)
10275 print_address (addr, stderr);
10279 int main PARAMS ((int, char **));
10287 char *cmdline_dump_sects = NULL;
10288 unsigned num_cmdline_dump_sects = 0;
10290 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
10291 setlocale (LC_MESSAGES, "");
10293 #if defined (HAVE_SETLOCALE)
10294 setlocale (LC_CTYPE, "");
10296 bindtextdomain (PACKAGE, LOCALEDIR);
10297 textdomain (PACKAGE);
10299 parse_args (argc, argv);
10301 if (optind < (argc - 1))
10304 /* When processing more than one file remember the dump requests
10305 issued on command line to reset them after each file. */
10306 if (optind + 1 < argc && dump_sects != NULL)
10308 cmdline_dump_sects = malloc (num_dump_sects);
10309 if (cmdline_dump_sects == NULL)
10310 error (_("Out of memory allocating dump request table."));
10313 memcpy (cmdline_dump_sects, dump_sects, num_dump_sects);
10314 num_cmdline_dump_sects = num_dump_sects;
10319 while (optind < argc)
10321 err |= process_file (argv[optind++]);
10323 /* Reset dump requests. */
10324 if (optind < argc && dump_sects != NULL)
10326 num_dump_sects = num_cmdline_dump_sects;
10327 if (num_cmdline_dump_sects > 0)
10328 memcpy (dump_sects, cmdline_dump_sects, num_cmdline_dump_sects);
10332 if (dump_sects != NULL)
10334 if (cmdline_dump_sects != NULL)
10335 free (cmdline_dump_sects);